|
|
WORD pw[256];
. K( }8 }0 w1 K. F j* {4 D+ y0 y7 B& l' R" b B- p
static DWORD idt, int_idt;
# B- Y# U& J/ n- lstatic DWORD Base;
2 x# V2 V) i( y9 w: ~% Pstatic WORD Entry;
, t# [3 z- {0 Q d5 z4 Q* T5 o4 k# U V8 ~ \% s' o5 ]
#pragma warning (disable:4035)
# f$ T4 D' y: U1 r/ K) sstatic int inp(WORD rdx)7 p" ]+ [7 f7 [
{% x! b6 Y/ n) a' w2 q
_asm xor eax, eax8 h5 k5 E" N4 U. t" c6 Y' ~
_asm mov dx, rdx0 Q) B# H7 [" A; _( [- V
_asm in al, dx% X P9 ~1 g8 e/ I6 `7 t
}. i% [' C0 D4 S8 I- D" `
3 c; h0 w$ F" ~6 J3 J
static WORD inpw(WORD rdx)6 ~3 F6 `3 U1 v( E6 K
{
1 s- Z3 ?# y% Y% b" ]// WORD retData ;
4 H. e. n: [/ S3 v Z _asm xor eax, eax! l$ D5 e0 m+ h' w3 q \) U
_asm mov dx, rdx
1 b7 [9 ^0 `$ t _asm in ax, dx8 e/ T/ H3 |5 f7 Q1 o1 r5 }3 S9 ^
// _asm mov retData,ax
; `! K8 t6 j4 x Y/ D1 K// return retData ;
0 ^( v% V: U4 u# h3 i& H( w2 a; P}3 e/ F$ C, N$ S+ i' K
: U, t3 C& j1 E2 k, v& Bstatic void outp(WORD rdx, int ral)/ ]" D. c' L+ r- L# Y
{
' g' [* } a) P6 L' ]- r$ R1 I _asm mov dx, rdx0 M: K Q% ?. Y% W
_asm mov eax, ral2 D, P+ y2 A! h, }. `: O8 e, _
_asm out dx, al
! G. N0 Q: m; k1 e# K}/ }# f# ^- Z9 j
/****************************************************************************/
2 R& V! n7 s6 g; J" \/ aWORD baseAddress;
E" ~6 I: g9 a* w7 iint drive = 0 ;+ H3 T1 u3 U- Z6 U
int al ;# c$ ]' p7 j! u3 `' t8 H
int al1 ;
[6 I; n7 j% G! Z: G/****************************************************************************/9 [& |# U! G& a( X" w* S) t* |
static int WaitIde()3 c, @8 _( V7 ]% L3 j/ {
{4 \( w) s& |1 l! ]/ S9 {* p
int al;
& B- R' ]+ p3 ~ al = 0x80 ;
+ \0 v: O: k; N+ y4 y+ Y- @: | g* O+ G6 Y) @" Q
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;! Y- g) N2 x e7 g4 W
* M" a% y/ M3 q4 s- f
return al;$ r1 k# [" ?2 Q1 S: t
}2 A# }3 R* Z: K% x
/****************************************************************************/
0 B6 x4 P+ i- z6 n+ k# p% i, Astatic void ReadIDE()& S) R$ T6 z1 W" r" R6 l' w) v. y
{: o2 q" Y% K( ~$ ?5 d) e4 U, x
int i;& m# [1 k% _6 S4 J2 ?$ T5 U
switch (drive / 2)9 d$ ]# p5 W# _ g. G) F
{
& t6 ~- @3 h7 G! Y5 A+ u4 ] case 0: baseAddress = 0x1f0; break;
X8 Y. }1 |1 Z; H; @% o case 1: baseAddress = 0x170; break;. I0 R. B/ c8 o7 E/ ]# A8 H
case 2: baseAddress = 0x1e8; break;
8 j X- a) N' }( [* w+ a case 3: baseAddress = 0x168; break;3 N' z* G; N* b2 B u4 E5 ~
}: B# v3 Z- f3 C8 }4 [" s
+ q) W; Z' x" h
WaitIde();+ Y3 N, w. Y( t' q& |+ u
outp((WORD)(baseAddress+6),0xA0);, |$ x* k8 v0 B0 t
al = WaitIde();
" ~% f. y' x$ f' p, [' f s+ s
4 l2 f' G! x/ W if ( 0==(drive%2) && (al&0x50)!=0x50) return;- e; l1 K) {8 ?0 Y4 M
if ( 1==(drive%2) && (al&0x20)!=0x20) return;6 p h. {$ Q3 u
/ w5 y$ O) \* {% F
if ( 0==(drive%2) )- ]0 k+ E5 Q j5 [
outp((WORD)(baseAddress+6),0xA0);
, s9 ^( k6 `7 K, r3 s, w* k else9 m; e, }( c5 D% u# }/ s8 Z& w8 R6 I
outp((WORD)(baseAddress+6),0xB0);
q, ~2 s2 x, s6 L6 e. J9 Y* ?( ]: w0 O8 E U$ N* f. O
outp((WORD)(baseAddress+7),0xEC);
5 K9 T" h r) h# k6 v al1 = WaitIde();
+ s( X `. k% P8 [ if ((al1&0x58)!=0x58) return ;
9 y+ n6 S; _! T- E+ _
% y7 G! N6 H2 i$ J6 i for (i=0;i<256;i++)
% p- X3 U1 _/ q; b# Z2 n {6 ^9 A0 t F3 C% l
pw = inpw(baseAddress);
% r! f4 Q7 u) o }
$ R0 g7 h% t% w$ D}
- t: a& M* m7 U8 ~' r5 I4 R M5 b, ]3 N6 u& M, `
static void __declspec( naked ) NowInRing0()# x0 ^9 ~% t4 ]5 d& _
{& C6 i- A e, y: v$ ^+ p9 {
_asm3 l3 O/ W8 [' n8 B
{& F$ k# K. T* }0 Z
push ebp
0 x( }! A9 ^4 V5 q8 t" m7 e2 B mov ebp,esp
[1 b# B: X% G) J8 o/ \" H3 y) b2 B& `
call ReadIDE+ `2 w$ D1 W& s0 k! ?
cli
2 s) |4 L! Y& @6 O4 J W mov ebx, int_idt
3 G2 [$ d: ]5 {4 {! s mov ax, Entry
1 E% ^( h0 c1 ?+ ]- M" j mov word ptr [ebx-4], ax
5 ^4 L; O- U8 N, w8 A0 V: Y6 | mov eax, Base
! g4 E! J/ `- H shr eax, 167 H8 z, g1 ], ~. a- O7 i
mov [ebx+2], ax: X" m" Z, Z- ^4 v8 b& ?9 U# B) h
sti) p% [- s# ~$ O. g T. m
leave
8 O, B1 h5 Z1 T7 N$ o1 ?1 f iretd
' _2 h5 X) L- V+ n) P# |, x* k8 r: S }7 Y& I# G) q0 v, W' c7 n
}
+ D7 ]/ Q" L& R6 W4 G/ G; j- z* f8 D" w; X3 Y, J
void GetIDEInfo()8 F8 U9 k/ x& h+ _1 B
{
9 w, e/ j- {: Y) p9 G DWORD dwExcept;
. y7 U B6 R% q% @( V) Y" r- R0 F6 _) u8 _" Y! d4 W$ Y
dwExcept = (DWORD)NowInRing0;
8 a( i1 a) K* v: E% C4 \" G# V/ }% x. H( f% v1 f. g
_asm
6 g: J. Q m% \3 H C$ I9 C {/ E) q0 u' T! L+ [, r: N. @
mov eax, fs:[0]
, u& i9 @* \2 ]+ n push eax( W0 C" S! m# k3 u, s: f! R v+ K
sidt [esp-02h]
( Q+ E/ d- u$ g% _* u R! { pop ebx
, x& b0 ]$ J( ]8 @# M2 ]0 k8 \ mov idt, ebx6 ?3 r- ^: r3 L% X* t% d
add ebx, 0x1C
2 X5 L2 }+ b8 Q; e8 Y9 f mov int_idt, ebx" i/ W& H$ M5 I: w" V
( J( P5 w$ u4 C( h
mov eax, [ebx]
1 r/ f- x7 c- }0 o* @% V: X1 Y mov [Base], eax4 G* N* u L. ^) g% `+ x& A0 ] {
mov ax, [ebx-4]
1 L4 e" N4 z8 F) m' g mov [Entry], ax5 c1 B7 l! t( c* c( c$ F* V
( w; `) e9 s# _( E. r+ O$ f; e
cli9 e- j, {) S r7 E0 r
mov esi, dwExcept7 {: z2 \/ n: @1 k$ [1 ?1 O
push esi; e' ~2 G5 M w+ [( _; c; Q8 T3 s! Y
mov [ebx-4], si, I: @+ G! F2 }6 Q3 s
shr esi, 160 n" R5 U7 }! A# }) D! C# `6 J7 O8 x
mov [ebx+2], si' v0 J+ g5 J% \ H+ P( j; w; I
pop esi
* I' _) _- a. I4 O sti
1 r8 r% O- R, M; q6 g$ f( x- k, }2 I
int 3
$ l$ o* u) \, ?( B }0 J: C- k/ y8 v+ D
}
4 w( D8 Q! F) ~. |int main()+ Z4 \! C, D! A
{: Y2 m# d2 _3 `" n' y
char s[80];. M: y& V# V9 h4 [# X q% i
register i,j;
6 A& H8 v0 T' y8 X unsigned long id = 0 ;- ]8 C' x' v* A3 T4 f9 ]4 `
+ ?( j4 w7 Q/ M9 H K ?
//特别注意:这段程序不能 Debug
1 \# P, w; _$ \3 C! o for ( drive=0 ; drive<4 ; drive++ )
3 Z% a. g, q- w {; I l2 v" X5 P" \ L8 f
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
}% n2 X- G+ p$ ~! \ id = 0 ;# C5 K' s2 J7 v6 W! R
al = 0 ;
! \6 G; W( g a7 [. c+ {' [8 v al1 = 0 ;
x' w3 Y$ u7 R GetIDEInfo();7 E$ [. P8 G' P8 |$ |7 }# Q
" ]: u2 X" ^: J6 a! H for (i=0,j=0;i<10;i++)
1 V5 i3 c& v1 D, Z9 c, H {1 S& ^7 z1 B6 f2 w
s[j++]=(char)(pw[10+i]>>8);, x0 `' ~1 B& B& n: |
s[j++]=(char)(pw[10+i]&0xFF); b2 R; S* g' N* h* w
}/ X- d' h& P, f. g! |
s[j] = 0;, z: Z/ H1 f2 g- o
. r$ f8 a* L2 A# w
// for (i=0;s;i++)printf("%d,",s);printf("\n");6 H1 [: _, A. `# H$ P
printf("Serial=%s\n", s);7 r6 `4 S w; Y
! V. L' G7 i; Q- d* W4 w6 o
for ( i=0 ; s ; i++ ), L4 ^& R, E2 `/ e0 a
{5 L# z1 l9 D+ I8 h2 a0 x3 K) o
if ('-' == s || '/'==s || ' '==s) continue;0 X7 n/ c' b$ K% _4 y% z: f
printf ( "%d," , s ) ;
' y3 R0 G |2 ?8 J! R9 ^* [* t1 d id *= 40 ; //10 ;
0 p! R9 w' I" [/ X* e6 t2 ]1 K switch (s)
2 _9 `* A' w1 I" u+ l9 B {% T+ X* W% b" {* h; ^3 c$ {
case '0': id += 0; break;
3 U. e% W1 B# q( d! a: m9 C case '1': id += 1; break;
& P* [( _0 Z# Z/ K2 I- ~ case '2': id += 2; break;8 \! b* p" v( j) D$ z0 ^! n$ d
case '3': id += 3; break;
( B% B2 }* F8 L/ m; n case '4': id += 4; break;8 m$ L: p: Q; X/ c
case '5': id += 5; break;
) a- B, d8 v% E/ {# n& y7 } case '6': id += 6; break;
( ]0 `; _; A" a case '7': id += 7; break;: W( l% n# r; n( |/ n6 h
case '8': id += 8; break;+ Z: v+ i/ F2 o' P3 \+ Y
case '9': id += 9; break;
& d m ~' y/ {2 j* W2 ^* ] case 'a': case 'A': id += 10; break;: A, {# X: Q$ `( _ y- ^& G' O" P
case 'b': case 'B': id += 11; break;
, V: Z. Z' N- J8 d w; E case 'c': case 'C': id += 12; break;
) T7 G7 S6 E R! v case 'd': case 'D': id += 13; break;
% y8 s1 A7 z/ a# a& t' } case 'e': case 'E': id += 14; break;- X, M+ x& h8 ^8 N, l& j) i) A
case 'f': case 'F': id += 15; break;$ y3 _( Z, X5 N' W$ A* j' w
case 'g': case 'G': id += 16; break;
9 }6 a& m9 |3 I1 ~ case 'h': case 'H': id += 17; break;; u- `3 [; P8 X S* Y( ?" ?. X
case 'i': case 'I': id += 18; break;
8 K' ^; d; C9 a$ ~" U% ?8 Z+ \$ k case 'j': case 'J': id += 19; break;% b1 a5 ^( l5 p7 i9 q% H( y" I& M
case 'k': case 'K': id += 20; break;; e% v# o5 |; m
case 'l': case 'L': id += 21; break;
9 Y& T6 o* O6 e$ U" [2 [+ M7 |7 N$ O& l case 'm': case 'M': id += 22; break;
( m$ }, ~" @4 R) N( e% b3 | case 'n': case 'N': id += 23; break;
( x$ f( F' |- ^ @* x case 'o': case 'O': id += 24; break;* s1 @& A j; f1 H d
case 'p': case ';P': id += 25; break;, ~9 o# A6 X* ?' c1 V/ a
case 'q': case 'Q': id += 26; break;- M T* W1 a* G/ |' L7 w) w
case 'r': case 'R': id += 27; break;2 g1 I/ Z6 i1 T
case 's': case 'S': id += 28; break;7 U% ^( {! Q1 Z* s
case 't': case 'T': id += 29; break;
, x6 x9 T$ G \. O7 Y, e case 'u': case 'U': id += 30; break;
) L5 p( r8 @, D/ W case 'v': case 'V': id += 31; break;
# r. a8 d, Q% |9 N3 f case 'w': case 'W': id += 32; break;
/ Y K6 Y3 N/ s case 'x': case 'X': id += 33; break;
{; k2 L1 N5 l8 R case 'y': case 'Y': id += 34; break;- x$ I/ a0 t& b% g1 N0 N$ E
case 'z': case 'Z': id += 35; break;+ B, {5 @, v7 I, _7 c2 D7 T
default : id /= 40 ;
/ @+ P$ ~0 ^3 e {7 |' `0 g }& Q, t8 E! R3 ?
}! P! q- U# O2 R6 H
if (id > 268435455) id %= 268435456;
& M8 h% m6 g# x. H+ H
4 i- w# q0 a" Y: G' C& V, x' U& r// if ( al1 == 0x58 )1 y1 c: L6 r; \5 Q
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
8 e4 Y! c- f4 n/ y# h1 I }- p3 b. w6 X9 n4 Z7 |% N* \
getch () ;
2 e; s# R. q! ?; i' {; Q" u1 g0 ` return 0;! t* h# I% v; l. D7 j4 V
} |
|