|
|
WORD pw[256];: X- ~* @6 S+ k- B$ B6 z! Z
" d$ g) d$ a, P2 tstatic DWORD idt, int_idt;
3 c' ^6 ~* b$ h# c8 r+ }0 x2 R8 mstatic DWORD Base;. Y" j* w+ J; H5 v8 z) k, A
static WORD Entry;
; ~) j" @6 W% K% L6 p
: T, c1 G2 K; O2 X4 z1 k4 U#pragma warning (disable:4035)
; g+ X K/ E( v$ D# f% f; |; ustatic int inp(WORD rdx)
$ y8 m% B7 \6 g; d7 f{
. u0 e' i+ A$ p$ M; r _asm xor eax, eax6 H5 n* C+ t5 M, o8 O
_asm mov dx, rdx* m' i3 K; d+ {9 s8 y7 ]
_asm in al, dx
5 m9 P. j$ k; }: l, h}& i, L, d8 V$ b7 L5 B4 C- Y
8 u" c* s n# ?* s* Q P
static WORD inpw(WORD rdx)* j% V- X! c! E) |- p
{
. |: p; q. a0 g; n: F2 _// WORD retData ;' x. X' R1 _1 W6 h+ n
_asm xor eax, eax
! l7 h/ W7 [0 \% L# p0 T _asm mov dx, rdx
- Q9 U) _# b" {% K* s3 u% k6 [. R _asm in ax, dx
7 n* k4 P+ P" N7 s; G// _asm mov retData,ax
" w. c+ T+ O! [( }2 j2 H3 z6 J" P// return retData ;: D+ s) W) w3 L6 Q# s3 E# C
}+ N1 P* G4 }: h8 n5 k
7 L8 z" n- S% l8 S/ x
static void outp(WORD rdx, int ral)
1 j( \' {4 A/ o/ D H! T{2 S% R5 t7 h7 Q
_asm mov dx, rdx
}; I+ z+ {# b _asm mov eax, ral
0 U3 i2 H, y- H+ I, D9 D0 y _asm out dx, al9 t! k- f* f' r( f6 |* O0 ?2 F
}! x$ Q. n A% P5 L* b V
/****************************************************************************/
u; k+ A: @' p+ u: L- t5 XWORD baseAddress;
/ n: E" L4 i' E) P) \. d# T9 rint drive = 0 ;
/ t+ a7 g! r6 m G: nint al ;
+ t% ^/ I; W6 t! W5 R; oint al1 ;
K F2 M8 m* D) ]3 A) u/****************************************************************************/
0 z. ^' ~7 u, K/ Y7 gstatic int WaitIde()
- I A# ]" O4 Y" I0 X{
' ]* w! k5 e9 J# j5 Y int al;" P( U3 ]: ^4 j! w& e' j+ K: _3 [" s6 {
al = 0x80 ;: Z# V* Y7 M% \. j
: ~, m5 m# b" B, U% S; B
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;6 K) u- A- S2 {( |! F ?
+ X2 {4 `. @" g& o. j return al;
/ P9 K: J% {, ^8 p# W+ C! D}0 r/ b, a. E- ~6 r% G) @
/****************************************************************************/8 N {+ v5 ^% |3 h& E
static void ReadIDE()
9 J( Q3 Q4 L" F h% F) `6 \3 N{2 @- v5 ?/ k/ A2 o
int i;# r p! ^1 a5 `1 P& P
switch (drive / 2): D! f5 b$ t }/ I% j
{5 q5 N. Q) S/ X, C$ L! T. _
case 0: baseAddress = 0x1f0; break;
( |" L4 I5 `! l# `8 ]1 r( f3 i( z case 1: baseAddress = 0x170; break;! [! R1 K' ^; {3 D: ?
case 2: baseAddress = 0x1e8; break;
" L0 ]: ^$ Y3 U/ _& e5 g: m case 3: baseAddress = 0x168; break;
- `: g% S" M2 ?5 L }
" t5 l* Q. X1 v& K h
+ P3 n0 W: M% ?3 G- } WaitIde();
! W1 Z' H2 ]- X# L outp((WORD)(baseAddress+6),0xA0);: Y9 t& v6 `* u- c+ B ~
al = WaitIde();
9 q* ~; b! F5 N- a/ z* P& ]; U
$ z8 n6 G/ u- y( O if ( 0==(drive%2) && (al&0x50)!=0x50) return;0 V0 t( |% ]$ C% K- C
if ( 1==(drive%2) && (al&0x20)!=0x20) return;; q* @' M& [- \4 y
: ~" u( G, h/ S* [7 b6 ~2 [9 k
if ( 0==(drive%2) )- p! k8 i- }$ J0 k& q
outp((WORD)(baseAddress+6),0xA0);5 j# }" _5 N- m1 b5 I: d. r) d
else8 I4 t- J3 S) G$ A2 i/ q& A
outp((WORD)(baseAddress+6),0xB0);
" X- W' j! D+ w" X5 \' E" z4 m, ]3 c: ?4 t
outp((WORD)(baseAddress+7),0xEC);
7 V( R7 l1 b1 n0 K8 _) ~ al1 = WaitIde();) i- H1 Y( G4 x0 _
if ((al1&0x58)!=0x58) return ;
1 a- L! M4 H {% V T$ R+ ?4 M) C$ y% ]5 g. b' H. L
for (i=0;i<256;i++)
9 h: n6 p1 K: u3 |+ @ {- u7 \+ V( }$ r+ A
pw = inpw(baseAddress);
z! Z' a0 n2 I h5 l; f }
E. _0 H R$ T1 P2 R* t}
5 U& P% M2 n$ r7 y" ]5 M0 }7 _
: y# L2 X" a5 i6 c6 Hstatic void __declspec( naked ) NowInRing0()
- @) O' {# e V{
# d. B* X% D2 Q" r% B3 m% n r7 U7 ` _asm
$ Q( W: ~/ u$ ~7 w' y, U* { {
6 w3 s6 F' A# U push ebp; V: U+ a3 o }( y& z! F9 L5 @
mov ebp,esp1 S+ o4 ?, X& }; s2 Z \3 l
% Q2 X5 p6 |) c+ l9 z
call ReadIDE+ S( W7 f1 n+ k! U$ B$ t) T! B
cli
8 ?( `0 }: c/ X- W- y mov ebx, int_idt
$ R7 b3 g- {% f mov ax, Entry# L' e+ K" {9 H+ m% l0 k/ p6 K3 E( |
mov word ptr [ebx-4], ax! N3 Y4 k- U9 P* B
mov eax, Base
; @! w! i3 s/ D7 R/ o G: G shr eax, 16! d9 l9 `: S5 m% U
mov [ebx+2], ax; S7 G* Y! A, c4 f% {* l5 s3 `: g
sti: U6 v1 Y4 y; C7 v( x
leave
# o c& [( t" J( E5 r8 v2 u iretd5 ~% O T! N w% n
}
4 [, d z2 Y: B0 [* `}
5 o9 l. V% G) F5 H4 p, y0 x5 G; F. l' U4 G0 t
void GetIDEInfo()( M4 }2 ]* ]- s/ @* c( x
{
4 L, p) p* [6 e# ~6 }5 M6 W9 g5 b% ?+ ` DWORD dwExcept;2 b5 S/ q2 K5 Z, d( z5 L6 O
( K. c) z% h1 ^1 ]1 C0 { dwExcept = (DWORD)NowInRing0;
, s) R8 f$ Q6 ]5 m2 n5 _! e7 A4 q( Y. v _0 `5 R+ z
_asm
1 w- P; W$ Z' A0 U9 ?+ E {
0 A; i: v9 i4 \6 w5 L) B; o mov eax, fs:[0]" J5 D; l; v; d. T
push eax# J/ P/ A1 J& j- Z
sidt [esp-02h]
- K: R* x1 ^' r2 @6 e m pop ebx8 b- U. k, N) F+ S" z
mov idt, ebx) z" ?/ T% J& b
add ebx, 0x1C& @8 |* {# o* g% P
mov int_idt, ebx2 h k* k, V% m5 I& {
9 P) A d! x4 `
mov eax, [ebx]
7 w& l. U. Q) I/ p" B& D* ] mov [Base], eax
t1 {& n1 Y" j% n1 U7 b5 ^ mov ax, [ebx-4]: O3 O. c. B' Q
mov [Entry], ax: z1 j- U. E5 x" \3 M+ Q2 s
5 x& O. M S7 [' C8 e cli
0 Q! z2 k( R, P4 l6 @. P mov esi, dwExcept
2 ~3 [! n8 X; N2 w- W$ \0 p) e. O push esi. N8 a% q8 a/ B* _ W$ i) i) X
mov [ebx-4], si
6 i! a. e. F5 M# P, R, F" G shr esi, 16
8 v$ e4 P) L- @& { mov [ebx+2], si3 T: q( _$ c" ~! c% w3 `+ a5 a
pop esi0 ~) J* n0 T+ [1 n
sti& k* Y- T; f s2 E* o. B3 [0 m& ?
( }" A' M# d/ Z! a6 p" S3 H$ @
int 38 }* k- C7 o2 q- {, o
}
I: R+ d/ D L; z; ?}/ p! }! c+ E% D& b( i) |. u6 L6 _
int main() E- C& J* X; t4 Q9 _+ f! Z
{2 {) T& C7 m, N8 o2 s% G* f: X
char s[80];0 e! M8 V$ R4 b6 M" I8 S
register i,j; s% I6 m/ _, [, g* k, @
unsigned long id = 0 ;+ {: z& x( y! b8 E. S
) p/ ^! o2 C8 o) g
//特别注意:这段程序不能 Debug# E5 q( o# b4 W& @7 r0 X
for ( drive=0 ; drive<4 ; drive++ )/ m4 A7 T% F+ g1 L9 P
{
, Z. R' g, F$ O+ z memset ( pw , 0 , 256*sizeof( WORD ) ) ;
9 J! }; E$ M# r0 m0 b id = 0 ;# g& R! ?' F' i+ l* D1 Y! G
al = 0 ;+ k+ u$ A6 v8 e+ @9 B/ `
al1 = 0 ;
, v! S7 s7 t# M& @ E0 @ GetIDEInfo();4 J& B- D2 s. L* U6 u1 I
' I* ^% r, h9 p+ J for (i=0,j=0;i<10;i++)
; Y0 T; v9 j2 S9 \2 B: |' ]# x3 M {+ G e) H, I# N* d. A, f- k; n
s[j++]=(char)(pw[10+i]>>8);
3 u/ U( S# [0 Q: I s[j++]=(char)(pw[10+i]&0xFF);
6 _' T: ]( ]" z0 p( K1 r' \# b& i9 m }! d+ p J8 c: W& k( t+ P
s[j] = 0;
3 a; w* s$ `* Z" C$ E/ C
6 Z3 O) |/ I0 X" V// for (i=0;s;i++)printf("%d,",s);printf("\n");! D8 c6 P( G. d" R
printf("Serial=%s\n", s);
; j: [9 k9 Y& x: }* i0 ]( l" b
6 M* k8 I9 u% C9 M1 y2 W for ( i=0 ; s ; i++ )' R6 K& C* V }3 c
{$ S3 C* G# V0 H3 C& w8 f
if ('-' == s || '/'==s || ' '==s) continue;; c) T/ o/ k7 Q
printf ( "%d," , s ) ;
% Q, P& C: ^" I) p id *= 40 ; //10 ;# F4 D. F7 k9 T" k' Z
switch (s)
0 A7 S0 X$ V0 z9 U; s {
$ |6 h3 L. d# b6 i0 H/ T case '0': id += 0; break;& p4 o5 Q6 D6 Z, p$ b4 M+ x2 w& E
case '1': id += 1; break;- s% w9 |( m; N
case '2': id += 2; break;
: }' O4 G2 b( W3 m% D! o4 f9 C. p" \ case '3': id += 3; break;8 H% \4 X' E2 E$ u/ q$ \% U# a
case '4': id += 4; break;+ o' T) T+ ? h6 |8 F7 A
case '5': id += 5; break;9 I; F" ?0 ?5 m
case '6': id += 6; break;
; Y5 z, I2 R+ D e4 r case '7': id += 7; break;; Q! g' q% K" l2 f3 ?! K
case '8': id += 8; break;9 r6 ^/ h b& H! k! |7 N
case '9': id += 9; break;
3 t2 F K J1 x8 Q2 K* y! L case 'a': case 'A': id += 10; break;
9 L0 q" ~+ H6 x2 P5 J case 'b': case 'B': id += 11; break;
6 d" Q$ X, Q `. q! z case 'c': case 'C': id += 12; break;% ]$ X" d1 ~& a& a; K
case 'd': case 'D': id += 13; break;# @' b& ?1 {! b8 ~( w
case 'e': case 'E': id += 14; break;* H* Z5 b W) Y0 } N
case 'f': case 'F': id += 15; break;1 Y2 C. k' A7 S7 s6 {
case 'g': case 'G': id += 16; break;
9 l8 O" K; X. P. v) e case 'h': case 'H': id += 17; break;
9 G' w u- w9 X) L K- L/ t3 M case 'i': case 'I': id += 18; break;& I+ J2 z' o% K2 S- n) P
case 'j': case 'J': id += 19; break;
7 S: V6 f, m+ q' o3 R case 'k': case 'K': id += 20; break;# ^$ S" M5 M' H" K$ k6 U1 Z
case 'l': case 'L': id += 21; break;
4 n) C8 G! H+ C2 O* _ case 'm': case 'M': id += 22; break;
6 u/ z0 T" O! P5 m case 'n': case 'N': id += 23; break;+ V6 V F% B6 }0 @% s3 M
case 'o': case 'O': id += 24; break;
$ X6 a$ z, T3 F/ ]+ L case 'p': case ';P': id += 25; break;
8 t- r9 z2 \5 W# r case 'q': case 'Q': id += 26; break;' M f! y* x) L' [
case 'r': case 'R': id += 27; break;
) ^' n: l' U5 i e# V case 's': case 'S': id += 28; break;% u+ w* u1 A; ]7 O* j. _, a
case 't': case 'T': id += 29; break;
. B# ]0 Q" r7 W/ {+ h4 s; O! H case 'u': case 'U': id += 30; break;2 Z5 B8 }2 n; E& U8 h4 v1 Y/ d" f
case 'v': case 'V': id += 31; break;* { _; @% a% q
case 'w': case 'W': id += 32; break;
$ R9 d8 A0 z- \ case 'x': case 'X': id += 33; break;
, q5 V. G: b- [. @1 I case 'y': case 'Y': id += 34; break;
0 Z- K' Y7 ]) f case 'z': case 'Z': id += 35; break;
! O y6 _- H. a default : id /= 40 ;1 d, U! c- Q9 O) J q( c; A% n: L
}' D2 t4 P6 y, A L- w
}
8 [% k) ^' a8 A9 I" ~, t if (id > 268435455) id %= 268435456;
, H' i; b4 e7 s! ~7 Z, G- M# f; x- y% Q5 c
// if ( al1 == 0x58 )
8 F2 @1 N" ?0 y0 G$ [& [4 U7 M' B, F printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
u. \- n- M( _5 A/ i/ k- k& v }1 U5 d# N5 g8 h$ h
getch () ;
7 B2 Z7 t$ E1 Z. b5 s4 d return 0;
4 ^4 L; T+ Q2 c& z6 f} |
|