|
|
WORD pw[256];9 Q9 `" o7 A0 e, m! {
: p7 S: j2 l$ D2 h ustatic DWORD idt, int_idt; K- @# h9 e& f1 F% m" U T
static DWORD Base;* B& x' @) m. R& h% i1 @
static WORD Entry;
8 F; B, ~8 b, C8 q4 A- e( c ?
6 R6 f! x* Y# \# f1 u#pragma warning (disable:4035)
, ^% g. ]7 o( {6 {$ [/ h `static int inp(WORD rdx)
* S) K: [6 {) r L t{
+ w+ p/ s0 s# I! s# z, A _asm xor eax, eax+ T0 h4 k4 c; E: j5 c& {. z0 H
_asm mov dx, rdx* g. r& Z) S7 ~3 ~$ `9 a' x8 \+ |: x3 k
_asm in al, dx
- Z. z! E$ g8 s6 `6 @+ Q& Z+ D}
; S1 w5 S# X1 i) M; [% B9 G6 d( k1 x5 G
static WORD inpw(WORD rdx)9 i# b Q$ h" q" o+ {9 g
{
, P1 Q7 V# j2 S! N// WORD retData ;
' B: g; J2 K0 [! u4 v _asm xor eax, eax
a% t, c8 x" f- t8 M* J _asm mov dx, rdx) u% M% L& x) X9 E0 G, T3 Z' e
_asm in ax, dx: `3 j) ?) W: o& P5 y, r
// _asm mov retData,ax
2 S5 Z- n# H: N0 j// return retData ;
! M; n3 C! f2 O5 y* n}
$ Q& x7 ~" u1 c8 P2 o
1 f/ M# H- c! `2 w/ @static void outp(WORD rdx, int ral)* o9 q1 p! K) i* l8 [3 q! U& V6 e
{5 O. [& O$ B3 H( q
_asm mov dx, rdx# b+ f. @3 @+ [1 h; ]$ p- ^' E
_asm mov eax, ral
$ Y* [* {5 P: S. b+ I" N g _asm out dx, al; {* w9 ]* p4 x& ]7 i9 q* e; S
}- J' t7 S p7 ^. H) s/ h. D
/****************************************************************************/5 {4 I% m) q) Y4 D
WORD baseAddress;# s& K7 Z6 U% E
int drive = 0 ;. x: w6 \4 q& ^5 C
int al ;& ]" m8 H a: p4 e% I
int al1 ;5 _1 s% ~1 z* H) m1 j' ]
/****************************************************************************/$ H& \: i2 A4 I4 Y/ ^. p5 ~. T
static int WaitIde()
* v/ Q. L/ P$ W. P{
. E6 A( m2 T D! |& W3 Z int al;9 y! [; J* y5 Q" {7 c
al = 0x80 ;2 r+ t& H7 P# L( N% P
/ t1 d% F; J* Z
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
+ a6 u$ i" K" _5 k1 K1 [ b s8 n
: m3 T- k8 \! G" j/ v return al;
' x+ o3 M2 d+ F2 L( p}
# T( u* Z, @, _3 H$ B, ]/ j6 m/****************************************************************************/! ?8 P+ s1 Q& q' R/ ^9 o
static void ReadIDE()& _$ Z' z" L& n v6 h7 }
{
! C4 H" f- q9 Q, f) R* ~, e int i;
/ {- H$ h/ @" o( g# y switch (drive / 2)( Q! L& `8 ]9 j" A/ V3 ?( s
{# V: K# K/ a8 B- N1 [+ u
case 0: baseAddress = 0x1f0; break;
: G* |: x2 K( U, z6 { case 1: baseAddress = 0x170; break;
! s7 A: I% D3 e, h5 o8 O case 2: baseAddress = 0x1e8; break;
( i( J) {- [( W' \$ Z/ K& f P case 3: baseAddress = 0x168; break;
+ y/ C7 }- Y% B1 G( M4 { }; X# U, v7 f: l
' \/ p& g3 ~$ e WaitIde();+ L; i/ [! o& M
outp((WORD)(baseAddress+6),0xA0);
$ N3 Z; @+ [' Q9 Q8 Y5 w8 h- b al = WaitIde();' b( d# e: _6 n& R0 b( c8 z4 g5 M
* E. ~$ F; o' T4 X; E
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
% s( N, w, j" ]1 l. E& c0 x if ( 1==(drive%2) && (al&0x20)!=0x20) return;
! R2 j& o+ e! c3 v- D, D5 k6 C( m7 i; y* B# ^5 X* ~
if ( 0==(drive%2) )+ F" N/ l* E0 I; ^; V
outp((WORD)(baseAddress+6),0xA0);
9 D' H$ I, Y% h" D else; a/ E! d8 R5 b( G# T
outp((WORD)(baseAddress+6),0xB0);/ D6 t5 _4 Q8 X. {3 V& ? J5 F( m" B
1 I: x- R9 |7 r7 X+ Z2 O6 ?
outp((WORD)(baseAddress+7),0xEC);) ]0 M: y# r; ^: Y$ `- L
al1 = WaitIde();+ ^% V; r% {# ?6 ^( h/ D
if ((al1&0x58)!=0x58) return ;
& A7 w6 b% x0 r& L |5 ~# _9 ~
) i2 t* ^' f, J3 H q, z for (i=0;i<256;i++)
* a, d* f! h3 T2 g$ F5 D( T {
+ c; u, N2 C1 f pw = inpw(baseAddress);
) V* ^6 i9 o& K0 l/ P }2 E$ ~+ u( O; g! ]0 i- _1 Y; X
}
3 i( a8 d3 [3 q* O/ W8 u3 X4 N) u8 I) L [ \
static void __declspec( naked ) NowInRing0()
5 y, o7 Z8 [( Q{
1 k3 R, S; d8 A5 Y: [& O4 l5 ? _asm& X& }$ Z8 H( u1 H* ]( R
{
; q6 Y) Y0 K6 n push ebp' `$ d2 [4 S5 T! Y: Z1 H+ W
mov ebp,esp+ ^! n+ G7 x: r' R; [4 [4 H: P
; T3 X" V7 S" X2 ] l call ReadIDE5 b% z ?$ J7 I6 n0 x6 J6 }
cli
& Q* a' ]: u: W6 Q6 g9 } mov ebx, int_idt
8 P0 ^/ K8 F# G2 J0 b mov ax, Entry C: I9 t1 s U# Z. f( O: I, J& M' N
mov word ptr [ebx-4], ax
; p1 [) _& R3 D% Q F% j$ U mov eax, Base
( A. `8 E& D j5 Q$ T shr eax, 16; N# M# i+ G- ^3 \/ ?
mov [ebx+2], ax
7 x6 \$ Y; l7 }8 R6 [: }4 J5 q- f sti" U- p4 p& W; \8 Z, ]6 k" R; \& C+ A6 m
leave
# \4 [1 V$ h- ] iretd8 y ?2 W6 t# X) t9 `
}; d% W: B0 I' k/ Q+ P4 S% ~2 I5 G
}& u0 {# A$ U+ N7 F5 s
5 O6 J" s \7 l5 t( K6 }/ g
void GetIDEInfo()* J) v7 h+ Q8 [8 m# O, M
{
0 o& N# u/ q' `- a' ~ DWORD dwExcept;
* o3 e7 D) A& K4 D3 k, l7 y1 D
! _! Z6 {0 _0 X: Y3 g* r dwExcept = (DWORD)NowInRing0;9 O' m: v7 Z& j, F1 i
% H" S( ^+ F! {' H: K- H _asm
( i: z3 d2 [/ Y, N {
2 W+ D i+ b* s7 l. T mov eax, fs:[0]. {: _( t" ]0 K& B* a) [7 i4 o
push eax0 ^% L% s8 }, Q$ h: `
sidt [esp-02h]
) e$ g6 e5 [4 g1 c3 I. [! A pop ebx9 |# i* o: Z' O
mov idt, ebx
0 U2 |1 `! U. v1 ? P J# F/ { add ebx, 0x1C
& ?# p( y, q6 I2 k- c/ l! t. U mov int_idt, ebx
3 s3 _4 v1 N& w% ~. h( A
& L% ], Z# m1 x6 q3 s8 g2 n mov eax, [ebx]8 n# v, v- P( x! e: R- R
mov [Base], eax
; X9 C% ~; n5 S mov ax, [ebx-4]9 T# E% I6 ^1 I+ b
mov [Entry], ax5 ~) ^( c. E2 N6 Q a; Q
5 [0 X" f8 O8 N) R
cli4 \3 y9 H$ _3 t/ a# {
mov esi, dwExcept
0 F3 ]7 j2 P' t; u push esi, u# g& M* [3 M7 E4 j$ g1 t1 {$ `
mov [ebx-4], si
4 c/ |2 A! q/ N shr esi, 16; I& ^2 u1 [2 ?
mov [ebx+2], si
6 S: M/ {. I4 ] pop esi1 i. c1 s, x H7 ~1 g. y
sti
8 {- B) o4 c: Y. F" _3 b
- q: U0 }! c$ I3 n2 }7 U: \9 G% d int 3
" y, a6 c9 A. @* g& ]& G) c }$ O D: q/ y; d6 T3 D
}
5 O* I. l* |9 Qint main()
- ^' @0 _- L; r$ K/ I# a8 _{4 ?" |; g: Z* F# x1 O( x
char s[80];
; B9 N" ~) w( s! S+ A register i,j;1 @& M8 f, Q$ D8 I
unsigned long id = 0 ;
" A$ l4 X& w/ y2 W7 J- r' H" j4 N: d- q* E
//特别注意:这段程序不能 Debug4 U0 P+ o/ Z4 k7 v$ Y, N
for ( drive=0 ; drive<4 ; drive++ )
* l, U- @& H( ]& i, l% _& f" h {" P& ~2 u" Z( I" \- N1 i
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
3 u3 [* Y0 w( ] Y% l id = 0 ;
$ C5 o$ M; b& W/ p5 [ al = 0 ;
0 Y+ r, ~0 s1 o* p5 _" l al1 = 0 ;
- d) t* F7 O; j( M GetIDEInfo();
% L4 C- ~* |4 D: V2 i& W0 v8 j: R' h; D( }" ~: ~
for (i=0,j=0;i<10;i++): a$ ^+ ]* e% O8 t
{
+ s' h( P' y7 G* @( |; z* D' m s[j++]=(char)(pw[10+i]>>8);
4 `9 c8 b' g1 V& W0 @ ?( f7 R- A4 r s[j++]=(char)(pw[10+i]&0xFF);
9 H4 A+ [3 c! u8 W* K0 F }$ D# K j' g2 F4 C8 r8 M/ W) u
s[j] = 0;
/ ~4 R* }! i. X* S2 u) Y
7 D) S' ?3 o; g V// for (i=0;s;i++)printf("%d,",s);printf("\n");" Y( A/ n W( h
printf("Serial=%s\n", s);
) _- [4 d4 `& v" h/ h/ m J A/ a. M
9 v* ^. ?, _/ ] for ( i=0 ; s ; i++ )
; N$ a5 _- ^3 i; R" }: i/ X {
, v+ S) i( L6 @4 Q' D if ('-' == s || '/'==s || ' '==s) continue;
; d8 P W& `& @ printf ( "%d," , s ) ;8 h8 o7 z# M+ R( M/ V
id *= 40 ; //10 ;3 z* g& m0 h7 M. q
switch (s)
& |; K! p+ X, | {. K! z" }; o' {/ W% T3 H6 q) ^
case '0': id += 0; break;
8 ^* i) O7 w- T2 v' m& A0 g. p7 W case '1': id += 1; break;/ U! E: {! P2 o- u
case '2': id += 2; break;) J9 Y- f" A$ P2 m1 W O( [' _( A: Q
case '3': id += 3; break;" T. |0 W2 Q8 B2 p' d
case '4': id += 4; break;
% W5 q, Q6 @& V+ a' {6 [+ |) A* j case '5': id += 5; break;
! c- u6 S% K$ p! M case '6': id += 6; break;6 H5 I. A" K& ^# `
case '7': id += 7; break;( a- ]# H- x/ b1 j( z# q) c
case '8': id += 8; break;7 ^" _& M$ h8 I
case '9': id += 9; break;1 S, O: }/ S0 n* d
case 'a': case 'A': id += 10; break;
2 z8 j, ]* Z+ g case 'b': case 'B': id += 11; break;
$ l- `7 o2 d4 L* l% R case 'c': case 'C': id += 12; break;6 m- e/ Y0 [' z% a- b8 E1 G
case 'd': case 'D': id += 13; break;
: U* {( p. o+ m# X) h case 'e': case 'E': id += 14; break;
( N( o. G6 U0 _1 }+ D8 z( [) C6 B case 'f': case 'F': id += 15; break; y7 L& B9 g2 K; h: x7 C/ I( D x
case 'g': case 'G': id += 16; break;
! a* U* F6 [4 I/ F case 'h': case 'H': id += 17; break;3 n. [( H) k2 C3 K" b
case 'i': case 'I': id += 18; break;
. |# K' I4 r6 H; M1 o$ K case 'j': case 'J': id += 19; break;
; l+ n3 D( ^1 k, C case 'k': case 'K': id += 20; break;
A# o# o5 e0 M3 x7 f5 h# V& o, | case 'l': case 'L': id += 21; break;
6 c2 d8 P( l; C" Z# u case 'm': case 'M': id += 22; break; P) u5 K ]. H9 R
case 'n': case 'N': id += 23; break;
; X8 ^9 Z. Q5 @& O5 d case 'o': case 'O': id += 24; break;
5 ^; s B6 Y$ U$ U# J( J3 o- j& G case 'p': case ';P': id += 25; break;8 x R1 Z( E: }# e! X: c. a' @' c: M
case 'q': case 'Q': id += 26; break;
/ |# Q# f' J8 j' D case 'r': case 'R': id += 27; break;
`1 N6 H5 O! ]5 {1 @+ p case 's': case 'S': id += 28; break;( c9 Q* o) B; p2 e% x. N
case 't': case 'T': id += 29; break; `, C% |. g& u \, l
case 'u': case 'U': id += 30; break;2 S$ B, D0 ]/ a, a% H9 w0 M
case 'v': case 'V': id += 31; break;+ e: R$ ~! P9 F1 h
case 'w': case 'W': id += 32; break;% h7 s4 {- |8 ?, F
case 'x': case 'X': id += 33; break;5 P# ^" o/ y+ U! V
case 'y': case 'Y': id += 34; break;
X$ F1 k4 |9 Q case 'z': case 'Z': id += 35; break;# _) V- y$ E0 s4 g, G: F
default : id /= 40 ;. Z# c$ b4 b" L/ J7 o
}
" V/ b- ]) o' E( P( m* y }
' a) Y+ L6 r4 W if (id > 268435455) id %= 268435456;2 _! y* D& t! V
- t+ f6 V; D: L; o2 ~+ K// if ( al1 == 0x58 )
' ?% O) @/ L1 L- }1 d y7 h printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;3 B* J2 d6 I% V
}
, H$ {: d0 w& U4 e7 ]" g/ D getch () ;
+ v4 F% u0 J6 K& i return 0;
- F" c L7 B" k; q, Z} |
|