|
|
WORD pw[256];- c& O& i' D& w
- @; X1 D. M- |* S9 `+ m. kstatic DWORD idt, int_idt;/ R+ f. y# ^4 r( N
static DWORD Base;
/ r! F" Z2 \* H7 f, estatic WORD Entry;7 Z$ i! ^; `4 z+ R8 n" r1 M0 p n
3 R- L4 W: X& g3 n+ @$ u, ?2 _* p
#pragma warning (disable:4035) * S$ S T! L) T' w, V5 N1 e9 V
static int inp(WORD rdx). N/ ~1 }. |, K
{0 r) U% H4 {$ p; d* f" L# c
_asm xor eax, eax
) l4 C$ U- A* V( J4 N _asm mov dx, rdx
* `4 o. t1 w) e+ o. t9 g$ W" {# c8 \ _asm in al, dx
$ F9 K1 \& Z4 P5 U& p}3 ~% w: t2 d, F: D @# D; m
3 g# {8 ?/ A* ]' }+ G
static WORD inpw(WORD rdx)/ v; G \0 o9 v, N2 O4 y
{2 f( I; p# X1 B" }
// WORD retData ;% M$ i( `' J! ~0 C
_asm xor eax, eax+ j0 }; y2 `8 p! w$ b2 M$ @, o' k4 u
_asm mov dx, rdx
9 P* g z. g' {- l3 L8 f _asm in ax, dx/ }: p( h; Q1 ~' ] C
// _asm mov retData,ax
& |3 \" e* C3 {' i f2 Y// return retData ;
2 X! t( \9 W N}
( m+ M) X# X G! w; w$ z, w1 {9 l* |& H7 H
static void outp(WORD rdx, int ral)
; @& c: o+ n- c% c0 |{* g, ] y: b8 ?% e5 X' @- Z1 h' B
_asm mov dx, rdx# S1 o0 t9 [5 d" j7 \4 H H- Z! w
_asm mov eax, ral
# o( `% j9 F0 N* _; d _asm out dx, al& l0 a# H6 ]' q7 P; }) I6 S
}
2 G! P! ]4 l3 n7 y9 r/****************************************************************************/
! i$ l5 _) o3 l9 f9 t8 LWORD baseAddress;5 {8 B, g( v) M
int drive = 0 ;4 c1 C/ t/ s: Z9 k8 G; E3 R& L2 r0 R
int al ;, ~% ~; |5 s+ s3 B
int al1 ;% L, N4 Z) G, u
/****************************************************************************/
6 ]! b+ l* D5 P k8 f1 cstatic int WaitIde()0 Z) m; Z% I2 ?* u' o1 J6 M
{
* q/ v! S+ F5 T6 W int al;" F- p1 T' d+ }/ {. E/ E; d2 ?
al = 0x80 ;
/ P3 F& |' X/ M; \) A& m0 ?5 i! D( F+ a, ~6 \9 r5 K
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
/ p4 z1 ]4 ^" A2 }
1 } [' w3 ?/ w8 c: ?4 |! [' t, c return al;" f$ c, P; e8 F* I7 K- G+ q5 m
}
7 x0 ?, Y+ a$ L- V/****************************************************************************/
/ w$ Q9 E* q" A7 _& M1 Gstatic void ReadIDE()9 M6 @* G5 u7 O C! z3 w; C& b
{
5 s7 k! a6 K3 m& o* d3 l4 j int i;/ n: _6 f" v6 T; r# m
switch (drive / 2)7 P! D* X0 A" ? c% m5 B
{ ?* X1 e3 a$ y3 Q+ s
case 0: baseAddress = 0x1f0; break;# |# F: |# U- K. ~
case 1: baseAddress = 0x170; break;
8 D) X( U! f& [" c Q case 2: baseAddress = 0x1e8; break;
$ f( j# s* [ D' i: H. H case 3: baseAddress = 0x168; break;
/ D7 D+ I( m8 A6 l }. _9 X y2 [7 z3 j. o
, m ]: X3 k' U& `! k. w
WaitIde();" {" B. f4 ~$ H3 m
outp((WORD)(baseAddress+6),0xA0);
8 [1 `+ g4 m9 t- A' V5 L al = WaitIde();
- B6 d# ]' T) i
/ M, K# B0 J5 ]6 F* e if ( 0==(drive%2) && (al&0x50)!=0x50) return;1 @! v' g* O3 D+ m& O
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
) \% D$ F, ?; E U* z" g. u7 _# }4 V& M: n; |. Z, s
if ( 0==(drive%2) )
; g+ V _/ w0 } outp((WORD)(baseAddress+6),0xA0);3 O& Y( }0 T8 \- Q9 b: q, C0 E
else
! j! P" N9 Y, w6 J/ e/ {3 h/ x6 F8 } outp((WORD)(baseAddress+6),0xB0);7 g( o' r5 I0 Q* |* ^4 V; I
: ?4 c& L3 u+ W( }8 `/ e( K2 k% @ outp((WORD)(baseAddress+7),0xEC);' l5 \$ e% F3 J& V5 K# u
al1 = WaitIde();4 [0 i& x( ]) S9 m) E) y. V
if ((al1&0x58)!=0x58) return ;
z7 K/ K( {5 o: a! F) H$ N
- [9 E5 C' }& l) V for (i=0;i<256;i++)
& U# g$ x9 u. f8 \, V {/ f; z. W2 U# n9 `
pw = inpw(baseAddress);
; ~: f* d4 X) {% K& B3 p! R }
. U% R+ o: X0 B) b# l}
0 d8 R& m' q$ t
5 X }4 a2 }1 A6 q0 y, ~, N D" dstatic void __declspec( naked ) NowInRing0()
/ a! j7 M( J. M' S3 _; M# A{, y- |# I9 ~, ?0 O8 u5 x+ l. {( `
_asm
" @* i9 u( j+ r/ ?& @ U {
, p. J; r0 U6 `# [ push ebp1 ?6 a) f1 B) [, O+ ?$ P
mov ebp,esp
2 u8 z% B2 u# P% i3 M/ ~- ~" o, }& `* g( Y" v+ j" I! D
call ReadIDE8 K: X q- J: u/ P' D+ F
cli+ J- t) L o3 B2 w! Y
mov ebx, int_idt: M, Y0 t3 b7 X" e! H8 }6 f, I% V- B7 S
mov ax, Entry! I0 C. H1 e K0 L0 l/ T' d
mov word ptr [ebx-4], ax& n, B2 _9 p f' t, x! Z
mov eax, Base3 e4 P D' a$ B( v( ]7 w6 p
shr eax, 16
6 {; X" ?- T# e# B/ d$ D mov [ebx+2], ax% z i# Q" M- b5 A
sti3 ~$ V/ e C0 W# N$ o$ w Z- I/ j8 c
leave
7 J$ \. q# `3 b0 d5 S iretd
( E. _1 Q- D* Y; A0 Z }/ y6 A5 \1 x }+ N$ `
}
- u) t' n8 n6 o# E
2 u# ^7 O0 A% zvoid GetIDEInfo()
7 K# ^7 q7 W$ I6 }1 N{
4 ?0 d P; X5 a+ u7 p DWORD dwExcept;' |1 E# w! q3 c' ^" {2 j3 C
9 o) }7 R' L" k" Z/ `& C dwExcept = (DWORD)NowInRing0;, L( a- M/ I) r! f' ^
# n. {! i! {/ \: w _asm, G& Z4 o3 X" r8 Z. ^9 y1 ?4 O
{
# d! E2 e& j- ]3 o$ W mov eax, fs:[0]
4 l+ s! m5 @# y8 O# F+ N' C- i push eax
6 Z# S7 F" h) n: W5 g W sidt [esp-02h]9 k* W4 v0 a& e
pop ebx
! |. W- m3 u$ R/ U mov idt, ebx5 a) g6 y) C2 y
add ebx, 0x1C8 M- G4 w8 f# J$ v
mov int_idt, ebx
/ z" v) v# X4 u: [3 x7 R
) J# V( ?: Z' X- m. B mov eax, [ebx]$ Y/ v- m/ x2 }. i. X5 s& _# p
mov [Base], eax
/ S! r- D& U; ]* A) ?' O3 q mov ax, [ebx-4]
0 E3 Q, A6 W7 S% ? mov [Entry], ax% d' E& c; ]5 [6 K, N
3 S2 ~& k- B( P* c+ u& ~/ I cli' u) p9 J. s5 |( L
mov esi, dwExcept
E- n3 |# G B2 @, s push esi
, M- n3 J, z+ N- v2 |2 X# }& J mov [ebx-4], si* g9 i1 E$ H- c T* S# E7 ^: r
shr esi, 16
/ r* L) d* ~- T9 @3 S1 q+ E mov [ebx+2], si; D, S8 B7 X) D( \. x: m# X
pop esi
, N6 W$ p. S4 A8 E' B* ~ sti
5 A' k6 d! b( Q* f
* x% Y0 E% J: S) n" @5 n, u# T# v int 33 V+ ?) d. D+ |5 R ?
}
a3 C. i% ]% D, @}; u" f2 Z& p2 q
int main(); y) F4 ?% _3 T8 D. C
{5 p' i: M5 r* L. E+ h% O: N
char s[80];. b/ c) ]$ X, _4 Q6 M+ f) A
register i,j;
' F4 A5 j. M/ z. Y/ Q unsigned long id = 0 ;
& O/ H* z4 w+ n' [9 n
`0 X0 @9 h: s# D4 g' G//特别注意:这段程序不能 Debug
: ^5 S$ l6 d% Z7 B$ m) q for ( drive=0 ; drive<4 ; drive++ )
0 g' {* \" s7 K {
4 v! v6 j3 e* m$ q$ B, L# R1 `& ~ memset ( pw , 0 , 256*sizeof( WORD ) ) ;
( C4 P+ g2 _2 d1 T id = 0 ;
* U% i* [; w6 y al = 0 ;3 }+ F4 r$ p2 X4 h
al1 = 0 ;9 w( H, T- i/ k! R! B) @6 c8 o! `+ R
GetIDEInfo();
& b- f }: ?* A9 z7 z1 S) x) |0 i9 I* t9 r8 O" q
for (i=0,j=0;i<10;i++)
3 w9 i+ o) A/ T8 |' `( w; \ {* O# {* a! I+ a6 |0 p: v) T' h+ s
s[j++]=(char)(pw[10+i]>>8);. }' U5 y' V5 K% c4 j1 ~
s[j++]=(char)(pw[10+i]&0xFF);
6 J0 |9 o" l2 E; } }# r- _; M% r! E, q4 W9 f
s[j] = 0;
9 F; c+ n z. p" ]5 u0 Q2 t
( `# m, K: N0 S+ _// for (i=0;s;i++)printf("%d,",s);printf("\n");
\, \, e. y6 t& } printf("Serial=%s\n", s);2 K. w; \; B3 m% h* Q6 P2 b9 f" j
5 `+ {2 e* r2 h' c3 W; j* @ for ( i=0 ; s ; i++ )% I" D. l. E0 t$ R, K( G* H
{' i2 e- d9 Q" X7 ]
if ('-' == s || '/'==s || ' '==s) continue;+ Q @1 n* E8 m% v
printf ( "%d," , s ) ;& ]+ V7 s- F8 K5 g0 k
id *= 40 ; //10 ;
/ X0 J, h2 a# q- \$ m# y# Q switch (s), E& \8 S8 @4 q7 g$ X0 S- I6 M ]
{0 A% Z1 k7 _# I' _5 C0 U
case '0': id += 0; break;9 d5 C- E: T* ^* s" l& T+ l
case '1': id += 1; break;
; o8 r3 y3 o9 K7 P& J case '2': id += 2; break;8 c2 Y1 N/ e2 K9 p1 X" g# j& ]8 F
case '3': id += 3; break;' I/ z4 i/ ~% @! p
case '4': id += 4; break;
" }/ `7 v# ~ D k/ c$ D. m6 a case '5': id += 5; break;+ }' I9 O2 Q/ d# t
case '6': id += 6; break;. _; U; o8 n$ a/ C. {, N A# e8 ~
case '7': id += 7; break;
- w9 |( V- _% w: u. ? case '8': id += 8; break;8 ?1 n% ~6 l* k; f8 ?. B
case '9': id += 9; break;+ S i* F L% x" Y( M, H
case 'a': case 'A': id += 10; break;5 v. g; X# v) A3 G" F) O
case 'b': case 'B': id += 11; break;
# Z( E. a- m, V& L8 y case 'c': case 'C': id += 12; break;
9 m: u+ j0 F, T. ~- H7 b case 'd': case 'D': id += 13; break;& O" ^) ?5 W7 F7 V5 g" G! \! w
case 'e': case 'E': id += 14; break;
( ~; |1 r7 R) \ u$ o+ W* O case 'f': case 'F': id += 15; break;) ]# v$ h7 I ?( Q+ t+ l; `7 P# o
case 'g': case 'G': id += 16; break;, S, `/ U; r' Q
case 'h': case 'H': id += 17; break;* m, a, B u+ [) K3 ?1 l8 F
case 'i': case 'I': id += 18; break;1 H7 e" `& h# J, d3 z# I
case 'j': case 'J': id += 19; break;
1 W, L+ Y- d' U2 _- J) P( m2 k7 \ case 'k': case 'K': id += 20; break;
- r) P. ~0 P8 d0 @! _7 x" L case 'l': case 'L': id += 21; break;. g6 {' X9 D# F
case 'm': case 'M': id += 22; break;8 M5 k4 V U+ N; F7 K3 Y
case 'n': case 'N': id += 23; break;1 I9 T# @, C/ K% r9 @& S8 G, r
case 'o': case 'O': id += 24; break;+ C8 n$ p1 u' Z8 T* m) M
case 'p': case ';P': id += 25; break;
9 D4 ]# ]8 N) N6 P y; j4 N* P- H9 w case 'q': case 'Q': id += 26; break;
1 p' h4 n8 o) k9 y0 g- h! @6 B case 'r': case 'R': id += 27; break;
! G$ T# ?( _4 J! j1 y+ O2 g" ] case 's': case 'S': id += 28; break;/ h9 P! l, T) A9 D# q* q
case 't': case 'T': id += 29; break;
: h/ _* h, s! b6 { case 'u': case 'U': id += 30; break;
; y1 ?# i5 H9 p/ W case 'v': case 'V': id += 31; break;4 i$ x0 @" M( e% d
case 'w': case 'W': id += 32; break;; E9 o2 a/ O$ Z S
case 'x': case 'X': id += 33; break;
; O: Z3 [" \# J$ t1 c2 M9 d* c7 @ case 'y': case 'Y': id += 34; break;
1 B3 [ A! p- E, W5 Q4 F' D& U case 'z': case 'Z': id += 35; break;4 r6 b0 b b8 c4 X! s3 v8 ?
default : id /= 40 ;
" E+ R1 [; X+ d }
- |" a7 w; E6 d# g3 Z }
3 N3 E, L$ K% V$ C: V6 |, c if (id > 268435455) id %= 268435456;& \) n; ` v3 [& v
`- b& h/ ~- ~+ X) n// if ( al1 == 0x58 )
3 @6 a+ G7 f+ X h% s8 G8 l! o printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
) i6 Q5 Y2 S' `2 g: }1 W, J( A }6 ^3 H: n; K U' q% B
getch () ;7 K6 r6 N, e f7 b& V" X4 B
return 0;
3 U2 n2 W7 r* d# w} |
|