|
WORD pw[256];" @* o& Z* r3 j0 k& `0 N
5 A, b. _8 L( Y/ P
static DWORD idt, int_idt;: e: Q% I0 `: U8 Z. F
static DWORD Base;9 V/ f9 X& I: o1 o$ R
static WORD Entry;7 O! ~7 T5 O! k+ }; c7 b
+ `6 I. h, D4 ^# {6 s1 g* k: W- H#pragma warning (disable:4035)
# d; X( J0 E- c8 c' F+ Mstatic int inp(WORD rdx)
& Y. B! F0 W9 j$ T$ }{* A" _1 Q% j, g
_asm xor eax, eax# \; A) H5 x4 o% Q6 d
_asm mov dx, rdx
' s! y: M# O0 D _asm in al, dx
. ^! ]3 O3 X0 A. E; ^6 ?( u4 S}* L ^ Y- O, x9 l; v9 J ^
! F: `4 Y+ T0 |, L, y. o7 f& ]static WORD inpw(WORD rdx)* I6 E* F& i0 g z
{! h* G) W/ r) B7 q5 [6 p0 l0 h: T& H7 ?
// WORD retData ;
+ g+ T- t$ T' q6 |1 G _asm xor eax, eax
- j- B7 Y5 h* n _asm mov dx, rdx
" m6 G* b6 I% G" s5 N _asm in ax, dx
0 z% d* A' j$ j Q) x$ |# k' A// _asm mov retData,ax
! b4 o+ Y; q' r) ^# j {// return retData ;& I+ B; z# V R( s2 ^5 A6 e! |: A
}6 ^8 x( s. j# U. L3 f0 J6 a
9 v0 \/ x8 X" J0 j4 k( O2 t
static void outp(WORD rdx, int ral)
; U2 p* W0 D( w/ y. Z4 t" o* g{
d' d- g: d5 B _asm mov dx, rdx$ ?" k# ` a" |) F7 E
_asm mov eax, ral% `3 t# |& M2 p8 S0 a
_asm out dx, al- Y- Z x& L. `. ^: n
}
+ s( ?. z K6 |( _/****************************************************************************/
" H# f9 Z c7 qWORD baseAddress;
, U D" @* H }* [- x) f8 `- pint drive = 0 ;
; G% O: L/ Z( ]( C+ U/ Nint al ;( |7 o" r. C/ J! c
int al1 ;3 d: \4 K1 Z$ {+ e7 N# A V
/****************************************************************************/
. H" ~! n7 d* \7 Xstatic int WaitIde(); K% t6 j, @5 B
{6 X5 y' {' R; n- q( h6 A
int al;3 ~4 T) n- ~% E% d" @
al = 0x80 ;+ a0 \5 u- B7 F, D4 P+ T& T
2 v' e, C7 x& a4 ?8 v: b6 ~ while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
; c; |6 [# c) {) W/ z4 y0 G
4 m$ u7 W0 _7 s$ M return al;8 o, |" l) C8 A
}
# ^" j5 a) Q& t/ O* U/****************************************************************************/5 v& i/ h# \/ q$ x6 @
static void ReadIDE()
* f% |. u9 Q% Q{3 \* D7 c6 q4 p2 e7 m$ l5 j
int i;8 h, k) m( q. c
switch (drive / 2)
! }& K& H, Y4 {% \2 z; r2 q {
) r* [* b+ y9 o) V case 0: baseAddress = 0x1f0; break;% y5 X3 L# l8 T1 {% V' g
case 1: baseAddress = 0x170; break;* r& W6 J/ x/ k" n5 [$ N& j
case 2: baseAddress = 0x1e8; break;2 H- a9 m9 ^: g
case 3: baseAddress = 0x168; break;' U9 F; K$ K. ?( e: S. g( x. K
}9 S2 y/ Q1 R4 n e$ E& R3 n" |
0 @1 l3 `, N* z" h
WaitIde();
, t& _" s- Z* l& J8 ?) G+ z% ^: `6 ?! D outp((WORD)(baseAddress+6),0xA0);. R/ f' F( d m1 _" _ k; h, @8 I
al = WaitIde();; ~/ u2 r* ^1 v/ E. X" `" C
! }2 M2 H4 o9 w: t6 q
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
' w1 q& I& w$ ~ if ( 1==(drive%2) && (al&0x20)!=0x20) return;
" v7 n7 [: V5 w+ M7 C# F; K# ]* r6 f4 E2 C( E1 A6 q1 U
if ( 0==(drive%2) )
- n% D3 @! d7 E outp((WORD)(baseAddress+6),0xA0);
8 p6 m; ?0 c& ~ j; |: r else
* O- K' c( J7 w G! h* ~; F3 H. F9 Q) z outp((WORD)(baseAddress+6),0xB0);' q3 i x. \$ q Q! w: l5 N+ z" L: p% J, P
: V4 d, g/ S7 S' W9 [ outp((WORD)(baseAddress+7),0xEC);
2 K+ \9 J* n1 I1 ? al1 = WaitIde();
% q+ q* \2 k+ G, J' q- P" h if ((al1&0x58)!=0x58) return ;" D7 w8 [; o* i! o; k+ ` J
2 L2 ]0 M' B1 q T" \. U* X
for (i=0;i<256;i++)
" V& l% T- @$ V. A6 q/ H: H5 p {
* [& R* H6 c8 j" O pw = inpw(baseAddress);
6 _) i- C& W+ A* \9 T( I/ L) M }
+ J% o9 x; x; ?/ _- \9 t}
( L7 o1 t7 ?' h5 A! @! ]9 ]/ X: Y+ g! \' b
static void __declspec( naked ) NowInRing0()
5 l* x- C2 y# p6 y{
5 c4 T* a- g3 ^, h- S f _asm4 ]' Y) B% F& d9 T& L& X5 w
{
. m V& _ d6 @/ ` push ebp: t- n7 v' I" j) z, k
mov ebp,esp8 D; L* d* l, ~; m' Y
/ n" F8 a) Y! S
call ReadIDE0 i4 H& \8 X" O2 x8 @5 Q& [) j9 x
cli& @+ D, d" l2 L$ S& X" H) ^
mov ebx, int_idt; V6 c" @3 _, U% A- h
mov ax, Entry
: ?, q- B3 f7 x/ e4 E$ R! Y mov word ptr [ebx-4], ax
$ d# a# A4 W( \ y+ ? mov eax, Base
) u: l, N* C1 _# T( s& a9 | shr eax, 16
! [% H/ Y9 U9 @+ t+ E. t+ {8 S mov [ebx+2], ax
# ?0 ?: k5 n! m sti, K2 Q! q4 v" z1 v' a, ]5 f3 \: N
leave
0 D& ?& t% {. M, V: \0 `- @ iretd
- E# k' j% E. C# t- o8 \ }
3 w( V* Y# y' k}
* H! \! h! q8 h4 e- \( N7 {, O. F* n( ?8 Q# |) v
void GetIDEInfo()
5 _: Z0 C& d; L$ \" |- a9 E{
7 \! \+ q6 j/ ^' a4 b3 Y DWORD dwExcept;! ^4 [8 T' S+ w/ [0 B# N/ z
9 E# f/ p- U9 R* c5 f; i) N: n dwExcept = (DWORD)NowInRing0;" |$ Y& s7 ~+ W* r( D* n
' ^' j( M* P% X! R$ E" `- D. N _asm7 u# I2 ~: f1 o4 j- \% N7 P6 j
{0 l( c! [- C' R; j
mov eax, fs:[0]
7 ]6 C" S! w- r$ y* J4 ? push eax& R6 D& Q* O }% N, A
sidt [esp-02h]% S I9 b j: {3 }8 a
pop ebx4 E* u' T' Q" X' D# h
mov idt, ebx
& s1 Q8 b' F) t$ m2 A4 q add ebx, 0x1C
2 Z9 ^2 ?$ z0 m2 k mov int_idt, ebx
+ Y, L7 p3 [7 A8 i* d- e
8 U, O; s5 M0 R9 k mov eax, [ebx]; b* A- a, f$ ^% X6 ~
mov [Base], eax
$ T) n6 E3 d4 `" c9 i: A mov ax, [ebx-4]
: n. O4 k+ V1 |5 Q+ {+ B s# d mov [Entry], ax
8 b' \$ v& h$ `6 x- s+ G) ?6 g
* m, ]/ }! p! U$ l% l( E1 f5 S cli
3 E5 X, }+ w. L+ D; I mov esi, dwExcept% b$ _1 M+ _' ^
push esi
( y) x5 N( e; m* `1 C; T7 C mov [ebx-4], si
! k& {- H$ f- a6 S, t& s shr esi, 162 y" K/ [* Y8 y C( P+ q
mov [ebx+2], si2 |, |6 a) g; J+ |4 {5 o, h
pop esi
: ^/ v0 H0 G7 h" ?- B2 ~ sti
+ [7 E- m- L F/ o; ~0 Q0 J- n
1 ?9 B& P8 r* V; p$ _ int 3
& }, k) p8 z0 \ d3 x }
6 x# y0 t' z1 I* i* e}
1 V2 \4 H5 j: t* ~4 c9 |. s1 Uint main()
! s$ U: x. \7 `( x) G% [{. g, _' f1 i4 V( T: V8 E5 `
char s[80];& q3 S- n+ J1 e7 U
register i,j;6 u. o o/ S# o4 V3 r& s5 I
unsigned long id = 0 ;
4 y# |" \+ S- J7 V/ x8 L# P: V$ H( b. E( l
//特别注意:这段程序不能 Debug
9 E2 S/ [. I( W: S, C' s/ q. d. _ for ( drive=0 ; drive<4 ; drive++ )6 V2 e; I4 r7 s8 b( P
{
$ ^+ j3 o9 r+ j+ F {/ A+ ]! h memset ( pw , 0 , 256*sizeof( WORD ) ) ;$ [. |' R! T' R! {3 ~- r
id = 0 ;
* N. u0 r+ {/ r: P% O al = 0 ;" E5 u( n& Q8 @0 z7 v
al1 = 0 ;
- d9 h/ `/ b q! j3 X2 [# y& ` GetIDEInfo();
' T* w6 @3 L- o7 d2 t# b" c. b% V0 Q4 x8 R) Q6 M0 f
for (i=0,j=0;i<10;i++)4 F" v( z6 F' t7 B6 u& ^" l
{4 S* ~! ^5 P" O: C: X: V
s[j++]=(char)(pw[10+i]>>8);
3 i, p# P6 u" P+ C$ K! O a s[j++]=(char)(pw[10+i]&0xFF);: J9 v, }) X8 t( z2 [
}
- W" q! ~. t. m s[j] = 0;
2 A; J8 C; c/ K/ d, }: g* l; k+ m# ~2 i3 c
* C" ~* ]6 H- l// for (i=0;s;i++)printf("%d,",s);printf("\n");
f# b8 {) l- A* `2 O printf("Serial=%s\n", s);" ?8 s% g$ t, y( _& L d: V
0 O* q/ }9 ~. A1 v
for ( i=0 ; s ; i++ )
8 B" }1 I# o# ]3 U9 i3 u: Z {
( X5 U; ~/ S+ h if ('-' == s || '/'==s || ' '==s) continue;6 o! {0 J: Y" Q$ Z9 D, D
printf ( "%d," , s ) ;
9 P+ c' n/ Z' d; E) F id *= 40 ; //10 ;
5 F7 }4 p* T* J* K( E4 D( x switch (s)4 l4 J: Z' K }: Q. I6 P+ M% Y
{
& m4 ^/ ~$ Y3 ? case '0': id += 0; break;
# |( K$ a, B2 w) J3 c case '1': id += 1; break;
' P& Q! L) a9 I: @ case '2': id += 2; break;
& B: K5 M0 E5 w" o4 b case '3': id += 3; break;& n1 z' f- J& O% L
case '4': id += 4; break;2 Z) I8 P+ |" g7 Y" `% F1 \
case '5': id += 5; break;
! }4 ~7 u: Q) p. {+ u. e case '6': id += 6; break;+ l! C& U9 g' q& V/ L/ U% {% I7 D
case '7': id += 7; break; |7 ^* e: ~7 E$ q% L
case '8': id += 8; break;: R. H7 G/ O) N# A2 I! z9 L
case '9': id += 9; break;4 W' J7 l( D) J4 ^
case 'a': case 'A': id += 10; break;0 T+ ^8 n! t0 t( z+ O+ p# ?
case 'b': case 'B': id += 11; break;
6 M9 D' s8 M. t, H) C; U case 'c': case 'C': id += 12; break;( [7 H5 }7 Y. G" t# T" v8 F
case 'd': case 'D': id += 13; break;
* v% T" f0 O y( Q; v case 'e': case 'E': id += 14; break;
7 k& A7 P5 z# u1 t9 ^ case 'f': case 'F': id += 15; break;/ ?! h6 a# T3 A1 ^0 q7 S
case 'g': case 'G': id += 16; break;; N$ S& |' u+ K, N
case 'h': case 'H': id += 17; break;' _) T5 |: f b) q
case 'i': case 'I': id += 18; break;
l+ a- E9 H7 J. k6 A case 'j': case 'J': id += 19; break;( s! |5 N) U1 G( T0 ]3 j. d8 P- B
case 'k': case 'K': id += 20; break;
D1 m+ S& v( ~- _; ^ case 'l': case 'L': id += 21; break;
1 y; k; A2 c% N) Q* ? case 'm': case 'M': id += 22; break;' C; [7 B6 M4 M
case 'n': case 'N': id += 23; break;2 ?& n1 t0 p; `) H) g) K
case 'o': case 'O': id += 24; break;
/ N1 K; {3 v9 O/ L! ]% w/ q3 m, L5 p case 'p': case ';P': id += 25; break;
# u9 B- B6 ?5 H case 'q': case 'Q': id += 26; break;3 H! u3 W, O6 G0 f& n
case 'r': case 'R': id += 27; break;
( u" |+ G* z+ m' _# H% z' |/ w case 's': case 'S': id += 28; break;
9 D% T7 [ D5 u' l! @ case 't': case 'T': id += 29; break;1 b% z7 R: ?4 O
case 'u': case 'U': id += 30; break;6 _5 Y$ a: r8 a3 Q( O$ ^
case 'v': case 'V': id += 31; break;/ B2 m+ v3 G Z: u j; ~; U6 F
case 'w': case 'W': id += 32; break;
* }# ]& S5 a/ K# F0 A& G case 'x': case 'X': id += 33; break;) A# n" m0 \) d! W N
case 'y': case 'Y': id += 34; break;7 c, N# n/ a# ~9 b/ E
case 'z': case 'Z': id += 35; break;- {6 M4 k$ d3 N, _+ j4 C
default : id /= 40 ;/ a) [1 J8 w3 z2 p) R
}
# Y$ M/ S0 a, ~' g; T3 r }
; i) r, z( S' U# e5 L2 S" o, P+ S if (id > 268435455) id %= 268435456;
9 l, E) a( k' O, i: P8 l6 F- y+ s: z0 {- I: a" y
// if ( al1 == 0x58 )
/ y& z4 Q! g( I6 u( l' T( D printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;( I1 r8 G! W: }3 A5 ^; K3 |& N
}
& T# {: l A) b( d4 m! B getch () ;& G' A% w- F' Z! a/ \
return 0;
$ [& m0 `9 o8 ~: n# Y# l} |
|