|
|
WORD pw[256];
1 m% h% B4 p* O( b' P6 Y7 w
% ^- B/ \$ r; Y9 M6 @% k$ ~) Ostatic DWORD idt, int_idt;; ]* h; Z9 r' I. @
static DWORD Base;6 E9 d% x8 Y6 S
static WORD Entry;% _2 A8 m1 ]7 Y: M: f4 C$ ~
/ L$ A1 L0 {% F) C# Y6 o/ C. }#pragma warning (disable:4035)
4 q2 R) D+ n. H) ystatic int inp(WORD rdx)
4 c0 G: R5 q# t8 c4 R% _% k{! `6 U! [% V, }8 l+ u# ^
_asm xor eax, eax- E9 m$ ^2 L: P4 U5 x5 m+ B
_asm mov dx, rdx% y* L+ Z* _4 Q f
_asm in al, dx9 h0 D; I8 [3 r$ m
}
% F. ~" n: D; s0 x) ?
- |! j$ { q. A- j( {" O0 wstatic WORD inpw(WORD rdx)" e! @- K) ^% K; l1 ?, Q
{
/ g; T; [) ^. M0 I& F/ V// WORD retData ;, q1 b" f& Y% @
_asm xor eax, eax
. ^% y+ i: s$ k5 w+ h _asm mov dx, rdx- r$ W/ \6 J2 o* [, y4 R
_asm in ax, dx
+ }6 `9 X7 ] ]* O' c0 I& r( S5 z// _asm mov retData,ax, f" _5 l3 \* V) P/ |2 @
// return retData ;- ~. ]; y3 K$ v: ?4 y' @
}. I, f. u6 S" j& n7 k
v; w8 s" t( S4 f( E4 K/ estatic void outp(WORD rdx, int ral)
: i5 h. k' i+ D. @* L9 y- Q{: S- A4 t6 e5 a% I0 ^9 r
_asm mov dx, rdx; e; P8 j) u% r% q
_asm mov eax, ral
. ~2 o6 T3 `. N$ j _asm out dx, al3 x6 u9 v) V& b& V+ X
}
& t' D4 J* Q& w4 _+ {/****************************************************************************/
2 M3 v# O4 Q6 ^; |! e# @& |WORD baseAddress;
6 S" Q9 {; K7 X% nint drive = 0 ;
3 i# c9 q1 I# M9 |! Q+ R2 Eint al ;6 k6 _; n. |7 _# z7 c$ j5 i q$ @- u6 n
int al1 ;8 p+ | g2 n, t! \/ Z i) t, G( M' k
/****************************************************************************/
7 ^5 S+ j b6 F5 {0 j( Dstatic int WaitIde()
* s* k$ M1 |0 M{5 H8 Y+ W* A6 c* @! j
int al;& n" Z) w' ]7 V, S
al = 0x80 ;4 r: {; H# \7 z1 _$ d. n- P
# n6 G; w, s4 ~ w+ |4 b while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;( K O. D( d" E- ~: Z
% U8 w% V$ w4 I1 s& L2 ]5 M1 |6 ~( I
return al;- |( p+ h6 u4 G* U9 v
}5 X4 n+ j; L& n1 ], L# C
/****************************************************************************/
6 a$ V' ], w; R/ Jstatic void ReadIDE()
* ^! Z+ a$ U9 [1 W/ t{
. T- @; M; y- D int i;
$ B) Z1 @+ [8 R! g* A. g/ m switch (drive / 2)
7 L3 Y r0 d+ v, j {
_: u2 M1 T; B- g! _+ x case 0: baseAddress = 0x1f0; break;
; O4 P, s0 b, [* [ case 1: baseAddress = 0x170; break;) o7 r" \% E6 P: i6 U4 ? f0 i& F* {
case 2: baseAddress = 0x1e8; break;: X! ^- B5 B' @4 d% s) a
case 3: baseAddress = 0x168; break;
6 h/ Z# B* }* F( D# J2 L% M }. ]: r) ^3 B, m8 r2 X
9 x& A6 n; K5 t2 }8 d) a WaitIde();
) Z) F ~' \8 D, d" M! R$ Y j outp((WORD)(baseAddress+6),0xA0);
. q6 t+ ?" `5 W1 d+ F. B al = WaitIde();
! |# s/ L" R( ^1 ?
! q& M. v: t g( I9 t- ~ if ( 0==(drive%2) && (al&0x50)!=0x50) return;8 }4 n' A7 c2 y8 }5 u
if ( 1==(drive%2) && (al&0x20)!=0x20) return;2 Z1 \2 r# f# e+ B
4 W4 a' Z, o; k if ( 0==(drive%2) )8 i1 j4 W7 T" l+ I$ ]' N8 m% F
outp((WORD)(baseAddress+6),0xA0);
2 M7 F3 m: U4 X else
) |1 V) j# B% h: K, ` outp((WORD)(baseAddress+6),0xB0); t2 x) ^) V3 e1 y" D5 n! ?8 A% q
6 }+ r7 K. j: `% k
outp((WORD)(baseAddress+7),0xEC);- a. Y% s- U' ]
al1 = WaitIde();
: B+ M0 q1 ~. P- H- ^; g6 D( @ if ((al1&0x58)!=0x58) return ; a7 b5 A% N X* H3 C7 S" f% s
$ B% }- v) k- k! J% h7 z& \5 g1 f for (i=0;i<256;i++)
" ^$ J/ V! s" G. ?/ t {& E/ {3 \) A! k x3 N
pw = inpw(baseAddress);6 B* ~* i+ g3 ?: O7 `. s' L, ~0 P
}
. t" m9 [2 i' ~) j+ b}2 g7 [8 ~1 k9 l* E. _: Z
R6 D9 I3 I2 Z3 w+ q' D! Lstatic void __declspec( naked ) NowInRing0()+ p: s3 B: N) R5 K1 V+ H. _( ^
{
6 j+ m6 a! @ a2 k5 ~ _asm
7 c) Y. C0 w- k# R {
( i D$ F! \) ]' }% O4 x6 a; v push ebp
6 ?# c# R1 n h mov ebp,esp
$ E$ s& B1 T: C R
8 ~1 m0 |& X4 ~ call ReadIDE7 h( x# z5 `1 R3 ?' r
cli6 V/ k$ k& k9 ? G* e1 n, Q
mov ebx, int_idt( ~1 Q0 y: K: Q0 ?
mov ax, Entry
4 k& b0 z$ T4 t! C+ w mov word ptr [ebx-4], ax
; `+ ], ^: m3 ]( p mov eax, Base
% [) O6 s7 ?8 ]. L6 e shr eax, 169 G/ i( J: E, s5 r1 V" U! z
mov [ebx+2], ax, n0 T. x4 o& g( R. V# l
sti. X# V- [4 ?- G9 ?3 v9 c3 e
leave% @8 D4 H8 y5 @. H2 O
iretd4 X7 l9 q! I! a! U5 w
}
. M- U6 Z; [& y/ j. d! K- S* E}+ ^+ ^/ a0 n4 G# T3 g
% ~5 E2 [* g! b: lvoid GetIDEInfo()
6 [. _- q( A% W2 q+ {0 r1 A; d- t$ @{; ]5 \6 Y/ n' d* w) o
DWORD dwExcept;4 Q% ]$ ^0 ~" r6 I8 X0 b
& O4 c! v4 k) Y& B8 F/ I dwExcept = (DWORD)NowInRing0;2 A* _2 O# S* }, l8 B
8 r0 B& P: G$ F1 X" m6 k7 `# j* a i
_asm# o7 W) x$ r+ }; A8 @5 V* u
{3 `, [- U2 m, w
mov eax, fs:[0] v5 p1 k" _0 }' a6 K- y
push eax0 t% `+ M& Q9 J1 ] T7 K) J
sidt [esp-02h]
6 F2 X6 ~$ X$ P pop ebx& G$ H! p5 ]5 D: a3 l
mov idt, ebx
: j, ?8 v7 U. E* P9 Z* W6 F, J, u0 A add ebx, 0x1C
C3 v0 b* H, \2 {0 z/ h" D3 o mov int_idt, ebx
! h$ |& r5 ^7 \% k& a0 @# J5 V/ A; G/ c L
mov eax, [ebx]
8 d7 T8 O8 v' B% f$ M mov [Base], eax
|; b+ H+ i: T' v mov ax, [ebx-4]
4 u3 f3 g8 S% W! S! G mov [Entry], ax
0 {; o( p& L v7 g% X0 F9 v
P ^, Y: e& y4 b( ?2 Q4 U cli
- ^9 F( w* P8 H+ o4 i9 U8 @2 h mov esi, dwExcept
$ \7 X1 h) J- D7 E2 l push esi8 `( w8 u( T1 i; B; x& [
mov [ebx-4], si7 y8 q7 \7 }0 c9 E
shr esi, 168 r$ J# G! w8 k5 X
mov [ebx+2], si
) i% }3 e! D# K3 I1 N pop esi$ ]. X, P3 A1 K' v- h
sti% D. S1 G% q, ?1 {. }, [) b% {
T1 N7 v* J5 d0 [ int 33 E; x3 O0 L2 M( N* k
}- Y$ A1 [' i+ y* x. L6 k
}% ^! u) ~" I+ Y, ^7 K
int main()" O) ]$ C0 H) h; R1 B* Y' j
{
" k4 A8 U! z; e; S char s[80];
. @' D, z3 {1 R/ I7 L6 s% {/ H* O register i,j;) F% q# E% s+ a
unsigned long id = 0 ;5 F! e2 k& M# m/ P
# t& V5 W8 j4 k6 n6 m- I" T# O2 T
//特别注意:这段程序不能 Debug
" }! G: J9 H$ m% m% _ for ( drive=0 ; drive<4 ; drive++ )
' |% D( E8 b1 y' g* _- O5 J {4 ~- D/ M7 A$ r) ]9 u! u4 U+ h
memset ( pw , 0 , 256*sizeof( WORD ) ) ;2 m% M# E4 U9 w# E( Y. d
id = 0 ;% S! m3 b; a% `, E$ E7 L: {
al = 0 ;6 M& o" o5 U: L) d: g
al1 = 0 ;
) R" x2 i. c7 B9 S GetIDEInfo();
: {9 n4 P" i: R! O$ P; {+ \3 J' W$ R
for (i=0,j=0;i<10;i++)
8 \% _3 X z5 t {
+ C+ U( w; d6 u7 k1 o6 G s[j++]=(char)(pw[10+i]>>8);
& F6 P) |/ K0 x( \0 M( q: y* J s[j++]=(char)(pw[10+i]&0xFF);
. S5 ~/ e3 _- D& ] }! h! o% s; T! F/ o; W' S& M; E
s[j] = 0;3 r0 k6 v0 G% _' a, @+ R1 u
$ v+ [, H$ w, V- {5 Z7 E* ?; E+ i// for (i=0;s;i++)printf("%d,",s);printf("\n");0 m/ q; S: e3 J7 t6 Z/ ?
printf("Serial=%s\n", s);
$ K) y- g7 R4 d* q2 h( c
5 c( ^: Z" H; r4 H for ( i=0 ; s ; i++ )0 [) N. ?! R, }" {, g- |
{
1 E& h' ^; r; _' M s- L if ('-' == s || '/'==s || ' '==s) continue;
& S" ], i/ ~ C1 p$ O& b printf ( "%d," , s ) ;* ~1 T2 Q' ~0 G- y+ ^/ b3 x# s
id *= 40 ; //10 ;5 p2 p* X5 }* G- q. X! P
switch (s)/ m; u' z) U. ]8 d! s1 ^2 a6 d7 g. Y
{3 u; I3 d9 t! l# b+ Q7 Y
case '0': id += 0; break;; k1 a& S/ M3 m; B3 j
case '1': id += 1; break;
9 }7 k3 T0 ]4 S" i( v: P case '2': id += 2; break;2 ~+ `1 e# u5 U% z/ S2 w0 E
case '3': id += 3; break;) F. ?# f* l8 }& y# C1 l6 j& o" k7 s
case '4': id += 4; break;
$ R) ~) @+ l- h9 @& }9 N5 p case '5': id += 5; break;
2 j8 O: M2 g$ @/ {! V case '6': id += 6; break;5 U6 f; i) }! T. ~( S4 F+ h2 J
case '7': id += 7; break;5 }3 u+ {% e1 a6 I. Q
case '8': id += 8; break;
1 {1 L9 w8 h0 v4 t$ F7 y$ G" X4 i- } case '9': id += 9; break;
3 {. ~2 K: V% i! }+ i7 _1 d case 'a': case 'A': id += 10; break;8 C+ H$ q: @4 o& ~3 X$ P6 M2 Q. i+ X
case 'b': case 'B': id += 11; break;1 ~1 O# J4 z3 \
case 'c': case 'C': id += 12; break;
* }; g) a j4 x) Y5 l case 'd': case 'D': id += 13; break;6 W* D c* {2 D" ]6 X. g P* R2 [
case 'e': case 'E': id += 14; break;
/ d0 i! @ O/ m! E case 'f': case 'F': id += 15; break;
- ~9 P: y% G1 R" @/ G3 f case 'g': case 'G': id += 16; break;+ _- d% `2 J; A" q+ L- I
case 'h': case 'H': id += 17; break;1 O) i/ v5 e! R( H" x
case 'i': case 'I': id += 18; break;6 `4 j0 ~% r4 C" s3 C+ p8 N
case 'j': case 'J': id += 19; break;0 t6 \" G& F4 F% B/ h$ u
case 'k': case 'K': id += 20; break;; k6 k) d5 V( x9 Q; ~
case 'l': case 'L': id += 21; break;
# O; h; J9 J- e, B' K9 z! j! T; b& H case 'm': case 'M': id += 22; break;
$ w9 c# F. Q# D0 o+ ]) |1 N4 l8 G case 'n': case 'N': id += 23; break;) R5 u. _( F+ i+ p
case 'o': case 'O': id += 24; break;9 o5 o1 K& { A
case 'p': case ';P': id += 25; break;+ l+ y! L2 _- u; q* N
case 'q': case 'Q': id += 26; break;
6 b# z" F; e: ?4 e case 'r': case 'R': id += 27; break;
, y: U, e4 R- [, d case 's': case 'S': id += 28; break;
. @7 v- @& U( Y' @) ~- Q% G case 't': case 'T': id += 29; break;0 u+ @5 I) `4 y$ T
case 'u': case 'U': id += 30; break;
6 ^! j( _9 H8 e% |; z case 'v': case 'V': id += 31; break;; _% s6 \8 p$ i$ H- Y
case 'w': case 'W': id += 32; break;
7 C! `$ f) G" C/ g2 @ case 'x': case 'X': id += 33; break;
; J. N7 L8 G5 K* z) c case 'y': case 'Y': id += 34; break;: S: F' D7 K) o- [; ^" l( B4 [
case 'z': case 'Z': id += 35; break;
5 z: i& i$ O$ b default : id /= 40 ;4 i4 L/ u! u& Q. J3 H% T" A
}; t" c4 p9 q$ U v+ z3 a+ w" a
}. q& Z) X$ b) m5 W1 E+ H
if (id > 268435455) id %= 268435456;
7 Y! r2 M" H2 [7 n4 Q5 `: e3 x- S$ \* s3 M& _( c% E0 z
// if ( al1 == 0x58 )% G& a* ~+ ]4 n$ k
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;) m: R- x2 [% C! j8 p
}& W* j9 s! G" e$ z6 c
getch () ;9 R+ W* J# j1 _: W! A) Z
return 0;( o1 s- |+ J9 ?/ ^! x+ Q
} |
|