|
|
WORD pw[256];' n$ V6 O' R8 o5 h& B5 b |
* t l% u4 x8 H/ t) ~static DWORD idt, int_idt;
" r z9 H4 ~9 n+ Kstatic DWORD Base;1 x l6 |. C0 {6 x$ t/ M4 M
static WORD Entry;
4 t5 ?. p% I( A, t1 ?
" m: e: t9 [! X& |" n#pragma warning (disable:4035)
/ H" `/ a6 |2 j/ `- i" b! bstatic int inp(WORD rdx)9 r3 F. I+ U+ N
{
1 X @3 D. c8 a/ K+ @" p5 |. T _asm xor eax, eax) c6 X' \# I' O$ J4 m2 K
_asm mov dx, rdx2 V6 b) m2 X( L
_asm in al, dx, Q0 O! b4 }- k; I$ g W$ ?
}9 j: X) a& I5 d( t6 G1 v
8 Q' h$ r/ R/ H6 [% z& M
static WORD inpw(WORD rdx)
+ v( h) f7 T2 p{8 ?9 K3 b4 a6 M# z% M1 y
// WORD retData ;
9 `' X; d; ~8 Y5 }1 a0 h4 f _asm xor eax, eax# g& I, I' i8 m0 O u! x
_asm mov dx, rdx
2 T8 ~; r- @3 O/ C' q _asm in ax, dx' I! t: _+ V, `1 F" V
// _asm mov retData,ax* x( M. W3 H* [9 {" F( X1 ]
// return retData ;
; q0 P! z3 u3 V3 j l9 f}
" x& @+ `3 }4 M1 H
: [. S t$ T, c) O% Sstatic void outp(WORD rdx, int ral)
& F5 r8 y, c1 {1 s4 d/ g{
, i# z( T& z* P1 L; ` _asm mov dx, rdx
7 k6 G+ Y' O5 A) W _asm mov eax, ral9 c) y' G2 `8 \# V/ X
_asm out dx, al- [( }0 @! E' h9 e
}3 D% H8 e& `6 y, V3 I
/****************************************************************************/
+ G' u% }$ f' l% F" {6 |) C. _- xWORD baseAddress;
0 x! W8 @4 a% ]: k3 |" xint drive = 0 ;
* F# g# q. J t! `5 u% zint al ;, b; ]# |: W& m4 C
int al1 ;& ^0 y) f# d. g6 C' a7 S6 l' `8 `
/****************************************************************************/
, h5 X' l) Z( w2 l% X( X* t+ S* Gstatic int WaitIde()
' {- f; A; s( [* [( Y{- s: E( K; N9 A& F/ S, `/ f
int al;
" O, ^5 e* e! q al = 0x80 ;
: x _- h# [# l$ t1 K2 b+ g6 b7 }2 C) y( B
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
0 b1 l% v1 k) ]1 R
( N' g5 K) |" G return al;: a9 H! O5 m2 [' U) ~, \$ i
}
6 l' D6 e% X! k% a# J6 H/****************************************************************************/
5 X% `) ? n- q- I& Jstatic void ReadIDE()
- H) W: O! U5 X% ^2 ~; P{
+ W0 H+ G2 C7 x1 v int i;
; ?! ?# j) L& r& X switch (drive / 2)
% u8 n& O" J/ | {
9 V: f$ f6 J7 l# I case 0: baseAddress = 0x1f0; break;- V6 a& u6 U" i& Z# b
case 1: baseAddress = 0x170; break;
9 \" _( f2 u5 Q0 {3 A4 r. I5 X case 2: baseAddress = 0x1e8; break;; Y# C' ^* S7 q0 m6 |) v
case 3: baseAddress = 0x168; break;# Z k3 R1 ?( B) W% b9 k$ r
}
. ]4 p+ A0 G; W: X; E* b: {* n# U1 l. P0 j- O
WaitIde();1 m4 p$ b+ T, z" l# i( a" d* G+ a
outp((WORD)(baseAddress+6),0xA0);5 W9 N( K4 A4 g! L5 m
al = WaitIde();
- i2 j U9 c, _9 M
# B- c! N& s9 | if ( 0==(drive%2) && (al&0x50)!=0x50) return;
! L& J) W- `2 i- i# `+ m if ( 1==(drive%2) && (al&0x20)!=0x20) return;
C! {" J9 L5 x3 z" o9 W8 a
5 a, T9 B. x g: [. s1 n6 H. Q if ( 0==(drive%2) )& ~5 q' N6 V! R
outp((WORD)(baseAddress+6),0xA0);
: ]1 e! p8 ^2 j& b8 k4 Q9 C5 ?4 ?# ? else, O5 r( e' b% t3 E4 d
outp((WORD)(baseAddress+6),0xB0);; T7 O/ i( W8 M! u5 {7 B
. `4 A$ X6 t* t: ^: L" ]8 ^ outp((WORD)(baseAddress+7),0xEC);
: o8 F3 j9 ?! y5 v5 \ al1 = WaitIde();: Y" P0 m2 p5 A: k0 h4 g. T
if ((al1&0x58)!=0x58) return ;/ V% B$ K P9 C0 ^) l
) J. y* V W* P" p/ C) Q/ p4 Z/ G) F. f# | for (i=0;i<256;i++)
) A% I/ U& v7 h; q {! V: s2 L3 {/ `2 p
pw = inpw(baseAddress);
t+ ~' E& R% K6 s: Y }
0 n; ^$ O, |# g8 {* S( F* }5 Y}2 ^9 F: j+ u5 }9 b3 M& w4 v! [
, b) w- Q: o! X! |* K) P1 istatic void __declspec( naked ) NowInRing0()
) V1 }* |/ |% U. Z, y; V{9 |* e$ O) m5 V: _! e
_asm8 _ x: s; g3 K% C+ k
{
: V8 v. Q' g' E `5 ^% B* L push ebp0 p1 X$ \* Z/ u, s
mov ebp,esp$ K! R) f0 G% y
* |& E r M+ w* u7 l3 A8 G call ReadIDE
+ k) B8 T" L2 {. I2 c: Y3 ? cli
% V7 t9 o1 t- @, ` mov ebx, int_idt* c2 \' k5 S' v% k5 B: g+ f
mov ax, Entry0 S) W+ n4 t; g' g9 B* C1 ~9 L( ~
mov word ptr [ebx-4], ax
4 n2 y6 T8 i' v+ K0 X; D4 n2 q mov eax, Base
% O- {. n- u1 e$ ^# S: b3 W shr eax, 16' f7 v7 R1 b1 @9 v8 g8 }& C
mov [ebx+2], ax
8 B3 Y7 I" v7 {7 Z0 R6 ^0 ~ P sti
( Y+ y9 Q# Y% i K4 A; G' T9 D leave
# T7 ^" {' Z# L1 T$ M& P iretd
- \6 }* t/ t- ?2 z: k, W8 h- R; R }3 |& h( k- p$ V
}! z' P6 G7 n3 H! f3 e* o6 d3 p( a8 i
9 N" j, ^+ I7 W+ v1 m0 l4 f
void GetIDEInfo()- S F/ t' x% a/ _- n; X. W$ e
{3 ~7 G- G9 _( U8 y2 s9 F
DWORD dwExcept;0 T* s7 L" H% z) m: l0 E" \! r4 Z
0 N- {8 q* o. j+ p
dwExcept = (DWORD)NowInRing0;
) j* Z7 P; Q- A& r) q# d/ {
, M2 \/ a& R2 C6 E$ a6 J _asm- E2 s& H4 G B, e3 Z
{
3 H+ f! p& E2 _( t Z; K mov eax, fs:[0]; a6 k; R- v+ x0 I# b6 d
push eax
# ~0 h0 ]/ C a sidt [esp-02h]0 o8 D; Q8 n- F o' b1 ]
pop ebx2 s4 ~1 M) V: R/ Z- @
mov idt, ebx
) G+ K1 n' O( R+ _ add ebx, 0x1C
7 T/ n6 ^; _: N9 q* u mov int_idt, ebx
& x; V: Y# T/ B3 d4 e+ D& ]) D z
0 X5 x9 ~0 H' Q. ~& g. ~) @% o mov eax, [ebx]" f) e: u$ q9 g2 c$ _# N- Z
mov [Base], eax \# J; W- O- k) x1 b
mov ax, [ebx-4]
5 J2 S. ?, J# u/ V mov [Entry], ax$ @5 I- O9 B2 I& Y/ u+ ]& k/ n! Y4 F
5 w' `- V- W7 E$ M2 P; l4 R cli# y: c5 O3 d+ D' l3 H g
mov esi, dwExcept2 t8 R# m' y. p4 i$ C _
push esi
; H/ @9 n3 m) M/ \& e+ a9 W mov [ebx-4], si
6 q# A& |2 Q( q: `6 N9 f/ W shr esi, 16
& C0 O" t' m1 r/ h: W mov [ebx+2], si
. W5 z, j+ o9 q pop esi
* \% M# s2 K8 C% q8 I( A4 Q: X% w sti! }6 Y( [! E0 Q, p: r# Z w/ X
& ?$ G- x) `: @* n# b4 ]) w* `. x& _
int 3# M3 h; \7 ~) p" M3 f
}
. j) _6 P' s% Y( @6 S}
0 B" Q, e& N4 u6 S( u4 s6 r6 Dint main()
: H- m' R1 }" L% \1 |$ v{
9 r9 {3 h( W2 a* {3 B" Y5 A char s[80];$ E; U" A+ r' T( ~2 b- b8 U/ j
register i,j;
n' ^8 `" J% g+ [- U! L2 b& e1 E unsigned long id = 0 ;2 M( ~7 b3 x0 d' M4 i
+ J- V0 P4 }1 w& H: G2 ]" `0 d: w//特别注意:这段程序不能 Debug" F5 f" S I$ [* O$ B$ n
for ( drive=0 ; drive<4 ; drive++ )* i4 H- s' l5 |8 d
{
8 T0 e* I: C8 ]: g# Q2 ? memset ( pw , 0 , 256*sizeof( WORD ) ) ;, y2 ^* u U2 ?2 G$ H$ F9 \) V
id = 0 ;
: k: l& i r/ V$ F, Y# v0 g al = 0 ;$ k) c7 X7 c4 r/ A" }+ E _' l
al1 = 0 ;
! {1 W1 f1 Z& W" f2 i7 o( Q2 A GetIDEInfo();# g4 Q4 I: g& u& ~$ o$ r+ d% }
6 M z( l3 G2 z. p1 u) r% |' b for (i=0,j=0;i<10;i++)
" S+ c8 L: x9 W# l+ A( Q {
, f, d; d. s- C4 u4 f s[j++]=(char)(pw[10+i]>>8);. f. ~" M2 ^$ \* a
s[j++]=(char)(pw[10+i]&0xFF);
3 R" O$ t% [6 A0 I1 ^; H6 U }
5 y& t2 D! N4 ~7 l s[j] = 0; r2 N$ `) T$ w; h/ _
* @7 J+ B6 ~( e, j9 R: n- M; h2 |// for (i=0;s;i++)printf("%d,",s);printf("\n");
9 U6 \: X4 _4 ~0 q0 E& B( Y9 h) v) q printf("Serial=%s\n", s);
8 A3 l9 x& U p E [! |" _3 t, ]; i5 N+ a* _9 ~5 w: ]7 [
for ( i=0 ; s ; i++ )
9 M) f: |7 r$ K g3 _ {/ E1 n: V. k+ S3 C- @2 c
if ('-' == s || '/'==s || ' '==s) continue;
; V3 }4 {$ Y5 N printf ( "%d," , s ) ;
6 w. O+ y) i2 d' f% T) ~ id *= 40 ; //10 ;
$ H ?# [$ Y) h. H4 z switch (s)1 d! l( u) p5 i. l# s$ X
{
/ x. @- x r0 {) O) d5 \) R! S case '0': id += 0; break;
* a2 g' |0 ^' h' C. x0 _ case '1': id += 1; break;3 l) k( i% S D/ t7 e
case '2': id += 2; break;4 u; i% |+ `9 _
case '3': id += 3; break;
! f* d/ @0 H0 H, d0 A case '4': id += 4; break;7 z1 r* S; W9 d0 O: z7 }2 d/ n
case '5': id += 5; break;
: n9 I8 b, y" K) a; y case '6': id += 6; break;: w. L& A6 d8 z8 J# F( f0 O
case '7': id += 7; break;
% v4 L1 F8 X! {( e3 d$ d case '8': id += 8; break;; i' O* N: \, _4 m: g) z
case '9': id += 9; break;, D1 R' i3 T! F( d7 t" B* Y/ D
case 'a': case 'A': id += 10; break;9 I4 t! N+ O! b
case 'b': case 'B': id += 11; break;
- \$ V5 F& N8 i: j }& j case 'c': case 'C': id += 12; break;
* Y7 J5 Z# x7 N9 w case 'd': case 'D': id += 13; break;+ D# Z9 J" Q, y% z ?/ l
case 'e': case 'E': id += 14; break;# x2 ^/ [. e- r) e$ P/ `
case 'f': case 'F': id += 15; break;7 j' Q/ T$ x' R& h5 g: K6 V `
case 'g': case 'G': id += 16; break;
2 ~5 P& Q# ~2 r: T" ~ case 'h': case 'H': id += 17; break;! J/ [; w2 n7 `% c% }. O1 x W
case 'i': case 'I': id += 18; break;, }1 H. D& }' g; P- e
case 'j': case 'J': id += 19; break;7 O0 s/ L- P T' R+ W0 F Y" I! q& _# G
case 'k': case 'K': id += 20; break;9 x0 x! k$ v3 D% F/ w7 Q
case 'l': case 'L': id += 21; break;/ X+ `3 b* r( K7 U& ]% y4 `7 w- Z
case 'm': case 'M': id += 22; break;$ R, ] M, d: D% R. B% O6 B
case 'n': case 'N': id += 23; break;4 J5 n, ]* m) g0 m: ` c
case 'o': case 'O': id += 24; break;
2 m! d X2 I) d2 z9 r7 }# _ case 'p': case ';P': id += 25; break;8 B) {" n' d$ W+ Y
case 'q': case 'Q': id += 26; break;0 p. P1 o: V+ Y% { U' V
case 'r': case 'R': id += 27; break;" P; X! Q' q# a6 Q3 Q
case 's': case 'S': id += 28; break;
7 d9 j. D2 b" J7 K' U$ g+ {0 K case 't': case 'T': id += 29; break;4 r% O& X7 k; ]& C, @
case 'u': case 'U': id += 30; break;
) ~; m& }' H6 b5 D6 u case 'v': case 'V': id += 31; break;& U" j" N/ f2 \0 c" T' o- o( n4 r
case 'w': case 'W': id += 32; break;% b: r( T. X( X; H {% V/ G
case 'x': case 'X': id += 33; break; p5 k- G' Q4 M, P2 K6 ^4 j0 u
case 'y': case 'Y': id += 34; break;4 Z1 C1 ?/ [ m i) N- F3 A9 A
case 'z': case 'Z': id += 35; break;
+ \# _5 F, l% M- {6 C, |% f default : id /= 40 ;" ?- `- ~4 V H4 _, v+ z
}
' @+ S, \1 M0 w* m$ M& ^9 B }3 R7 Q; j" Q6 e1 q5 O4 s+ Q ^2 \
if (id > 268435455) id %= 268435456;9 n1 y& c" ^) f, ^* E
- ~' q5 @. p+ P2 j- H$ F& _// if ( al1 == 0x58 )
# w5 V% r1 A# L4 p( f printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;+ e2 G7 p0 T) H* n
}+ m0 D9 }* ~0 i8 }5 J7 a
getch () ;
* ^3 z0 M( |0 b+ I& z" F$ G return 0;
: w( u2 l/ J- x1 v$ T( J3 F5 ^} |
|