|
|
WORD pw[256];
0 g. O9 x F6 C. n/ L7 X9 z- C7 d3 B
static DWORD idt, int_idt;* }" t6 I2 N- }
static DWORD Base;' ^7 {' D( L7 t
static WORD Entry;
: Q+ z9 U. ^# @( e" w; {: y: b$ U1 \( ?0 ^' B
#pragma warning (disable:4035)
% ^5 a* v: }- t1 ^) V- o! Lstatic int inp(WORD rdx), m5 \4 @2 U% S/ k; G1 k; N u
{
2 C/ [; l* C" {" i _asm xor eax, eax
( V& d5 Q$ o. N9 Z! ^ _asm mov dx, rdx: w0 a/ p {3 ?/ `7 a; g# c
_asm in al, dx
+ S8 r# n) S" y' z& F3 _$ ~- f}
* D& ~' v" W) V. G0 x
% j. e8 _# Z6 ?static WORD inpw(WORD rdx)
' N3 m. d( L% T; R- C. f{" ]* n6 k# D. ? {* T+ r1 i& F
// WORD retData ;, O2 U" h# N3 M" f
_asm xor eax, eax* S5 Z1 N# N% u# [& `
_asm mov dx, rdx
, w) K% p- P1 r5 x' L2 m: g _asm in ax, dx
! _5 J$ |1 X9 f u) ^7 e5 D+ H* |* M// _asm mov retData,ax
. S7 r7 D( |, C& { c; F/ u. u// return retData ;
% p; t/ j, N( @* d2 M3 u u! e}
: {3 Q; z3 r$ }* F. A/ Z7 _, l- ~7 r* P9 G
static void outp(WORD rdx, int ral)3 S1 k/ t$ I+ l' J# j. A2 R
{
9 X: p; W8 \& M) [ _asm mov dx, rdx5 h; d. j' m; }5 \8 y) m" B( Z
_asm mov eax, ral
3 Z; H+ O2 I/ d' S3 A" y0 I- x' A _asm out dx, al8 {* [6 T: r: ]: X
}
* D& j0 R$ F% a4 h! o/****************************************************************************/
/ I/ p$ Y1 f9 L6 |& C7 t* b8 LWORD baseAddress;5 v7 Q, _2 q7 K. n7 _
int drive = 0 ;
9 Q1 |- V! J* C# N2 Zint al ;
6 p6 j' P: b. X W# L! nint al1 ;3 J1 y+ K- `- s5 q9 N
/****************************************************************************/
4 d; x& A8 _( P0 Qstatic int WaitIde()
: a2 c0 l _$ ]# y6 I* R! j3 K{, ^# d5 Y; |- g) e
int al;2 J' {; |: ]5 Y
al = 0x80 ;. v, ~/ b- X% N( P) }- q- |9 y( G+ L. N
4 i6 r1 m8 X3 O; O while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;3 q9 Z$ U+ Z: J0 M, u4 `9 G
# V3 n" |% s8 ~; `3 u& [
return al;0 A( k5 @" g/ Z
}
' y& r9 y- v6 F/****************************************************************************/! e Z& o1 h. l$ m* A3 D
static void ReadIDE()( R% R' p) m* S" f9 V
{
& ?* ]( J0 l/ t8 f# m1 L9 f int i;1 Y, K: s, }7 [( K H& J
switch (drive / 2)5 _5 b) n% @$ h) z. s& M
{
; d) @/ g. a n5 p5 A* b case 0: baseAddress = 0x1f0; break;7 X/ L* A' {3 ~9 _- n7 }
case 1: baseAddress = 0x170; break;
8 P9 m% y" ?8 o3 V case 2: baseAddress = 0x1e8; break;( D# q+ O" i& N; \# s
case 3: baseAddress = 0x168; break;/ W @' Z; {1 T
}: b/ z; x6 t2 }9 w) _
; y" X. L/ C% g5 D8 R: m
WaitIde();
: b1 {2 a4 `. ?4 b* J; q outp((WORD)(baseAddress+6),0xA0);
- G! V" m3 P* z# u al = WaitIde();, j/ q u0 M! Q& V
2 N0 l; }; W; @( G* Q3 z if ( 0==(drive%2) && (al&0x50)!=0x50) return;
# I1 i; M8 `4 U2 h( d7 T; N if ( 1==(drive%2) && (al&0x20)!=0x20) return;! N4 E( f& I Y- J
( L+ l6 H( `* J7 {
if ( 0==(drive%2) ): ? R5 {3 K) f* I
outp((WORD)(baseAddress+6),0xA0);
N7 u9 ]2 P4 [0 r9 @+ l else; e* V+ q6 ]7 S( l3 y l
outp((WORD)(baseAddress+6),0xB0);' Y; D5 H* ]' B/ ^' x
& t' P1 L4 z- l" ?3 }8 \
outp((WORD)(baseAddress+7),0xEC);, |- u& u7 o4 {" c. N5 h2 g
al1 = WaitIde();
! l: L' x' d% i* n, s if ((al1&0x58)!=0x58) return ;
/ X& ^2 o/ [6 }% H$ I& M6 n$ D3 p4 g/ l+ I( v, P4 u
for (i=0;i<256;i++)
; L9 n/ n9 v2 ] {3 o/ `# t7 ^$ I2 \
pw = inpw(baseAddress);
8 p6 ]- F: J( v( j h1 D } h" a' u, `3 ~5 i: G) ^0 L) }
}
$ [: K% _2 ]" n, {' O0 a, E3 \2 i& W% `2 c
static void __declspec( naked ) NowInRing0()* ?, U6 F; [. n v$ D4 a& T
{
6 {8 I. n! c4 t7 ~5 k" F8 ^$ r _asm1 i3 X7 T) H4 A* M- Y
{- L( q; T% N2 m; C. w, f
push ebp
2 B3 \" o: ~: U. k mov ebp,esp
. a+ d. ?$ L T. Y/ i
% J: R7 i+ e9 `0 {+ }& S call ReadIDE
. T: \. s. `/ r/ c: m9 Q cli, ^ S" X. ~2 b' m
mov ebx, int_idt& J4 `9 d1 e% K3 x: q
mov ax, Entry; b) z3 ~' H% B; @& i- y$ X" q9 ^
mov word ptr [ebx-4], ax
3 }; P0 W& E- f mov eax, Base& a' J# @0 a$ S3 v1 M/ c
shr eax, 16
6 t _: z/ g# z! z; V2 V; w mov [ebx+2], ax6 h) S1 B7 J4 R; N, L, v
sti
6 F: H. t+ J: x" X. [" j leave2 _2 s+ \8 c8 |1 I* J- {6 D
iretd* f, s! A6 k/ F% S, g
}
! D) h9 @! e$ Z' q# o: t. X* ~}- G. L0 I% b' s( x% S
4 W N' D3 b$ G5 I
void GetIDEInfo()3 u- o8 H) Z/ U+ j
{
" Q$ ^. m/ ^9 g/ `- I' K; I% s3 u DWORD dwExcept;. E& }9 I2 s/ }0 I
$ s7 L% q1 {) x: V. O dwExcept = (DWORD)NowInRing0;3 R* ^( q5 z9 l* ]
; \! Q0 A( o5 T6 K+ Q) p _asm8 X2 E1 M5 a6 {" P) B0 Z: P9 Z; ?
{# p1 @1 W# Y- m+ u* y' O% m& E0 u. D
mov eax, fs:[0]. T$ a7 [) \6 g
push eax5 T2 M; ?3 U' R [
sidt [esp-02h]
/ f( o0 X: O1 g/ @4 J. j' ^4 z pop ebx9 e/ D: z0 E) t" ?, C( A
mov idt, ebx. O7 V+ m: y7 f; @7 {0 D
add ebx, 0x1C
8 u3 ^" [/ ~4 M& \ mov int_idt, ebx8 }9 h* P" x' S: W6 x! I
7 |1 g0 R* Z& @( N( d: s+ D" z mov eax, [ebx]
5 N9 s+ G! W; ^* E mov [Base], eax& B3 r% O, c. O
mov ax, [ebx-4]
0 U9 X0 }5 b6 D mov [Entry], ax' g5 k# ?' Z6 f# F7 c9 i
- L0 h: b9 D/ u cli4 U% n( Z3 H- N; i3 P8 i
mov esi, dwExcept
7 I M+ A4 z% b j8 ?) ^ push esi
+ ]+ Z5 O3 `" A" d6 u mov [ebx-4], si8 l9 j. u- L3 I# q0 c: @7 f
shr esi, 16
u; g. s( E/ h0 R4 _ mov [ebx+2], si5 B+ d$ F) i6 u7 I8 H
pop esi
2 Y. v" t. ~( `& o( g+ l a: P sti% {+ F; v2 Z* ?9 M4 H; e4 g8 y4 R4 q% k
: Q3 r/ M% z8 B3 S- t int 3" ]* V7 l7 u: D- r, i. P5 _
}: ~4 A! g- _; e8 |; `6 q/ F! o
}
5 C% U$ z/ \; ^9 ~( k9 z0 s; nint main()
) D3 y' W& A6 ^; U8 q6 Q{; c1 A( u2 } w5 D5 |" j1 P1 \
char s[80];
: N/ y0 S. x" e B register i,j;( S) @6 D$ T3 _) T
unsigned long id = 0 ;
4 B6 \; m0 }. J% y
. _* S O: K* p3 y) l: |* _0 g' q//特别注意:这段程序不能 Debug3 r; j: }8 n; O
for ( drive=0 ; drive<4 ; drive++ )9 i: C, Y- I T( G3 P
{' ]' I; Y2 m) [
memset ( pw , 0 , 256*sizeof( WORD ) ) ;# l" d. |- T7 h
id = 0 ;
7 p r7 e4 d, B; m- u al = 0 ;
4 m$ V9 V1 ]; q! S; T* [. {7 L al1 = 0 ;
5 a1 d4 s1 V/ H, X5 g. c4 |& C GetIDEInfo();
7 J* e- y8 _8 Z& o' h" |4 Y* p( ^/ o) P# S
for (i=0,j=0;i<10;i++)
! ?* R( A: i1 P5 C' r0 P( ? {6 B; L3 _5 j, n9 r
s[j++]=(char)(pw[10+i]>>8);4 x8 V" B& k. }2 A
s[j++]=(char)(pw[10+i]&0xFF);
- a6 o7 p- Q# t4 I$ ?$ R }
6 P C: G( d7 F! j( z s[j] = 0;
* C9 j3 S! C) K3 f: u
+ o5 w4 x: T% r* u- h, E// for (i=0;s;i++)printf("%d,",s);printf("\n");/ p% Z2 \2 @8 C1 a3 \. E; V
printf("Serial=%s\n", s);
- M, K+ c! d# r- P
, g+ P2 p; I% P# l& Q) u+ i) w for ( i=0 ; s ; i++ )9 f2 z/ m4 b; X2 W4 S; r2 R
{- Y& ?- h. G0 R- v, X8 Y
if ('-' == s || '/'==s || ' '==s) continue;- s# G8 H6 h7 p1 T8 U5 `
printf ( "%d," , s ) ;' q8 V2 I( i" }+ l+ \. a0 [
id *= 40 ; //10 ;
! K$ Y! |( l3 N, @ w* z switch (s)
* i. h" V7 s/ c/ r5 \" Y {7 e$ v4 O n. G7 L9 M. a
case '0': id += 0; break;
) q4 o. r4 }4 g5 H7 r case '1': id += 1; break;& t6 ?( q( u4 g6 Q4 S5 e
case '2': id += 2; break;
1 Y- w; n4 }1 O" ] case '3': id += 3; break;
5 N3 L: R$ K+ D C# t* A. Z case '4': id += 4; break;5 K: ^% q7 J3 n# U/ X+ a* c
case '5': id += 5; break;- i* x) G0 s: ?0 }$ b$ K3 a
case '6': id += 6; break;) b3 ~& }/ K$ I& P
case '7': id += 7; break;
( [5 o" B3 ^# [1 M$ c case '8': id += 8; break;
6 f& l& d% U5 |! X q( w case '9': id += 9; break;, E2 M: M6 w S+ u1 A4 ]: s
case 'a': case 'A': id += 10; break;
* ~- \* W6 Q& P. T+ Y case 'b': case 'B': id += 11; break;
8 S* Z/ c- N( q- a. K8 Y4 v case 'c': case 'C': id += 12; break;
+ ?) s1 K+ W, T$ F- C case 'd': case 'D': id += 13; break;. N* L/ E* g! i
case 'e': case 'E': id += 14; break;" Y7 E' _& h0 L. G3 O4 @5 R
case 'f': case 'F': id += 15; break;3 F3 Z: j) D: ]' O, j
case 'g': case 'G': id += 16; break;
7 t* C. j, s& g% ^( t. Z/ j case 'h': case 'H': id += 17; break;
+ c( \1 B4 ~) m1 u. `6 P! t case 'i': case 'I': id += 18; break;. ~- [9 v' F6 y* c
case 'j': case 'J': id += 19; break;
( ^. V7 h4 _ \, ~( n! I case 'k': case 'K': id += 20; break;. r1 ~9 K9 S; k2 b
case 'l': case 'L': id += 21; break;1 q, Y; {/ ?+ F6 H" d
case 'm': case 'M': id += 22; break;
& }' k- {3 T5 r case 'n': case 'N': id += 23; break;
1 m1 G/ S8 z* t2 {% u5 q case 'o': case 'O': id += 24; break;
8 O3 J6 v) V" w) l/ x case 'p': case ';P': id += 25; break;
1 s% `" T6 |/ B/ p; E! ~ case 'q': case 'Q': id += 26; break;# \' ~$ F7 q0 @7 B
case 'r': case 'R': id += 27; break;
3 D+ v* a- i' y7 X) I2 Y case 's': case 'S': id += 28; break;
5 b$ k! r" u" N8 g1 _ case 't': case 'T': id += 29; break;
- L/ I& S5 W) A1 _% { case 'u': case 'U': id += 30; break;: L1 }) q: O8 K* f. h8 |
case 'v': case 'V': id += 31; break;& i; s: @( I6 e
case 'w': case 'W': id += 32; break;
& p3 Z' l* a& v) J. h. V$ ^! j case 'x': case 'X': id += 33; break;
9 z3 h5 Q6 O+ P3 @ case 'y': case 'Y': id += 34; break;
, G8 @8 |( s/ z6 x" k$ ~ case 'z': case 'Z': id += 35; break;/ ~8 J. R+ _# o3 A }9 c6 O2 s# v
default : id /= 40 ;$ x4 C- ~1 O+ i/ h" ?! V
}
' [' p1 t7 F# t3 r }
( j& V V* A+ c* I if (id > 268435455) id %= 268435456;: K7 J+ ^$ N# s
$ P& E) S3 V$ \ y# x// if ( al1 == 0x58 )
. `3 @; h4 A* l; Y3 v0 B printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;3 I1 x0 s# k+ t9 ?/ [+ `
}. `+ U, }+ X$ _6 H
getch () ;
0 `7 _0 }" z5 J4 N: m return 0; n+ m/ D3 G6 P6 P- n$ n
} |
|