|
|
WORD pw[256];- w1 E( p' k1 J" i _$ Q2 U# u8 A
7 l4 L2 a5 q; B
static DWORD idt, int_idt;
& R1 @! ]9 U1 Y& T M3 e. ^1 i3 qstatic DWORD Base;8 N7 d: q) a+ l7 u e# g+ H2 ?# J( j( y
static WORD Entry;
% c5 k: l. T/ p3 _8 c7 V
8 ]# b9 d, ]5 C#pragma warning (disable:4035)
0 k, @! V/ y4 wstatic int inp(WORD rdx). Z! z; I9 X; d0 |1 B" g& e
{
0 Q- Q' m5 ]# ~+ [9 Q _asm xor eax, eax: ]$ O$ L% V3 D- l2 `! e5 @' H
_asm mov dx, rdx1 C$ J7 m6 V- k1 N
_asm in al, dx* P* {) p/ [! D4 R; \; B
}/ c( k4 \( v3 W: [# ~' \. u [
0 w- S3 g% D$ f/ bstatic WORD inpw(WORD rdx)
( Z. C$ W9 k1 K! L' s! s/ o{
+ n' Q8 V4 C; z% C// WORD retData ;1 k/ G3 I! y' R$ I
_asm xor eax, eax6 y6 e* F0 P9 e d+ r
_asm mov dx, rdx f7 k# X+ H- I
_asm in ax, dx2 C+ y5 p! D4 P3 k! @' C& s
// _asm mov retData,ax( o3 Z% W8 {; X* ?0 J) q2 Y
// return retData ;7 d n# B& p- }5 C: t
}3 r: h- \: P6 p8 y$ M/ r) B( E1 Y
3 i+ A3 j4 Q: b; y0 d1 e1 ~3 E
static void outp(WORD rdx, int ral)4 s! j8 g3 _# p. P5 `! L; p
{
5 j9 \- Q/ T8 t2 z8 g _asm mov dx, rdx+ c$ D t$ H, v" v- j
_asm mov eax, ral/ o' q! g5 |7 J
_asm out dx, al
" e4 `% |5 k% N7 L}6 D) C) L2 l: y5 n. @
/****************************************************************************/; h x2 B8 w3 a( H
WORD baseAddress;" u7 }' a/ o2 k- C
int drive = 0 ;
2 z: a+ a7 ?8 O* d. X$ H; Xint al ;. [" x l' }; e
int al1 ;7 `- V; \; D& q
/****************************************************************************/) ~+ e) B* B4 p4 @
static int WaitIde()! P( H8 \, T2 k( [
{
. P6 [: i, ^# B. j( Z+ B% T int al;
3 L8 H# c6 g9 J/ d. e! x al = 0x80 ;
7 _! @, E( x. Y3 k6 t; |0 o+ ]7 P2 Q: ?
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;1 M g' a0 T0 t5 i2 f+ o3 O7 J: i
" ]/ J' E* @" b$ F; `/ I
return al;
m/ L1 I5 T6 ]- }}
* @) q1 _% U% ?" ]/****************************************************************************/
( J6 a0 \! z; {2 ystatic void ReadIDE()7 f5 `+ \, I; o8 L; l
{; m. W [2 B: m( x8 S& i# p
int i;, l$ z, d( Z& B9 T2 Y+ }
switch (drive / 2)
& F, M1 K. h2 ~, J- | {9 l4 p4 a! y I5 K+ E( v6 o6 \; A
case 0: baseAddress = 0x1f0; break;
1 T7 k, S6 [, Y F! `3 h case 1: baseAddress = 0x170; break;- k0 j1 t _8 P: @/ D! {; |) J5 U
case 2: baseAddress = 0x1e8; break;
0 u& r! l( |2 Z case 3: baseAddress = 0x168; break;! Z9 G) w; B* H0 l( c; A
}
- v/ K s' O( m7 W1 w0 m8 k' G2 e9 H, \$ E/ {+ X1 |* M* l
WaitIde();5 E$ S& K" I3 _4 N
outp((WORD)(baseAddress+6),0xA0);
8 x H* W0 u" O; c4 m" b# \, y0 p al = WaitIde();7 D7 X: [% C! j, t# `
$ f0 U% l2 R4 x
if ( 0==(drive%2) && (al&0x50)!=0x50) return;& b+ n& O9 \7 a+ Q% F. b
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
# j4 g( ]5 M! h2 J9 N$ H! p2 L
6 v# ]$ v6 q( G1 h" u' ^3 } if ( 0==(drive%2) )
. @6 \* g8 c" D8 H* t8 K, i, ` outp((WORD)(baseAddress+6),0xA0);5 e1 d, E; e; K( t1 O
else# B: H* c l# t/ g R6 a, b2 g
outp((WORD)(baseAddress+6),0xB0);' ~/ k4 y/ S# h% t/ s
5 h5 e k, t, Q' C2 G# n) |
outp((WORD)(baseAddress+7),0xEC);
, U% g( z8 t! J! b' S% z4 d! r al1 = WaitIde();8 R4 `6 G) ]# t9 E* @
if ((al1&0x58)!=0x58) return ;6 Y* q" O# Y6 ?7 k8 \; v: r4 x
- i8 T- q' W: q for (i=0;i<256;i++)
' {- j, w8 o0 s. w {
* P1 C6 u& d: ~5 t! ] pw = inpw(baseAddress);
) h' m& ?; |% b }4 g- \) x. f6 O5 K) `
}7 y- _3 n' B* C9 Q# `# @6 Y; g u
' J! M* h7 D+ ]static void __declspec( naked ) NowInRing0()- @8 E. T( u, W1 v; j4 V5 [3 O
{
( z+ g3 \& u' x& Z, D# q- } _asm- o& B( @ n% K: T& g1 _8 v
{
. M( B" R9 Q7 c8 v4 p0 ]* U6 V8 J push ebp, s9 k1 G; ~$ ]% L; y6 g R) Y& X
mov ebp,esp7 D& v; p% s" ~& l% T; j7 K
3 H5 s: w1 z& O/ |: S call ReadIDE* X% [8 J) r T& ]. Q
cli' F' y0 [% \9 ?& d* O+ I$ g! z
mov ebx, int_idt) Z6 x. N7 K. b7 o% t D
mov ax, Entry+ W! W* V% p1 h% ]$ }3 J
mov word ptr [ebx-4], ax
. f v, J4 \: O& O' i% R mov eax, Base; B( F9 }7 x6 T' d8 U% Z# S7 ]
shr eax, 16- ?, C* _3 L2 i$ z( C
mov [ebx+2], ax
$ ^2 L% Z% N9 m( b, ? sti+ L. _. E: e& D% L- @- Z. [
leave
, w; p( D) L( K0 P" [ iretd$ {3 `( C& |5 Z2 r; x' P
}5 V. K. V; g- }$ Z
}
7 M" l1 o# c6 I0 F+ g. R' D
: G" ^( z! w/ G2 kvoid GetIDEInfo()
7 s9 w2 @: E3 J4 j4 ?{' G; F0 l0 y. C& J
DWORD dwExcept;
% T+ E8 [2 S/ h% C2 y g2 m1 L7 Y. G) I+ l* D
dwExcept = (DWORD)NowInRing0;
/ G* l' p- s# F L* P0 L) A. G) V1 `2 L- R/ f; ^/ P
_asm
4 i* c& T& I( L0 J" L, j8 H2 ~; ` {
" K6 _3 M' I1 F$ [: e) h& _ mov eax, fs:[0]
1 E8 ~; s2 u8 R push eax- O" s" F/ r* o$ K
sidt [esp-02h]' x: C- x: O6 p! r8 P
pop ebx; g9 q# _9 ?( g3 g
mov idt, ebx) g& p. r; ], t0 G; k5 w7 {
add ebx, 0x1C( |* b: a [( ]2 R
mov int_idt, ebx" x: L6 m0 k9 m+ i
1 c. L; _$ y& H0 u& e mov eax, [ebx]+ b- ^0 D8 T, r. Q1 }
mov [Base], eax& @: ?, D5 F6 s$ N% U6 }% P
mov ax, [ebx-4]
: W A& A- M! R" O# o' ~$ M& ~ mov [Entry], ax
/ ^3 T* ~1 r9 `0 p. K7 k5 O# _4 T( m5 @: K" B9 k" M. ^% ^/ i
cli' K3 g+ ^/ u- ]* a3 _) ?7 g
mov esi, dwExcept
$ r* |- ]' t5 y* z: D. n push esi
% T: R. E5 p# D# I& Q4 L mov [ebx-4], si
4 X8 v# K. {5 C shr esi, 160 n; k1 H( g3 R7 W* v" J! s
mov [ebx+2], si* V: o. I X1 d
pop esi
! v, l) X# D4 w" K$ x9 `! | sti
+ y0 i# X% ?; X& O0 ^' A2 Y' ?4 n* n+ o$ a% F
int 3* z! Y+ l6 ^" t: C# m
}9 x0 T9 _& r: O. ^& p0 J0 J
}0 i3 e B0 [0 i
int main()
$ T) c& E5 K9 l{
2 R$ H R |- @ O6 l* [ char s[80];9 e, f2 t' D8 y4 ~# j l( d
register i,j;
) j7 z8 z; I7 P, G unsigned long id = 0 ;2 M! r8 J( {! v+ G8 E
5 B2 `1 {& O* N4 U2 q//特别注意:这段程序不能 Debug! @- n7 O9 F9 N$ I. w
for ( drive=0 ; drive<4 ; drive++ )6 R: l& w6 i) \) |. x0 M6 ?" i
{5 S; S, j* _ g( X/ [0 E
memset ( pw , 0 , 256*sizeof( WORD ) ) ;" i G$ s# x+ N1 {
id = 0 ;, ^& d4 D. [' w4 _* v4 \
al = 0 ;
0 e: h; ?9 H3 Q2 o4 D al1 = 0 ;( V* j3 O6 n! n. p. R$ M
GetIDEInfo();
6 O# |2 X% ~# @9 l0 D+ f. i( _: L) o/ K
for (i=0,j=0;i<10;i++)
( z2 G3 g8 L2 X6 t' a# t3 V {7 `8 E+ A, q0 m* O# u* j$ h
s[j++]=(char)(pw[10+i]>>8);: \" w& S' E H2 {. _. i# r- Q N$ N
s[j++]=(char)(pw[10+i]&0xFF);
" L% d, z% [8 T0 [& A- Y }( _5 |& }- w3 Y, V! L, O
s[j] = 0;0 r! H6 @; f- z4 o x1 u
2 M0 O# t7 q* e3 P9 r: `/ x8 z2 N
// for (i=0;s;i++)printf("%d,",s);printf("\n");
' {& ]/ B( a x1 Y" U; i0 ` printf("Serial=%s\n", s);
% {8 |8 x& \+ r1 j# y1 z* j W* U* s- l! T- K
for ( i=0 ; s ; i++ )5 L* j* ^0 [2 P: e! }# s
{7 O4 j h, g" h- y
if ('-' == s || '/'==s || ' '==s) continue;$ [# M* Q: @0 o
printf ( "%d," , s ) ;8 F9 p8 S$ j, ]6 y- v
id *= 40 ; //10 ;
) c) Q! R7 t, E9 b( y8 ? switch (s)9 p# Z3 f1 O$ x* T
{
: e- ?1 P6 B* l7 R- g; u7 p& Y case '0': id += 0; break;- ^6 w0 A' F' x* [: ^8 c! u
case '1': id += 1; break;
+ ~" t0 L O8 ^1 D v0 m8 U# n case '2': id += 2; break;
0 H: a8 u# O6 T' b! _% e1 ~ case '3': id += 3; break;
1 q& C5 N9 x! C- g' k# C case '4': id += 4; break;
& N1 i9 p0 z! k case '5': id += 5; break;5 ~+ @9 L% ^. Z0 Y) ]8 L$ y
case '6': id += 6; break;
+ F7 F, Y! x* S1 |3 @# w case '7': id += 7; break;
4 I/ H& v$ z* N3 C" w case '8': id += 8; break;
1 P& ~0 K- V( f case '9': id += 9; break;/ {( F- _; U$ ?" l, k$ r8 x
case 'a': case 'A': id += 10; break;) E/ h' U5 F2 l5 z
case 'b': case 'B': id += 11; break;
2 u5 `) ?# _0 T case 'c': case 'C': id += 12; break;, ?- |8 |9 H* T1 y
case 'd': case 'D': id += 13; break;4 p6 r8 q; B( ?& ^
case 'e': case 'E': id += 14; break;
. z, M: A+ u9 U8 ~! r case 'f': case 'F': id += 15; break;3 o) c7 E" ^1 ]
case 'g': case 'G': id += 16; break;
% Y3 P! o* d8 H G4 P' L case 'h': case 'H': id += 17; break;
0 n" l# K3 m3 ]- t k case 'i': case 'I': id += 18; break;! j) u; C/ S: Q% W% L$ U/ |
case 'j': case 'J': id += 19; break;
& F; C" @- Z) E* E! r+ T case 'k': case 'K': id += 20; break;2 \. C; w5 \ [' K+ I K/ `" N
case 'l': case 'L': id += 21; break;2 ~8 O7 N! x. O; X
case 'm': case 'M': id += 22; break;
) ^0 M6 |$ E$ V3 T case 'n': case 'N': id += 23; break;5 F0 p4 Q; B1 Y& `8 S& @6 R
case 'o': case 'O': id += 24; break;
; @ i: F% J1 J5 @* ]* X4 h( q0 y5 _ case 'p': case ';P': id += 25; break;
! u, g$ O- O0 I& ]; c$ e5 G4 J case 'q': case 'Q': id += 26; break;
' B7 A/ z+ t7 _5 n' x case 'r': case 'R': id += 27; break;2 O9 W7 |* ]+ G# H% K2 _
case 's': case 'S': id += 28; break;( ~& h; o" u) F1 F/ S4 R6 t
case 't': case 'T': id += 29; break;
9 b1 {7 D$ S" B8 s- w case 'u': case 'U': id += 30; break;
* r0 y& s- Z+ n9 q# b9 Z case 'v': case 'V': id += 31; break;
7 a/ W4 N$ ?) t2 S) Y7 Z3 Q% t8 l r1 f case 'w': case 'W': id += 32; break;9 E2 e9 Y1 v j
case 'x': case 'X': id += 33; break;8 H4 _% Y3 T1 n
case 'y': case 'Y': id += 34; break; X$ R! t! ?5 S" e N
case 'z': case 'Z': id += 35; break;8 ^) Q- O" m! K2 n/ f: W
default : id /= 40 ;0 |( A& s* h' u8 ~! C, P0 m
}6 ]9 P3 w @5 W! T
}
5 x3 A! h) L' D* W, o7 d if (id > 268435455) id %= 268435456;& p* b+ A3 \& j9 Y, s/ r8 l
" y+ n1 ~ B+ U0 n4 n+ o0 u7 x$ ~1 A2 h
// if ( al1 == 0x58 )
* ?0 g! [4 V/ B, k! F printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
. H/ m6 I- e: q0 {) z }
1 P7 I J+ K* l7 K; _ getch () ;/ C! W% ?! \5 x. u
return 0;
% ]( S; e6 s( q s& P0 c% L; J} |
|