|
|
WORD pw[256];4 b! N, j8 U1 K1 R* N/ E6 Q
8 u1 o- T% ]: R0 J- A4 B
static DWORD idt, int_idt;
& H- P. L+ _/ D, u1 U4 E/ w/ K5 w; }static DWORD Base;
$ [# A4 ~8 m2 s+ b4 }static WORD Entry;
, `4 P+ ~+ }' ?- U% X; Z, n" D- Y& i1 D$ ^( h2 |
#pragma warning (disable:4035) ( W% \" }8 f& u6 w, ^
static int inp(WORD rdx)
+ g: @* V- u5 t{0 N, l+ Y9 S- I+ w U% x
_asm xor eax, eax
5 S4 ] i# V3 [" I. Y, J3 b _asm mov dx, rdx
) H) a! p0 }# R' p# v. ]8 r _asm in al, dx
{; d1 s! }1 |3 b) t}$ B {, a, g$ ?( ?5 x2 g# l
( h* X2 `# t8 f# z. n& E
static WORD inpw(WORD rdx)
4 A3 X3 w7 X- C& w) Z0 P* x* U- v: E{
2 v' O* i1 G3 Q- o// WORD retData ;* O/ o7 e6 g' g
_asm xor eax, eax
3 Q! A5 C9 T$ x j. x _asm mov dx, rdx% t! w1 F5 g( P' Z
_asm in ax, dx7 |/ u$ N4 j; I- o) n
// _asm mov retData,ax
. h, n; O+ I+ i8 Y) C// return retData ;
, L' K2 d: S/ @6 K( N}
& }1 D( ]) V! M' F0 A# P0 q* a# B1 N/ f
static void outp(WORD rdx, int ral)+ m1 j( E* `& m9 i+ \! B: H/ }5 w
{1 n; Z. E4 S' W$ ]
_asm mov dx, rdx
+ z0 `. p3 @& P* w8 O# N- w _asm mov eax, ral( p) T' Z, _+ X [
_asm out dx, al
0 i6 j, T6 f; l}* f1 {/ r! J# i- {5 ^
/****************************************************************************/
4 E, V8 W6 P1 F0 C7 F6 U) xWORD baseAddress;
% o7 G' [0 C9 @5 v7 N sint drive = 0 ;& ~- o1 t( R+ F$ z/ Y
int al ;
! r! K" \0 L: |7 ?6 c& e) d! y3 yint al1 ;; m# Q, G6 W# Z# i
/****************************************************************************/
3 A$ o6 n8 m# istatic int WaitIde()
' F* j& Z$ C) j! r, [& n- j% _' V{
% _/ r& ?4 S+ G" R: U int al;
+ R9 N) z' Y% ]6 n% b) w al = 0x80 ;
$ J! I/ C5 p. ]0 j0 C: y8 b$ {+ d3 B" _& K0 ]" ]
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;1 |) _" H3 n5 @
' Z% u. a/ J0 a. L4 Q6 T; A; p
return al;2 _) M8 z* e# u9 E3 ^
}0 S* |3 G8 X8 v' C [! X2 b( {* t: w
/****************************************************************************/
; V0 `$ ]2 ~" V# h. m( R- y7 ]8 ], c% a gstatic void ReadIDE()
; p* U* k! ?2 W6 V, m7 z{3 F4 X. g. d: ~! x3 y1 X
int i; J9 |1 W" f! x1 `% Y' I1 Q# y; v+ c7 k
switch (drive / 2)5 [: d5 o8 h( k0 N' w
{
3 P/ ?+ U$ L, v# C1 a7 u, s case 0: baseAddress = 0x1f0; break;0 ^) D# t" }' h
case 1: baseAddress = 0x170; break;9 t. e- ~+ b% Z0 m2 D9 |& U: m
case 2: baseAddress = 0x1e8; break;
" j, I$ U& w% e4 S" V case 3: baseAddress = 0x168; break;3 I* `& k+ X C9 @ J6 n% B6 L. l
}+ h6 B, e, I: Z# @, [5 H
/ I" Z- Z& }0 Q. Q/ w
WaitIde();
7 J: T6 y2 p$ @: t) A5 {" l r outp((WORD)(baseAddress+6),0xA0);
" Q( c5 }: U% m al = WaitIde();6 U7 M$ M o. z6 Z3 w
: O8 r% B8 f4 U" X7 e2 L q
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
) _/ u. b0 @" |: m2 | if ( 1==(drive%2) && (al&0x20)!=0x20) return;2 x. |! u3 P8 z2 Z
3 Q6 c1 e9 I/ U if ( 0==(drive%2) )
. B6 J( K0 y* t/ }7 | outp((WORD)(baseAddress+6),0xA0);) z8 f7 x& K) g$ Y# U" w
else
b7 H9 Y" J1 H* ]) |. | outp((WORD)(baseAddress+6),0xB0);
. _& d( a3 Y, `+ ^; V* k; X' F- `- W8 @/ U x: \) P
outp((WORD)(baseAddress+7),0xEC);
8 c( A1 {' K. B( p; K# T9 I* Q5 [. c al1 = WaitIde();
0 a' Z, I3 U+ k if ((al1&0x58)!=0x58) return ;
/ Q- A# C+ U" U3 i* y0 y* L
7 Y# w% x" ?5 ^- n# g for (i=0;i<256;i++)8 f4 U( B! ?1 C) w
{
% v7 ~4 o: r Q pw = inpw(baseAddress);& v1 Z3 l% A- U8 u4 Y1 Q
}7 z8 E8 e5 Z' G8 ?2 l3 _; g1 q% R
}* Y# c5 O7 R5 F! Z0 n) H
7 m! m, z( v* U8 C2 A* H c
static void __declspec( naked ) NowInRing0()0 @4 e& {. D0 ?, ]6 R
{$ p$ d2 V3 P5 C7 {* ~' S
_asm, o$ Q3 ^5 T/ T' R5 E4 L
{
/ J: m% j% F) N, X3 N push ebp5 m; F7 _1 w" I
mov ebp,esp
. A1 b3 G# w2 e1 `/ @$ P% v
% y9 u& E* W1 a( s( j I' A call ReadIDE0 t& w, ^& P& g& L9 B
cli
* j" w- N6 R( N4 F; ` mov ebx, int_idt1 {. m V; B }/ Q
mov ax, Entry3 |# f+ M/ E$ b4 r
mov word ptr [ebx-4], ax
s3 w9 Q" b' j$ Q$ N mov eax, Base
( w e( O9 b( p/ w% p) O; Y* S- y shr eax, 16, G8 }/ u# b! O! `2 Z& q1 w
mov [ebx+2], ax+ p8 J7 T7 S I" Y" b
sti' E! l2 m. s/ A2 t* i
leave
: l# E6 h2 P2 F iretd
; p9 ?& F" W- a }
8 }' e* j2 k, E/ `- r' X& I}
7 _8 f( x w2 V' [
& i& L2 w& W+ B, n; g7 k; bvoid GetIDEInfo()4 p' ]5 G b! k
{: r! r; X( o. d/ v
DWORD dwExcept;1 f% U9 O( Z) }# A4 Y9 h; T0 w7 C
7 b- @! B* C C, v7 J
dwExcept = (DWORD)NowInRing0;
H3 n: T; P1 x0 t4 {7 h
4 ?6 z8 h9 p. \ _asm1 M' I" b& O8 D% p/ o6 e& _8 S
{4 H4 W+ g, H8 F# x h( P. ~6 m, ]
mov eax, fs:[0]
' D: R7 J8 [$ g' C4 T push eax
# i+ `. A, |# c j, A$ G sidt [esp-02h]
% H6 v( \6 M; R+ g7 c: N" R pop ebx
; X L4 N3 V9 T7 ?+ Q mov idt, ebx
/ e ^' a! N! z add ebx, 0x1C
; \. [* I. w9 D6 E) m& i mov int_idt, ebx8 O8 V7 v* E0 q/ v7 f4 C' u
8 X% }3 _4 T/ R, U5 ] mov eax, [ebx]1 {) j* q% \3 i- Q$ w3 A
mov [Base], eax
/ T4 L4 k' k" q6 R8 w. c mov ax, [ebx-4]9 c4 i; `! F$ g' D4 g ^! q. ~+ }
mov [Entry], ax& N, C0 k; y7 K
) c" H( v8 i; [$ ^+ J9 T! z/ O+ @; h! ?
cli2 _3 M% E' ~: |
mov esi, dwExcept, M# b$ |& ]" i7 F5 L( [
push esi) d! r- k5 V1 _
mov [ebx-4], si. q+ s* p! n' D9 B, ]) k
shr esi, 16
, {0 N& N7 W/ I2 a1 n mov [ebx+2], si1 }; y% Q* l: B- d8 p. X
pop esi) [7 H9 M6 N. f
sti& F% t c5 F$ }* u5 P5 s. y3 v
5 I x2 m7 U" y! I int 3
. a0 e3 A# o7 [# }1 C% y9 w% E( E: o }
, t0 B% R1 c$ Z* E* A( h; Q}9 }( `$ Y# V3 r
int main()
3 x8 ]5 h- _5 U5 N7 U/ l{
# \1 |4 ?& E/ M" S char s[80];7 o4 e, f1 s4 f( b; u
register i,j;
) [ w. E `* ^- r unsigned long id = 0 ;. {* D x+ V) d% z w9 k' C1 [
" @& E' J; d$ G/ E4 @3 w
//特别注意:这段程序不能 Debug
% k& Q, [1 N% z2 |. P+ ] for ( drive=0 ; drive<4 ; drive++ )
. ?+ T- u, g3 G# ^ {: ]/ p; }: Z, l+ z
memset ( pw , 0 , 256*sizeof( WORD ) ) ;8 X# B6 [" `9 C/ N+ i5 ], X4 y) q# o3 h
id = 0 ;
6 ]5 J ?/ O/ f3 u$ V; S4 [ al = 0 ;
/ g* Q2 P" `% \; F al1 = 0 ;
, m; A5 q# d' |% o. f7 W" ] GetIDEInfo();
% i; ]2 \ W* A1 S8 _, [& a" s- |- |5 T7 n
for (i=0,j=0;i<10;i++)& z* C( |" G/ b8 X# e0 _) A
{* k( ^) J; k9 T0 {2 {* j& G. S
s[j++]=(char)(pw[10+i]>>8);
" ^# @7 x. _" P9 `1 Y s[j++]=(char)(pw[10+i]&0xFF);( d% R! L% z0 [
}& j9 n& O# W. S7 x# ?
s[j] = 0;
$ w0 r- b5 |( s1 B5 E' T* d6 C* `$ X8 f. x+ V; q' b
// for (i=0;s;i++)printf("%d,",s);printf("\n");6 X7 J& n9 i0 k% H
printf("Serial=%s\n", s);
4 k' I$ ^" | J, J5 e* a
* \% N* z* j0 Z: ?4 Z for ( i=0 ; s ; i++ ); {- C* e9 i9 `/ |+ T4 B
{
+ f" o$ K7 _. }3 |' p( t if ('-' == s || '/'==s || ' '==s) continue;6 T: h* q8 E: G: Y+ b) s2 s
printf ( "%d," , s ) ;0 k$ b' h( o+ r; I/ t# k9 i
id *= 40 ; //10 ;
. R4 Q' X1 d: |6 V switch (s)* i4 B% I! o, z; u9 T
{
' _5 r+ V8 U. l6 ~) O7 ?/ `/ D& s- H case '0': id += 0; break;
4 {- R# K: t1 x+ }: u4 E, \0 } case '1': id += 1; break;# c/ p7 E' X0 R& u d2 k
case '2': id += 2; break;; U- R2 d' [, J
case '3': id += 3; break;9 F6 s. u) W& @) ]
case '4': id += 4; break;7 J' T4 k9 F/ D+ X6 e
case '5': id += 5; break;
! M% \7 R3 E9 x9 M4 s* u* o, r case '6': id += 6; break;4 p4 [8 p5 H; `, [/ O
case '7': id += 7; break;
9 P" _% J' c+ u6 U/ I( W2 M6 d! \ case '8': id += 8; break;
2 m3 N/ c! c! ~0 R1 S. M case '9': id += 9; break;
; u- Z3 i1 v5 k4 @" I4 r case 'a': case 'A': id += 10; break;; {+ n8 q7 u/ U8 ]1 Q/ m% x$ N
case 'b': case 'B': id += 11; break;8 b0 {# c& C( V1 I
case 'c': case 'C': id += 12; break;
" O( N6 t' |+ |& k9 C6 a! J case 'd': case 'D': id += 13; break;9 x* \! \/ P- H) A
case 'e': case 'E': id += 14; break;
& o+ `% N/ R5 I) w2 ? r case 'f': case 'F': id += 15; break;2 M: Q( c4 B. r) V8 w9 ]
case 'g': case 'G': id += 16; break;
) V g( }% n, m2 s8 ~ case 'h': case 'H': id += 17; break;9 a0 u0 o8 M! e5 [
case 'i': case 'I': id += 18; break;
" f' X0 O+ e- T! [3 ] case 'j': case 'J': id += 19; break; C0 h- M8 o) H. B) `- |) {2 N# K+ F
case 'k': case 'K': id += 20; break;
0 ?1 c0 R, F# |& l case 'l': case 'L': id += 21; break;
1 E+ M; m/ l x8 j: i" R8 ? case 'm': case 'M': id += 22; break;" u: R% Y* `2 k
case 'n': case 'N': id += 23; break;
, F. m! {( d. M0 Z# |$ I case 'o': case 'O': id += 24; break;! Z$ t L% J) n/ v& `( ?
case 'p': case ';P': id += 25; break;9 Y. ]* v/ o' ]8 G9 p/ |/ ?
case 'q': case 'Q': id += 26; break;2 n/ J8 `% ?+ G, x6 j% x1 I" {
case 'r': case 'R': id += 27; break;
/ V1 S5 s4 t1 G/ C) x+ y: S$ {0 l case 's': case 'S': id += 28; break;7 t9 ^% D: k& D+ w
case 't': case 'T': id += 29; break;9 E2 y1 @, {; N0 l7 y$ ]
case 'u': case 'U': id += 30; break;
' U2 k4 F0 ~4 h/ {; [ case 'v': case 'V': id += 31; break;( S; }" q3 I' M; X' C# I% F$ I
case 'w': case 'W': id += 32; break;
$ o0 ]8 I0 E6 w/ s" U9 J case 'x': case 'X': id += 33; break;
( S8 Q; I" Q5 K" z# R2 |- } case 'y': case 'Y': id += 34; break;
# S6 _% o$ L3 A. J case 'z': case 'Z': id += 35; break;
: C$ T9 F, s' w. r default : id /= 40 ;! y% h) G9 R$ b" u
}
0 W, O7 K2 W, B3 V' R4 Z8 V: \7 U }7 `' C% D; ]9 V- ?) j+ Q+ F
if (id > 268435455) id %= 268435456;; \4 `) X' X& m+ x, l) o8 D
( x# x7 d# A6 k, U2 ]// if ( al1 == 0x58 )5 ^- `! d! j. G z; A
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
; a0 U: {, O! h5 y" ? }: G- {: |6 X3 ?" W
getch () ;
. ?0 Z9 Z* `% _7 ?, ] return 0;0 J) ~6 T" Y: _6 z9 s
} |
|