|
|
WORD pw[256];6 Z; T& P8 o7 u" z9 n& _3 f
G2 l7 z e) w8 I5 U) vstatic DWORD idt, int_idt;1 p: k, m5 G# l% N& F
static DWORD Base;
: x* I4 Q- g6 g ustatic WORD Entry;
. R1 L. S \; Z# u2 k' H7 A' ]% O5 Q- s+ g) G" j0 {( W `4 z
#pragma warning (disable:4035) 7 I0 u. `/ K# U5 [& x
static int inp(WORD rdx)
4 d/ R; R; U1 z( U4 ]' t{
. I) v3 x4 U6 A/ m _asm xor eax, eax E$ d' R7 Y3 f, G! I3 ~
_asm mov dx, rdx
7 _9 v) }: S H5 b. B1 y1 k+ K7 f _asm in al, dx" V( @8 |% n1 X7 M4 c9 a! w
}6 f4 [# N, [$ _
+ k7 ]& A1 |: {" Q
static WORD inpw(WORD rdx)
/ E" \; ?( {: R C3 e( e3 N! ?{
0 W- [2 M' n1 p& f- A// WORD retData ;6 w3 b* K& q- }( X( R
_asm xor eax, eax
e. w- c3 ^( L; Q _asm mov dx, rdx) o7 q! k) l+ Y# {6 [3 E* X! r
_asm in ax, dx
. @- H% a+ F, c1 K# _, y// _asm mov retData,ax# i2 T$ I }$ B/ f
// return retData ;8 N. L, o$ `6 J
}
9 g( _+ c- F: v$ _9 O( P w! E- M# K' ]" t( |
static void outp(WORD rdx, int ral)& S* I2 Y! `9 G6 t, k) V9 Q; m. w' h
{3 w8 o, l5 ^0 c% N
_asm mov dx, rdx
/ J& c+ Z$ j& @. Z H0 Q _asm mov eax, ral$ W6 A# G1 G) V w7 p# L
_asm out dx, al1 Q3 E) H+ Q o X/ m) ^
}
' N1 J9 z( q5 T1 {/****************************************************************************/
' a: X3 J, X3 u) }- z5 f$ L9 rWORD baseAddress;
6 g! E2 m. e) B$ z V% |int drive = 0 ;
$ \$ o1 e$ a% B. k8 ?+ f, \int al ;6 L& G/ @) }& G6 `7 [
int al1 ;
! a3 r) c6 |/ t* l3 K% p/****************************************************************************/
/ i: ?# B% y- L: {3 y! n& s# q! Nstatic int WaitIde()* t- a) l% e: k: {
{" x" b" b( J) y! _/ ~
int al;
3 I& r+ `6 z- M/ w al = 0x80 ;2 O2 T6 {# N; p6 N' ^
8 n) E+ p9 B& g6 t# u) U
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
7 |8 Q0 o" X0 H9 f6 v/ k" C0 K1 S
# p K. M9 o+ l return al;! @4 v, ~8 n; u1 O6 W7 w' G0 m
}& H7 \$ z$ L8 ~: ` U* d1 ^
/****************************************************************************/
$ t+ e8 [( H- bstatic void ReadIDE()
- j" w' U; c: ^; e' z7 W{
0 `0 h% n* X3 }2 P int i;
$ a. P, \. w' r switch (drive / 2)3 }1 ~3 L! L/ D$ I) v. `) \; m( n
{% y7 E6 L/ D! w' \; `
case 0: baseAddress = 0x1f0; break;* |9 n2 v( z* s
case 1: baseAddress = 0x170; break;: q3 z, C9 z# @; V: a2 f
case 2: baseAddress = 0x1e8; break;9 c+ n8 ]( y6 l, |) z) ]
case 3: baseAddress = 0x168; break;
1 c; M+ ?. E7 r/ E; D }
+ _, {' c6 n2 ^) G1 t$ p
1 s5 w0 `# C5 P( x/ k8 o+ I WaitIde();
! c9 }% M1 s) f* d9 B/ ?7 q outp((WORD)(baseAddress+6),0xA0);( ~- w; Y2 l' f0 D3 E
al = WaitIde();
! _4 B; o# O8 k" u; t7 y
( z. _' A# T ]6 w$ {6 W if ( 0==(drive%2) && (al&0x50)!=0x50) return;4 g) n2 O& z: c9 q3 X
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
+ W7 E0 p* k$ c1 a a7 ]
) {6 h9 B% e9 N* _# x if ( 0==(drive%2) )
4 Z4 o- h2 C. | outp((WORD)(baseAddress+6),0xA0);
1 C( }! J+ l. W& s- m& L else
8 _ K; d- N* N% r5 G7 Y9 q- B outp((WORD)(baseAddress+6),0xB0);' I6 ^' C4 g& |. [# ^
7 I" a/ [2 S" d3 I; w v outp((WORD)(baseAddress+7),0xEC);
" r( c! C3 ^1 i$ N* u al1 = WaitIde();1 R" c, `$ k! m! U5 M8 u0 V
if ((al1&0x58)!=0x58) return ;7 G, J8 m9 o, _. o. `& q: E" d/ h8 O
7 N9 n2 P" u+ ~. l
for (i=0;i<256;i++)
# j7 w `% `2 Q: {+ S4 g! Z {
2 i U$ M& ~7 g( d pw = inpw(baseAddress);" a ]; L8 Z3 N4 `
}& |3 w( G) h& X
}
7 g) ]) F/ }0 h+ T# c8 K% {6 o2 d$ f, d/ a8 g+ G2 T
static void __declspec( naked ) NowInRing0()
, d* V5 K: S' p- R4 N{5 U1 n0 s: X" A' g
_asm7 I+ E3 w% {" v
{- S) ]$ d+ C' \5 Q6 ?3 I
push ebp
- F$ C+ i9 Q1 O0 {0 @" ~ mov ebp,esp# n# Y0 G8 Z! T& R# x: {7 F% L
2 G p8 L _4 V# h
call ReadIDE" p; x8 ^ f: Y# v$ G. Z: d! v4 o
cli
* \& x6 R, u4 L/ o6 ^0 p mov ebx, int_idt( h6 l9 b5 J( @ o
mov ax, Entry
z& ~0 s7 ?: _! {+ a mov word ptr [ebx-4], ax
[: ]6 r( c8 G0 G4 F# q" ^ mov eax, Base3 A0 x5 b3 d1 Z; B! b7 m
shr eax, 16: y) @- w. }' ] i5 V
mov [ebx+2], ax
# ^6 P }# I8 I) l4 T) ] sti0 Y" t1 _" {& P' K3 v7 U
leave
3 @' b# }% i: R+ a) @! d iretd
: H* }# r7 \+ F7 `2 E0 z7 f2 m8 E; V" d }
! o2 n: J7 R* b0 b}
. d4 c/ k: a( P5 R8 T p* h' D* a2 y
void GetIDEInfo()2 Y3 Q- Z+ }4 R6 {( U# v: B
{& D+ B" E% _- Y8 _
DWORD dwExcept;
) J( I' R: H" ^1 j& D8 b- C) P
* @+ F, Y5 n% p dwExcept = (DWORD)NowInRing0;$ ?% o) ~6 O6 j2 A% X8 C1 V2 J' @' Y
" @% N5 s3 i7 r* l( L
_asm5 }3 U; n: X3 R4 P9 V0 A
{
- ]5 I0 g' M* S mov eax, fs:[0]0 b; y" A1 _- j0 \8 W
push eax" I6 O7 U5 Y1 b3 |2 T# G+ E3 b
sidt [esp-02h]. i* S5 A$ U7 h) i( q
pop ebx
2 ~/ T* c7 Q; r# g& W+ z% b/ i' Y mov idt, ebx% m8 V* p0 X, Z+ J( `
add ebx, 0x1C
0 F7 Z( P9 U0 G$ X' c" A; ~ mov int_idt, ebx
* C+ C$ o5 |. @ {' o
5 I% @9 ~4 I6 l* I# I$ }" a mov eax, [ebx]; N+ k$ f% z2 C7 |* ~
mov [Base], eax% ~5 d5 u5 r7 j% u5 |5 S
mov ax, [ebx-4]
7 ~/ T7 k* u s6 I& x$ ? mov [Entry], ax
$ l; |. n- o6 L1 W0 {- M, E$ _9 d! H7 ]& D
cli
G; n. M3 p/ D/ U1 `) S1 m mov esi, dwExcept: C ~' d, E8 e y! @
push esi
" c* ` W) o; g( h6 T mov [ebx-4], si) o9 [( |" e, i/ o8 V* s% ^' o! b
shr esi, 161 `( C b* F2 \
mov [ebx+2], si
& S% c9 v- I6 _ pop esi
; \! I5 D1 |. @( R' {- Q sti" W9 S7 E7 j2 t U
- V; a6 h8 S# j& j. `6 \# `' L1 M int 3
3 f2 L% A j0 h! t }6 M( _2 M. d- a% e7 ]9 j
}- D1 ?/ g' ^0 w7 d1 W2 g" U
int main()) M) t# H# t4 J& t% Y+ `+ y
{
% T$ ]) W) d5 A5 u( ~ char s[80];
4 U3 w$ D0 J0 G$ U3 C! H8 i! D register i,j;
2 q W I5 M3 R' Y+ s unsigned long id = 0 ;4 t* F: o- Q' B( H! a7 c1 q( g/ o
: P% Z3 M [+ ]7 E3 j; Z! s//特别注意:这段程序不能 Debug) b+ H( X$ o/ Q3 G9 y
for ( drive=0 ; drive<4 ; drive++ )1 q5 S$ n4 ?3 N+ p
{( V X; d6 l3 M. T% {3 Q
memset ( pw , 0 , 256*sizeof( WORD ) ) ;- L, d' n4 H4 n n# Z; _- G m
id = 0 ;0 X4 l# v2 [9 Q3 L6 G# F0 M2 K
al = 0 ;! |, _# n& w& n4 k1 }, s# {
al1 = 0 ;
# r. g+ J: c9 R3 K" N GetIDEInfo();
; i7 M" f4 D4 h4 c, M6 d) I7 ^6 \* U$ g
for (i=0,j=0;i<10;i++)5 B$ Q# l7 c) O8 T
{0 a6 K! p+ ~' ~: f* Y8 `$ n3 l1 z
s[j++]=(char)(pw[10+i]>>8);+ [# h( Q! ^2 I6 E; N! \# Z- k0 l6 W
s[j++]=(char)(pw[10+i]&0xFF);+ t# H( ^7 Y6 \- v% C
}( X4 p9 Z8 |' ^) I9 D
s[j] = 0;; d) e; l" |8 g: |& {) ^- e
# ?4 J% U ^- I// for (i=0;s;i++)printf("%d,",s);printf("\n");7 \2 V; g% \( L' z$ J8 s F
printf("Serial=%s\n", s); G& o) D8 D3 G( e& O
4 ]0 P( ]; n" h) g" D& \ for ( i=0 ; s ; i++ )
; P @/ `7 L9 b1 O. z# i {# Y! i4 B; h$ X7 u' O5 z' s
if ('-' == s || '/'==s || ' '==s) continue;
2 B& _& f$ Q5 i2 x printf ( "%d," , s ) ;1 K7 W% W; R/ r9 U5 ~: h1 ^7 L
id *= 40 ; //10 ;/ E+ E9 @# x7 N5 ^/ \! C
switch (s)9 @* _0 D# e3 w6 } u Z' @3 `; }5 \
{
" y0 D- q4 E3 J3 E h& o case '0': id += 0; break;1 B6 ~: k1 s! O/ s; {
case '1': id += 1; break;0 f- n y! {9 \9 {, N
case '2': id += 2; break;
7 W2 K( j* X) U+ P case '3': id += 3; break;
" e; _& M, r" W" b case '4': id += 4; break;% M+ z3 p- p* L- ~/ N- z) J
case '5': id += 5; break;0 E5 x _0 k+ l+ P
case '6': id += 6; break;
+ z& j: S2 O* s- S- Q8 X) W- o9 O case '7': id += 7; break; m3 @! @: O3 @8 I
case '8': id += 8; break; K% s$ u! {) u" a0 Y
case '9': id += 9; break;
, S% M. h, M3 K j4 L7 Q case 'a': case 'A': id += 10; break;- }; }3 m: n' `, J
case 'b': case 'B': id += 11; break;! p# N7 }, m# z) o* m' I7 m
case 'c': case 'C': id += 12; break;
5 o/ O7 ^6 r) B+ m* j+ V( N case 'd': case 'D': id += 13; break;
- j/ b7 ?3 g' P5 t: Z case 'e': case 'E': id += 14; break;
2 L/ |$ O- s* p4 p/ n# P9 d case 'f': case 'F': id += 15; break;# l4 |5 m9 m6 F0 A: q
case 'g': case 'G': id += 16; break;7 y- _: v! q5 J* f. U/ g* s, E
case 'h': case 'H': id += 17; break;
J+ V4 m6 D4 E4 I( M" @7 z/ p case 'i': case 'I': id += 18; break;
3 B$ b) s5 V h E3 \ F n1 Q( p case 'j': case 'J': id += 19; break;
# x+ E! s! H/ o1 M5 a) s case 'k': case 'K': id += 20; break;6 [9 o$ [( J# y) A
case 'l': case 'L': id += 21; break;! s1 m$ H' O+ L) C& D# r& `! \
case 'm': case 'M': id += 22; break;8 s* K/ x0 G+ C+ s5 J
case 'n': case 'N': id += 23; break;1 t' k( @, C4 g3 o# @
case 'o': case 'O': id += 24; break;5 W1 A# u! W' i! Z5 [5 Z( O1 a
case 'p': case ';P': id += 25; break;! q k1 Z \1 _
case 'q': case 'Q': id += 26; break;
2 _4 l$ @* f/ I2 Z& h case 'r': case 'R': id += 27; break;
# n# u/ G. U% B- {* _ case 's': case 'S': id += 28; break;1 u$ a# ~" q, c6 q
case 't': case 'T': id += 29; break;
# v/ v* w# A8 Q2 S5 j) f case 'u': case 'U': id += 30; break;
% e8 n, C$ |& i( f, q case 'v': case 'V': id += 31; break;
1 R' ?$ C; o, t2 _ case 'w': case 'W': id += 32; break;( A8 G# G/ A; v! J9 g( B( Z
case 'x': case 'X': id += 33; break;6 }' [! O" T7 \! D8 X
case 'y': case 'Y': id += 34; break;9 t+ m8 U: i7 M- ^, R9 y( E
case 'z': case 'Z': id += 35; break;* c Y6 `) Q- H. x4 _. t8 @
default : id /= 40 ;' z1 Y$ V. ~3 |! }" a) a2 w
}
$ [7 M* o& J6 [3 s# | }2 J" }# \5 R* k0 O2 _
if (id > 268435455) id %= 268435456;
8 w4 [& t* m2 W O1 v' a
4 f, M' O/ @! n: P// if ( al1 == 0x58 )
1 B5 ~& u7 x2 P1 p2 W' p$ x printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;+ ^8 p+ }' ~# D9 S9 D# B
}
% U8 F% z& F8 i% @2 E7 @4 h getch () ;; H8 i1 y# [1 ~1 a: U
return 0;4 T) }& @5 q5 s1 T
} |
|