|
WORD pw[256];
1 D1 x8 M5 O( R: ^, A: r, B
! B, a' ]8 I5 _, d, H( Tstatic DWORD idt, int_idt;. d3 p/ _+ {( a& D) T, N) K
static DWORD Base;
4 t# U) @! U0 y4 u. gstatic WORD Entry;
2 t- @# R2 N5 [/ R y/ W1 |$ G, A: N% Y6 W. P
#pragma warning (disable:4035) % V, d2 u( i: }) o* ?& ?& `$ D
static int inp(WORD rdx)
9 s$ d6 y) ~' P) u0 o# z- M; q{' Z) l- y/ m, o8 p t8 X
_asm xor eax, eax6 J8 N$ i; F; Z; X8 ]& p9 \( K
_asm mov dx, rdx
9 [0 i- O: [1 f( ]0 c _asm in al, dx
, X8 c4 S9 ^1 u ]( `. k3 J2 e}
+ T4 |8 R: k, l+ F2 z4 E1 V+ @) ]* M, v- U
static WORD inpw(WORD rdx)0 }! j3 V& Q# ]$ }8 m3 B. a- ~, _
{
" Q s' l6 X# b9 f+ g5 t# W$ g' q// WORD retData ;
- x' z! q, Q9 x E$ i' [% ~+ p _asm xor eax, eax8 J9 n3 e; H9 \5 B0 I2 |
_asm mov dx, rdx
8 j" ?5 R1 E( J9 O+ u. K1 S _asm in ax, dx, @5 _: k' u; X" U
// _asm mov retData,ax, k4 G/ h5 H- e5 H0 A( j
// return retData ;
h* l7 R, ~) Y- J+ c/ i2 c* \9 x5 ~}4 W i `! h2 i8 S0 [7 D- ~, l. A
3 D8 F4 J$ |# S9 G) i
static void outp(WORD rdx, int ral)1 R2 e* \4 b7 k1 ^- x
{
1 K% C4 [7 U7 w9 b0 K: j _asm mov dx, rdx7 c5 V# _7 q! {: q6 T! @0 f
_asm mov eax, ral
$ r* u2 s$ Q8 {& k _asm out dx, al
( m( i+ T$ b4 u! }% K' T}
7 e' m* ~5 x8 v t/ _& o1 ~/****************************************************************************/
! Q$ v$ V. c$ F& LWORD baseAddress;
* S8 R1 `6 i- N3 H9 w, z' nint drive = 0 ;# M! g& m! | D3 E
int al ;( A& C- B s9 c
int al1 ;
% K# G% P5 c* X. O/****************************************************************************/
6 n# g) p7 I; L+ f; u2 L6 d' pstatic int WaitIde()
1 m& q/ k' @% {8 Q- _{/ {$ Y) [' i4 S
int al;
- h: ~* A) F7 a ^/ @3 ~2 u al = 0x80 ;3 W6 f) J4 M" X$ Y) w
& D! j0 g2 G0 S" A: Q' l while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
. \8 P) T1 @6 F5 G
4 L9 [3 `, u8 c$ k4 ^+ s. Y3 G return al;- G2 G9 k1 b$ t) Y% D M5 a: ?; R
}. e# I' R. j) M- }" a( Z
/****************************************************************************/
' G' _! A7 y5 h& [+ I$ Q7 b1 R1 dstatic void ReadIDE()+ S7 {" b3 I0 y/ k4 l& a7 D, T
{# s2 X& v7 M; D/ N7 f. m' j
int i;
- s% [; `/ ~1 U9 { switch (drive / 2)3 h$ v3 _# s9 ?/ L- w
{: y( R9 W( _) l4 C: A8 ^) T
case 0: baseAddress = 0x1f0; break;
4 O- ?. R* {; N case 1: baseAddress = 0x170; break;7 g3 p- B3 v1 J; d1 B! M! c
case 2: baseAddress = 0x1e8; break;
7 {9 |, K( c% ], s" G! I case 3: baseAddress = 0x168; break;& ^+ D8 o: x" b# n/ @
}
9 e+ N2 o; j' s3 Q; D: Q* h' P- a+ l* y7 G
WaitIde();
( _; }/ |6 t" e, a+ A3 o outp((WORD)(baseAddress+6),0xA0);
+ N; W& }3 U3 P7 c al = WaitIde();
, ^& j/ l) O( M v
* F' s% Y" _- H- o" h9 q if ( 0==(drive%2) && (al&0x50)!=0x50) return;
$ e: |* {8 w( j/ w; ~ if ( 1==(drive%2) && (al&0x20)!=0x20) return;$ d4 S7 ~/ T; H/ Y. `
$ v# Z8 ^+ q) E+ a0 O3 O, c' J
if ( 0==(drive%2) )
% @ D) ?# l, @- C9 [+ U outp((WORD)(baseAddress+6),0xA0);
( ^: y. W: E2 | else4 N* _- N. R- j( y# E* y
outp((WORD)(baseAddress+6),0xB0);
, E; Y* o" {3 R* {' D% E. z( r8 @1 Y) q: a- G
outp((WORD)(baseAddress+7),0xEC);
" [. y2 f! w* m. G g al1 = WaitIde();
' n; W" k6 r. _2 Y/ }3 O if ((al1&0x58)!=0x58) return ;
4 ]5 ?/ g- R% w0 i2 Y! B, Z* H q. w
for (i=0;i<256;i++)) O# Q: R8 D F
{
$ N4 M C+ E/ X' D# w. \0 ] pw = inpw(baseAddress);2 p. I7 l7 Q6 s) R" s0 q5 s
}
6 F9 a* {* @& y/ m}
9 ~& U0 d( @ A C) ]8 m
* k9 b( Z1 `9 ~! x% e! |) r( E/ `7 Mstatic void __declspec( naked ) NowInRing0()
1 B+ J8 I% ]% Y! m% f- @{0 ~) z& f- |' M& ^9 x, G) P
_asm1 L! g6 A2 z+ _8 L6 Q
{# M2 N: M) r/ A) z
push ebp
5 P! [. Q* n4 u% g5 z9 U/ A$ M mov ebp,esp# M' Q% R7 s% V9 {" d/ o
1 d+ ?9 p/ D/ l0 e, R call ReadIDE
: f T9 ^8 K( R. k) V& M cli
# }, i$ A; Z0 c' z+ w) d mov ebx, int_idt
8 _- f' G/ x2 v mov ax, Entry
$ {3 G0 E1 W/ g& R4 U0 C7 Q! u- V mov word ptr [ebx-4], ax7 ~0 \6 J3 h- O: r
mov eax, Base* q! }. q8 B* y4 ?0 a
shr eax, 16
; f1 N/ E) y& z! s0 L( S mov [ebx+2], ax' Q* I; b8 y( V0 U$ A/ _
sti
% Y* O* n# G% [1 P1 E leave4 {5 z4 F1 O8 y
iretd
2 v, @* F; l6 @/ I }
: I- v8 t# y) k( l! v}" W- T% v# l- X W0 u9 i
- V" W- o% p X5 m$ x
void GetIDEInfo()
: |/ O N- S4 _$ |{" E; l+ K5 k( `' R! o- A
DWORD dwExcept;+ N: I7 N4 [% P
7 K2 h2 O$ u* g9 k* U/ j dwExcept = (DWORD)NowInRing0;
: h1 H6 G! u$ o; J3 N) v; }' l0 A+ X. S2 v; g7 y. t
_asm
% q# D+ [. M( E, Y {
% C- X9 }, T# V4 n' ` mov eax, fs:[0]. U6 q6 h- v" c k! p% r, S
push eax
; [' ^: {7 N0 ~; S5 W. l sidt [esp-02h]
: E4 m! q U# h0 D1 P! A! ~ pop ebx
) J. l# C% S( x$ w/ m mov idt, ebx
, X/ v |' s: V' o% V4 @/ P add ebx, 0x1C& k2 ?! z* k' w& O9 m0 p6 A$ ~
mov int_idt, ebx% _1 R e0 n9 [2 O
7 Z, u. t# k, e7 O$ Y' `$ A: I, o/ ~ mov eax, [ebx]/ ?+ A3 D0 q' g4 V$ u
mov [Base], eax# a. B7 }0 ~: d7 r; i
mov ax, [ebx-4]
& w& F1 f% R; s6 u9 q' p mov [Entry], ax
3 k% Q9 @ j$ ~6 u8 u
, d) J0 U" ?) B- m1 t! ~% ~3 [ cli
; s @& W" q1 n8 ~" Y7 {6 b1 m mov esi, dwExcept; b6 @6 j8 I* D \" P3 }
push esi; B5 T& `+ ]$ N4 O
mov [ebx-4], si% ~: }: \. _7 o1 G* L# a6 C' B2 e
shr esi, 16
2 [0 _' _3 d# _! ^# ~( ? mov [ebx+2], si2 A, i. j- N2 g. C
pop esi9 X+ q- p- |7 s/ Q
sti7 {1 | M+ F5 g# k
( g* f- M2 l8 V+ q* ~( N5 K7 ?& D
int 3
, A. a9 a' A2 q% e& p h }
& o# K& p3 R' O% _) @' }: g* B5 H}
' `5 G+ ?1 N3 ]3 z9 l |$ k- Yint main()1 M4 Z+ ], S, `
{
& p6 H+ f! d( Z6 v3 _ char s[80];3 ` `1 w0 g9 j; }
register i,j;
( ]6 \# E0 r/ `. {7 R/ w unsigned long id = 0 ;( o1 ]7 G. u- Z& w: T: S
5 K3 L! @, k0 X+ E" j$ |
//特别注意:这段程序不能 Debug
4 D; n; }3 b5 m: ~% p. o/ W0 } for ( drive=0 ; drive<4 ; drive++ )! `& |" Y9 R6 Z* G* T% W1 x
{% l2 ?# d# D& C& H9 b
memset ( pw , 0 , 256*sizeof( WORD ) ) ;6 G0 D* k# H) r9 o8 z- U
id = 0 ;
- `1 [# X( C4 I* a' _ k al = 0 ;
/ J* _% D& |# u; G% e9 N. g7 ? al1 = 0 ;
/ p9 S/ m; u* l5 f! y' `% d GetIDEInfo();
: o8 K1 X! y+ p
, V1 q& R5 B+ ]! g for (i=0,j=0;i<10;i++)
; K4 V% P; t! Y# P* G R {; a( Y9 l, O2 u) `8 l6 N4 b
s[j++]=(char)(pw[10+i]>>8);
- J8 a/ K1 ] i/ X: i- O; f$ u s[j++]=(char)(pw[10+i]&0xFF);
$ o# `7 H! `2 e4 ~ x! M. D }7 Q8 i5 _" W9 n! [3 T t
s[j] = 0;2 p8 D& F2 c; R9 j! A- P. `- G+ T
. w% ^) b6 z5 E6 O l// for (i=0;s;i++)printf("%d,",s);printf("\n");% c* X* o- H c8 d8 z X
printf("Serial=%s\n", s);0 j5 N" {( t) l: k
- h6 V( z4 c4 Z$ q4 M( {
for ( i=0 ; s ; i++ )
& G' I) ~, T* [, F2 |4 ?: ]7 ]0 Y7 a$ g {0 S" G: Z' b- X% L* M
if ('-' == s || '/'==s || ' '==s) continue;2 E' D6 U( A9 P$ x- U9 U- L
printf ( "%d," , s ) ;* n* U5 @/ q2 @9 Z
id *= 40 ; //10 ;
! C- P' ^: D. D, t6 M( o+ k! {: J e switch (s)
8 U8 T) v' c. z6 b% {, r {. [% d: a7 |. Q4 f' q2 \. ~
case '0': id += 0; break;
4 }5 U* H7 {8 A) I& E case '1': id += 1; break;* |* t( e4 J% a2 X2 b
case '2': id += 2; break;
& g( i; B6 T2 g7 P$ B8 g& W( Q case '3': id += 3; break;
+ ]+ X* _" i2 |( e" u4 Z Y case '4': id += 4; break;: t0 x0 p/ R1 \# \4 Z* ?
case '5': id += 5; break;
% B1 \9 N0 R9 ?; [, ?2 T case '6': id += 6; break;. [- v0 W! H4 v- `. z
case '7': id += 7; break;
( A" A- G3 w- ~# j4 u$ } case '8': id += 8; break;0 J$ k+ s0 C) O/ U
case '9': id += 9; break;6 O3 }1 V* D" L; t# z* }$ f, [
case 'a': case 'A': id += 10; break;" {; q. {% D$ g3 z; T$ V
case 'b': case 'B': id += 11; break;1 V9 _/ k' e5 y
case 'c': case 'C': id += 12; break;
! f+ n1 A g* `2 S case 'd': case 'D': id += 13; break;
5 E. A* A- ~. C. Z case 'e': case 'E': id += 14; break;
: j; X* V1 Z; Y, A* ^3 M case 'f': case 'F': id += 15; break;
1 I' s7 U2 B- n4 u2 p* Q case 'g': case 'G': id += 16; break;/ }, z9 e4 u3 g% c7 \+ d3 j6 y+ C
case 'h': case 'H': id += 17; break;/ f- P. }* h5 v t) H5 V
case 'i': case 'I': id += 18; break;
( p* O/ B& a1 ~2 ^& n. U1 r case 'j': case 'J': id += 19; break;) u1 K$ y2 z S5 g: K% `) V7 }* l
case 'k': case 'K': id += 20; break;
5 V q# s N6 n* t case 'l': case 'L': id += 21; break;
! \$ G6 j9 s" V6 R case 'm': case 'M': id += 22; break;
% B- X n2 b' }( V7 ~; ^ case 'n': case 'N': id += 23; break;# F& g. G8 w& {
case 'o': case 'O': id += 24; break;/ K0 c6 y* B+ j& P& H
case 'p': case ';P': id += 25; break;& b$ C' e2 R9 ?3 o
case 'q': case 'Q': id += 26; break;- A; s8 N c3 L) P! G6 i) G7 X
case 'r': case 'R': id += 27; break;$ R0 {! z2 D0 J! X( Y, t: N
case 's': case 'S': id += 28; break;* Z# h! h6 b n9 @. Z( t
case 't': case 'T': id += 29; break;
8 y, x) Q% ^7 b# y' `2 d! e. [ case 'u': case 'U': id += 30; break;
4 z8 j8 |7 f9 a& R; c" N case 'v': case 'V': id += 31; break;
1 s. c3 {; A1 B, z- _, E case 'w': case 'W': id += 32; break;3 p. W( i* n o4 b9 A2 ^! ]' I7 w
case 'x': case 'X': id += 33; break;
r: e1 d) b5 J; o) H, t" n case 'y': case 'Y': id += 34; break;" k3 w5 J8 N% S6 p) j, T) M6 J7 i
case 'z': case 'Z': id += 35; break;
- c1 d7 Q% Q% @- ~ default : id /= 40 ;) v( A) N1 I9 c
}& ?7 Z D- A/ U1 N: d6 I
}
6 Q7 y% D/ S- |. J3 | if (id > 268435455) id %= 268435456;
+ O4 o" _. L- ~! w- ~8 @! R3 x. w) b% V2 k' E1 f
// if ( al1 == 0x58 )* y7 |( _9 n1 U6 g d
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
* J1 e$ v* C! d3 ]! n }! V, a2 ~ H/ Z+ `
getch () ;5 f2 j E9 p) s, [% l. l, o
return 0;% w( i/ ~# m) \# x# k0 ~; [( K
} |
|