|
WORD pw[256];5 O/ ?2 ~) o# I% [" ^7 s, P
$ m/ I7 X" O- A3 I$ G- x) o
static DWORD idt, int_idt;
; p" w( l- E+ A5 g! ostatic DWORD Base;0 ]& f6 `9 `; [/ g2 g/ ^$ M
static WORD Entry;
0 u2 L- `% K; H4 N0 G% Y$ g1 {. V, H' Q: M' ]. I1 P' x
#pragma warning (disable:4035)
3 ?" A+ U3 E5 m' B8 T+ F; g+ Ostatic int inp(WORD rdx)
8 q+ c$ |" H {7 `* p+ f9 {{: L0 C5 f {. r6 U4 V3 I
_asm xor eax, eax
# ~' L3 d5 T, M5 e; G, B _asm mov dx, rdx# T8 z1 r0 w+ a' o+ d0 a; n1 B
_asm in al, dx+ ~* [3 p+ a9 z; F/ o5 D
}1 I8 h9 F- |- Q$ A( f2 V" X! \, \% f
! c( a; d1 x5 p# f; F
static WORD inpw(WORD rdx)1 p! [, C# i; G. g) h7 g# I
{8 N+ J& |7 q% m8 t# s7 A3 y
// WORD retData ;* C7 r' j3 c4 r' @/ t2 S" ]4 a
_asm xor eax, eax3 }9 _& Z% r; r' }" E
_asm mov dx, rdx
" U; L, j5 @! T; `- r _asm in ax, dx
* K5 Q% ?/ `7 P* J' _// _asm mov retData,ax7 e7 n7 n& V2 C" _* x
// return retData ;
* s# F6 d: ?# z- w# _}% t& [! ?2 t3 J: g
. m. J. H0 N; p- r. V Wstatic void outp(WORD rdx, int ral)2 L! A3 z1 `/ w9 u0 f4 ^
{
( T \3 Y: t# ?8 j; O- Z0 V _asm mov dx, rdx
2 k: C7 w( f" Z. V3 D, G _asm mov eax, ral
. v# q5 R! m* U V _asm out dx, al9 s( r: e( s- m4 u
}# j/ q1 t4 J1 e/ B) \7 K. L
/****************************************************************************/
% \5 k0 \% C* U$ d& Y$ O" g8 r$ D! XWORD baseAddress;" J) T- s9 H7 w9 g# k
int drive = 0 ;5 Z/ P. ]& |7 [2 l
int al ;, K+ g& C4 p0 U% s; R
int al1 ;6 t: H0 f) g' Z; g2 r
/****************************************************************************/
2 |% A+ L0 ^7 Y- a& z/ n, f2 cstatic int WaitIde()% e4 b0 B& k e
{
) P. Y# q7 U: y/ [ ] int al;/ O* l& }8 P' C5 W9 ?- V" Q
al = 0x80 ; i% ]% @6 ^# A
, q6 Q- @+ \2 ~! l* C while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;; D- E% x0 v4 a
9 d7 e% a y7 U' O% ] return al;
( J7 [! @/ h; {1 c( {1 T; z: u0 C/ e}
/ y- _# ]6 n' h0 o! _/****************************************************************************/
6 y& t- Q( U* B3 W0 O; U& jstatic void ReadIDE()2 }2 f' [: J( Q% p4 B- F3 @
{
3 q0 I6 K5 T0 Z5 R0 j int i;7 V0 ?2 \# m( L" x
switch (drive / 2)( c6 \+ B6 c; U! t' W
{
o' _" G0 `, Q* ] case 0: baseAddress = 0x1f0; break;
) e! x. h7 q- B( A+ H case 1: baseAddress = 0x170; break;* i+ y- x' P! J% U# P+ D3 I
case 2: baseAddress = 0x1e8; break;
- }2 P; H& j; @* D4 y h$ s case 3: baseAddress = 0x168; break;
$ g$ x, H7 B. K* p }
1 a6 h( a) F* ~) m# c- {( T
* p- @+ x& p$ r7 q r WaitIde();3 ^: t* X5 F }& S5 {2 N
outp((WORD)(baseAddress+6),0xA0);0 d5 J5 g2 H, G" P) |2 W( }
al = WaitIde();
4 L* E* t9 O3 v7 P
; F2 {* `3 F7 @+ d/ I- x( w9 i if ( 0==(drive%2) && (al&0x50)!=0x50) return;0 n* |4 x, W( i6 B7 K
if ( 1==(drive%2) && (al&0x20)!=0x20) return;* w0 W5 o( ^' v5 O1 c0 C
" n$ ` P- K& }. n) {* G l: g* U if ( 0==(drive%2) )- M4 \ k4 k6 b. F, Q/ f1 q) n0 P
outp((WORD)(baseAddress+6),0xA0);4 n8 z! p; r' f
else0 u: X q9 H, a0 U* l
outp((WORD)(baseAddress+6),0xB0);) j$ E6 z* H8 c7 ~
* c/ W/ ]% F# y" e$ T _
outp((WORD)(baseAddress+7),0xEC);
2 w! a& i8 q6 }1 D5 d al1 = WaitIde();
$ h. [7 h3 l- V5 ^% a" O/ F if ((al1&0x58)!=0x58) return ;
$ |! r# T0 V+ @1 O
+ M( E1 @5 O2 |' W I for (i=0;i<256;i++)
* P7 B3 Y3 t, O, O" n5 w {
$ O6 f( B, x0 G pw = inpw(baseAddress);) ~ u; x; W' X9 ^( s7 D8 X0 p% z
}9 v' b/ `! x- W
}, {5 |! E7 V3 Y# b V5 t
6 X. E# G3 v7 Ostatic void __declspec( naked ) NowInRing0()
, ?. Y9 L. X( o; N' G4 l{. T7 Q# e: d1 d0 M
_asm* f# B. Y4 u6 m9 X
{8 x' p9 J* G3 i6 H
push ebp) h! M4 f4 n5 p3 n5 M @% j
mov ebp,esp k9 f5 W/ d/ ^* X! c+ K! l' P
T5 ]. g8 w6 B. G5 y- R
call ReadIDE
1 h3 A: E$ \% x0 c cli
% F7 `) o! q( k4 W$ _0 J mov ebx, int_idt
1 I3 p* h8 y7 H* Y3 O7 p7 c mov ax, Entry5 o/ K% R; w7 v2 y4 q- k W1 X
mov word ptr [ebx-4], ax
) {" E4 | u$ C3 ] mov eax, Base
/ f" k: x# R, X2 _: N1 O, ^ m4 t shr eax, 16
) i# T w8 s& R8 S- p5 J; ^9 G mov [ebx+2], ax, A' T$ v. l+ x3 z; I$ B: z |
sti# G3 R7 J6 w7 C0 p9 Q) ^" a) m* L
leave
# U1 j) {% f; n iretd
- f. }4 m8 w- p0 X: W# t }; Y/ `" t8 E4 C, D3 K$ x5 u
}: d/ i, m; _8 R+ y Q5 s: _/ {
9 w8 d( c' H7 O# H9 Kvoid GetIDEInfo()- |4 ^' f$ ?) ?6 [. v9 h0 ~
{
! s, p; Y8 B* G* H2 { DWORD dwExcept;
) _: x7 j8 o; X+ h, n6 \3 J/ x' o6 T8 X
8 U5 o/ b5 R% p dwExcept = (DWORD)NowInRing0;
! h6 Z+ w R: z! F7 y9 F8 R$ o- v3 l+ p6 Z; s
_asm; j2 ~& w1 d" ~% h) u
{% p- t5 a" K1 Z' m( c
mov eax, fs:[0]
0 n) T% V6 p2 ?, K, j5 {* w0 | push eax- J2 P$ x3 b7 i" Z y
sidt [esp-02h]
7 b3 i4 W$ z- b5 s pop ebx
. m6 ^; i: x8 I1 [ mov idt, ebx
0 k7 D4 J) [; A$ P add ebx, 0x1C1 d% d3 k6 A7 r @
mov int_idt, ebx
- i" l& R2 a, M6 K9 {2 G: h5 Z/ R/ o' K$ z z
mov eax, [ebx]
# W+ l4 R) B$ [ g7 i- a$ X mov [Base], eax
, l3 T% \6 D! n8 J, N mov ax, [ebx-4]
G) q z5 H1 r M/ E' m mov [Entry], ax+ P5 K" P+ Y; I7 `
3 T2 k" o" l' h$ M2 X5 i# G cli5 V$ z9 k& L1 {2 a3 ~/ R
mov esi, dwExcept
2 C. q$ i( m3 n$ b- e push esi
; ]0 E+ n: I- F0 N9 ? mov [ebx-4], si
% w! \' F( D1 i2 F+ }4 V shr esi, 16# x* d& S3 P6 Q9 X
mov [ebx+2], si
$ G! } R" d+ v4 i" Q8 v pop esi
9 m, G" F; R [% T sti
6 z4 c4 L, n. n- y: U
7 U, i% ?( O2 Q {: P+ [ int 3, @& Q" ^2 y; N, ~% d/ q1 I
}" _0 g! x! F0 ~! @$ W) g, g9 _
}6 Y# v) q2 O, `
int main()
" j8 [) q. Z. D/ J, q{
% u$ d* D/ N3 g) S/ D Y char s[80];5 X, Y F% C# t- S( _
register i,j;, m4 z7 `3 {" B
unsigned long id = 0 ;5 Q) }! `6 b; X8 _
2 {+ f) c- P& m8 n3 Q* _& w//特别注意:这段程序不能 Debug
5 }4 n% s* F$ F1 S! }% K. D, p for ( drive=0 ; drive<4 ; drive++ )( p4 V* _* L, y, S( l
{5 ]( D7 o# j0 P( j, j$ w k
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
/ @, {* v+ z: P! G! \: L id = 0 ;# ]$ |) v9 n8 E- V5 I+ `9 h
al = 0 ;
6 [/ A. ?) c0 p4 U) p al1 = 0 ;
, a. Q# I0 t) l, ~ GetIDEInfo();* E& J3 ^! }$ t7 W& C' W
- k/ O# L6 {7 d4 ?2 ]. y2 C
for (i=0,j=0;i<10;i++)
& t1 D# @$ `# F6 ? {
2 @# f. I3 j, _. P+ d, e s[j++]=(char)(pw[10+i]>>8);
}, H! u6 {9 f0 v( f s[j++]=(char)(pw[10+i]&0xFF);/ k) N" Y7 D4 ]# n* [7 `* }
}
1 r4 ^) h+ C9 f' ?* c6 e# z! Y: q s[j] = 0; c7 D4 @- {% ?- Y$ m
+ v* [3 a/ d; E% Q7 S0 `( c
// for (i=0;s;i++)printf("%d,",s);printf("\n");
. y5 A1 x; L6 {( @+ P3 E printf("Serial=%s\n", s);+ J5 P; }9 u# q9 m
6 M! `5 U. P- C" B' h! ~
for ( i=0 ; s ; i++ )" J! J% k; d5 X" z
{/ x0 I l& g" N7 E j, F
if ('-' == s || '/'==s || ' '==s) continue;
) {" F' N1 ~- i( d$ P9 W printf ( "%d," , s ) ;
7 \7 @9 U& ^; m; E! d: v1 r; k, g# w id *= 40 ; //10 ;/ d3 x# O/ O( ?& H
switch (s)
. J) Z8 A+ g1 N0 { {
( n* m1 q7 U: Q; x; l: b case '0': id += 0; break;) ?/ S: }' i) y4 @* T9 m7 I
case '1': id += 1; break;
9 F$ [( ?' ^0 ?6 Z0 w4 v- k case '2': id += 2; break;
8 h+ ~5 l! H2 Z, Z r5 { case '3': id += 3; break;
( M" E r0 ?; H N case '4': id += 4; break;
; P- J: d4 `( P/ q3 O1 r7 o! X& M case '5': id += 5; break;
" s; Y$ M# u2 K; x) Y case '6': id += 6; break;
- o; }9 Q1 @, V case '7': id += 7; break;
( _9 x ?; y4 t* o2 F9 t! } case '8': id += 8; break;3 q' [. }) M) s6 Z) i
case '9': id += 9; break;2 [8 X; J, \( Y* S
case 'a': case 'A': id += 10; break;
- n" q+ W+ U, o case 'b': case 'B': id += 11; break;! T# P1 H4 b/ q, G$ @; Q6 @# w
case 'c': case 'C': id += 12; break;- u" I+ k' A) `3 d+ \6 o$ _
case 'd': case 'D': id += 13; break;: I1 B' t; d5 N! o7 } k: Y
case 'e': case 'E': id += 14; break;
) Q* h/ T ?& L case 'f': case 'F': id += 15; break;% F3 ~$ G! J# H, e8 Y& `* z
case 'g': case 'G': id += 16; break;! H3 F: G6 ?) }) O- e
case 'h': case 'H': id += 17; break;
9 w# z4 s/ t1 Z4 G& J case 'i': case 'I': id += 18; break;5 [/ m0 I# Z% A. c( k8 @
case 'j': case 'J': id += 19; break;
# ^! A# P& i* T* C+ R4 l case 'k': case 'K': id += 20; break;
0 w2 \1 o0 O9 _1 k# L case 'l': case 'L': id += 21; break;' Z9 m N/ O# ?+ m! V$ ?! s! v
case 'm': case 'M': id += 22; break;4 m4 k r' B3 k* {+ M9 i
case 'n': case 'N': id += 23; break;
. j+ S. e/ u4 F7 J' d4 a( E case 'o': case 'O': id += 24; break;7 I% Y+ _: n& P4 c+ s1 r2 f3 Y
case 'p': case ';P': id += 25; break;. z D7 Y/ m% q& ?
case 'q': case 'Q': id += 26; break;! ?% B" O: u0 f
case 'r': case 'R': id += 27; break;
6 s( J6 ]$ h! F2 S, L5 x i case 's': case 'S': id += 28; break;
1 g3 v" Y; c7 t case 't': case 'T': id += 29; break;' t4 q3 |3 `; d7 d. ~# n7 y3 ]
case 'u': case 'U': id += 30; break;
( ~" R5 f" z# `) T' `5 V! y' q/ ?. O case 'v': case 'V': id += 31; break;# v- ?/ J8 w' ^% ~4 ]" L* R, }
case 'w': case 'W': id += 32; break;
2 A6 p) c- ?, d; X) s case 'x': case 'X': id += 33; break;6 [- [' Q( Z& d6 L
case 'y': case 'Y': id += 34; break;
9 d# S* N( i% v9 L9 ?! i! K case 'z': case 'Z': id += 35; break;* ]0 }+ l/ d5 P
default : id /= 40 ;( `+ v$ a! o% w" [/ ?
}
: D& x" e, a! m+ n+ ~+ g- O) E" i }9 O& W1 V, k/ _; O2 x3 A
if (id > 268435455) id %= 268435456;
: c# V! v# x( X# Q0 D
- {3 A) y* V, i4 N. L// if ( al1 == 0x58 ). M. y; @ `1 y# a
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;# H" c& x# t9 Q. E/ X" U7 v
}
) e ]3 [, j0 R getch () ;! ~5 L$ s# `! A1 \0 i3 u
return 0;1 n! {1 U. |, K" a+ o2 C a/ _
} |
|