|
WORD pw[256];) J1 ]9 c/ q: q, m( a8 ]0 S
- ]2 ?9 G- ?2 R
static DWORD idt, int_idt;
( f, j- Z# ?$ T; `9 Bstatic DWORD Base;
/ e$ j3 U8 |: x" n. ~, Kstatic WORD Entry;
& i2 a, J! W* c, _9 q( F; w: F) H" L; t; _; L8 y$ {
#pragma warning (disable:4035)
6 b2 c6 g; k$ L/ f. Tstatic int inp(WORD rdx)
+ Y+ d/ f" G$ r( I. _) G E( g{& l9 [/ o4 Y( X$ U2 @/ \: X# b, m
_asm xor eax, eax( u6 I1 U C1 v% a5 n
_asm mov dx, rdx/ ?: T# E# M! u# ~, h
_asm in al, dx
/ e2 z$ V& R& n, n}
1 O' E5 y5 N$ x0 v% Y4 N2 ^7 p( m [* @3 M I# \7 _, h
static WORD inpw(WORD rdx)9 F% S% ~' G! Q+ O$ ?0 Q
{
0 ~" z! ^9 C0 ]# C// WORD retData ;2 `7 g9 U+ C1 m
_asm xor eax, eax7 _% r' p4 ^7 R& q* @; D3 f J
_asm mov dx, rdx
0 R7 |7 y! L( @/ | _asm in ax, dx
) \; Y7 c2 o0 Z8 T$ Q1 ]4 O// _asm mov retData,ax6 H j( b( \, ?- c P
// return retData ;
- D' ~2 y5 k* j5 k0 d}
( M( O. S3 D+ c: t0 H! v1 ]6 Z& H& |: s8 D. F5 v& ^# I# \
static void outp(WORD rdx, int ral), v2 l4 ~- G# R2 j
{
- F7 _1 Q1 b" q _asm mov dx, rdx3 K8 y _; w& }* d$ p0 S
_asm mov eax, ral6 v! _7 h: a/ J4 U8 x8 L
_asm out dx, al
}1 P/ R6 R# ?- R; B}
2 g# c- U! g: n) I6 o& \/****************************************************************************/
/ i- f" @5 l" F4 S# [7 n4 JWORD baseAddress;3 q1 s' W2 D' l4 x5 P. S
int drive = 0 ;4 o: S0 h( ^/ e0 s, K( [/ _% ^
int al ;
( i% s7 E0 Z' F- N" j7 F/ s5 c. ^int al1 ;
: ?! B7 k) j. C1 O/****************************************************************************// S3 \8 v2 D+ Q$ t5 |
static int WaitIde()) n9 U* M& \1 a) L
{4 y8 L( p: g9 U6 z G4 ^3 S
int al;
& [ m2 m) }1 }- \% H0 h% g al = 0x80 ;1 @3 X3 d9 b- l! [
, ` C5 e+ @0 V# c) K$ | while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;/ ~4 ^' \3 j1 m6 I8 i
7 f- O+ n8 ]( a0 x# O) S return al;- a% g3 N# K8 S* V5 z! @$ p
}
% o9 W$ Q* [0 x, D: u4 Y+ o% H/****************************************************************************/% \0 Z5 P2 } j* z$ J
static void ReadIDE()
$ o6 v6 h' Y1 q7 e1 o{" B, b4 ]' e* r3 z
int i;
) D& l0 T# {* h4 Z6 h switch (drive / 2)
. L2 W1 f$ Z( `3 s+ x) |2 E {
8 e* x" B2 D: q7 E/ U case 0: baseAddress = 0x1f0; break;
& k! X" d. I% S2 O$ u case 1: baseAddress = 0x170; break;' o7 H7 b# U( Y: ]& i: l8 x
case 2: baseAddress = 0x1e8; break;8 M: e: [1 Z' x, o, z0 r
case 3: baseAddress = 0x168; break;
6 H, f* x# J7 Q }7 U, v2 h# q0 Z4 c, c7 D/ F* I4 [$ X
) L: k& @ T& Q: W WaitIde();% \+ j) B2 ?. n& _- l$ q
outp((WORD)(baseAddress+6),0xA0);
1 M f5 j2 x, X( x- Y) W; v1 D3 P al = WaitIde();7 I5 _. L) s# R$ @) k1 W
! J6 E6 L7 P& ^8 o( a J8 v* P
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
3 @7 G6 t* \" j$ }* W if ( 1==(drive%2) && (al&0x20)!=0x20) return;0 ?- E* \; t9 d
& D3 Z9 j5 w! g# g9 B* [ [; g/ }, u if ( 0==(drive%2) )
0 c/ p# l9 B3 `5 W0 q8 C outp((WORD)(baseAddress+6),0xA0);
( i5 s. O* {4 \% l else
* k, r8 ?( d* o+ P$ F; O5 L outp((WORD)(baseAddress+6),0xB0);
" O6 b) Q) f) p* x7 ] A7 O( }
) M0 D7 G# J, E' \6 M outp((WORD)(baseAddress+7),0xEC);
1 i% K" d7 e0 n( [0 k4 F) V al1 = WaitIde();' O S/ d# }5 S; r* n) N
if ((al1&0x58)!=0x58) return ;
0 m s" y+ Y4 [% g% e4 E; B5 T0 ]# Z) i& m) Z+ ?8 @# V
for (i=0;i<256;i++)0 N! Q8 c6 K0 K
{- [) O5 J8 j1 b/ ?4 R; M9 u
pw = inpw(baseAddress);7 f. E0 F# X% _$ B
}
0 p* Q3 t1 J, i" t}2 `/ o) N: I1 B
: s- J, j" i7 h- O6 _6 L
static void __declspec( naked ) NowInRing0()8 M( r) Z/ \# C5 S
{
b) B8 _* v6 E/ X& i1 X7 f _asm
4 m! Y8 A" c+ \( R; Y8 G { `$ M, Q: q! U a( A4 ^8 U. S8 R. W
push ebp6 p( Q/ O* o5 h9 h3 C- S5 k
mov ebp,esp! E: C) Q% }! Z( Z
$ H% x3 w0 d: A( ?% C5 C; r+ {: i
call ReadIDE
/ ?/ j' \$ ]/ F2 }$ j' Z9 p& V cli) M" O4 J" d5 q! f9 g5 Y
mov ebx, int_idt
5 X9 B" v4 b! A mov ax, Entry. r5 \$ |5 c7 t+ u7 P/ T
mov word ptr [ebx-4], ax
# n' R1 y& c% c7 z% _% N) o8 A k mov eax, Base
# x7 }( O& Q/ j shr eax, 16& D& v6 Q. }3 M6 S& _8 E* Q
mov [ebx+2], ax
/ o6 E7 t# h& G T9 U ` sti
3 r4 }7 W3 b! R leave
' @( ^/ K' }% V* ~8 g' P/ P% U iretd
5 z5 l V* b6 |2 q. H( J6 @ r }) M! V6 e$ E& h" l: s$ |9 q
}5 }% z4 q$ |+ k, R
* r3 [: X* s$ H( F2 M+ [' avoid GetIDEInfo() I1 Z" ?, o/ {2 p4 X0 Z
{
( O3 G) z: S# u+ J DWORD dwExcept;, u: B, X1 F3 O: {6 V3 ~1 [4 b
! a. q& L+ H' F7 ^7 ^0 j4 u% o
dwExcept = (DWORD)NowInRing0;
) k4 i6 p# v- n6 C" I! ~. J- ?# |
: l! W: V+ g$ t* [ _asm
8 z) l" F2 ]) @9 v P {
: O: [* p+ D; Q mov eax, fs:[0]
7 B( u" [, z: g- Q$ v push eax
8 a8 I, [, G9 ~8 }+ P8 y sidt [esp-02h]) U" c2 x1 |0 j* \4 s5 N4 a
pop ebx
6 G% N F8 N6 e H" c$ N8 w- P1 j mov idt, ebx7 o' R! s, h+ p0 ?$ x
add ebx, 0x1C: b9 r+ W, X% P! o% j
mov int_idt, ebx! n5 W0 L+ i1 n0 O! N
6 E# j) ~& `( H ]0 I0 U
mov eax, [ebx]/ i8 {$ G' Q" D. E, A
mov [Base], eax
7 J/ x) x6 w4 Z$ R3 H& p mov ax, [ebx-4]
6 x+ q9 Z9 Z9 C. L- F3 e mov [Entry], ax& r% z7 H9 ]% W+ f( M
* Q- h0 a* e1 i) V* S2 v cli
' C! C. X: F+ ?; \ mov esi, dwExcept5 m& t, D. \+ S
push esi, N& F( X$ f& y0 l( @: Y) q
mov [ebx-4], si9 R4 {8 r5 V; N
shr esi, 16
. f2 b2 B7 e# Y" v4 B. M( Z mov [ebx+2], si8 i [2 Z+ }% s1 i4 E5 _# h" z+ c
pop esi
3 F' `2 Z. P! b1 x2 s& }' R' H sti
& I7 `" M+ x4 v2 O1 J, H
% C9 c* n+ t$ R0 C1 C; p int 3
6 [: u6 a9 f( I3 \; l6 R! k }& V7 b9 d2 F+ I5 ^5 g) j
}
. b: }6 F0 N0 R. c* _2 h% [int main()
. Z$ D) ~6 K- x0 a/ I( f/ {{
2 j/ u! \5 t7 W3 [5 G char s[80];
$ s s" B. G2 u2 _# [ register i,j;
) L( {6 t; }" H1 ?. E unsigned long id = 0 ;
1 I; W0 s* o O! Q3 Y9 a4 C7 n- n6 _- K7 m8 k, K
//特别注意:这段程序不能 Debug; W5 U/ G/ t/ _6 J
for ( drive=0 ; drive<4 ; drive++ )$ P! Q& S; _" c G& e. I& S3 `, m
{- [+ u" J/ Z N; o2 w- Y% k B1 _
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
$ Z% B: V' G4 Y9 y6 x5 l id = 0 ;$ f% D9 V4 J+ h
al = 0 ;( s( d- P( A% y
al1 = 0 ;% S$ a# e8 q& D6 v) L9 z
GetIDEInfo();" s% |7 ]' q' g: V* B
6 U$ p% L- M. U# f for (i=0,j=0;i<10;i++)! f& { {4 S6 I/ Y" h- Y
{: W3 z# Q' D' x6 g6 [ C( S
s[j++]=(char)(pw[10+i]>>8);
- q, G* U+ `# H4 E s[j++]=(char)(pw[10+i]&0xFF);/ K% d5 C( D4 T1 p1 s
}
! T2 R. q5 u C! g4 Q6 o" M' i. D s[j] = 0;1 L" b3 ?$ d6 W. z9 b8 i6 b* V
6 r* Q9 k1 L7 l. J8 |% x5 \5 L, [, {4 \
// for (i=0;s;i++)printf("%d,",s);printf("\n");
1 q2 M/ o2 u) C. {+ [ q% v printf("Serial=%s\n", s);
. S- B% C2 n2 n. F L! H# p# n9 v0 c& i# q5 G4 W6 d
for ( i=0 ; s ; i++ ) b# f% U# v: G
{% I; h3 N4 x! c. e1 w6 f
if ('-' == s || '/'==s || ' '==s) continue;6 ?9 c# k! o3 c& h
printf ( "%d," , s ) ;; K6 J9 S# z: u- t y
id *= 40 ; //10 ;% {% Q: b' X- L/ K! @7 _
switch (s)9 s) ^" ~5 _ V2 m2 s
{; D' |3 @9 P |
case '0': id += 0; break;
0 {( @: Z; I8 v' { case '1': id += 1; break;4 B( ^! O- Z6 d2 B+ e# ?
case '2': id += 2; break;1 l6 f9 v6 u% g3 Z; ^
case '3': id += 3; break;9 N Y+ L" s3 M: V# i" N" u
case '4': id += 4; break;, ^' ?" |3 d k9 q
case '5': id += 5; break;7 u. ~% K7 e0 z. b7 A, d# r8 d
case '6': id += 6; break;
2 R2 g9 A- y y4 O4 S0 o2 L* ] case '7': id += 7; break;
! ^1 t& i; ?, g, K& a case '8': id += 8; break;
( }! Z0 }6 [0 Q: p case '9': id += 9; break;
/ F/ U) d0 {: |# Q% p% d1 e case 'a': case 'A': id += 10; break;
: L \4 A/ B2 O5 V) [, }& a case 'b': case 'B': id += 11; break;
9 B4 f; Q Q9 o- M case 'c': case 'C': id += 12; break;
, G+ t6 N4 P8 c Z# ]9 \ case 'd': case 'D': id += 13; break;9 l: V9 u* R u9 v! L1 Q
case 'e': case 'E': id += 14; break;" L2 N; a) D6 E
case 'f': case 'F': id += 15; break;
( J/ {: @" t2 O2 |# D% @( {- u$ d case 'g': case 'G': id += 16; break;
9 S& |, P/ {5 M, ^, x; T case 'h': case 'H': id += 17; break;" I; m, E- t& D+ n/ v+ T- t
case 'i': case 'I': id += 18; break;5 {: | q( K0 h9 ~$ r$ J
case 'j': case 'J': id += 19; break;
) X$ x" C9 ?& \7 \. c case 'k': case 'K': id += 20; break;
, _+ j- d+ ^3 ?9 @: p0 x2 {# n case 'l': case 'L': id += 21; break;% e( v* n$ r9 u7 ^1 A6 U9 G" Z
case 'm': case 'M': id += 22; break;
- q0 U) Y" d4 k3 w; y" O c8 S7 X+ m- y case 'n': case 'N': id += 23; break;
0 L- @" @/ @7 ]! c- P. Q case 'o': case 'O': id += 24; break;: @% C# f( n$ Y" V) _+ T7 t
case 'p': case ';P': id += 25; break;
' l, `& b/ S1 [- {$ a case 'q': case 'Q': id += 26; break;. p8 ^, S# v, J6 ?) n0 e" R$ J
case 'r': case 'R': id += 27; break;
! G2 C* Q, ?: K2 L( j; L* d, Y case 's': case 'S': id += 28; break;
7 o3 S7 B) `, e( O case 't': case 'T': id += 29; break;5 r. n" v, v; v& v' y4 d" X) q5 L1 @
case 'u': case 'U': id += 30; break;
! G$ E' @8 H6 C7 d' u case 'v': case 'V': id += 31; break;; i1 |. b" ^' f3 U% B
case 'w': case 'W': id += 32; break;
) M1 O" G3 y0 b# `# E/ M* w1 U3 [ case 'x': case 'X': id += 33; break;
" ~3 |# _: n Z" J3 y* s& D! S case 'y': case 'Y': id += 34; break;: n6 O3 ?! b7 L
case 'z': case 'Z': id += 35; break;" h+ J) E, x2 U" Z
default : id /= 40 ;2 N# R' M# X% V; `0 l/ C( j
}
1 R0 W& m7 o/ G7 y: D }
7 m. k8 e3 v& R( J# B2 `8 n if (id > 268435455) id %= 268435456;
, Y# z: A& h6 t$ G! x h
- I K- K5 L3 g$ V// if ( al1 == 0x58 )* Q A: D) x% b+ o/ p1 J" h n1 J
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
1 b1 L* W& x4 }7 X G$ U5 v }
: o' C! M$ B! A getch () ;; N) B- y. W! A4 }$ X- c7 ~3 M
return 0;% O5 A: h; K$ s6 A" S4 v5 n+ ]
} |
|