|
|
WORD pw[256];* R" H& Z! J, q; v
' K1 M: _, m. estatic DWORD idt, int_idt;( I# |' H" v1 R# K$ }
static DWORD Base;
- M; X- {* _- f. \; p; f5 _- Bstatic WORD Entry;3 L( ^5 y/ A. g6 M8 l& r
0 e d5 l0 q- i: a' K( P) \. e#pragma warning (disable:4035)
, E2 X$ q, a. Zstatic int inp(WORD rdx)9 w2 N& s$ U" S: F1 T
{" s3 V b# e7 j1 Y# p
_asm xor eax, eax+ G3 {4 Q7 |* z
_asm mov dx, rdx
& R& z3 d2 o+ z! |0 @ _asm in al, dx( \5 ?* e2 u+ C1 i
}4 V' K) J% K' L" Q
+ ^# B$ ~$ ]' X$ [8 x! X
static WORD inpw(WORD rdx)
: D' }& a2 J% G; X) l{
( z4 X* k2 y+ T0 s7 |/ x$ d// WORD retData ;' O; t1 E- ~$ z4 V# B
_asm xor eax, eax
; u6 b) u6 B) g7 V$ z2 k _asm mov dx, rdx
; D( T( |! f6 M0 A+ n' E! q _asm in ax, dx
1 D$ d! e* ]( R5 T- \; v7 ? j// _asm mov retData,ax
0 s4 y7 j+ A4 A6 Z: b- a// return retData ;
0 M/ k' O( K* B}
. T" q" r6 H4 m8 \2 E4 k- J
+ @; q' b. h& fstatic void outp(WORD rdx, int ral)1 b- y, `- t5 N! ]
{7 y+ X* r3 P1 R0 v a5 D2 H/ ^
_asm mov dx, rdx
v( P. }! u8 ]% @! T" j _asm mov eax, ral
F$ T1 ?+ o! N! s+ y _asm out dx, al
% W( D. n- z' j- h0 K}
. G* Z9 [# D( T& C/****************************************************************************/
/ ~( E0 j1 P! f/ OWORD baseAddress;: v: D" y* ? j' [4 n7 N
int drive = 0 ;7 n0 b, N2 A( S
int al ;
9 p8 D, O; X0 _. x* w( nint al1 ;7 _( e8 Z l6 M7 y: n
/****************************************************************************/
- d6 I4 B% }. Rstatic int WaitIde(): T- E9 J/ N( T' D
{: V% }) p; i# X/ h; V: e0 ^
int al;
1 B f3 K2 s4 | al = 0x80 ; z. O1 j5 ]; U( n3 k# L/ [
+ O1 f( m4 ~4 B1 g% Z while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
9 f4 d9 G: r& u
) P* R% O- d! Y( f return al;
2 S) D) V# R1 e+ w! x& R}# ?. ]3 A4 X4 l- N
/****************************************************************************/. n% k, A2 f( e! m( o
static void ReadIDE()& Z* b# H- e& x" K t
{
/ l# w1 C0 h& T int i;
9 N6 R7 D0 C* B5 L switch (drive / 2)' Z( i6 Y. F( @
{
: M/ \. o, L' j& ? case 0: baseAddress = 0x1f0; break;/ y B& g& g+ F
case 1: baseAddress = 0x170; break;+ Y( ^# t% f4 {) i; H
case 2: baseAddress = 0x1e8; break;0 w, k, C4 A" O5 ]( l" X5 b
case 3: baseAddress = 0x168; break;
! o$ P, J8 ]0 Y. t' T }; ~6 }# h9 F3 x& s+ @! A4 P9 |
) U1 t0 e- @) K1 D
WaitIde();9 G8 y1 _+ e, Q3 m
outp((WORD)(baseAddress+6),0xA0);
" D+ w1 D- x# g9 @ al = WaitIde();
% h ]- s+ l$ w% V* h& C z4 @9 S5 N& g7 ]) ^, B( I
if ( 0==(drive%2) && (al&0x50)!=0x50) return;7 `( f2 l/ |! y8 m) R
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
8 h) r! Z5 A' S+ T# d) P# g: g! W, i/ @* }
if ( 0==(drive%2) )
1 L) ^: T( |/ M7 D outp((WORD)(baseAddress+6),0xA0);
0 w* O. V& } x else9 o' B& k `' p+ c1 `1 ?
outp((WORD)(baseAddress+6),0xB0);/ m' b. Z0 l. `
' K: |8 }2 L4 _5 z! b- |
outp((WORD)(baseAddress+7),0xEC);1 q O0 N/ A$ [
al1 = WaitIde();
8 u1 |6 I7 ?- @* V8 Y) P8 x4 h" Y if ((al1&0x58)!=0x58) return ;) P/ w9 k3 q) [
C/ ^- B% X6 G( p$ a/ H' B5 X4 } for (i=0;i<256;i++)
, U! n3 V0 \' @2 t+ S y4 g0 q9 V {
" P8 B' A8 U! O b0 H# L pw = inpw(baseAddress);
( X$ G5 A/ t4 u" L+ ~: y }
) a# A* e: }* `. W}1 G. j0 k& [# M) |" k& V
; q, ?8 i2 v" N0 ^0 }6 Ustatic void __declspec( naked ) NowInRing0() d) Y; {' c6 ^+ M/ Z6 ^3 M
{0 S1 V! A% R7 J1 g7 _( j$ l
_asm, o% a' O8 T6 B* B
{
, S9 u4 B$ M" [; Q2 q& L push ebp
/ S+ [$ z7 z: Y1 V! C mov ebp,esp L3 ?! q/ |0 q- O1 r
+ p/ ^$ o- l1 f2 @6 G ^9 m
call ReadIDE0 [/ n, E' n" v
cli [8 _* A" i1 t5 y2 n1 {
mov ebx, int_idt9 f: J% B) t6 O: T% \
mov ax, Entry
H% j1 h% {, B' G; _. L mov word ptr [ebx-4], ax
; H# h/ E1 Z- M% f& W* M mov eax, Base: i- v& m, c4 ~* B& a& f5 `) @- N6 q X# H
shr eax, 16
# R: ~8 k+ O, l2 J& |9 V mov [ebx+2], ax: A5 I3 h% J) ?3 \6 y
sti4 R: F" P, z3 A3 I9 G2 O
leave8 G* B* G2 O2 Y; m
iretd
8 w" E4 q0 s% y8 y4 T8 \6 ]: ~ }1 R; r9 y% b% y9 d* A
}
& l0 F+ ^. f8 Y' i# A
2 ?: ~# ]0 w6 y% Lvoid GetIDEInfo()
6 z4 Q" Q, I k7 R. d{" l9 D1 }$ C0 v w2 ^/ [3 i, O
DWORD dwExcept;' N' u% Q0 G5 t7 X7 b
% k$ R" }7 o/ e. N" D
dwExcept = (DWORD)NowInRing0;- O$ T3 H" i1 B# ]4 O3 w
- D" E7 R5 p/ L4 y5 o' I _asm# D4 F% v8 i" s
{
/ \" G) l" i7 K: l* q# T6 U# Q ^ mov eax, fs:[0]
. s* n/ j- G% t* _* J. j push eax& J6 ^6 m$ w9 o, o* a" G
sidt [esp-02h]3 z. c9 U: t& b+ ?) g" }+ L" ^
pop ebx
1 d8 N6 i. O8 O3 F+ o8 U) D" J mov idt, ebx
5 a2 e& m' I/ `0 k9 i add ebx, 0x1C q& X9 ~6 ^* n7 D% {% ]& c" n) O5 b
mov int_idt, ebx k$ D/ C' C2 y! v
x1 R6 a/ L& ^( E8 p: x mov eax, [ebx]
4 E( T2 P& A1 g' m5 [; a& }* s# y mov [Base], eax$ p( q* _/ Q3 E6 _; S
mov ax, [ebx-4]
7 k( Q0 O) Q% g1 @& h4 n4 Q mov [Entry], ax0 A3 m, j ~# F3 E
& v# w L+ f: k. a( Y0 \# R7 v5 @2 G
cli1 K. N- O" K$ X" V; z: _
mov esi, dwExcept% Y+ C8 d! q8 W" q/ J/ l: s
push esi: w0 q& c" f7 |+ z
mov [ebx-4], si" m" o3 w/ s) z
shr esi, 16: ]0 _8 ? P$ b* i1 Y$ r, u4 {
mov [ebx+2], si
0 l1 D6 p1 c/ V- j5 c- P' q pop esi
B; J" {6 J+ \5 S1 M" M7 z sti
( [% t- n5 v z+ Y# p
) {+ e: y: S6 _9 B8 q! ] int 3
; }# ]( v1 x8 y, P/ U# ? }
% J' H8 G# y* \ {}
8 I: x0 V+ W5 X5 T' C' i1 Nint main()
% E6 d) n8 h5 s* H{) k- ]2 m4 n/ J- t
char s[80];
1 r1 W7 t/ K% S register i,j;1 b" d$ R" |, A0 `6 c0 S: ^
unsigned long id = 0 ;
+ K( }7 @; g0 f& @; a: g) ?# Z% Z6 m) w5 v4 V7 ~& X2 I$ h
//特别注意:这段程序不能 Debug. \7 p) d6 g: O, @$ b
for ( drive=0 ; drive<4 ; drive++ )
5 o4 d; o) g" d) c {
( L! H, I8 x9 |% N7 q# |- d memset ( pw , 0 , 256*sizeof( WORD ) ) ;
& r" {4 U! o( i; i: e6 A1 {* k id = 0 ;4 q7 z0 N# r/ ?# G S
al = 0 ;
" y- Y, l. F) s }* B, E al1 = 0 ; y: m: O8 \0 V( P& N
GetIDEInfo();
0 h* E) D3 X( b A
* A2 b# A# U# |2 d" s$ q for (i=0,j=0;i<10;i++)
% n* X6 G# O1 P6 c* _ {+ [/ L0 z! [! }' I
s[j++]=(char)(pw[10+i]>>8);
5 L( {% `. D3 E% {. s5 u s[j++]=(char)(pw[10+i]&0xFF);; s, a0 B: `' J# R1 I% b6 c
}0 x- I L% B( K! i
s[j] = 0;
e4 E# H/ ~% q$ ^( q% Q) V. f
5 _5 q4 F3 ?# ^; y& w, w" E// for (i=0;s;i++)printf("%d,",s);printf("\n");/ J# Z- a3 M9 g9 o6 y
printf("Serial=%s\n", s);
, L4 s& A7 ?0 `- `
# @3 z- v2 v+ `- D3 ^$ U1 j: Z for ( i=0 ; s ; i++ )
& x5 T$ {9 V0 ?* T7 k7 p T {
7 V3 j7 G; V8 _# Z( t7 D1 [ if ('-' == s || '/'==s || ' '==s) continue;4 Q1 l9 s# g) \
printf ( "%d," , s ) ;
0 ], U: E' p* u4 Y$ y id *= 40 ; //10 ;
4 y% E% o0 ?2 [3 i. M: e3 ^4 t" q1 w switch (s)
" I m/ U0 K% Y6 X, @$ z {. f' c+ ^& g$ C; k, |
case '0': id += 0; break;4 o3 v- K1 k1 O" K1 y3 b: c3 ^( ]
case '1': id += 1; break;& j% I# ^1 R% J
case '2': id += 2; break;: Y1 l# E0 n8 t( f
case '3': id += 3; break;
2 T, }; m; a3 ?. o2 o8 R( Y case '4': id += 4; break;
( g! k& g" Q7 B' x! B% b! [ case '5': id += 5; break;% p$ r8 t( w; @2 t' X) f7 m
case '6': id += 6; break;$ v- r, b5 G* d) s
case '7': id += 7; break;" M( o7 H+ H6 p7 S1 W
case '8': id += 8; break;
8 \# K G$ x R case '9': id += 9; break;
5 f" R, N) S* w7 [+ S7 }. |" B# x case 'a': case 'A': id += 10; break;" K8 ^1 Q! g/ c$ H
case 'b': case 'B': id += 11; break;* |7 C! M3 a) x5 `/ n f
case 'c': case 'C': id += 12; break;! `$ q9 N( p) e, n
case 'd': case 'D': id += 13; break;
8 Q- T; M K- q, W7 i$ V case 'e': case 'E': id += 14; break;! g0 K. p( S$ X# i# E8 i; @7 B
case 'f': case 'F': id += 15; break;) j5 k" H8 r: B5 m$ k
case 'g': case 'G': id += 16; break;: T8 W* p" {+ l% U( p6 @8 ~
case 'h': case 'H': id += 17; break;! [( @. r3 t6 X6 G+ X
case 'i': case 'I': id += 18; break;
- J) Z. n; V) z2 X9 F case 'j': case 'J': id += 19; break;
0 M5 L |, i' | case 'k': case 'K': id += 20; break;: }1 \' g* j% I2 h" d* L' z8 b) @
case 'l': case 'L': id += 21; break;* _5 ^! m) d$ `' {1 \
case 'm': case 'M': id += 22; break;
% b C5 a6 R2 [1 k case 'n': case 'N': id += 23; break;: m: g3 E, y+ ^( p I% e
case 'o': case 'O': id += 24; break;8 M2 W6 c3 y* K/ l
case 'p': case ';P': id += 25; break;
5 x& _* n$ A. [$ U case 'q': case 'Q': id += 26; break;
0 H7 X5 V$ H0 V6 T9 a case 'r': case 'R': id += 27; break;
# J) a7 L8 v) V% C6 ? case 's': case 'S': id += 28; break;" C& X) }, `0 U/ a- U! P' S
case 't': case 'T': id += 29; break;1 M; a8 G3 t8 W t! @, I
case 'u': case 'U': id += 30; break;
& ]* A/ }+ A) u" {; X2 h# n case 'v': case 'V': id += 31; break;
7 ~ X5 f& [* ?' E) l case 'w': case 'W': id += 32; break;
: `$ u- L- Y3 \5 x2 N0 V case 'x': case 'X': id += 33; break;- k6 L2 m w0 q8 ?
case 'y': case 'Y': id += 34; break;7 E3 i' z( G/ P) `
case 'z': case 'Z': id += 35; break;$ c( L ]. \: b& _
default : id /= 40 ;
! Y# Q5 i2 e1 Y5 E: ]: B }( Z1 i7 @& U3 d7 i
}/ M+ v4 R, V2 F$ L
if (id > 268435455) id %= 268435456;- {# ?3 v5 J/ l2 t! K
7 k# D) H+ [1 t1 C! d g// if ( al1 == 0x58 )7 k2 U, T: }+ R8 u: p6 B
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
- B6 x2 {# ?3 D/ s p& x }. c- _& y( P7 @: z5 j4 v7 ~2 @9 ?
getch () ;
% r5 S/ B0 d- D3 W- c3 J return 0;3 W! x9 y7 p6 i6 C! G
} |
|