|
|
WORD pw[256];
2 h: @9 Y r$ F8 L& Y; T$ [' O( R3 V1 e0 s) ?- G7 P) H6 ?0 C
static DWORD idt, int_idt;: H, M$ J, s, X) @& ]
static DWORD Base;( {4 C9 f, m) v
static WORD Entry;5 m, l& }4 W* x1 P6 Q
" m3 D" S, r3 b- x+ ^#pragma warning (disable:4035)
! P6 ~6 I+ R5 @static int inp(WORD rdx)6 b0 `+ @, G7 y: X$ n4 B9 c
{& m* k3 k+ B6 P- `6 K5 J
_asm xor eax, eax
7 I7 w; Z7 B1 D* k' d2 }- g8 V* d _asm mov dx, rdx _! L! y1 i `4 B" ^* l
_asm in al, dx
( W/ _ y4 n7 F0 i) Y+ a}
, _3 f! V, V/ m# _3 d! C4 V0 v0 ?/ Z: [; C2 x2 F1 M% [1 P; f% J! w
static WORD inpw(WORD rdx)
7 [0 T; q$ s6 I* O{
" c' @( w) n: Y/ \9 A// WORD retData ;' L6 D: k( e; }" Z t2 g( Y
_asm xor eax, eax8 Q: `/ N b/ J! `* a* I& r3 Q5 y
_asm mov dx, rdx
; V# L+ F( Z( y$ c) U+ ? _asm in ax, dx U5 \8 i, N0 @0 K
// _asm mov retData,ax% [& f$ j1 k+ n& i$ G( n2 Z6 g
// return retData ;
" o' S) \6 z3 s, A- J$ o}2 v$ p4 a1 E' f4 ?! i
) X1 |: G- {4 v4 X/ [# s5 hstatic void outp(WORD rdx, int ral)
6 W5 R, Q- |+ K# O f4 ?/ g{
9 r. A* P9 g, s2 x _asm mov dx, rdx
: @1 `8 [) Z! T3 P# V5 b6 s9 n4 u7 ]! b _asm mov eax, ral
5 v& M% c* ]: ~& E _asm out dx, al
+ S/ I' @+ j% b' d}
- F6 `6 P* J) l. @" I0 O3 c/****************************************************************************/
" w7 \* K5 D; x# P1 `& d& OWORD baseAddress;
& g2 I& N5 i) E+ c7 @int drive = 0 ;8 u/ K% U2 Y7 P: z+ M
int al ;, R! S& p# _, R& W
int al1 ;2 X. p D: @6 U6 v) p, c: {
/****************************************************************************/
4 a0 i! l1 X# M! ]* g) I& Y3 dstatic int WaitIde()
8 T* L- N' y+ z. e{
4 `4 b, @6 d/ [5 s; l2 m int al;
7 w1 @* B; O, k |: T5 e: a al = 0x80 ;2 w7 e2 W: ?7 i) N
% V# v* Z. m4 Y% U. K: N
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;7 c; B& E0 x- S9 Z; d6 c
+ A) b1 C' G! @7 C! j return al;) p+ q' D) ~1 y- U M0 b
}
@( V$ x8 ~' y+ w& q8 X3 }/****************************************************************************/' v$ C9 W# R# c/ [' w: u; u
static void ReadIDE()
7 x+ ]( J# }6 {$ S9 \' N' X{9 c% w) `# m) M: p
int i;. A# {' t/ B+ x: G$ x
switch (drive / 2)
" j# G! e- w& A. [! W7 Y2 ^+ ^0 z1 } {
, [- n8 _! r# B+ q; V, F case 0: baseAddress = 0x1f0; break;! J' u4 f' I: Q3 h! ]8 ]5 C# `
case 1: baseAddress = 0x170; break;
; u* ]" R, g- h' C6 n case 2: baseAddress = 0x1e8; break;3 G* ~ e/ g! Y
case 3: baseAddress = 0x168; break;
; P* D9 V. b5 z0 }- ^ N }$ o6 u9 O" }2 C! G, |
/ L! S" X w" }: {0 ]# S4 S* p WaitIde();6 \3 F3 b2 b: b: t3 I% ~8 j
outp((WORD)(baseAddress+6),0xA0);
0 F E( |7 r. `- z K' b4 L0 \ al = WaitIde();7 t/ Z& Y# a I+ z: r5 [, }0 C1 [ }* ~
1 |% A) D7 P1 K if ( 0==(drive%2) && (al&0x50)!=0x50) return;( h( \* }& ~" u
if ( 1==(drive%2) && (al&0x20)!=0x20) return;2 o1 k/ H P) }+ O3 C
/ ~7 m' L7 ]- A" u6 g4 G
if ( 0==(drive%2) )
0 r$ c. |" d0 l, ~% a' | outp((WORD)(baseAddress+6),0xA0);
* C8 d# g5 z+ K( F else
+ f4 ~; s0 y4 }$ O: @8 f: d- B outp((WORD)(baseAddress+6),0xB0);2 ]7 J( C. D( H* N5 L
5 d2 w) h+ C7 v$ c# O/ L/ ?, `* k* X outp((WORD)(baseAddress+7),0xEC);: W! g3 b& q; L! R$ |. O5 R6 Y
al1 = WaitIde();% |0 v/ S2 T" U' [/ d8 X7 N
if ((al1&0x58)!=0x58) return ;; X( q8 _( R0 k% n# `. |3 [# W/ G
& Y2 P# b. {( c- ?/ g* B; [ for (i=0;i<256;i++)
7 V% ^. t X) m- q, i @3 B4 \ {
; z$ ^* |) L4 c9 C8 d6 k- q- M pw = inpw(baseAddress);0 f _/ I+ L1 ^& p* C
}2 P& t% q% x* t% {9 D' w' f7 x9 c
}1 O8 ?1 A" o6 f2 ~0 w* i2 c
8 M3 i z& w+ Astatic void __declspec( naked ) NowInRing0()0 z: |( k, L C3 B
{% c+ x# I0 y/ s
_asm2 m$ K; L9 [) l! |" y: m
{
# l( ]9 B; D+ r% p3 O push ebp' A8 x. J+ c; B/ C
mov ebp,esp" [9 l- ]) k" ?- z I5 n
: K2 \- x, b2 S/ p
call ReadIDE
; J' w' a7 ~; q! t cli
4 R9 g6 y' S* @) ]! j mov ebx, int_idt# E4 {* L) y8 H/ s& v
mov ax, Entry2 z) ~( W0 v! u/ z( f- C& N
mov word ptr [ebx-4], ax
, U) g8 q5 V5 ]" p mov eax, Base5 G P1 k1 p$ ]" [/ ~
shr eax, 16
7 r- |3 E$ c) v( |8 }; u% y mov [ebx+2], ax
8 ~/ x$ g' u6 h4 X: [ sti i4 e* c/ s2 e2 a L
leave) u z9 I) O! T& e1 \
iretd
% i r% V- z( {" Z }. R) u7 ?4 J3 X9 W+ w& M
}1 h2 e2 A7 G! C7 n w8 v$ O& m! Q
* }+ n+ O, z6 p6 C; E% }$ W, y' n( a5 H
void GetIDEInfo()8 I$ M, q# c& [ {; K
{
3 t _; ?$ }9 g( N" l# } DWORD dwExcept;& x9 X' S3 d T1 u% u, ^; D
1 g, L$ s3 p% Z" @* F$ h dwExcept = (DWORD)NowInRing0;& Y: D: Q5 C) h- V: K
0 L O3 \% O0 t k/ Y% ^7 y _asm
2 X% G1 G6 S/ q% l5 M4 Z {
- c4 X- P2 w# s. @ mov eax, fs:[0]1 r3 i, [8 h8 u* i; U! p
push eax
8 u# a3 ^& F/ Q2 Y( w( a0 ` sidt [esp-02h]
4 @! N4 ^' k+ |" s pop ebx9 k6 z7 ^ i1 |+ N0 E
mov idt, ebx! s5 r+ R0 S9 o$ Q' J
add ebx, 0x1C; U' B6 C% J% \4 A! J: M+ ^
mov int_idt, ebx- ~- C9 i- n) q9 E4 b+ B5 `3 ]
2 A) f- R/ ]+ m$ U4 F- [7 g8 r mov eax, [ebx]; w$ o- V- b. X
mov [Base], eax" b. o' a4 Q, y. ^! R! r
mov ax, [ebx-4]; C) t* L' x$ P% b8 \8 E
mov [Entry], ax% J" |9 [0 ?& {, v( i2 t" F
" r; u: ^* {. i cli
0 s% |% \; S2 [- g mov esi, dwExcept' K+ j* c* `5 E
push esi1 u. G* _9 x; l9 [: v/ @" \
mov [ebx-4], si
3 f. W' ^' D, m, @ shr esi, 16+ `4 `% r) y' {4 D" x% S
mov [ebx+2], si7 S2 H) G% g& [8 y7 Y
pop esi
) `, v. p" I2 F7 } sti; F6 x! g" e5 ]
0 V% |0 @% m4 F" e' Q g int 3$ y5 X% d Y2 m$ D
}
: b9 V( p8 c, a' f/ _/ ^}. A! o, f) a& r, V2 J9 \! w; E6 F
int main()" D* w1 e( r' b0 x4 X6 w5 \) p" N
{
V T9 P9 l1 u: o% }- n# b7 {" ^$ X char s[80];
3 H }* {" ~2 n8 p% C+ G) K register i,j;
, i) ~( D' D# j unsigned long id = 0 ;
. d( l5 a& b/ T; r2 Z! c/ R% g6 }! Q. |" ?
//特别注意:这段程序不能 Debug
9 D# P& { ~7 Q% V+ v* @ for ( drive=0 ; drive<4 ; drive++ )
9 i2 G; Z* B; j9 w0 c3 r" k7 B {1 ]! |& Y# [) q; b2 O9 H7 n
memset ( pw , 0 , 256*sizeof( WORD ) ) ; Y- J& `+ u0 P4 {5 T
id = 0 ;
' d8 L, w ~* o. f al = 0 ;
5 Q4 w9 A" v' t. s% \ al1 = 0 ;! p4 T( b$ I% t- z6 Q
GetIDEInfo();* |9 d" S9 F) {, L) `9 E+ l" [
& {5 l: x P% [8 a3 k" c% c; t
for (i=0,j=0;i<10;i++)4 c* l. v p$ u) }5 t7 v
{
# k F% T# p4 u% }. B# j0 `) B s[j++]=(char)(pw[10+i]>>8);
: P3 I z* v3 ?1 s- T' l0 N s[j++]=(char)(pw[10+i]&0xFF);5 i, \7 s# [0 Y
}+ M) p! W4 H, d& o
s[j] = 0;* h( E1 `. r7 P6 e1 A
2 j9 ^0 d& h# K, h- l
// for (i=0;s;i++)printf("%d,",s);printf("\n");6 U+ z1 p: d1 u
printf("Serial=%s\n", s);
& E( m w0 t2 g* O( r8 f- v
' l; b: w0 b5 j+ Q; [ for ( i=0 ; s ; i++ )
8 n+ @$ B3 m4 L. i- m# ?% j8 N {2 [# P# v' h ]' g
if ('-' == s || '/'==s || ' '==s) continue;* A: G; g; Y5 p( L/ `9 U9 A
printf ( "%d," , s ) ;
/ }) t/ K% W! C id *= 40 ; //10 ;( d3 a; c0 h0 o. S `3 [
switch (s)
9 z" P8 y3 D7 v/ \4 U; v {- I0 ]4 h, T$ s5 o8 e7 k- _" X
case '0': id += 0; break;
, |) _* ~2 m, j: u- h& j% z case '1': id += 1; break;
0 [8 s+ |3 D3 j+ W3 a9 B6 b case '2': id += 2; break;, d6 |" W$ y H
case '3': id += 3; break;
H: f! E9 {* q8 J3 f" ?$ O9 ^ case '4': id += 4; break;! z3 A0 O3 s% Z* m! K/ @: p
case '5': id += 5; break;2 O. S' r6 b! S" m2 b3 I
case '6': id += 6; break;5 j; e c, N( n' O8 y
case '7': id += 7; break;" ]+ k" G9 W* O6 k; v
case '8': id += 8; break;
- j% x: G5 Z: @+ E! i4 h0 v case '9': id += 9; break;& ?( l' F3 E7 v u: e. M( X) ~4 Y
case 'a': case 'A': id += 10; break;7 B0 s/ e' O( E1 T
case 'b': case 'B': id += 11; break;+ A+ n' g C* J
case 'c': case 'C': id += 12; break;
! E) Z# w- W0 B case 'd': case 'D': id += 13; break;7 G8 W5 p3 r1 l# [' u5 C4 G/ d
case 'e': case 'E': id += 14; break;) x% D% p! w2 L
case 'f': case 'F': id += 15; break;
4 [% h$ A0 `8 v8 X: k- F0 _ case 'g': case 'G': id += 16; break; Q e$ L2 B6 b6 e
case 'h': case 'H': id += 17; break;
% {0 k' M4 i; Y+ R- p) n case 'i': case 'I': id += 18; break;
9 W: @6 Q5 T5 V; ?% O case 'j': case 'J': id += 19; break;8 C( R0 f! D3 v3 C5 Z
case 'k': case 'K': id += 20; break; B0 e, d. H# q) `3 a
case 'l': case 'L': id += 21; break;' W0 Q' d% Q% b |9 H# [1 v
case 'm': case 'M': id += 22; break;
4 J) \! |6 c( b) p2 }2 e case 'n': case 'N': id += 23; break;: q4 z9 B- { b* u+ u0 ~# N. @
case 'o': case 'O': id += 24; break;
/ q! L8 L ^* @$ v case 'p': case ';P': id += 25; break;# V4 R* L% l2 V2 i4 T6 ^, Q
case 'q': case 'Q': id += 26; break;
8 N* P+ E$ g6 M( i) O7 t% o( o case 'r': case 'R': id += 27; break;. c0 u! m1 B+ {( a9 B
case 's': case 'S': id += 28; break;5 V$ |% k" O2 ?! L1 n \
case 't': case 'T': id += 29; break;8 N5 i; z- w' e, X+ I3 X7 F: |
case 'u': case 'U': id += 30; break;
8 I Z8 ]9 F8 t$ l9 ~/ U/ C' J8 A case 'v': case 'V': id += 31; break;
# c3 b( j3 H K$ m! F% N8 N& q case 'w': case 'W': id += 32; break;# V+ R: r1 z' v& l/ b3 L1 ^# W5 X
case 'x': case 'X': id += 33; break;2 U1 m2 ^/ k7 {6 c& l, p/ N/ M
case 'y': case 'Y': id += 34; break;' i; h7 _/ m9 `; K$ p
case 'z': case 'Z': id += 35; break;
& t1 [' |% A, y D0 \; G' c- L default : id /= 40 ;
( m5 j2 Y: o1 u8 A1 |) M6 ?0 z }
* _7 K6 z9 b/ _6 K }
" K$ S2 g, ]5 V. [# F if (id > 268435455) id %= 268435456;
# \. S" {5 k7 [5 g
2 j2 @( X( y; i6 H// if ( al1 == 0x58 )
* P* A2 ]5 d. `9 U' Z printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
6 g! g4 T; g4 z: q5 \& H0 R' s }# H# C1 P1 ]; N4 U
getch () ;4 p) x9 |& q! S- b% R0 G9 W& z
return 0;
3 R% M6 E; z- F} |
|