|
|
WORD pw[256];
6 r, S; w. }- \6 Y+ Q ~% A
' p- V ~4 ^# M: k7 Ustatic DWORD idt, int_idt;
# q( L' _" {, o: I& r7 L1 rstatic DWORD Base;0 B0 [5 j3 H- o( N1 X: |3 o' x
static WORD Entry;
: O5 {. h2 ^, U! x
; ~6 ]5 Z4 |- z+ S#pragma warning (disable:4035) ! I% L2 [; J0 ~6 |. K) Q" C2 U- V
static int inp(WORD rdx)
: a% w7 h& b4 R{: z9 z. L# k! T; N4 y! E% u
_asm xor eax, eax
4 C6 m% i+ g! |- N" Y _asm mov dx, rdx6 Y$ E- n ?7 P
_asm in al, dx
. P7 ]; a( Q F$ p! w}
9 @: Y* A2 L+ ?% c
% o! r6 a. J4 C/ h2 [% Z1 kstatic WORD inpw(WORD rdx). ^' \% }& ? R. t0 p& ~! j
{) w* g0 a+ V7 `0 e4 }2 n5 Q
// WORD retData ;9 `7 H( p% w) u5 M. A& |
_asm xor eax, eax
8 ?0 O# {! W6 _" s _asm mov dx, rdx1 u1 q5 P/ T8 E3 b7 S
_asm in ax, dx' @, ]5 Y3 b4 }" I1 W
// _asm mov retData,ax
0 b6 B- c+ F, q// return retData ;
- ]2 z3 a0 d( |% K8 c' L# }7 u) I8 u}& ]3 _) t+ }5 U" ^, _9 V2 f3 p
7 T; c& ?+ ?" t' \' gstatic void outp(WORD rdx, int ral): I) A: w. E% I
{
" Y2 M9 f9 T# ?5 N0 \* K7 v _asm mov dx, rdx4 Z3 M7 W" C9 V1 f3 p5 q4 v
_asm mov eax, ral
$ p. D6 Y# |8 B$ w3 W! [ _asm out dx, al& t1 ~, ^0 ^8 B I7 M
}
" n% a! ~2 P$ d @% n2 F9 @/****************************************************************************/
5 P2 z' `% |, Y( [4 V8 i- i" M/ f/ XWORD baseAddress;
# [% z( [: K) [int drive = 0 ;% b/ A1 |( K+ f
int al ;
' n3 e% u' V2 i2 D/ }int al1 ;
]7 V" c" u6 _' x3 _/ U8 |/****************************************************************************/
! a1 e5 Y; ~3 X) [static int WaitIde()
9 Z' t) |, T+ ]3 C& @{' z5 S; M* t& C- m5 Y9 `
int al;
% G% P! J" Y9 e, }. P7 f al = 0x80 ;
3 `6 ]: o$ |3 r3 J" f5 d9 r) F& J, b# n# n+ U6 N
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
% z# i5 m, L" v! H' b4 g; M4 N) [" T5 h7 h% b5 d6 e' a8 c3 A
return al;
( e a' {+ n) y. L8 q$ Y' c}1 Z! {3 K4 o9 {! a$ V: G
/****************************************************************************/) m l. b' Y+ `( T" L
static void ReadIDE()
# |. e G9 S! d0 ~: T{
& d( c- E+ v M* w! A7 w int i;
& H3 M" O4 ^* s- ? switch (drive / 2)3 e: g8 \5 b( y% ]- N$ j: X1 C
{
% h F3 }9 {! k9 N- }! w. A, d case 0: baseAddress = 0x1f0; break;, F5 l' r9 D: h0 P" K, b( b& ~
case 1: baseAddress = 0x170; break;
7 X( r" ]$ ~& P/ S$ V case 2: baseAddress = 0x1e8; break;+ y# V' E! o( _7 f5 h$ N
case 3: baseAddress = 0x168; break;4 K$ l% P R. t2 \+ Z+ |' Y
}
4 I/ O1 m; c o7 e7 N) D; X
" D- ?- v1 o( J- l2 [ WaitIde();. L. E' v8 ?( g
outp((WORD)(baseAddress+6),0xA0);6 Y- h9 z/ p5 s( a6 F0 }0 t2 W
al = WaitIde();; g) \. f: F0 ]7 O* s9 g$ ?
$ [' I& F$ g) |. I6 D" z7 n( u
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
% w G9 B& B# r8 ? if ( 1==(drive%2) && (al&0x20)!=0x20) return;
; e# V+ v# x8 v* Y( D8 l/ ~3 P! [, _# z' H$ _& o8 u$ \/ X' P
if ( 0==(drive%2) )
# J# Y9 d* V* c+ _: s& x outp((WORD)(baseAddress+6),0xA0);
5 C4 @* ?& P% M1 o6 s6 h else8 M. u4 z9 { `; W* B) I; y3 Z
outp((WORD)(baseAddress+6),0xB0);
& ?0 W; b7 _8 q( ]6 \/ H
" W1 p) z) J$ b& d* L* d outp((WORD)(baseAddress+7),0xEC);! y1 b* g* d1 X# K: H Y u! V
al1 = WaitIde();
5 F! m" ]1 a, F if ((al1&0x58)!=0x58) return ;! _% n5 I% y" S: }
& D& I% l& l7 f" u5 a; y* ^4 f$ G for (i=0;i<256;i++)
a' z7 }1 y) S# \$ r {$ `" P. ^7 M# ]
pw = inpw(baseAddress);
% d, ~8 S& _5 A( l7 c7 c }- |7 E+ @3 i K% G, j
}
- R4 A0 z/ Y% \* g' p8 i& o( K( `+ r: g4 s! o
static void __declspec( naked ) NowInRing0()
* {( W+ [: v: W* ]{
6 j! e* K, T0 n) t0 p _asm
; L9 j( o1 b, U6 h, `6 ]6 c {
& z; r1 s0 Q: W! j' [' h push ebp
1 o0 D0 ]/ D0 }% H: E) J mov ebp,esp! T6 G8 P7 ^& D2 S, z; N$ \9 ]
. x/ ]# d% t' C8 M) m0 s
call ReadIDE
' w$ b% U8 x( a9 G, M; y/ F cli$ B# f% d+ v: g
mov ebx, int_idt( m3 W, ?; l& {8 ], X4 x/ P
mov ax, Entry
; h) d1 l2 b; j- T `& H* Z mov word ptr [ebx-4], ax* a4 s5 l! r7 @; e/ X, K
mov eax, Base
4 A+ @2 T+ Y$ U! t shr eax, 16
& n: U1 F3 ~. I8 U4 T: p mov [ebx+2], ax# k# u$ X" {) e! s9 i. y6 ~2 m
sti
' O, h) {- O& d6 a7 g8 B( m leave- M# x- n* X% O1 }5 J7 I
iretd9 Q' J) T. n4 ?# O
}
0 y/ d1 T4 d2 Z! Z}
0 t* ^: {3 T! d |8 O4 t) F2 Z1 I$ d# D6 i! \
void GetIDEInfo()) t2 M, Y( s/ q [0 k. N2 p) L# ^
{
: @( E3 Z( u; p6 V& S) u DWORD dwExcept;
4 l) G) {/ {+ b' b/ [" T& e ?$ ^5 m) \$ Y' R# @
dwExcept = (DWORD)NowInRing0;
8 c( w3 `0 T' Z, a4 D9 c! D1 [0 V/ \& ^! q
_asm% c8 O( \/ B9 ^
{4 ] |7 F9 u- F1 E6 v
mov eax, fs:[0]! f) D3 K9 a& F0 v( [- k2 E
push eax
6 B3 }- D# |9 |$ ~3 e9 F5 _ sidt [esp-02h]9 I9 m! W2 n3 _( T. F
pop ebx
+ m# n; O% o' S mov idt, ebx' a" L; o+ D$ c8 d q3 M
add ebx, 0x1C4 ?9 O* f6 V: D" s* B i5 c
mov int_idt, ebx/ j' i0 Q; e6 u
" s0 C- R+ ?4 M9 U9 n# a$ s) g
mov eax, [ebx]
: ]4 o+ {0 E) t5 O% d) ^: K mov [Base], eax0 F5 D" T6 U! o0 L3 C2 ?# D
mov ax, [ebx-4]* O+ H- f1 _' ?
mov [Entry], ax
* K7 k; U5 b0 e0 N1 z2 R' e1 n& e3 i9 T! A! r+ [8 l- @- A( N
cli: W7 e6 f0 M! D1 U( G! P
mov esi, dwExcept' p, E& N, v# u5 L
push esi
; d% n5 W9 D6 g8 u& J mov [ebx-4], si
( d, A# x+ y, W- `+ O, V: A% s shr esi, 16( w2 ~/ ^7 t2 @2 z3 n# {5 a* y
mov [ebx+2], si# K. z$ Q# \4 _. g
pop esi: E4 ^9 ^% N7 h# L7 K7 v
sti
- O4 N, m% ]/ G8 D8 g2 ^' ^; J7 U
int 3
9 W- v/ X. l; z0 n! U }
; f( `& H$ O+ d) f/ ] W3 y}; h/ O$ g2 Y! e/ T" w9 e
int main()
+ E2 G2 ^: v* X6 j7 ^: s, _' ?{
6 X1 H6 X! S3 O char s[80];
+ j( H" v* d4 U3 X4 k register i,j;
# V2 a' G; |( L, q+ T unsigned long id = 0 ;, o" h$ X+ l R: {7 [
. d& M/ i" E8 I0 s4 x" U
//特别注意:这段程序不能 Debug
( Q7 S8 p7 _% x! a1 x( D7 _( N' A for ( drive=0 ; drive<4 ; drive++ )7 ^, s+ O# w! d4 B, f/ n" _( P
{" G0 L4 j7 p4 `$ z& o; K3 K. ?
memset ( pw , 0 , 256*sizeof( WORD ) ) ;6 \. |2 ]6 F$ Z+ T" g7 n7 F# T. B
id = 0 ;$ Q* d" p9 D+ j a8 I
al = 0 ;! E* Z8 Y0 U4 ^: f- D2 I+ k
al1 = 0 ;8 ]9 N: p/ W% m' W( y
GetIDEInfo();
# j% n8 l6 s: o4 ?/ Q
3 ~8 E( l5 {% s for (i=0,j=0;i<10;i++)( ]4 R2 H' _$ ^# `, f _
{
+ P( k3 ~4 [* y' h s[j++]=(char)(pw[10+i]>>8);
1 }; Z; y9 q1 J2 v; I7 f& } s[j++]=(char)(pw[10+i]&0xFF);1 m: l+ _7 Y% h- O7 R
}4 u, F* E+ o( ]* K
s[j] = 0;3 i: O: F* }. I( r& n" I
9 g5 h# ?8 [: F1 i$ A( O
// for (i=0;s;i++)printf("%d,",s);printf("\n");+ H2 O: s! m9 e u* r4 J# r; O1 d
printf("Serial=%s\n", s);" E* f* Z" r5 k y
, E. W4 C. o7 T. w/ q _ for ( i=0 ; s ; i++ )
- M" a9 N( e' ^% V9 \2 Z0 ~ {5 u# Y8 e/ p. n# N; S8 g
if ('-' == s || '/'==s || ' '==s) continue;
$ i; a# N- b2 I printf ( "%d," , s ) ;, ^( \2 y( S. R5 Q8 }9 N' _1 L
id *= 40 ; //10 ;. z" x" t& o: r4 A, O! ^6 O
switch (s)- y" z" [7 b- u4 ^ x
{
! Q/ t6 s% q6 M2 H. W case '0': id += 0; break;) O3 s$ K$ O- v y5 n
case '1': id += 1; break;
/ j w5 m3 H" j u3 \; w- S case '2': id += 2; break;
7 H5 k' r& K+ _5 ~# k case '3': id += 3; break;
$ x" j% e6 \" r; K case '4': id += 4; break;
+ x( i4 B ~+ P3 B1 P case '5': id += 5; break;( ?; _- F) i. M: ^6 H
case '6': id += 6; break;
* `9 K: R4 Q( R) h' z case '7': id += 7; break;' s, a1 R' X$ {5 ^# i$ s/ n. {* _0 S
case '8': id += 8; break;
1 x% V- E2 | P: _$ O3 j% | case '9': id += 9; break;( ~$ Q9 v. E+ j4 K7 c# C1 Q
case 'a': case 'A': id += 10; break;
/ C! _. F3 s6 ]6 R case 'b': case 'B': id += 11; break;! H" D. p7 z4 c% Y
case 'c': case 'C': id += 12; break;( u- R0 W6 y- H& |7 F2 _. k
case 'd': case 'D': id += 13; break;0 F' N' G4 S- G) \' w# \" Y
case 'e': case 'E': id += 14; break;! G/ g* B! U9 }
case 'f': case 'F': id += 15; break;: ~& W, T0 j. X3 a! Q$ _# u0 Y
case 'g': case 'G': id += 16; break;4 o. b) |9 c# A' A/ z7 R ~
case 'h': case 'H': id += 17; break;
5 u" A/ [" ?/ S/ x4 \ case 'i': case 'I': id += 18; break;) n: R/ O* q$ U- j' E& A
case 'j': case 'J': id += 19; break;7 q; @9 I# v% l( V
case 'k': case 'K': id += 20; break;6 i: R6 \4 H: |; v0 J# w7 L
case 'l': case 'L': id += 21; break;7 C* O. C) M2 i7 s ^9 n
case 'm': case 'M': id += 22; break;! R C' T J, s; |
case 'n': case 'N': id += 23; break;
7 L1 r; } E3 G" z/ V7 J, I/ J case 'o': case 'O': id += 24; break;6 L; O8 z c6 u. t3 y* o9 H' {+ e8 w
case 'p': case ';P': id += 25; break;
# D* v& I( `3 V case 'q': case 'Q': id += 26; break;
, [% E. c1 _' l" d- i case 'r': case 'R': id += 27; break;
6 B% @2 @9 y2 k+ D& H case 's': case 'S': id += 28; break;& b; w' S3 t7 A; W
case 't': case 'T': id += 29; break;0 O. U/ B G+ s" L4 t
case 'u': case 'U': id += 30; break;
4 |: K; K8 @# m# P7 Q6 `8 ] case 'v': case 'V': id += 31; break; T8 ~& z8 w$ p3 J \
case 'w': case 'W': id += 32; break;3 Z8 M! Y0 O1 g9 T, G
case 'x': case 'X': id += 33; break;# H9 w3 S2 S0 ]
case 'y': case 'Y': id += 34; break;* q( g% l$ R! V2 f t. R) k
case 'z': case 'Z': id += 35; break;
+ P+ L( Q# O6 j$ o7 |% j/ G default : id /= 40 ;+ a# I5 R( f8 a' Y
}
, r* z% ~, q" T( m5 x& r } G* [: G- O2 ?
if (id > 268435455) id %= 268435456;6 Y# i F& W0 `8 E) b/ ^
) E+ g6 D: [# I& ?// if ( al1 == 0x58 )% j; j! g; Z* n9 p* w
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
- _. }! h. z: e- J4 p" Q }
, X3 B+ F9 F* J# r u getch () ;
, V: [; U& T' p! o5 S5 o; V return 0;: U5 C! k$ s$ U+ P2 K9 H
} |
|