|
|
WORD pw[256];3 l3 l0 u% U& x. ~
1 o# k3 |! l; s- v0 `" v2 q0 C
static DWORD idt, int_idt;
# @- W6 V$ Q7 V1 m) I( _3 bstatic DWORD Base;
( c* j; I1 h$ A! Bstatic WORD Entry;/ |( S M/ {0 e) ^9 R
9 r; {1 l2 m: U#pragma warning (disable:4035) , N# d/ \/ `. C, T
static int inp(WORD rdx)2 i- C0 A( \$ R3 |
{& i0 w+ S4 C; D
_asm xor eax, eax
8 [' e* e Z" S _asm mov dx, rdx4 a# B, V& h0 n) B9 I. [& {
_asm in al, dx- O5 t6 D F/ m9 \9 A" `
}
* f( k2 i7 c' y% K! g P" a; A J) j1 D
static WORD inpw(WORD rdx)
6 m; c, ^2 p6 n2 v{& Q) W$ y, }3 B' t% p
// WORD retData ;
" r5 S& E( L- Q" A @* } _asm xor eax, eax4 k0 q0 V8 H! E, C- y; C2 z
_asm mov dx, rdx: R0 ~/ O3 `/ b, l$ h) y
_asm in ax, dx
8 t/ _( s$ d( Q" Y0 D1 K// _asm mov retData,ax* L4 p6 }& j" l* U! ~5 Q1 x
// return retData ;" ?2 ~4 j: c" U! J) @& T8 G
}0 M. c9 k. ?* b; ]4 M( J/ b
( k* t* u) v/ M t, l& P- rstatic void outp(WORD rdx, int ral), i' Q. C4 v6 k8 V( D& P/ S+ ]9 q Q
{4 u& f# {/ n5 Z$ F
_asm mov dx, rdx
W8 Z9 x! g% j9 U: m _asm mov eax, ral
, |3 T& [5 t, A _asm out dx, al
9 o3 |; C, x5 b1 x}: C& f1 z3 i. I
/****************************************************************************/2 D4 C' ]/ V) @9 Q& v
WORD baseAddress;3 i: q9 u% C4 k+ M7 X
int drive = 0 ;* |$ D* H' p0 Z$ T0 r) w
int al ;
8 }! _. ]2 N2 W1 o* c2 iint al1 ;6 e1 z9 z; s) J; @
/****************************************************************************/, w0 E( ?& V. w% r
static int WaitIde() g9 ^. A; D* L: R! O$ `6 E( e
{
6 [4 _5 V7 c" B6 d. c+ n; `7 H0 s( f int al;, z% p* A9 W2 i8 C \
al = 0x80 ;
; {1 q+ v8 U( z5 N/ D' v
' Y; F/ @! P0 i7 u while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
. a' q, x6 z( N9 ?* o `; B. ~- ~* d/ J/ h0 d
return al;9 l9 o5 a/ t& i: A9 F' Q' n5 r
}
% a8 l" \( D$ o! } k. D* H$ [5 L/****************************************************************************/- J! S/ {" H1 x6 w) r* U) Q
static void ReadIDE()& u- [, r% y1 N: z" t
{8 T7 d. B! }! B0 c+ ^2 r' B" [
int i;
8 P- `6 ~5 N% E1 [& l2 Y switch (drive / 2)
3 [- `5 |; v2 l1 W9 b( m* F {- z" q8 X8 }# }6 K& g1 Q- N
case 0: baseAddress = 0x1f0; break;: M' K; G/ _, T( F" q- \% P1 @. N
case 1: baseAddress = 0x170; break;
- u( N, a% | k) k! [2 J case 2: baseAddress = 0x1e8; break;5 R3 @) w; e( i( ~0 ~; r, d, |
case 3: baseAddress = 0x168; break;
) z+ n3 _0 b/ k- d S }
4 s0 i: Q u/ Z0 D7 q6 h: z7 @6 m+ A G6 P. C& B
WaitIde();
0 k5 G# O, _* T- {6 p2 a outp((WORD)(baseAddress+6),0xA0);
$ {2 C( a8 f* c5 y al = WaitIde();4 C2 ]6 G! `7 o, i1 e- s3 ^
$ K6 r( O% G0 }$ P if ( 0==(drive%2) && (al&0x50)!=0x50) return;
9 e; t' h0 M/ c6 g& S$ Q' O if ( 1==(drive%2) && (al&0x20)!=0x20) return;
6 M# C! G9 Z4 w/ `# a( o
: n7 h2 h# r% V, A5 M7 r: g if ( 0==(drive%2) )& C. j& B$ u+ F0 a+ Z
outp((WORD)(baseAddress+6),0xA0);
4 `" I' M, e4 q7 O else6 n% ~; z. {! B3 ^& Q- z0 L; X4 c
outp((WORD)(baseAddress+6),0xB0);0 F) q% g# j/ d/ K, j' }
. W& H F. f9 S7 K5 ? outp((WORD)(baseAddress+7),0xEC);8 L8 b" \) z/ J2 \
al1 = WaitIde();, K7 E5 a& o! f( H* T; E2 T
if ((al1&0x58)!=0x58) return ;- I. [, \) }; y$ r" y( _$ U7 o
8 A: p0 f% {* \& }: { for (i=0;i<256;i++)
5 x4 ?4 K* H4 v, q7 k4 b {
- Y+ l- R3 j& b; f# V3 b' A) P pw = inpw(baseAddress);% ?( B+ r$ k( F0 s
}
! E6 J" U; C3 ^) A, @3 u% L}
I* b6 M' i# g5 R5 e1 a. r2 x) W7 y
% ^) S3 m- x- _' E- r& r: O! z! sstatic void __declspec( naked ) NowInRing0()) O6 P3 u- C$ X4 _0 r1 N' i
{" A$ V# c5 x8 Y3 T3 F
_asm( X" S" j' N$ m- m7 t0 ~ l1 i0 X7 v, q$ a6 R
{8 ?8 L# Z: n+ V# W
push ebp
7 j% P& }) t& {4 A mov ebp,esp
; \9 e) r$ g" h {' s& U- `1 u9 x2 ?" x1 m5 x+ X
call ReadIDE
+ S! x$ ^' E6 k( C/ D* ]* Z cli
: O8 u; q5 i9 i: n1 E: _6 @: F mov ebx, int_idt
* V( ]* ]6 x1 E; z; f8 O mov ax, Entry( p8 m* u7 S9 ~! p i
mov word ptr [ebx-4], ax2 F' u" A- {! A X4 ?5 N
mov eax, Base/ ?7 W( N! p$ {- h. d6 L( S4 ~ x
shr eax, 160 h$ z5 c6 Y) z& ]! \
mov [ebx+2], ax
8 }$ J( x: Y! X; \9 f1 Z- y sti$ P* ?( M8 Y# h/ W* b
leave
3 R; V( G: q Z3 c3 k" F iretd
' @+ E4 g- ]: p7 {/ z1 Q% y }
0 m8 U2 M$ \6 Q/ B) b: V( x}
2 f, e, }% U4 L" P- C( ?9 \8 b9 I7 c* j% j
void GetIDEInfo()) X# X4 w5 ^' Y$ `5 d) m/ W
{
$ i% Z/ g* a7 ?2 r DWORD dwExcept;- N" X" b) g8 G. U1 O
7 y* Y. _+ o' @/ I
dwExcept = (DWORD)NowInRing0;' v- Z, g; m5 B
# D* i+ U3 q+ N
_asm% O# m) f* I0 n: Y3 h
{$ A Z& y8 m4 Y& B2 Y
mov eax, fs:[0]
2 y0 n9 ?3 t" {5 |8 S push eax0 z; O: p( Q7 B) n5 x, s* f2 O
sidt [esp-02h]
$ ^# X. T- l2 R1 t0 v pop ebx. {2 R* v8 M/ t$ D) J6 U4 i" n
mov idt, ebx
/ v" f; Z$ J$ `; a$ q& m! o add ebx, 0x1C
" @( b9 n1 }2 L& r mov int_idt, ebx
/ [2 Q5 `/ ~3 G, U
' ^. @& Q$ Q4 U: r3 J mov eax, [ebx]
! m% f, i4 V# w$ I S2 B mov [Base], eax
' P, V ?$ H$ o& p1 e# w/ |+ g mov ax, [ebx-4]
* w6 W7 }+ h- K: a mov [Entry], ax
% z. t/ b# p) T! E* r! ~8 B. e
0 f& J4 [$ v( _ K! W cli
; d5 i% \: i- J0 B% d% A" j' \) b3 c mov esi, dwExcept: X' d, V7 X5 P# E: x% o
push esi
6 P4 n G: @, Z6 A: I0 k& y mov [ebx-4], si
j8 }$ \/ x7 R {4 _ shr esi, 16
) g8 e" e. c; f1 `, A* y+ ` mov [ebx+2], si6 }" ~ t. ~. ?: [6 A9 r1 L
pop esi
V4 q" g- ?& S( k& w sti
) Z! l) I8 J) Q% s# z$ s# \) j* u2 x' U, ~% V# m9 L8 B4 y
int 3& i+ ]- `% Z% P# D$ |! d
}- W+ ~# k+ T# y; N/ ~3 m% V
}/ U( A4 H) E R; l( o
int main()
q' `$ S) o4 b. w{* m/ H5 q0 \8 v8 b9 ]
char s[80];# ]- ^/ b+ [+ b y* v- V f
register i,j;
8 M# y/ Y' w, y( v& n, O. J" p; H) @ unsigned long id = 0 ;3 Y- A3 w/ e6 J# `& v
5 z4 J- s& x# u3 B0 x//特别注意:这段程序不能 Debug i* E% A5 L1 c L
for ( drive=0 ; drive<4 ; drive++ )
" k8 \ M9 S2 k+ _* _9 q {
; s" i/ u0 z% v; ~8 U5 x$ k0 D# n, U memset ( pw , 0 , 256*sizeof( WORD ) ) ;
+ [3 g2 [- G) \ id = 0 ;
$ @% _9 n, q. u3 F. h. f2 ? al = 0 ;; I- Q) i- K B9 N/ l+ V, ?1 W
al1 = 0 ;
9 I1 |/ `7 o# u$ g7 f+ l& n GetIDEInfo();
# T8 G- y* \9 ^/ q, L. w) H2 ]6 h* Y( z8 Y
for (i=0,j=0;i<10;i++). I4 l$ N d9 R& d# F6 j+ n
{' ^% M+ W b4 t6 g i- w: T: @
s[j++]=(char)(pw[10+i]>>8);
. h C% ~& G; T6 k5 U {$ g5 e s[j++]=(char)(pw[10+i]&0xFF);
6 {+ c& ~5 u! B }
# @& d( N1 }' L# O s[j] = 0; D6 \ w0 `) s8 \' ^
+ j/ I. R" l' c) }
// for (i=0;s;i++)printf("%d,",s);printf("\n");
, {9 G0 `$ S$ Z+ H printf("Serial=%s\n", s);
3 J* v7 a' w; \5 m% d! [+ p4 X2 C% P5 u, Q& d; z1 S6 R6 ]
for ( i=0 ; s ; i++ )) s. r# V% o( Q6 @3 k* n/ m- M
{* v* [4 G- B, A9 u. {' j
if ('-' == s || '/'==s || ' '==s) continue;
2 Y! [1 N" Y, v6 b- H printf ( "%d," , s ) ;
4 m% o! O2 p+ \5 @5 a1 i" L id *= 40 ; //10 ;9 W" Y, t# o u# r% y7 I
switch (s). P" u/ ]1 D4 f
{
5 w3 l6 b3 S& B case '0': id += 0; break;& e1 K1 F' a' ~
case '1': id += 1; break;
" L" B' g( f- n; u, l, S case '2': id += 2; break;
: }7 k1 B# I, R0 h; P2 b case '3': id += 3; break; }1 l$ e) M, {$ {2 J
case '4': id += 4; break;& H9 Y! ]! `# J
case '5': id += 5; break;
# v' t& y" f/ }6 I2 \) `* u) H case '6': id += 6; break;0 x# t" Z, m& a
case '7': id += 7; break;* x# s3 T: E0 t3 I# G# z
case '8': id += 8; break;) m. S: Q6 t# C; ]6 l
case '9': id += 9; break;# T( h3 \ S' k, r: T# h& @
case 'a': case 'A': id += 10; break;3 u7 Q s+ L2 O; L7 k @" N
case 'b': case 'B': id += 11; break;1 [9 S, r; [2 Z" X+ r$ t
case 'c': case 'C': id += 12; break;
& t( [1 w' n) y0 s; S' G7 }" M! m case 'd': case 'D': id += 13; break;& [0 _7 r4 e z% @6 s& a
case 'e': case 'E': id += 14; break;
3 r$ H7 O0 I8 C3 n; J1 ~0 [0 ?" R case 'f': case 'F': id += 15; break;6 e) ?) V% F1 f' z" a4 T
case 'g': case 'G': id += 16; break;
; M2 C; `2 E! _# ^9 p4 S, { case 'h': case 'H': id += 17; break;
) ]# v% `' ]7 |4 B3 F" l9 ? case 'i': case 'I': id += 18; break;5 D% l7 O' m2 N9 {4 P
case 'j': case 'J': id += 19; break;
/ _3 u$ l a+ z7 A2 G5 P case 'k': case 'K': id += 20; break;
& w/ W5 k$ Y6 {% U case 'l': case 'L': id += 21; break;$ O$ n9 t# X ^& V
case 'm': case 'M': id += 22; break; s ^, @% g/ ^6 w" E2 K$ B
case 'n': case 'N': id += 23; break;
, S4 ~) K* E7 s6 b/ { case 'o': case 'O': id += 24; break;. e4 y' D7 x" G8 \( v
case 'p': case ';P': id += 25; break;
: z2 \3 ]* i% x5 z. V case 'q': case 'Q': id += 26; break;0 w a# Y K# i. n+ E0 `! n
case 'r': case 'R': id += 27; break;9 Z8 W+ Y) E& S+ k3 {
case 's': case 'S': id += 28; break;+ A- _1 z9 }% S
case 't': case 'T': id += 29; break;: Y8 ~/ w5 `# E' Q( _" O# h
case 'u': case 'U': id += 30; break;- Y0 {& \* {3 w# H3 w5 t8 ]& F6 K
case 'v': case 'V': id += 31; break;7 b( V! [3 a+ A: O& y Y+ X8 r
case 'w': case 'W': id += 32; break;0 T: N2 C+ _9 t! R; O u
case 'x': case 'X': id += 33; break;
4 _6 R6 ?( _3 K0 _ case 'y': case 'Y': id += 34; break;
5 T( [& e$ \1 y: w. D& [ case 'z': case 'Z': id += 35; break;
. @4 e" J9 \7 f- { default : id /= 40 ;
R' ~' d ]! y }
4 @3 n5 {" v2 k: `$ {& R. b }
8 K1 u/ C0 m! U. | if (id > 268435455) id %= 268435456;
, n% x" b( p; O I5 j p. i( |; {5 w; a4 {, T6 X G
// if ( al1 == 0x58 )5 O+ `& p( C# R" _, D7 q; L
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
. ?7 i c/ z' S2 w }
- b/ K6 E+ m& A getch () ;& }8 E3 i5 m( o: E/ f
return 0;
! K: F- i: e; i; x0 W& O} |
|