|
|
WORD pw[256];
1 P3 x5 ] {- v6 V" h+ E$ s- V: @+ \6 B& d: F8 k6 n9 c
static DWORD idt, int_idt;
; p' I+ z$ q- P& astatic DWORD Base;
* I+ D! z0 v+ b/ J$ V- F; P4 A1 _static WORD Entry;7 V" y7 f: G C
0 Y/ P w9 H1 U+ f' }#pragma warning (disable:4035)
% U7 r& g( C2 z- X- I3 J0 ~static int inp(WORD rdx)& H- a0 d2 ?5 P. ], P. l0 J+ T3 b4 v
{8 i8 i) ~2 N0 v2 h) v2 C* R
_asm xor eax, eax
9 W9 y/ k0 `0 t& T _asm mov dx, rdx
4 S$ B2 w p0 r3 @: Q$ ]8 T, g _asm in al, dx v2 u* P: ^/ f9 q& C
}
6 t4 }1 D1 i/ n% W) K
- H) _) L' `' Cstatic WORD inpw(WORD rdx)6 X* ]& G( j# K, n" m
{
! g" Z2 s% v+ z// WORD retData ;
5 l4 K6 e9 D* t+ g1 m _asm xor eax, eax- C5 B8 e9 v/ M
_asm mov dx, rdx
6 j9 {' X7 ?9 @! K3 Z _asm in ax, dx0 u, y9 \8 w7 v$ b
// _asm mov retData,ax
4 ]. ^. G, t8 F8 ?: F6 ]// return retData ;- E4 ~2 O0 D- m8 T
}; Z+ ?- L* m! s3 Z. q; O
) `5 B- q- r/ h9 `
static void outp(WORD rdx, int ral)
0 {$ J6 ?, X2 c{0 l. m) ?. G" m! o3 v
_asm mov dx, rdx
1 b. g, D8 ?- N9 i# A% e _asm mov eax, ral m5 _5 f. }+ i/ k; b% |8 f
_asm out dx, al/ n1 S7 l+ Z+ N4 J& W& ?
}( X9 [3 v' {* N
/****************************************************************************/2 |$ u4 L* s7 e6 A& P( R; v
WORD baseAddress;9 v2 p: I% D2 k2 D. Z
int drive = 0 ;- K! [+ i7 ^' a& D6 c7 W
int al ;
( z" Y& K5 d$ ^2 V1 C* Q- }int al1 ;
& o9 T8 s: G6 P1 @/****************************************************************************/1 V8 _$ Z. M% W& X2 ?
static int WaitIde()" E6 d6 \- E) E1 U' X
{, |$ f7 a9 a0 Y+ c; `
int al;
, h# E) n7 o, R al = 0x80 ;
% H' Z4 y; M. L6 c7 n- L: p3 B% R
& O# _$ U. J n3 H; |& v3 ] while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;/ x0 i$ _/ c/ f+ b, F
" D0 Z( D2 z9 P. Y9 f( b return al;
5 t$ m ~+ k. ^9 D8 d4 {* |}
6 V; C1 j4 a' O" H0 N) ^1 o6 \/****************************************************************************/
3 u) I* @8 M7 N; G) ?static void ReadIDE()
% w$ j1 ?# m# B, {6 ^{3 l$ [8 H8 h2 o7 r3 H
int i;
& h! N2 {; D$ ^) t switch (drive / 2). t5 |& u2 q+ Q; a5 i0 r
{& T% Q0 ^, Q' f! ]6 `
case 0: baseAddress = 0x1f0; break;2 r/ {6 L4 ~5 `- |8 S. B$ f1 L4 D
case 1: baseAddress = 0x170; break;% s$ \0 S5 B- p1 v
case 2: baseAddress = 0x1e8; break;5 e/ w+ }3 E9 R; n
case 3: baseAddress = 0x168; break;+ G! _1 g- h' b- O3 h1 C k
}6 h; ]' X, S" w$ i
1 `+ Q* f7 c3 a3 F4 b- h6 L WaitIde();& _: R7 Z* U4 ~# _
outp((WORD)(baseAddress+6),0xA0);; i: C4 r9 P0 l6 x1 D/ [
al = WaitIde();! P6 ]$ b1 z0 ~4 E8 z) E
3 i: q1 s9 P# B& }' r if ( 0==(drive%2) && (al&0x50)!=0x50) return;
9 X% E2 ?2 e9 y if ( 1==(drive%2) && (al&0x20)!=0x20) return;' c; W& N3 O! f% k( Q( ]- A* s
+ @ v1 l5 i# r* n
if ( 0==(drive%2) )
1 o: M5 E: w8 T outp((WORD)(baseAddress+6),0xA0);
, v* s, h# @0 w$ {- g, G$ ~ ~ else8 Z- q8 M! y) r! J
outp((WORD)(baseAddress+6),0xB0);' m+ b- Y2 \: Z; `
; f5 i0 a( F0 l outp((WORD)(baseAddress+7),0xEC);
/ D- T5 s: [% e( _! [ al1 = WaitIde();& y* [0 W8 {6 v1 `' f
if ((al1&0x58)!=0x58) return ;3 @6 J+ m% T2 E' l }( J
, U2 c2 P, _( l( R for (i=0;i<256;i++)
& l4 I" Y! \4 s% Q9 f {
/ k: p9 i4 u) b7 ?9 I+ F pw = inpw(baseAddress); d1 |9 `3 M2 W+ }) e
}
6 Y9 L: ?$ L& S}
9 J$ y- b2 [ f+ E5 g+ x% j1 ~1 i% W9 f. ]2 m2 P
static void __declspec( naked ) NowInRing0()
9 v `/ M M+ [% m{" Y- F1 O8 E( _8 M' \: e
_asm
7 n) L- @0 r& e' {( ]: v" K {+ W, X! d$ s$ A1 {( g
push ebp3 A _! G$ m$ C8 M! J) L
mov ebp,esp/ w% M) K2 C( K2 z3 M/ N1 p* G
3 e" s) y, a6 [! s call ReadIDE
/ k* n0 C* [- q6 K- _ cli8 n- g, y" ?" C6 V0 P
mov ebx, int_idt2 `+ Q! ]+ D+ w+ U j; {
mov ax, Entry
& b2 [# a: a; k+ ~ mov word ptr [ebx-4], ax
% E, ]% c3 n6 a( S% Q mov eax, Base% g$ N8 g& h2 g8 g0 ]% x
shr eax, 164 o2 ]6 t& \7 ?7 d+ Z' t% L5 T5 y
mov [ebx+2], ax. z: x" ]" P0 s% x7 z
sti& i3 e8 Y% i. ^; I3 \- l
leave
8 H& E4 p1 G5 P# T: i/ W iretd
9 `$ {8 I% S) ] }/ C- l! H3 J( a; Q# [
}" q3 v, U2 b) d, ^2 c8 |5 [# l6 W2 u$ h
3 \! G3 R I) c2 U5 K, q6 r7 N+ G
void GetIDEInfo()% }0 F. m" b8 A4 Z% ^% k# g
{. h9 g/ G6 {1 A+ e
DWORD dwExcept;/ C' D. v( L! E, f; D
9 k, E1 ~$ B: F& ^
dwExcept = (DWORD)NowInRing0;5 ?# z9 E5 R* w; k8 q H% D' T7 D
' C! o. R8 a0 q8 O) [! i
_asm
* a$ o$ u/ _1 E* b, C2 F, Y1 o {" n# w/ O8 J5 z3 K8 V
mov eax, fs:[0]
' x& P* ~. w- d' x3 b, @' k push eax
: [' K: V8 h! g* R' H sidt [esp-02h]
9 w; w/ _2 {6 `7 [4 ~- `/ K; x pop ebx
( t% p. z" d3 A9 o+ H0 k5 P, X mov idt, ebx6 A1 W# H% h# _4 H8 z
add ebx, 0x1C
, A9 |* ~# _- k7 A mov int_idt, ebx9 Y. B# ?, D* b3 c+ _+ N2 {- O
" W5 P: b# M% m. I" G: _) [
mov eax, [ebx]
$ O# e" n5 o; Y2 `% V4 f3 y mov [Base], eax
8 s& Y# Z# s; a* \ mov ax, [ebx-4]) a9 D; W' N9 R
mov [Entry], ax
$ l, Y6 E6 f' j2 W( j4 U; g/ x- T) p6 i/ O1 e, [$ K- ?
cli
/ j: g8 }7 H& E6 a mov esi, dwExcept2 j# k, A1 o i2 ]& R# y
push esi
: T! W+ `' j! ]* E1 W3 V mov [ebx-4], si( c; D$ v3 b) K5 {: ~7 j
shr esi, 16" ` v2 _) x% {$ H) m
mov [ebx+2], si% G+ U6 r6 K) \; Z3 Y! `; H
pop esi7 W& I; e+ g" }
sti
4 e5 l8 ^. a' E( P+ u5 {& |5 z$ [6 d! k2 L. z
int 3
4 J) g; L% s! V- T8 F, w) { }
+ c( m/ \3 G8 [}
- j( A/ \. M M& A4 g- R3 s: qint main()9 h% N8 A( t$ B4 O6 R
{
6 x) l- ~4 f" g- e# V, A char s[80];( \" R0 Q w9 C. w2 k0 e6 b
register i,j;
$ i4 l( O: h7 W# m- I4 K. o7 o unsigned long id = 0 ;% b# Z, k! A; U q0 g7 j
4 C" s* g5 D- o$ F5 Q8 S a8 ~
//特别注意:这段程序不能 Debug
$ ^% ]( E" r6 M1 z for ( drive=0 ; drive<4 ; drive++ )
8 A' m% i! C% `! u7 n r8 |9 a {
/ V1 Y8 t5 |# t; i# n! t memset ( pw , 0 , 256*sizeof( WORD ) ) ;
: r' N8 h. E5 ?9 X- Q) y. q% Q id = 0 ;8 D' x1 m3 V }0 c$ k
al = 0 ;% w$ d" z) R& n) R- s6 h
al1 = 0 ;
8 b M# F8 x# q: n1 r GetIDEInfo();
2 E% A7 a; D S7 B5 ]3 C4 }6 H! G0 [% k' x* w; C1 B- K4 q
for (i=0,j=0;i<10;i++)
k+ j/ h" z1 C {
: t: G8 Q u% e; J/ \7 S! @" O s[j++]=(char)(pw[10+i]>>8); a0 \9 a D; R' R# `: z) A
s[j++]=(char)(pw[10+i]&0xFF);& a- s4 C# ?: ?% L
}
6 s$ L, N) g8 m" C5 R s[j] = 0;& V! p4 A* m3 {1 S5 [4 B2 ]9 i8 x, a
1 m0 Z# g& H2 U" s( O. e/ i1 h2 S// for (i=0;s;i++)printf("%d,",s);printf("\n");' I( Q& _& n* b% \
printf("Serial=%s\n", s);
3 i3 [3 F3 l# a; ?6 L# i. w9 x, j% J9 }. n! D( n; O& |
for ( i=0 ; s ; i++ )/ _4 A ^, G3 X; c, J
{% Z& j1 l; W/ O( e: D- `
if ('-' == s || '/'==s || ' '==s) continue;
! D! F% F% h; q2 c* v printf ( "%d," , s ) ;
4 Z, |# i" i! I" ~ id *= 40 ; //10 ;
1 Q5 u) w9 W8 b6 }3 ^ switch (s)
9 j" u7 z5 s0 Q" M. F! c {
! e( s# C% f; X8 O! ` case '0': id += 0; break;7 L7 U7 J* d& O) _. G5 Q2 G: E/ s g
case '1': id += 1; break;3 h7 b( A# y% ?. l+ N
case '2': id += 2; break;& v$ p- P- |4 e$ Y' ~5 s: c
case '3': id += 3; break;# }# Z0 H$ c; r( u- V
case '4': id += 4; break;
. n2 E6 T# h' l2 G case '5': id += 5; break;
9 J+ R5 p* g8 D7 _' `2 O case '6': id += 6; break;
; D7 g7 W( ~4 g9 \ case '7': id += 7; break;
2 g* H, U0 Y ], d case '8': id += 8; break;# m$ Q( C# P2 W; w9 ?: h9 {
case '9': id += 9; break;
, N" T) L) w/ g- R' i: Q case 'a': case 'A': id += 10; break;3 P g7 d, U: @1 H) p+ D
case 'b': case 'B': id += 11; break;: F8 u* Z- O6 v, d1 ^9 p/ O
case 'c': case 'C': id += 12; break;6 ? P& _6 m" D# f* U
case 'd': case 'D': id += 13; break;! P- e3 F) i. q |2 t! x
case 'e': case 'E': id += 14; break;
+ U( E* D$ @1 f case 'f': case 'F': id += 15; break;* m6 A/ J7 L$ }- ~2 g
case 'g': case 'G': id += 16; break;
4 V6 Y# d& t) s1 M case 'h': case 'H': id += 17; break;
, h% [6 q* ?. O0 H case 'i': case 'I': id += 18; break;' {' r: v3 n$ U
case 'j': case 'J': id += 19; break;0 r. v! Q- j1 j& g# e$ U
case 'k': case 'K': id += 20; break;& n. M1 O$ M7 f3 t6 I
case 'l': case 'L': id += 21; break;
# b& m, d( M* o0 d! k: v case 'm': case 'M': id += 22; break;* A% K/ r$ D" i6 g- P
case 'n': case 'N': id += 23; break;: O& |" M5 Z. h6 U# M, O
case 'o': case 'O': id += 24; break;3 _3 m5 ? d* c- K: {
case 'p': case ';P': id += 25; break;2 B; X8 F% C( d5 p& U* j( p) O! _
case 'q': case 'Q': id += 26; break;
; E' H* S" t& ]" A case 'r': case 'R': id += 27; break;
: P! f+ F$ c! M0 Q case 's': case 'S': id += 28; break;
4 [( ~) V: R/ o" L& n! z case 't': case 'T': id += 29; break;4 W; A5 j1 I3 W" Y
case 'u': case 'U': id += 30; break;
* d+ Q7 K4 m' H, c3 g6 o2 K ~ case 'v': case 'V': id += 31; break;* a) S$ P0 s) g! Y9 }6 N
case 'w': case 'W': id += 32; break;/ s7 v' t7 j3 o: K3 }# e
case 'x': case 'X': id += 33; break;1 s. z1 d" W! O
case 'y': case 'Y': id += 34; break;
) @2 d3 t+ x9 S7 S( G case 'z': case 'Z': id += 35; break;
3 s2 y& J- O8 P M default : id /= 40 ;; Q6 u! q; T+ {* W. G
}! _2 T, V4 `9 @. h, a( T* x0 n
}2 v N7 q2 \6 f1 M1 n" C0 O2 a
if (id > 268435455) id %= 268435456;
6 p/ _( O1 u J! F! X: A1 ?# t8 Z K
7 t1 x! q7 d& R5 o! V# k z9 ]// if ( al1 == 0x58 )
* G; f5 B7 h; L$ N1 p7 a3 k printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;/ `0 ^6 J y& Y" k7 B* b- h
}; k9 b1 _. ^. b
getch () ;6 N" L$ _5 j/ L9 Z/ v, J- B
return 0;
, o( g. V; N p2 ]: q) t: R} |
|