|
WORD pw[256];
, b6 l3 Q, X5 ?& B* \% N) X$ I$ v! l: ^; h
static DWORD idt, int_idt;
. R: g& t5 n1 P+ S0 M! q5 B/ tstatic DWORD Base;% k8 T4 d+ f1 ? A% u+ A* N: X- ^% l
static WORD Entry;
" x, f& J+ H N2 U% ^& u3 Q0 l* @7 v2 y7 h* R
#pragma warning (disable:4035)
1 u1 y7 ?" u! x$ h9 Y) y; Ystatic int inp(WORD rdx)- `7 L- X/ Q/ o9 Z8 P" d
{/ g* h2 W' N _
_asm xor eax, eax
' U: |4 \& u- y) V _asm mov dx, rdx) U7 g* N6 Q+ B* `: {* E/ B5 \' l
_asm in al, dx
: Q2 w% g1 |# Z K8 Y8 c}
/ w Q# a( N4 r6 v4 T9 P
8 g% g/ F, z* i. `* I( c, B Nstatic WORD inpw(WORD rdx)
% v5 x% |8 }! \; L0 i, b$ E{% h: X# R6 K& I' e
// WORD retData ;
: O7 S$ Z: b' V4 O* j' N8 H J _asm xor eax, eax
- V1 ^% v1 P- W/ T/ |" Y _asm mov dx, rdx4 R/ \ G/ u1 a+ c. ~
_asm in ax, dx y8 _1 x; ^' b/ x
// _asm mov retData,ax6 r1 g& K/ C( \% n% J) n
// return retData ;
8 a6 w/ r- k. z- Y9 c1 B0 m}& N2 O8 N6 y/ O& D) j
" f1 m$ b, ^8 k+ ^' K8 e1 {1 Fstatic void outp(WORD rdx, int ral)$ g" M( R. |1 v) A
{
4 I; x$ B5 F9 f5 S+ W) G4 H _asm mov dx, rdx. `7 D9 J8 A. |- G3 }. t* R4 }
_asm mov eax, ral
# w$ a7 ]* h% e _asm out dx, al
0 k% ~* S, R6 z6 T* O0 ~6 E- _" b}
- O. d/ P' N& [: j) G: g8 u+ [' v1 M/ D/****************************************************************************/! f! ^* n4 q( ?! u* E
WORD baseAddress;
, J8 v! G3 }5 q+ X% _( [int drive = 0 ;
7 X% e% Q7 i: A3 h) qint al ;) o1 b" Q6 Y2 f+ V# a' g
int al1 ;; w/ I) z: @ ^1 q
/****************************************************************************/
3 l4 E# z! b, I' a) r' |6 Qstatic int WaitIde()* O' O' q% G" @8 z3 v2 e
{
$ E! @! T- @6 |6 I int al;, I( _8 W0 x4 g z5 ]) `9 P
al = 0x80 ;3 y2 V# X0 S! n- W3 k
8 O4 O3 _ A0 |2 `3 u5 I: a- G. { while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;. ~ |( ^9 n! h+ u: Y6 ~( H4 Y
. T- W! a$ i& `( M/ w( I# D return al;
$ V" A& O( ?; B' i: _ Y}
0 I5 ? `: h' L+ x$ Y/****************************************************************************/7 J8 l& b# i* p1 |0 j7 x" U
static void ReadIDE()
5 l1 s: B, p+ c5 G2 a{
1 L* C8 L, ?( i; X5 ] int i;' l( Q$ G, J: @) D
switch (drive / 2)
$ O: ?( G/ h6 Y7 Y: E { e. A9 w( r$ k I$ X3 _! c8 w
case 0: baseAddress = 0x1f0; break;
0 i2 K4 |; O& J- W7 c' d case 1: baseAddress = 0x170; break;; }7 k8 Z5 }5 Y* E# E0 ~; _
case 2: baseAddress = 0x1e8; break;
# S+ L) w# W7 z! [9 F case 3: baseAddress = 0x168; break;
?, L% K+ }& L: f5 P. d4 T }+ V' b" y4 w3 F# W5 T- Q5 F
2 j; h- o- p* w+ B, c2 |4 V WaitIde();
# M0 ]- H& g" |5 H" J outp((WORD)(baseAddress+6),0xA0);8 Z" ^5 G C3 z; k
al = WaitIde();
# i; r" x1 v) f+ H# I9 f) ]: Z/ k- K% \! q. |9 _6 x
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
3 e4 h4 d" u6 h) D# k% p1 |. E if ( 1==(drive%2) && (al&0x20)!=0x20) return;8 V3 t8 F5 K1 w: p2 t0 M8 v3 p
% M0 g5 Y# C$ c/ ?2 k if ( 0==(drive%2) )
$ z! Q/ u$ P5 t5 d outp((WORD)(baseAddress+6),0xA0);
6 e+ J2 Q H7 N, e: b% ~5 Z else8 B) z; G6 K& \* F
outp((WORD)(baseAddress+6),0xB0);
; V- ?( f; ~6 M1 d" w
/ K# P* I- x5 d8 o1 s( H1 z% V outp((WORD)(baseAddress+7),0xEC);
. C$ k. i" c; Z/ ]0 \+ } al1 = WaitIde();
, Z: x3 _3 A; m/ N+ p! }4 N* W$ t if ((al1&0x58)!=0x58) return ;9 Y* g' G7 @% D$ b
$ T, }+ s3 d6 y9 t7 x for (i=0;i<256;i++)" `, i3 k% a; B( O& J9 \! K) @; z
{0 Y1 `9 T" t" u/ ]
pw = inpw(baseAddress);% W# C/ e5 ?( y5 q3 Y
}9 O# \, n- N7 i7 Q9 B
}) H, P& h! n( a, G. p I" p
) i9 X7 M% P' d8 y% i6 s4 W
static void __declspec( naked ) NowInRing0()
1 W' _& |, V7 c! I1 F- A/ K{
) {& u+ u, h5 L z& M7 X3 A- X _asm. P+ {/ U9 ~3 A r9 K7 d/ K# F( w+ {
{- R, k4 B! \, S( C* b, v$ {1 g
push ebp- ~8 x9 Y' D( y' ~. V* p
mov ebp,esp
6 H+ u" W4 |9 n. f: g0 J2 X v) ?% `7 p
call ReadIDE
8 W2 }* |* r& f cli
0 f C% C$ H0 w mov ebx, int_idt/ m6 ^# ]0 `4 i3 M/ w* x
mov ax, Entry5 g t* }2 Z: H
mov word ptr [ebx-4], ax, P6 \3 v' l% [, l7 z
mov eax, Base
3 W" p6 i. M4 ?3 |7 N, L shr eax, 16# w) e% o) S0 D
mov [ebx+2], ax
% L: n# T! R: U5 C8 k sti6 E+ v+ w4 L6 L- d
leave
* u) j6 z1 s( p: x* i iretd& O/ ^. W$ y" h1 K) g5 w
}
- I5 {* ]; h% I}
/ z( E, A, L# x+ w. N, e. x, S' y% z# w% V7 e5 ^$ m
void GetIDEInfo()8 F8 e) C' }# q( R( W& t
{
1 F& q) Z B7 m; d& h1 q7 [ DWORD dwExcept;
& \3 X# y+ \7 o+ w& z
! f$ Y3 p5 ?" T" H! U+ U- S7 Q dwExcept = (DWORD)NowInRing0;2 v: K4 O4 p5 r; c T! X, t
' H. j( T# k& D6 j _asm
- ]# i5 t4 n6 b2 S, m {4 W8 h9 t: M( f3 D
mov eax, fs:[0]
" a" H; C+ W& ~2 h push eax% Z# X: C# q: r0 {% ]) l" ?
sidt [esp-02h]
4 g5 @6 {" ~( `; B9 E# ^4 R pop ebx
. n' O; T0 D# A- w; O; X8 p mov idt, ebx2 P% E3 l# J/ M2 K# }# S
add ebx, 0x1C
7 B' L; R' F. a- R; @! ] mov int_idt, ebx3 I ~- ^2 \% z( X2 Y
j$ s6 \: n% j* P7 m O
mov eax, [ebx]
8 u* y) ^6 T. K/ h mov [Base], eax
5 T' D4 @- N, ^7 W8 A& `6 [ mov ax, [ebx-4]
6 [5 S, R" B# h" N2 F, o mov [Entry], ax2 ~. K! l9 _: e9 B4 w
( l" j$ X! [6 n+ s! k
cli0 U! d) w- n& u9 E
mov esi, dwExcept
) y' b/ i+ j# S. i. ^ push esi
7 N& ]& i9 b: h$ s# J- `2 k mov [ebx-4], si
/ J" O! a3 U |; _. r$ R shr esi, 16# v1 `2 v& h. L- Q5 |" y/ r% _: H
mov [ebx+2], si" t) r$ S/ n( K4 v- q
pop esi3 l' J' {2 r1 c7 R _
sti9 F- c2 b6 _& S8 o3 T
# e7 w( q; z. [. z8 L; M9 W3 r
int 30 v' i8 O$ E- S$ v/ H& h
}" H" G% i2 P$ h; i. g
}
8 C" M& u8 e) b, F5 Iint main()
. s6 x8 F; w) d4 U) k2 R8 J{3 R- e' l% v. [4 R
char s[80];6 S2 D1 [5 j5 Z# X* U
register i,j;5 p4 G; J& @8 O2 R
unsigned long id = 0 ;$ \; g8 O9 j; I- Q6 V
; ~0 q& V$ |5 {8 `( G//特别注意:这段程序不能 Debug
. c0 N2 }2 n; Y- v' M$ c: a; g for ( drive=0 ; drive<4 ; drive++ )" q4 J" R+ R5 g% c; ~
{
h& w6 o( i+ G' ?! u% a$ T memset ( pw , 0 , 256*sizeof( WORD ) ) ;
, K: `2 H# b! N id = 0 ;3 `& p1 k. U: a0 i. L, u
al = 0 ;( P) k0 `5 d9 ~% R8 ?8 k
al1 = 0 ;
$ O/ s2 H# S+ R9 D$ ] GetIDEInfo();( _+ b* t8 f+ Q9 I q, _: A
- k5 t4 t5 |# Y7 k for (i=0,j=0;i<10;i++), S7 {% }# q8 g, p' I
{+ S. U2 \, B: m ~3 Z! O
s[j++]=(char)(pw[10+i]>>8); F$ v' I$ S% x/ n( Q5 Z2 W
s[j++]=(char)(pw[10+i]&0xFF);
# Z( H6 D* {6 x& J0 G1 f }& A. p: q" z$ g) X% K: @/ A5 q
s[j] = 0;
6 M8 \# _% x6 r3 M- @* n! y. f0 H8 u7 ] m# |5 s( C- h- V
// for (i=0;s;i++)printf("%d,",s);printf("\n");
+ `: n! U1 g6 A$ E9 }5 N( F* p4 \2 @ printf("Serial=%s\n", s);
% d2 P$ i# P: ]# p
- v7 ^+ s% P3 b0 a! h! L for ( i=0 ; s ; i++ )
( G9 q5 @: W) A. F: L {
m) a' L# }0 M, ^4 g if ('-' == s || '/'==s || ' '==s) continue;
3 C: o9 a# _' T7 E! Y# p" ` printf ( "%d," , s ) ;. c& l( I2 P* E" S# o
id *= 40 ; //10 ;% t& y9 l b+ s4 B
switch (s) ^5 {, y. {8 N0 W/ h0 i9 P+ T
{1 n. Y( X+ Q$ q; j) H7 W" x
case '0': id += 0; break;
- X( A. A/ j" g1 Z' T0 j case '1': id += 1; break;
$ ]) C: k1 @- ~ case '2': id += 2; break;
# q# [8 N) L- B- p case '3': id += 3; break;
7 h7 F+ y2 s- i/ j, _ B case '4': id += 4; break;
3 r7 o& ?7 P! T) `- N4 N' Z, w case '5': id += 5; break;
) t4 Y4 {+ k/ j case '6': id += 6; break;% t% E, ~0 n3 h$ y
case '7': id += 7; break;
2 _) x- K$ S( w. Z) D5 n5 S+ _; ^ case '8': id += 8; break;8 U) F" u2 v: s v, E# @' z5 V
case '9': id += 9; break;
% W4 g& c' v. I& g! q$ Z case 'a': case 'A': id += 10; break;
$ Y' U# b0 Q. \0 g" P- `4 S f case 'b': case 'B': id += 11; break; @! }1 w; N6 g* u
case 'c': case 'C': id += 12; break;
6 ~3 z8 g: n" Y# n" B8 _ case 'd': case 'D': id += 13; break;/ G+ t4 S$ b7 Y" s" D
case 'e': case 'E': id += 14; break;" }; B: L9 ^. W Q3 k \- E
case 'f': case 'F': id += 15; break;
5 v; ?( q5 k% j case 'g': case 'G': id += 16; break;5 E* K% \7 h; \& Q7 U- }) O/ {
case 'h': case 'H': id += 17; break;
) ?% a( O" j: A1 n5 J* r case 'i': case 'I': id += 18; break;
. I5 H {' ^7 X$ n D case 'j': case 'J': id += 19; break;, F6 @3 \8 o7 L8 ]1 M
case 'k': case 'K': id += 20; break;8 l( U; x* m9 _8 h3 ]1 `
case 'l': case 'L': id += 21; break;
6 U* F" h! q% r9 ~6 ^! G& l) { case 'm': case 'M': id += 22; break;+ ?" K+ i% B$ s Q# i* F# M
case 'n': case 'N': id += 23; break;& M1 Q) a( X7 I7 p
case 'o': case 'O': id += 24; break;
5 t+ I% s" B' J, E5 R/ G: ?! y case 'p': case ';P': id += 25; break;3 ?% W. f" d9 E/ u% ~6 X2 O
case 'q': case 'Q': id += 26; break;1 X7 S1 r X' {" t) U5 r
case 'r': case 'R': id += 27; break;, b) v7 z, k+ S; u! ?
case 's': case 'S': id += 28; break;
M$ E6 T$ g6 x case 't': case 'T': id += 29; break;
1 C( E/ N) {, d: i' t case 'u': case 'U': id += 30; break;" `- F4 \, A' Q# g
case 'v': case 'V': id += 31; break;9 {3 R1 K1 O" Z! _2 T
case 'w': case 'W': id += 32; break;# c8 v& Z( K. U: b& V0 V0 e4 S
case 'x': case 'X': id += 33; break;
0 K0 z9 R' c3 e! K6 `4 V- R& i& q case 'y': case 'Y': id += 34; break;
- J, }" ]* A: |! f5 S case 'z': case 'Z': id += 35; break;8 d; M1 ]" ~9 W6 S+ m! k H
default : id /= 40 ;
, D) T% e% t: l6 C3 p0 o" f }
' y; o) P* B; U1 t5 O' b8 k. Z* Z1 ` } C0 u0 n* [) Q
if (id > 268435455) id %= 268435456;+ v2 a7 a& o5 ?3 Q; W) w. R' z) g
& b1 F* [3 `+ l0 e// if ( al1 == 0x58 )
4 Y1 y6 e' D5 x$ t# _& f5 I& I% w printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
4 u, x% x# I' A' U }* r8 T/ M5 o# \# F- ~; v
getch () ;" d) {3 q5 w* {
return 0;) T$ R" c: D- V3 a9 {
} |
|