|
|
WORD pw[256];
, k% i1 ]( z) j
% Z2 |( R7 A% I( ?" _9 a% Vstatic DWORD idt, int_idt;
% h& I" x( { ^( q+ astatic DWORD Base;# A; Y) p' D: q( }! |) W& I) ]
static WORD Entry;0 e+ a1 X$ t6 E. |
, N$ C6 E4 g, F5 W, _
#pragma warning (disable:4035) % ?0 ^6 E' H8 _
static int inp(WORD rdx)
% b, H8 H: f6 @1 F: I6 M) E{
/ v; f; r( E9 h0 n" g9 T4 n _asm xor eax, eax$ y- z2 @) o) T" c/ K
_asm mov dx, rdx" [+ s' ]% ]: K( \- l
_asm in al, dx! O9 Y/ s$ L& `& Y- |+ @" z( y
}
2 ]; @! Q1 S2 k+ `+ {; h' e# D9 [5 K0 R6 n5 w0 e/ y6 T; y6 j$ ~6 a
static WORD inpw(WORD rdx)( R5 X |( H7 } z) ]& w7 l( o
{: P! C3 N4 J {# x
// WORD retData ;& y. U; [/ h: n0 Z% S |( l
_asm xor eax, eax
: S+ H0 W* O# @3 k$ x, I3 E- c _asm mov dx, rdx
, u6 w$ x: ?6 k _asm in ax, dx& d1 P( @/ r6 v& f* v4 G& s
// _asm mov retData,ax/ Q2 E- Z: c/ D4 P
// return retData ;! D4 z- W* `+ O1 ], K
}4 b( D6 v/ a# u, g; r# m6 O; z; p
3 X4 a: r( X( f& M( S# rstatic void outp(WORD rdx, int ral)
: x0 C5 G1 C& P( _{3 r& o& g* e+ ]
_asm mov dx, rdx9 t' Z y0 h. h. k4 E* i
_asm mov eax, ral
* X8 b( \; d) g" Q/ j: P _asm out dx, al2 l1 l, i) l- n! C
}+ j" x) p/ i: a( l
/****************************************************************************/
& \/ S/ l2 M, @, J$ h" @/ vWORD baseAddress;7 r0 w J/ H p+ n6 t
int drive = 0 ;
M) C/ U+ p/ Z+ {5 j# \int al ;
2 T8 W6 h2 e" jint al1 ;
: {7 W+ @. h' a/****************************************************************************/$ d( M; C8 ?) m& B9 A6 v- d
static int WaitIde()
5 c" ?+ i3 H% W+ d& `( \2 }{
8 g) x# E9 v, M# Z8 D- O, ~ int al;+ L( f. ?+ J5 P0 Y" q6 n
al = 0x80 ;
, e* ]; M8 C2 p% y* \
. S9 Z9 y8 c1 q8 i& z, a; [7 ^) U. F! c while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
6 b' ?: M0 l' u4 M
2 J: ^0 z: M9 y/ ]0 y) H( {0 { return al;0 Q9 F6 l. k; a$ B1 t9 ^& j. v
}
0 _& |! ~. H' X. ]% ]3 }7 a. V, D/****************************************************************************/
. J( y& F$ [' i. y: j5 h- gstatic void ReadIDE()$ [+ S+ U9 t( w
{
& M3 o" k& b" S) z; v int i;& F' L' C( q, z
switch (drive / 2)0 y8 i# [; Z" K' q0 f r
{
; B/ G$ U1 R4 d9 B0 E) \# s; x, V case 0: baseAddress = 0x1f0; break;$ S6 e3 r; K: ^/ q2 R
case 1: baseAddress = 0x170; break;& c3 v7 B; R; ]4 T3 g# ^( H( ]
case 2: baseAddress = 0x1e8; break;; O: [& ~8 |$ x" W8 P
case 3: baseAddress = 0x168; break;5 |% h& b9 U: d Q2 p/ f9 v8 x; [
}
$ A+ M- n4 Y" O& x
8 D$ J! M7 p+ U5 P$ Q WaitIde();6 G/ `0 n; {8 i* x. ?8 d
outp((WORD)(baseAddress+6),0xA0);1 f, f% X( \' a! u( ~- `
al = WaitIde();* @* L, Y/ _9 Y8 |8 {
4 {+ W1 t A0 h8 {# w# @ if ( 0==(drive%2) && (al&0x50)!=0x50) return;. @$ K0 n) e5 j ^3 ^
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
: a+ F- W3 W0 P9 E: Z$ y- X$ B5 L$ a; }
if ( 0==(drive%2) )
7 v* a9 E' {/ ~$ z5 R outp((WORD)(baseAddress+6),0xA0);" P, k: k( j- X% }
else% @% b% F f+ {; L% X
outp((WORD)(baseAddress+6),0xB0);
( v k& X5 e% V4 |& B) b& p8 i" M# i* O) d0 C
outp((WORD)(baseAddress+7),0xEC);
6 c* @, H5 _0 M: r5 s: |* R( Y al1 = WaitIde();; K1 S) x0 ]+ P% M) w: F: x
if ((al1&0x58)!=0x58) return ;, H: }$ {+ X# u2 ^$ m1 ~9 B& S5 W
2 J$ W4 e. q* k& c; z7 ` for (i=0;i<256;i++)
9 d9 V; [% i1 }# }6 P0 `$ J. e {
1 W9 z2 n/ [5 X4 W& ^5 _' z pw = inpw(baseAddress);: ?! [. G4 |2 @. K) e {3 F5 D
}
. D: R/ v* `/ t}
6 _; e+ c3 ^8 v7 |! n8 L" x
1 T _+ s1 z" A1 L& V+ G8 ostatic void __declspec( naked ) NowInRing0()
1 H6 U' _8 y8 t6 ]{8 V; {8 V% Q6 Z/ L7 P. f
_asm
1 D( ?% {/ k! J {
1 D# w7 Q6 ]7 [, t# p push ebp, [$ I% I* H5 N( L! w! ^) Y
mov ebp,esp) J: b' C. B' @: K* s
" A. x1 R3 \; @/ F$ m0 T9 @5 D
call ReadIDE8 x9 B# ?0 M t
cli
6 P( S" W" N5 u. v4 w7 A mov ebx, int_idt. m$ H. o% N0 A
mov ax, Entry% V: h! M) q$ j! E; o B& y( L
mov word ptr [ebx-4], ax
, {9 ]! Z- r* s% w' n mov eax, Base
5 b% |5 `( Z3 k2 [4 J shr eax, 16" M# A& O- ~% Z
mov [ebx+2], ax/ c/ ]9 P% C8 j9 {$ d
sti
4 R' C8 O t7 V leave
S; C; z% _# V. O/ L! r5 C iretd0 z; d2 n, A; `3 x* r0 l7 A
}0 ^5 E, ?+ X& t9 o9 R" G7 ?0 K* C9 m
} I. q& L4 `% h1 M/ j2 X; W
8 a6 b$ p4 H! R+ K
void GetIDEInfo()& x! Y- q- F" J, q* Z& h! N
{. C3 A- ^" N2 d" p0 O
DWORD dwExcept;! J8 G. q- ^: i4 u# `5 Z6 |
- @1 J* Y2 j$ [; k" g$ J dwExcept = (DWORD)NowInRing0; y X! _) Q( r& }$ [: V3 N
8 R P. q4 X o Z$ H
_asm, i! q/ A# H& b9 m
{
. I7 m& \4 Y1 D9 |7 Y/ S/ [- { mov eax, fs:[0]! X9 ]3 ~0 `' \
push eax
+ ?% M6 c) x' V# ~* Y sidt [esp-02h]+ e! w0 A; F: ^
pop ebx
) f' \1 k$ u* `. F! i, [1 L, W mov idt, ebx
# u# m: a p8 q. h add ebx, 0x1C
3 ^3 P5 M6 X; B2 u8 [5 [ mov int_idt, ebx
Q* k) r5 O8 g2 P7 ^8 J( L
( Y/ I/ l# i# u- h# @8 n! f' T" G mov eax, [ebx]6 Y6 y, q3 j; m5 G& `8 M E
mov [Base], eax
+ ^4 {' S/ f0 g9 o" B; P mov ax, [ebx-4] v9 N, j2 ~8 E
mov [Entry], ax
3 c) ?4 B% \+ P. j- i8 d- k2 K" o" {/ F* y% `
cli, D% p% R, @( _/ M5 u2 L* B
mov esi, dwExcept
: s. v% a9 c. U4 S6 s2 W' X push esi
& M' _7 ~" {. i( b7 c mov [ebx-4], si
3 J$ h! e0 x Y; z' J1 x shr esi, 16. I, @. ?* z5 Y) f% F
mov [ebx+2], si
8 y p4 b w( D; L5 y7 i pop esi
5 [% V; H' j/ k p6 U/ c% ? sti2 Z. w: V; S* x, f9 K
1 m# _1 u* o- D4 L* D1 E$ L) N% Q5 Y int 34 R- W+ U" K4 b T; \+ N& p
}9 v6 c) m! h5 ^8 G( u6 _
}% p1 `2 y8 ^8 {& U
int main()* I- c6 Q: l( x" O) d# K
{
" R7 s7 [5 m6 n char s[80];
O- M2 x8 l+ F1 @* J register i,j;1 p$ M% L$ M" d- b; m/ x
unsigned long id = 0 ;- }2 n* q- z7 g' V0 E
8 u! c: E1 p" ^; e# K: P//特别注意:这段程序不能 Debug7 X' s) }- q7 ^/ q9 l6 _6 P8 }
for ( drive=0 ; drive<4 ; drive++ )$ k6 L+ \7 C: r( U! H1 c' O
{
7 ]2 N* W: r2 G1 j; } ^/ }" b memset ( pw , 0 , 256*sizeof( WORD ) ) ;
. o4 t# ]" y) F* h% l& }6 h1 h id = 0 ;
/ u% Q- G: [' a, d al = 0 ;
! p/ p/ q+ B1 G8 ^& W al1 = 0 ;% M7 S% c; O( H3 |1 r
GetIDEInfo();3 {. z" L* H. ^$ u6 f$ Y9 W7 V
* t! n9 w9 Q; w0 v% |0 o) S4 b% ` for (i=0,j=0;i<10;i++)! M: W; t3 i1 x. ]* ]
{
$ @; f8 }3 w, Z/ u; L; N: i s[j++]=(char)(pw[10+i]>>8);
4 o% a& n7 g. d- N6 k( d s[j++]=(char)(pw[10+i]&0xFF);# @' V' _7 W5 L; X
}2 h6 f+ p; U; Z6 g, C0 I6 j; l& Q u
s[j] = 0;9 K2 I& `) d+ `. X3 e8 d' D
$ w5 G' Q/ `% U5 I# [// for (i=0;s;i++)printf("%d,",s);printf("\n");
& ]: D) s: V& m( a7 k2 Y/ u8 g printf("Serial=%s\n", s);3 e: `8 H+ c7 {; @
" p% e" ^$ h/ e8 |/ s$ \ for ( i=0 ; s ; i++ )2 p+ _, B x. w# I O0 e/ k1 i
{/ B- H, ^! P/ P, o m' c6 |* f7 Z9 H
if ('-' == s || '/'==s || ' '==s) continue;
1 Y! b1 C7 c2 g, o+ o6 c/ U, y printf ( "%d," , s ) ;
9 u) v* S) J5 E2 Y3 u6 g4 P id *= 40 ; //10 ;+ V, x9 [" n! ]3 C
switch (s)$ F5 w3 Z; f9 T+ B9 V* U r z% Z
{- z) o: _" X" n' q
case '0': id += 0; break;
5 w `( r3 l/ |2 l2 ^ case '1': id += 1; break;5 z) w8 @5 u& P1 {4 x& E
case '2': id += 2; break;
+ V( i0 L; a( S6 C case '3': id += 3; break;
, u5 E q1 x% O! `( j& l+ C" d case '4': id += 4; break;6 q# f1 J" S1 @) L2 z, d: X: \6 O
case '5': id += 5; break;
0 j# |3 t9 X4 M( P case '6': id += 6; break;
1 k# _ }3 m: A9 m3 G3 |# E7 @ case '7': id += 7; break;4 p) z5 k7 @ ?% m
case '8': id += 8; break;
) F( K( A7 K) A, \: B1 N case '9': id += 9; break;
* w& l7 r, f6 y" a# a6 ^ case 'a': case 'A': id += 10; break;, r+ E. U1 y% h) j
case 'b': case 'B': id += 11; break;
. w# I6 r) Z# \, S- V) H case 'c': case 'C': id += 12; break;, u8 P. ~8 `( M3 T }- Q
case 'd': case 'D': id += 13; break;
6 P( o7 i& I, r3 n1 a case 'e': case 'E': id += 14; break;; i0 y6 } D0 X7 x8 a
case 'f': case 'F': id += 15; break;
, z" t3 M5 k5 l3 Z0 c: x case 'g': case 'G': id += 16; break;
( Y* c' p) [3 a4 A7 S9 g case 'h': case 'H': id += 17; break;. t; C6 N- H, y4 Z0 n+ s8 l
case 'i': case 'I': id += 18; break;) H2 E. ?8 c4 x5 `" }# k1 D9 E
case 'j': case 'J': id += 19; break;
6 L0 R& w& ?" {: N case 'k': case 'K': id += 20; break;
0 a1 o/ g) }$ K+ d0 t case 'l': case 'L': id += 21; break;
6 k9 V+ F; o1 m& w case 'm': case 'M': id += 22; break;
0 q2 j; _+ {3 r6 \+ i case 'n': case 'N': id += 23; break;4 I2 {* m0 V. S' ^: [0 V! S
case 'o': case 'O': id += 24; break;' j# @) ^( i A% o. s
case 'p': case ';P': id += 25; break;
& u6 r) Z6 H, {8 P case 'q': case 'Q': id += 26; break;
1 \% q6 v7 [/ l8 Y case 'r': case 'R': id += 27; break;
0 [" O; U" H" c! W case 's': case 'S': id += 28; break;
7 W2 [+ l( F, M# o. ^# T! y case 't': case 'T': id += 29; break;
' M9 v M. j0 ] X case 'u': case 'U': id += 30; break; F8 o, `0 K! g, ?/ o" [
case 'v': case 'V': id += 31; break;5 E& Q' U# k8 ~$ @; e8 v. b6 o
case 'w': case 'W': id += 32; break;! A' {/ h: V) d" a
case 'x': case 'X': id += 33; break;
4 m V7 s5 Z- D( ?2 ~" D. H! J case 'y': case 'Y': id += 34; break;$ m. W# k4 a$ H, P
case 'z': case 'Z': id += 35; break;
# K. t+ F/ j3 y% n" c default : id /= 40 ;5 e$ S. T3 |0 A& R- a
}
$ `0 Z. Z c; w n5 |1 W H9 u }0 u. r% _* n( v; G: k
if (id > 268435455) id %= 268435456;. L4 R. f S9 o6 E5 T0 ?
0 s, n$ T9 U# Q- s' G1 k// if ( al1 == 0x58 ). d# {8 q8 b" A; V
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;! [- t. r4 } `8 w( d
}
9 w& m' @( z; s: r# y# A9 S I# i getch () ;; Z/ D4 E4 m$ P7 X8 o- S
return 0;
# j( b/ c5 k0 U: X1 P6 o# C' d} |
|