|
|
WORD pw[256];+ U1 f" h8 W, [3 r9 Y/ P) Q
6 }) m4 b- \, Y- C2 {) v4 t2 d
static DWORD idt, int_idt;( [, K/ q4 t4 v. Y% W7 e1 E
static DWORD Base;
1 Q' f, K0 k! Qstatic WORD Entry;& H( n1 K7 W6 j. F! L
0 p6 A6 @8 h: o- i
#pragma warning (disable:4035)
. z6 l. {- p+ Fstatic int inp(WORD rdx)$ h6 f" m% Q+ A( Z
{; O$ A$ l9 x$ k7 u2 Q
_asm xor eax, eax' j" N! L# ?* n
_asm mov dx, rdx
8 ?9 l6 P+ H2 l/ t+ ^ _asm in al, dx
! _. z# k# h' c: @; e' Y}
! R- F: `6 B4 M" E8 ]. x: Z' V- I4 c
9 |1 |3 S# Y- ~: M" D& h3 E1 E6 Vstatic WORD inpw(WORD rdx)" N# R7 O' B) r# U! s5 A4 k$ L
{7 S" `" N# w/ {! f* R3 [, [
// WORD retData ;
; b2 y/ w& I4 v% o* z7 T _asm xor eax, eax
1 [! Z2 h* D8 W6 h _asm mov dx, rdx0 R% Z/ X1 s* P: m" Q! d
_asm in ax, dx- \/ D& S' x8 O# {: t* x( a
// _asm mov retData,ax4 N" I. v4 V* r2 F3 E3 P/ X
// return retData ; e2 }4 Y4 W' ]7 z9 u3 x4 E& S( e
}/ h! I0 Z* ~+ g" @3 ^& c1 ]1 L0 J& z
+ ~! e6 l& i* i0 o
static void outp(WORD rdx, int ral)
. T+ W4 D1 K! h& r! E{2 w: @, c- L' E7 B% o
_asm mov dx, rdx0 \8 Y) ^: R. ~3 I- O( N0 Z4 n
_asm mov eax, ral0 `: f8 i9 U, l0 w# b
_asm out dx, al
- G2 _3 [1 W: H}! ?; }5 Q% K$ S5 g, u# Z
/****************************************************************************/
- x& z* k* l& m' DWORD baseAddress;
$ S! h( T( D" C1 p1 lint drive = 0 ;
/ D" w1 Q' z* y* [4 J5 Mint al ;) f! i) e' e; l
int al1 ;* F/ G0 b \4 z* p; n
/****************************************************************************/
! E/ l, V/ R- {: i2 @ g. e0 Gstatic int WaitIde()5 P4 F' N! J8 E [* E' w* q
{+ x; I, P* ?5 ~1 c
int al;0 a) E% _' I1 x) q* U, }$ S
al = 0x80 ;
% \: ?% q9 @- V6 h
, |5 r% ~- @, t3 n% b while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;) \- Q# p6 ?8 a. T
8 N5 n! X5 A4 P, t
return al;
7 c6 W! ~# ?: c; B$ Y( P" q+ ~+ S+ F}( w2 S! c- O& D6 l
/****************************************************************************/ O; E, l1 @2 q! x, z
static void ReadIDE()' H( L: F! i) \8 Z& O* Y6 A! E# ?8 `
{+ F$ p& S0 w- Q" C& x& I4 u
int i;, s, \* i2 K. v
switch (drive / 2)1 J( F' A* p) \
{
: ~4 b3 \: k8 G7 J% b case 0: baseAddress = 0x1f0; break;
" Q8 Z9 n: ]% h case 1: baseAddress = 0x170; break;4 S) c8 W/ O8 M) s* t9 s
case 2: baseAddress = 0x1e8; break;
& v2 p7 _* F' Y3 y. U( N case 3: baseAddress = 0x168; break;
% {6 d- x0 |9 j" v) } }
: r$ g: E2 u( `& L
6 r9 a" a. |# H6 t. P WaitIde();
) X s1 K9 T" m* Z outp((WORD)(baseAddress+6),0xA0);
K& E2 Z8 a% z8 W al = WaitIde();
4 h5 {" e! ?% H* d6 B$ G0 O+ O. r% N& Z+ s' O% ?
if ( 0==(drive%2) && (al&0x50)!=0x50) return;/ z1 a! I& U7 u+ e
if ( 1==(drive%2) && (al&0x20)!=0x20) return;/ U, b3 l* [ d+ D; O
6 h! V: H5 m% D5 G
if ( 0==(drive%2) )7 u9 g" H; g8 U7 n3 [& M1 w6 O
outp((WORD)(baseAddress+6),0xA0);/ x/ @0 _9 P9 Y/ d* K( F2 }, u8 p
else
q$ C$ C+ b# l& p3 ?* w outp((WORD)(baseAddress+6),0xB0);3 u/ [9 H. {$ J
& A) Q5 d1 [5 o N7 W" w) o1 T( W
outp((WORD)(baseAddress+7),0xEC);- y1 ]9 I( n: h6 I9 q
al1 = WaitIde();
7 @" j' e' z! b+ V W- v9 {8 @ if ((al1&0x58)!=0x58) return ;
6 L( _9 H- O9 h: K2 w
5 W, s% P% E0 N9 } for (i=0;i<256;i++)1 z; s4 F" v6 ] C7 r
{
5 j! q4 {/ p. [! C pw = inpw(baseAddress);
: | f& z" y5 R" B }$ O7 K% l' z' \. g+ t& k; `. T
}! Y, w6 w4 c1 p
3 Q0 r1 N* R( Nstatic void __declspec( naked ) NowInRing0()
6 T; k; C; u, f' h! F) G4 {% g+ j{
0 V0 d/ m8 h3 M4 T# [' j _asm
! Q; h* N; G* C: Q4 e X4 H! {* w {$ \5 g4 e: }+ G
push ebp
. O# w* C4 ~5 j3 ~ mov ebp,esp
. |8 z# m, [. {0 e: k& ^" q- e! l% S2 f" ~ M
call ReadIDE! T5 s) \' w2 \' O
cli5 b4 W* f0 A% I9 W: J+ e
mov ebx, int_idt
0 h) v) [/ Z, B9 Y! y: a% e mov ax, Entry, f& ^' J: }/ P+ r2 K/ ^
mov word ptr [ebx-4], ax. s+ F: R1 T! r7 W/ Z
mov eax, Base+ D- n: u/ {8 `( Y0 G
shr eax, 16
9 V2 ^1 l1 s6 H- H" V mov [ebx+2], ax
, A4 V; k/ [* `9 R( \' c. a4 | sti
; I* s8 C1 m4 |- Z* Q y leave
. S; U8 e5 r% p" O2 D w iretd
( `, K, B" ~ P- I/ Y: J- w }' G# y; ~) g9 p! g
}8 Y2 q7 I& `+ m4 O n& m
/ K& ^! R: F: X) f1 R G1 |
void GetIDEInfo()
" `9 I% J* i. T+ d+ ]7 J" Q$ t{
s7 R( P% S' K( k, ~2 o' e% N$ Z DWORD dwExcept;
# }+ \3 S) c e- f \# u3 ]; o5 b G* o! O4 |2 ^
dwExcept = (DWORD)NowInRing0;5 B% K( `3 C# Q7 j
8 y* J3 N4 N/ x* r+ R* f, |
_asm2 z- w8 C+ ]" v1 t* d% {, `
{* ~9 b2 ^$ d' X, L
mov eax, fs:[0]6 f/ O+ _2 `8 J& g6 }$ |4 v
push eax
6 X+ K* y7 y' J! G* |: J$ Y sidt [esp-02h]/ Y7 o: A% N- |1 x" b: O
pop ebx) k6 @3 }, C/ Z) m/ i% i" V0 p
mov idt, ebx
* I7 t# B& Q `! b, F9 O6 s; n add ebx, 0x1C. O: l: j, n& x' z2 b5 w9 M z
mov int_idt, ebx6 n6 ^2 S6 J/ ]8 Q
9 m( h4 G" x# k: l! ]1 v+ ~: e
mov eax, [ebx]$ d5 G' W3 |% ^6 l
mov [Base], eax
: p0 }6 t& S4 k# ` mov ax, [ebx-4]( m& l! w0 N5 s; m! }
mov [Entry], ax
; M$ c& T& ~. q: F6 u9 b; ^
. B& [2 I1 b, |8 m. v cli
! \9 ^- }( L3 }) b+ N$ n Y mov esi, dwExcept
8 ]1 j, g- V+ @# j3 F9 v- }8 t5 \% Z4 u push esi
]5 A- V8 Q) G% p! H mov [ebx-4], si
* V9 z; l" v8 H& z; F1 J( W& A shr esi, 163 B: J7 m7 @( M! y0 j" y' A
mov [ebx+2], si
4 ]' Y g! K# f pop esi
6 M" r) p' r% |( g8 V3 d) r sti8 M3 j$ U1 S* c6 g: e, {
/ t: K }$ r& y6 X5 f, x$ C0 | int 3
/ _0 v( W; G$ {; T. S5 Q3 J }
3 X: T/ W6 d0 u6 z/ S1 A1 L0 K ~, @}5 f4 q7 v3 q% ?
int main()- o9 C2 n- Z. M! _" h
{
4 ^* u+ [! e3 P# ^ char s[80];
2 N, j( K$ ]7 M, H9 @: E register i,j;( q0 f# O+ h* b z( l* G" s3 a) A
unsigned long id = 0 ;/ P1 L7 n, r4 s
R3 o0 N1 h- {) D! _" ^4 M$ }//特别注意:这段程序不能 Debug' _+ L; p2 r9 g5 m: \6 ? D) k* P- n
for ( drive=0 ; drive<4 ; drive++ )
5 b0 i' w/ S) q, t: c+ V) ~# ? {& x: D# Q# [2 E1 N, I) P
memset ( pw , 0 , 256*sizeof( WORD ) ) ;% K" ]1 {2 T( y/ z
id = 0 ;
) e7 N( G' g+ `! o" B. L u5 ? al = 0 ;" E+ C2 E4 O) x3 `. Y( b
al1 = 0 ;
: {/ e6 [( X5 `6 G GetIDEInfo(); J/ p; u! h; l' c5 x! i* V
% Y. E' Y1 |2 O O J; {9 t4 G% `5 S for (i=0,j=0;i<10;i++)/ |) P/ h+ D9 X$ O6 y1 M
{
3 Q/ v' \1 h* o/ U R s[j++]=(char)(pw[10+i]>>8);
/ P3 V/ ~3 n) J" G5 l s[j++]=(char)(pw[10+i]&0xFF);
& c2 S7 v! D# W3 m) {- a }
`+ M+ |' V* D" g9 g* c s[j] = 0;
' \, D% ]& F: Q; O
2 n9 C: z; `1 G- H8 @// for (i=0;s;i++)printf("%d,",s);printf("\n");9 L' \9 u$ @6 ]/ H* z! s
printf("Serial=%s\n", s);
6 B7 L* J6 ?7 U# ?7 g* M& B$ V
4 o( {6 p% l$ I8 t6 T, F0 l for ( i=0 ; s ; i++ )7 m- {8 m y7 d
{
# J# O0 x7 S" Z+ b) D7 B- Y7 W if ('-' == s || '/'==s || ' '==s) continue;
7 e8 j% y) b8 }+ d0 F3 V printf ( "%d," , s ) ;
0 X4 i9 [, Z* G: L2 J id *= 40 ; //10 ;5 K; d) q& Q9 ^6 u2 n7 T- B* f
switch (s)% U1 t/ g+ Q: n, O: |
{
4 a. o3 n& s5 j$ f( E case '0': id += 0; break;
/ [% S i) L( v. d case '1': id += 1; break;6 X8 x1 A- I4 k4 C0 f9 w1 i, X
case '2': id += 2; break;
( I! P$ q" o- R w. h case '3': id += 3; break;
: B8 w0 G8 X7 ] case '4': id += 4; break;
3 l5 e1 I, B7 E* E9 k) y! Y' ?. A( Q case '5': id += 5; break;
( @+ b6 ]8 p: [ case '6': id += 6; break;
! [1 g1 o. B8 r6 L case '7': id += 7; break;6 i d3 o# I% e
case '8': id += 8; break;
" e* G k# S! c7 v" v6 N; I case '9': id += 9; break;
$ B L6 v* X) ^, I' l$ b( I case 'a': case 'A': id += 10; break;! x6 X( q, O/ h' h6 h7 F: E) e) o
case 'b': case 'B': id += 11; break;
* z4 q/ V# t, M# ~; ^/ B+ s case 'c': case 'C': id += 12; break;1 M8 o) M8 W1 M
case 'd': case 'D': id += 13; break;" J" L; S8 K4 B( B5 H: u* X
case 'e': case 'E': id += 14; break;4 I" S' Q8 N1 y( a s, Y6 G5 p
case 'f': case 'F': id += 15; break;
, f7 x6 p0 x0 c0 P( P5 j case 'g': case 'G': id += 16; break;
8 b' @3 j) K8 E: g! @3 h8 T# m case 'h': case 'H': id += 17; break; q9 v9 P* A) U( O4 a
case 'i': case 'I': id += 18; break;
5 g! B, y, A% B( @ case 'j': case 'J': id += 19; break;6 Y+ m3 r: s; g+ n' ^, d' g
case 'k': case 'K': id += 20; break;
b6 h' ^+ C, Z" ^; ]. e case 'l': case 'L': id += 21; break;
6 I! g6 e- ^( v; ?% G" G case 'm': case 'M': id += 22; break;
, k9 G1 ~9 f4 `$ `8 ?0 \6 V case 'n': case 'N': id += 23; break;
- x2 K! }$ m2 I case 'o': case 'O': id += 24; break;# g+ r' h1 p9 u& A
case 'p': case ';P': id += 25; break;
9 z3 z3 a2 x3 `: }; d; {9 u. n case 'q': case 'Q': id += 26; break;2 {" ]' `1 M/ t
case 'r': case 'R': id += 27; break;
8 C. Z8 k$ i% c( [3 ~* B case 's': case 'S': id += 28; break;2 Y4 x) m8 s9 r5 g H T3 T
case 't': case 'T': id += 29; break;- V: n+ P4 @9 {2 L5 {1 h! A
case 'u': case 'U': id += 30; break;
5 Q3 _3 v, @0 a9 G/ r* q r: H case 'v': case 'V': id += 31; break;
, N' k7 q! J! \3 a6 } case 'w': case 'W': id += 32; break;1 d: Z9 e$ G$ M3 E% O
case 'x': case 'X': id += 33; break;% Y5 `5 s) I5 x: }) w- _& Q
case 'y': case 'Y': id += 34; break;+ X! Y7 t. w& G8 C5 c
case 'z': case 'Z': id += 35; break;$ I. _$ C3 t9 h Q( `! K, _
default : id /= 40 ;( [' q1 z) u! V
} f2 g( R; t1 V" p H
}
' @3 {; k/ n1 R1 t if (id > 268435455) id %= 268435456;1 B6 i8 u9 t- Y ]/ {9 b
0 N) K% l, Q1 F4 j& ~" e1 p% \5 C// if ( al1 == 0x58 )$ {8 f, [+ J% ~
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
' M) c2 }" a& v$ v+ ?$ p& x" U4 M1 D$ | }) _* V" S$ s- L( y
getch () ;
9 h1 D' T( Y ` return 0;
8 {. x" K8 M6 o F% h* J! m} |
|