|
|
WORD pw[256];- m9 C' \. c. x- S: [
! G- {+ s# \6 w& _) K
static DWORD idt, int_idt;! e) @4 c0 C0 V9 r6 b
static DWORD Base; V$ _- m, o' i4 X2 U- @
static WORD Entry;" J N5 V- o5 K/ A, v J
8 P2 a/ x6 a4 R5 Y( h) m/ U
#pragma warning (disable:4035)
$ R: O4 n% F( istatic int inp(WORD rdx)
; C; }# g2 h {0 W7 ]9 _# {4 h V; X{' E2 f7 Q9 ?- q' A
_asm xor eax, eax9 {7 U% j, ~( K
_asm mov dx, rdx
( Z& B. u# P$ C9 k- P _asm in al, dx
4 e N; a! I2 ~0 r6 T3 N}
! S, k6 c; D/ A# b( ?- o* {* n# r/ k4 M* n* ]+ E# p
static WORD inpw(WORD rdx)
/ s* K2 \1 q, }# y; d. [- |{6 l8 b+ z2 [& W2 t0 A! G9 X
// WORD retData ;
9 E( K0 M& ?& q _asm xor eax, eax
* w# U/ a2 k$ n$ V, d' Q3 F H" A _asm mov dx, rdx
# p+ t. `' Q6 w; L, B3 j' t$ n" b) p$ y _asm in ax, dx# @' y, \" s) v/ _, g: O" u
// _asm mov retData,ax
' [5 s) x: F0 j" d. b) W+ j+ X% q// return retData ;1 k; T9 E; d5 g
}! D1 [7 _5 O0 s6 M' }( E# C6 y1 T
9 u. n/ ] E! O estatic void outp(WORD rdx, int ral)7 G3 k4 c T+ M, G8 ~7 k
{
% J9 B. ]' T9 q _asm mov dx, rdx0 y& _9 Z, }3 T# o# n" _9 p+ d
_asm mov eax, ral/ P8 X& H6 Y( }' S3 B8 ?: q
_asm out dx, al2 b% l) ]# w' f; X
}
, _/ R+ s4 P* I% v3 p/****************************************************************************/
$ j% t b" _# l7 d# x. g% KWORD baseAddress;/ n, h7 A" ? Z/ L
int drive = 0 ;/ H: C6 [: ~0 J' S1 N) o
int al ;
# v+ I9 O/ k3 G p& h! U' s( X( K0 Bint al1 ;- r/ W1 h3 m" ~# n K& q( @* O7 G" I
/****************************************************************************/
+ F% d; R- R1 i6 ]! ^2 l+ Jstatic int WaitIde()3 f2 a! @& I& O. K. B2 n! {
{% t1 J: V1 ~+ p* i+ m6 b, j
int al;0 N9 \. Q& h0 u! h
al = 0x80 ;& _2 C3 H4 _+ _) M8 `( o& T# A
% \0 t. f7 n( @5 H8 h1 ` while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;, ?/ W i/ U4 Q/ o: X W
5 `8 C" W3 f- }' R' e3 N! x* N7 h% M return al;/ ]+ B. X7 l8 P2 \0 Y3 W
}
, T' Q7 H6 N8 a! z/ Q( S& m/****************************************************************************/9 s8 b- t; }9 A3 c) n
static void ReadIDE()
9 ?# e- [* L6 R5 n- ?$ s5 v- H{2 s$ u' I+ O, m; s) J
int i;
% a' W5 E5 R+ N9 z switch (drive / 2)
, T9 c0 g3 z' E* F {
* ~: I# _6 ]) _4 V! ] case 0: baseAddress = 0x1f0; break;8 x1 W* b! \9 {4 c9 W- T9 p/ }
case 1: baseAddress = 0x170; break;# z) [ u' f5 c) L7 T+ q; Y
case 2: baseAddress = 0x1e8; break;
% O) z( F) L( K& c$ V6 \0 p9 b case 3: baseAddress = 0x168; break;
1 L! u) s. D3 x% V1 }* } }) i. K O6 L8 u
" N) z2 u1 \+ }$ D+ z5 i i WaitIde();9 o1 q( s" n' H; J% C7 w Y
outp((WORD)(baseAddress+6),0xA0); [: C) s; G) {- e/ u1 e0 r
al = WaitIde();8 _/ N- l$ L; H1 `9 ]' [4 M3 m
/ Z4 ~" M$ z `, v) R2 h$ Q8 h8 {
if ( 0==(drive%2) && (al&0x50)!=0x50) return;* X9 _- i I/ E& i
if ( 1==(drive%2) && (al&0x20)!=0x20) return; S& H% E& y! d% z; {
: `# _2 l6 s* _3 }" O
if ( 0==(drive%2) )& M7 t# O* }0 d8 A* H5 m4 t
outp((WORD)(baseAddress+6),0xA0);
7 I2 W* l1 A9 F8 |' k# ` else
- I/ y& D6 h" v1 W& y$ C7 l outp((WORD)(baseAddress+6),0xB0);
3 p( \# ?$ Z8 x. X# M; ]* | V, J$ i2 H! `
outp((WORD)(baseAddress+7),0xEC);
5 G$ ^: t1 M* ?2 R( N0 f al1 = WaitIde();
9 M( N( x$ m4 j: o if ((al1&0x58)!=0x58) return ; `$ `* H1 [" H/ z
7 d G2 i. j. J
for (i=0;i<256;i++)
6 a0 B4 \4 O3 ?8 j {% Q8 |# X8 h& R3 g! [
pw = inpw(baseAddress);
. T5 g; p, u' B2 W# \& f }+ e7 U' J9 r5 O
}
" h6 F. P$ l8 X
- U2 ]+ J2 v# s9 Z+ x. Cstatic void __declspec( naked ) NowInRing0()+ |, ^, k6 H; u4 T3 }; C/ j
{7 b- \3 w! L$ w, M* ^
_asm
g! M+ |% V% F& \ {
, U1 y. z: D/ X# t8 G2 P push ebp
) v9 x3 M% _$ U- o mov ebp,esp, m; E. G( v- q" l, ]$ k7 l
: y* M' [# h# n+ c( f7 t5 N call ReadIDE( G0 t: U0 d7 Y
cli
. I f. P5 i9 g9 l* ?6 i! r5 m- V mov ebx, int_idt1 R9 b, S0 y3 |, ?- A9 V
mov ax, Entry) ?6 j2 l; ?1 i3 ^
mov word ptr [ebx-4], ax
$ x4 p- n) u1 | mov eax, Base6 [# S/ s( q- Z" Q4 D) z; X F
shr eax, 162 O0 b* x3 k9 A/ P
mov [ebx+2], ax
, s' P- d9 h$ H) `: N sti$ r7 |2 C( a8 G
leave
, Q! I$ z$ m; r5 k iretd
: T+ R; b5 i+ H& W9 i: o }; s2 d8 N2 l5 [
}
/ o- s* J, B2 d7 m% ~4 b6 G4 y2 f; z, U+ o- R7 c; c
void GetIDEInfo()2 ~3 _ o% K( U; \
{, K! P% a; C7 W5 D) D( k
DWORD dwExcept;
" j1 ~) H4 x2 K0 P' E, n) e5 [0 ]; A" O$ c% U# M
dwExcept = (DWORD)NowInRing0;# F( q# N0 j$ }
5 j& k0 |8 v) e# m
_asm
! ]# x1 e( n2 k# P( f2 w, }& k {
; w- c: @! E2 q& Z mov eax, fs:[0]
" u8 w) W# h8 q7 a q push eax2 V5 ~. R- a. k' m
sidt [esp-02h]
6 a1 ~" q) V6 W" x pop ebx2 g& [/ c5 B+ |4 C; G
mov idt, ebx C: W' R& i1 q9 B
add ebx, 0x1C: q* E2 S j4 I' z& |" ~- l1 R
mov int_idt, ebx4 f* K* |' }" l
1 f3 k( G- a5 e7 P
mov eax, [ebx]9 Q3 l/ L0 ~1 } v2 n+ _. L/ o+ N6 f. E
mov [Base], eax
) w) Q" q8 [0 _% T2 M% N) @ mov ax, [ebx-4]
4 A/ T% i& F* s" h9 m7 e/ F) X mov [Entry], ax% I' b# E" @- v4 y' ~
0 H7 A- f* q. p N) Z; O cli% { s3 i) t; f" g
mov esi, dwExcept
7 |( J) G$ J m push esi, Y' x6 e: f: v) t7 n; h
mov [ebx-4], si
0 l6 E# Y2 n3 [ shr esi, 16
: l6 e$ A+ [# F0 L- Q mov [ebx+2], si
" |- Q, k9 y% l+ R pop esi2 b0 L5 N, ~5 D& r& x! y8 s! f
sti1 W* q9 { o( ?$ l& w; N! W5 i
* |. m# @7 E& e' [3 A! J4 ^
int 3
8 l2 n4 ~: l+ F5 d2 w }
1 C4 H% ^0 L0 P% o8 b}# R; L' d8 ]5 P. i
int main(): b% x k, [8 { m
{
' l7 D- y5 d* u char s[80];$ B- m2 |6 @. ?, ]1 J
register i,j;, w7 ~4 ^; d1 L7 ? d% J
unsigned long id = 0 ;
% b* @% ~7 w6 _# e( s" u6 l9 c( _* B/ i V, y8 i j @
//特别注意:这段程序不能 Debug; K. c+ ?- h% U( G. b) z/ b$ U
for ( drive=0 ; drive<4 ; drive++ )( g/ n! y( _- [- U% j0 l
{. K( G! g! p% b/ ^* v
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
5 }9 x; Z8 S" I9 n: o' ^" m9 e id = 0 ;6 Z7 B7 O; @3 [1 Z: ^
al = 0 ;: S7 q l( _6 P
al1 = 0 ;
6 h2 n z9 s# J/ t+ [' J GetIDEInfo();
9 H+ k) l/ l: C' ]8 ?" m6 w+ {7 x! j' W* o% u
for (i=0,j=0;i<10;i++)/ K- U, M( F2 g" r
{
! m1 h7 `& F. v+ N s[j++]=(char)(pw[10+i]>>8);& R& Q; ?( P1 U3 z4 Y) a
s[j++]=(char)(pw[10+i]&0xFF);
8 J# r3 s3 j9 `8 L. L }$ {0 z0 k% a3 `" { x: s9 t; x& K
s[j] = 0;
9 j9 D) {! B+ | G( `2 A% d% A- M' J/ Q0 r- h, k5 R Y/ p w
// for (i=0;s;i++)printf("%d,",s);printf("\n");
, ]9 J# V4 ]0 [1 p6 J. W* X/ g printf("Serial=%s\n", s);
& B$ S/ t' a# p5 Z1 I8 c2 ~4 G- V( d% ?: b4 A2 D7 |3 ~
for ( i=0 ; s ; i++ )
8 G; i6 R; ?/ R# O6 ]6 y& R4 N9 g1 M {& \4 i( O5 `: H3 ]
if ('-' == s || '/'==s || ' '==s) continue;, ~. O1 H; C6 K. B& m8 n% z3 S
printf ( "%d," , s ) ;* t9 ?: r$ i, }! |9 v
id *= 40 ; //10 ;
3 f/ \6 [9 j* v: K+ f switch (s)
) G. ^0 s. V8 b; \3 {% { {
+ G% @0 t/ M$ r5 c Q# q% ] case '0': id += 0; break;" E: w& p* S) G0 ?7 X: O) h" n0 q4 R
case '1': id += 1; break;/ @: [% @+ w/ U' ]7 X
case '2': id += 2; break;
1 m5 J# M* k, o* J" k case '3': id += 3; break;
4 j- R, T+ F& g8 e4 U) m! R case '4': id += 4; break;: ], }$ ?$ m7 L Y( Y: Q
case '5': id += 5; break;
. F6 f4 g1 o6 p case '6': id += 6; break;
. E( v, p" E W$ F3 }% t1 Q7 H case '7': id += 7; break;" [+ y. f; _$ ~2 @7 W: [: S! U( C* ?6 m
case '8': id += 8; break;+ p0 N: r( _9 o9 U5 \. u3 I
case '9': id += 9; break;; u. w4 z8 Y7 A+ }0 Z* n3 I4 l, a
case 'a': case 'A': id += 10; break;* b/ b! M4 L4 C
case 'b': case 'B': id += 11; break;
2 ?8 @ {: v5 v3 A$ K( D case 'c': case 'C': id += 12; break; q& ^8 N/ R1 j2 m/ K
case 'd': case 'D': id += 13; break;" @5 P, a9 m, e8 x% S
case 'e': case 'E': id += 14; break; k m- t% S, K7 }4 J) C) Y
case 'f': case 'F': id += 15; break;/ s+ c3 A9 O7 K
case 'g': case 'G': id += 16; break;# W% ?0 n ?1 L) L) j0 L
case 'h': case 'H': id += 17; break;
. H& F0 d h# w case 'i': case 'I': id += 18; break;) n2 \' O% p! G2 S9 o2 H/ b
case 'j': case 'J': id += 19; break;/ I! z, T; z9 V i3 E% X
case 'k': case 'K': id += 20; break;9 A9 ^2 e) O& o* P& z: I
case 'l': case 'L': id += 21; break; @3 a% X: Q. M+ O4 V* s6 E
case 'm': case 'M': id += 22; break;
G- h( n5 R; V* v* G case 'n': case 'N': id += 23; break;
7 F* g% X; I0 }: G/ M! N case 'o': case 'O': id += 24; break;; c g H0 X( y& `
case 'p': case ';P': id += 25; break;
8 r4 w! ~6 q' q) r w( E$ `0 Q) }- f case 'q': case 'Q': id += 26; break;
# [5 q8 k( T% C case 'r': case 'R': id += 27; break;
" H$ S$ Z I. }3 Q case 's': case 'S': id += 28; break;
' X: G8 x" x- O# k3 h2 L( v n case 't': case 'T': id += 29; break;
" ?5 |4 |2 E( n% |8 ^ case 'u': case 'U': id += 30; break;
" N! e- b0 _* a3 {1 [4 M case 'v': case 'V': id += 31; break;, |, {% n6 [# G! L* W
case 'w': case 'W': id += 32; break;
- G& b/ T- P& k) L case 'x': case 'X': id += 33; break;
' X8 j* Y V0 n9 W6 [* |9 u case 'y': case 'Y': id += 34; break;
) a9 i3 V. c% X( U) ^ case 'z': case 'Z': id += 35; break;
3 z0 k' W: ?% O default : id /= 40 ;
! z+ M$ |2 Y. C }5 K4 y0 K! N U+ d
}& l6 o7 ~! ~9 k. z% r
if (id > 268435455) id %= 268435456;
2 F. C- N" [! D1 L$ C- n( C
: ^ @! E1 I; w5 v& `+ d: e2 ^// if ( al1 == 0x58 )
: v5 ~) E; T% p7 V% N printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;$ A- T; c/ H! ?4 s/ F w" m
}
# W+ l5 m) |9 W4 s% ^# a# V( B8 P getch () ;
3 S0 O: M" M+ ?" Z return 0;
- L) m- n j/ R- G; c" k! Z} |
|