|
|
WORD pw[256];/ Q% y( f' O+ ?' h
- d- u7 y2 ~$ T+ C& w0 K/ nstatic DWORD idt, int_idt;
. }' @7 G4 J/ q, i2 ystatic DWORD Base;
# I. S! W6 d) }/ {& Ustatic WORD Entry;
! Y8 K8 N# H4 h* S* W1 Y' k; f0 i# c. n# c3 Q# E4 x# E
#pragma warning (disable:4035)
* A. Q3 Q) y% h' astatic int inp(WORD rdx)( ?: H/ Q+ q- Z1 d7 z
{4 o8 I. o8 T3 p+ K
_asm xor eax, eax; y3 ~/ E% D* P9 {1 `4 L
_asm mov dx, rdx
# h" d: @, m: R6 z9 {" p) a _asm in al, dx
& d8 E, t M7 ]# A3 B/ G2 c- N. \}0 L! j/ I$ b$ U ?2 S
* D5 w/ J# F6 n( W! f3 I! y, T. u; W
static WORD inpw(WORD rdx)
/ b( |/ }( u) a7 b{
0 m, z; C2 K" k, i7 n// WORD retData ;1 g* O/ T; q$ c7 i5 q4 U
_asm xor eax, eax h& ?9 d$ S \. Z. @# M. i: A4 J
_asm mov dx, rdx ]+ F' a& ^7 m. N
_asm in ax, dx
& K, I |! h. v9 C' t9 Y// _asm mov retData,ax
! u7 d+ r5 C! v+ a' Q, W// return retData ;
5 n# A1 Y, h. t1 q! Z}
3 W, [) w3 i. I* l5 c+ s
! `8 B" R! n# {2 ^+ ystatic void outp(WORD rdx, int ral)0 _9 K& e' _' M; T1 L# r3 q! y% C
{
+ @. p5 P# @! n; y- m, }- v1 g _asm mov dx, rdx3 m5 x8 w7 H* e) r1 L, e
_asm mov eax, ral! Q+ b! z0 t8 ^
_asm out dx, al
) L' \0 C) H _- |* F+ i}8 i$ l! `& m( X
/****************************************************************************/
+ s2 C0 y0 z! E3 }: xWORD baseAddress;
9 {+ W6 T8 k# n- K$ K2 n+ wint drive = 0 ;# r7 b2 e) f! u7 q7 k1 e
int al ;+ M/ q3 B$ c2 V) u# l
int al1 ;9 V( ^! H- {- `0 o/ W. f
/****************************************************************************/2 X# O1 t+ _* G, {( P
static int WaitIde()) ]; q5 i8 O* ~9 R* h+ K. I! U
{
+ {0 F& E2 W* _, A& ` int al;9 Q1 r# |5 r+ `( [; l7 f
al = 0x80 ;$ Z/ v6 U1 y6 y4 X
9 \& A3 [3 z. e" d
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;$ E1 u) L3 h* Z4 s+ Y
6 X# H* ^: ^4 t0 A' T
return al;
7 o" r N7 P" B/ T}
& t0 v) L; w, O8 _+ v/****************************************************************************/
- v/ y) E( K- `static void ReadIDE()+ ]4 i! b9 B% V7 W
{
; R0 U6 X$ ^0 S* x int i;
, u3 Q% P8 I* M: G0 a, _; U9 C switch (drive / 2)4 d7 Q) v" b; ? G* T$ M. h+ E S
{1 X U9 _; ~; I: b3 ~
case 0: baseAddress = 0x1f0; break;
/ C% S. q8 O- o% B9 ^ case 1: baseAddress = 0x170; break;0 r5 L1 o8 k5 k% ^- r
case 2: baseAddress = 0x1e8; break;
2 P! T! f% E3 I3 d case 3: baseAddress = 0x168; break;
3 s; k9 g( X; Q! t Z3 b$ B }
* Q. F3 X4 [ e9 X, \6 W, O8 G0 Z, L0 d
) M! U& l5 G; T WaitIde();
[ X1 b3 {$ O8 } outp((WORD)(baseAddress+6),0xA0);. [7 `; e! a0 @& j
al = WaitIde();8 o$ a/ d3 z% d
- ^0 j! N# b0 a/ M# a
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
3 s2 q7 i" i- }7 F9 |5 c if ( 1==(drive%2) && (al&0x20)!=0x20) return;
) ~* e, m. q- v2 L4 f1 S" i& m+ p3 K: Y3 v8 x
if ( 0==(drive%2) )
0 M$ \* e# H5 ? outp((WORD)(baseAddress+6),0xA0);
1 e4 Z$ ^ l& T/ K else# W! _: O% L {. |7 [
outp((WORD)(baseAddress+6),0xB0);0 _. H2 _; h; v9 M
7 o+ A( C" m" ?0 {2 x G! |5 C outp((WORD)(baseAddress+7),0xEC);7 O. j7 I* b6 ]7 J: ^
al1 = WaitIde();
$ x5 n: v& e0 s if ((al1&0x58)!=0x58) return ;. r9 d- K/ E# S0 r6 W
( T" ~ [% i- @$ b2 b. c( B
for (i=0;i<256;i++)
* a+ V) G8 P; l& g8 M0 a2 e' J {
! k+ U) g! h. _9 ^( q. c pw = inpw(baseAddress);
; A/ z9 J: M$ ^( M }& w3 b) t& I, w7 d
}
( n, c$ a2 F0 Z* v; Q# c) I( L3 ?
* W! c( N+ b# istatic void __declspec( naked ) NowInRing0()5 b% f' u0 t" O7 K( b
{
% B' G* [3 i2 z- i8 l% Q _asm1 G# t: v% X" X- a: N( B
{) y4 z8 f" W# F
push ebp( B& L( o9 j2 J" B. j+ J
mov ebp,esp
. e& J2 ~! Y5 n
0 W7 S) X; R# \ m call ReadIDE
. H% Z1 ^+ H0 q! P# [ cli8 A1 Y0 `- Q- M8 f* s
mov ebx, int_idt
! W* l# M4 T+ U E2 `/ @2 ^, d mov ax, Entry5 `, u) x! w( y
mov word ptr [ebx-4], ax' t, ~ x* G4 D+ l1 m# g8 y1 a; |) f; {
mov eax, Base
. g$ L# Z [* C3 h2 u shr eax, 16! ~# e9 ?. c+ a, M( V
mov [ebx+2], ax' g5 d) z' F) B0 r6 H: a& p* ?: J, ~
sti
) l! h3 y: H- P leave. o+ t" z _, i) O2 k
iretd8 c* i" H. ~$ N+ C! u) `& d- W
}
0 P- \6 n6 F/ e}
B% d( N6 a" T" F0 F" x6 S- b, X/ j! h5 K$ V7 M$ E; S
void GetIDEInfo()% i2 j5 _9 L7 M- O2 d
{
$ Z% ]) ~* y5 V2 P; J, |7 u4 X DWORD dwExcept;
5 t% E( a: y! P3 v. s$ i2 z( ~) V6 B8 {1 d8 H
dwExcept = (DWORD)NowInRing0;
7 G' N% x* ~0 Q' Y ]7 f: @# u' Z" c* w J* e2 a) Z
_asm
& h; a" }1 E& o5 a) @1 L% | {
2 Y! c2 U+ }/ g$ I mov eax, fs:[0]
. }& J/ f H% q+ k; m! v. Z push eax
+ L3 h1 I9 ]) l3 y; ? sidt [esp-02h]8 i. D3 x- @; n! @ Q( ~
pop ebx
2 K! O z T- L) U! k mov idt, ebx/ W3 g! B" B% F% Y; l' d, {
add ebx, 0x1C1 c4 {% |# m/ \9 u! q7 F, l& r4 Q$ F- t
mov int_idt, ebx
& S& U1 `& M- I! b! `7 D( s9 u9 j" W1 b
mov eax, [ebx]
2 T# _* N7 |6 h mov [Base], eax
& R- [( ^5 W! c7 O* F x6 {9 _: { mov ax, [ebx-4]: F! _/ E# K. }* n$ S
mov [Entry], ax
/ {+ M. c1 l( A3 k
T# c) d9 N5 J6 h: s cli
7 B$ O" h4 W$ l) a( u3 \ mov esi, dwExcept2 [2 Y$ o. u9 K' v+ s {
push esi
. M7 \1 |/ X7 [1 f L* T1 ` mov [ebx-4], si" v) ^: A4 o3 \1 [6 c9 n' Y
shr esi, 16
, J) [+ u% x) R- p( }2 r mov [ebx+2], si
7 f" Z7 @+ d& e. \; N6 M p) j pop esi; R' C: d0 |( X7 t7 y
sti
0 h$ |* s! e1 K, G% Y
2 q% @! v5 V* D) H' ]- x4 A int 3
9 ]4 S0 ~+ h# y- g G- ?% U3 O3 ? }% D5 h% r, X. h
}! F( z3 `8 k; |1 `- t+ H% O
int main()
/ U. y! r+ n1 Q8 F{
) M N( q/ R I( _5 w4 K) t char s[80];
, d, x' E! [9 U6 q register i,j;
9 S$ c6 c2 U& B8 F# Y: l6 b unsigned long id = 0 ;
) Q$ i& o/ j# U' U- N$ N2 l; l! ~6 Z. E8 ~! b
//特别注意:这段程序不能 Debug
3 ~/ [6 _- n1 K& }& C5 g9 R+ u for ( drive=0 ; drive<4 ; drive++ )4 i" V& O! Q3 a# s1 U; f
{
! L4 I$ U& W6 n, [3 |: v8 q memset ( pw , 0 , 256*sizeof( WORD ) ) ;3 [- j7 j! Z: d: V4 p
id = 0 ;
5 Z, q: E9 S) C; O al = 0 ;
5 Q* g/ f* K, v$ P" i' t al1 = 0 ;
2 J4 r4 c3 Q+ J3 z! U# `* ^ GetIDEInfo();
8 ^, c! @3 y8 f6 d
% W3 x$ R* {8 `$ Z for (i=0,j=0;i<10;i++)
4 x- ^ a8 F1 j) ]( n {$ z* b' @- `# X6 h& k
s[j++]=(char)(pw[10+i]>>8);
: \+ K# K! N' Z' G1 A, E s[j++]=(char)(pw[10+i]&0xFF);
8 D7 V8 e% D6 X. ? }& _2 f( G# W+ j# n
s[j] = 0;/ c8 H& A0 g& u/ C( r0 I% s. e9 n* ^
: L1 T' B- V0 T/ j5 q3 A
// for (i=0;s;i++)printf("%d,",s);printf("\n");
5 ?1 r# U% u% m Q3 }# y; g printf("Serial=%s\n", s);0 i4 R! K8 w' L
7 s% u" R* p/ L; [* R% j& T for ( i=0 ; s ; i++ )
1 ^( k' B% U# {+ B; z2 j: I4 {( Y {
) A6 K( L0 t# l3 s/ K; ` if ('-' == s || '/'==s || ' '==s) continue;
) K* t0 ?' H$ q" k printf ( "%d," , s ) ;
0 M2 I8 }% \! n1 ^, _2 C: O id *= 40 ; //10 ;! N: I& H$ Y( R! H1 T
switch (s)2 v8 c. H' M$ j' u
{
4 Y! b- O6 J- A/ p# j9 \+ J case '0': id += 0; break;
4 J9 I! t/ W: ]1 z C case '1': id += 1; break;2 j" o5 ^# \5 w- R1 P: g9 q, e
case '2': id += 2; break;
1 c u3 `; `, j! C' R8 H& Z case '3': id += 3; break;
3 B- W+ x! A% Q, r8 g$ Z case '4': id += 4; break;
9 s5 k5 B( f7 o2 y) N' Z: }' t( o, O case '5': id += 5; break;
; J- P2 z" e! i, u9 v( p6 c( D" ]. Z case '6': id += 6; break;( E# S% R/ P" t% Y/ q
case '7': id += 7; break;
8 Q: C" e/ p/ e# }# ] case '8': id += 8; break;
4 t7 x! M4 X1 U% Z3 K) \. r case '9': id += 9; break;
( ?" Z7 B1 {5 G; n2 s" { case 'a': case 'A': id += 10; break;. ?2 ], X; K# b
case 'b': case 'B': id += 11; break;
( v W, a' i9 p$ m8 ^, C8 Z case 'c': case 'C': id += 12; break;
0 m1 e2 Q8 ~( p, u, B* m case 'd': case 'D': id += 13; break;' V$ c9 s! s+ M) p% R
case 'e': case 'E': id += 14; break;
: C, N8 K9 ]. }. O8 a* _ case 'f': case 'F': id += 15; break;
$ Q9 b0 b& K. m8 G/ y6 c case 'g': case 'G': id += 16; break; _! h; b, r9 {# l2 b3 p: |2 c
case 'h': case 'H': id += 17; break;
4 `4 X+ h! g" F: L, o8 t case 'i': case 'I': id += 18; break;" u8 X) `% {% n9 E- t8 e
case 'j': case 'J': id += 19; break;2 \! ^! B8 F+ O; h" V% G5 D$ P
case 'k': case 'K': id += 20; break;; v) [* }9 [. z# G K& `% x3 Q, ~
case 'l': case 'L': id += 21; break;
0 ?) k- V' A* a" [) P case 'm': case 'M': id += 22; break;
$ z" ?: J6 N+ E) D7 S4 c6 X case 'n': case 'N': id += 23; break;6 ~' ~; r( ^- d- R' T l' o
case 'o': case 'O': id += 24; break;
: ], s# k' L9 V1 M+ k, V/ | case 'p': case ';P': id += 25; break;
( l, W) W, K- H) Z+ m Y: h5 b case 'q': case 'Q': id += 26; break;/ N: D; t9 F9 S, k# a6 H
case 'r': case 'R': id += 27; break;5 E: ], N+ a5 W; k# T6 Z# ^
case 's': case 'S': id += 28; break;
/ E- M, J" s. f5 l% m! i case 't': case 'T': id += 29; break;
' o$ \/ @, l% |. q' e case 'u': case 'U': id += 30; break;' e2 a9 G/ F$ w) R E
case 'v': case 'V': id += 31; break;
+ a. C( _3 l$ T( t/ }: i! _ case 'w': case 'W': id += 32; break;+ s/ @2 ]7 B- Q5 g
case 'x': case 'X': id += 33; break;* G3 F: R3 _0 U# T& X1 j [
case 'y': case 'Y': id += 34; break;4 s0 h5 H& \! o% D2 W
case 'z': case 'Z': id += 35; break;
! m2 W; s$ j1 A. F default : id /= 40 ;" G4 [: y* y3 o# L
}; a/ Z) t+ d% \) ]4 w( u: X& q
}1 p, B8 t: E/ [4 d- s
if (id > 268435455) id %= 268435456;7 a0 b @' b4 a4 h
# V( m7 l6 U" @5 ~5 U9 r
// if ( al1 == 0x58 )
! ^5 n3 @+ B C* E printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
) k8 C( ~6 r6 u* T }4 r; u1 R5 M) h0 ]3 L* Y
getch () ;
. ], x3 j. R5 w# d1 v* Y return 0;
& V, F8 M" x, s" N/ F6 l} |
|