|
WORD pw[256];) O5 M/ o$ ~% f6 d! u
' u* t/ ?8 B" `" D6 T0 F Astatic DWORD idt, int_idt;% j# ?. ^" s, W
static DWORD Base;4 ]# Y: p: O9 R+ M( U' O# o8 @
static WORD Entry;1 o5 M5 i$ o! u, u
. q3 {- {7 |/ q5 C, ~) P9 z#pragma warning (disable:4035) 1 G) W' v1 P5 d" t7 k" o3 o
static int inp(WORD rdx)
/ V; \7 g+ E+ G! ^/ o( l4 j{3 x {0 J( x! V4 x
_asm xor eax, eax
) q2 s2 a( S2 K, b+ y& b7 h _asm mov dx, rdx
9 V9 O/ L# G3 U$ E* ^ O _asm in al, dx* n) p& d& o' p0 l5 \
}3 [2 I8 F3 B$ n% T5 w3 w& p5 f
7 M. u' B( N' ^% J8 Dstatic WORD inpw(WORD rdx)
$ j- A* a! q/ S+ q( j8 d8 [6 A{
& }# G R7 {2 ?// WORD retData ;9 v: p2 C( b; z/ B
_asm xor eax, eax
( [, C* E, s$ d, E* y% H/ n _asm mov dx, rdx
9 `7 p8 E& G$ g! ^) O( E% D3 [% g D _asm in ax, dx
/ D9 x# _8 ` q: `, G P' S// _asm mov retData,ax ?9 ]9 S, c; I, f. d+ F* h
// return retData ;) S1 g* ?( H$ g2 [
}
5 Q2 C4 }) |; }5 B: V4 E/ H+ g$ {' P0 T$ M3 S
static void outp(WORD rdx, int ral)
1 ^' K8 ~0 @1 Q4 X) _( v{' A6 M/ P& K! T5 ]4 Q# s4 S8 m0 i
_asm mov dx, rdx* W; w/ b( U3 E; D5 D7 }# H; H
_asm mov eax, ral) S2 z- A8 f( S. u6 _
_asm out dx, al2 h8 P1 X9 ~4 M H2 b
} s! Q) E; {! y- O+ u& n
/****************************************************************************/
3 W8 x* E/ a- I! R6 M. FWORD baseAddress;9 N* }1 h; Q: W0 r& X/ }7 T5 Z
int drive = 0 ;. ^' \$ y. ]) u! Y& J$ m _
int al ;
) a5 O- L% ]! aint al1 ;! b5 P. [0 l# i, l A2 K
/****************************************************************************/
1 H2 z4 P( b4 e @/ ?static int WaitIde()
- [* t g2 w; v# q{$ f$ p% `3 [* V7 Z3 k; ?4 n
int al;
; w* U( _8 Y+ S% ~1 j. Q9 T h+ A al = 0x80 ;
6 ?) H. j) r, ~4 ^% a1 k. z) U' [- L7 q0 z6 Q$ [8 Q" ?2 k& Q3 Y
while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
) j6 ^, F. O7 z& I
9 ]2 Q+ \" Y& m L1 o2 B9 g return al;
& }# q+ V. z7 l# J$ Q}* Z J( M9 q2 e
/****************************************************************************/
" @. r. X0 d5 x1 Lstatic void ReadIDE()
+ V) I7 I9 e; v2 M0 I7 K5 r{4 T* m% E: f# t2 `, g) { Q K
int i;) q! F. [4 O* y0 b9 A3 ^/ i+ [
switch (drive / 2)4 {! _6 v c" |0 ?, I8 C
{
9 I3 `! H7 q1 n% ]' S3 T( h4 P+ X case 0: baseAddress = 0x1f0; break;
2 I0 N- a- C& ]% |4 E" E8 u case 1: baseAddress = 0x170; break;
: M8 S: k: R7 |, o7 l case 2: baseAddress = 0x1e8; break;/ i2 g& F5 V3 b" o
case 3: baseAddress = 0x168; break;+ ?0 \+ d0 y d; ~
}+ V4 P9 O# [* X `7 u
9 w4 B6 B- o# v2 L9 e
WaitIde();$ ~; S0 ?- {6 R5 ]. m2 Q
outp((WORD)(baseAddress+6),0xA0);/ r/ J# _1 P, i5 \2 S$ }9 J% I
al = WaitIde();
8 e( U+ @- t; M% q/ ?& ]8 }1 ^2 q$ \ u7 V s% I# Q
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
6 c" L5 T; i0 _. l2 q if ( 1==(drive%2) && (al&0x20)!=0x20) return;; R7 T [7 q& Q& V* @+ b
& I$ Y* l7 w2 c: y if ( 0==(drive%2) )
9 Y. s- s- n+ r outp((WORD)(baseAddress+6),0xA0);" a$ z% J& Q( t# o
else
# p: A5 j, `2 W' J+ G/ G' n& W outp((WORD)(baseAddress+6),0xB0);; K# D7 w, E6 X- h$ L4 V% _
2 t3 X( U7 r6 s. i+ u7 l3 S1 G
outp((WORD)(baseAddress+7),0xEC);
3 }8 @& g7 E7 z5 C' ^ al1 = WaitIde(); ~: P+ s2 l' v
if ((al1&0x58)!=0x58) return ;
0 z$ O3 V; L v+ |# H/ s l5 F- R' f( [) n3 ~
for (i=0;i<256;i++)
9 D4 K& t, Z% \$ Y) Q% K {$ T- t+ h. ]: s$ U _( F
pw = inpw(baseAddress);
2 V; r' y5 A. F; d& ^/ x5 |( X }: W C( {7 f* E3 K
}/ U4 q2 J) k% Q
! F6 a& X; M4 ]7 astatic void __declspec( naked ) NowInRing0()
+ \, D' S: ^0 o/ J3 e{
( o& m" Q, Q( { _asm; v; ~. C5 t# f1 z7 L/ s8 {
{
; d8 o# \8 W% j) l1 B/ Y! r X push ebp
# h0 P9 h- Y; }8 j mov ebp,esp
" K: m w1 e; r6 }* g( Q& B9 q
1 @% m; f" c5 e5 j. N3 [/ X call ReadIDE
# X2 V8 B7 B' M: X. `7 l cli: |' l, M# h2 w7 e
mov ebx, int_idt: `( B2 M6 n; e( l: V
mov ax, Entry
& f6 i& L; U# N$ l mov word ptr [ebx-4], ax
2 D/ r6 t8 b& v' D* I1 [0 n mov eax, Base
1 Z. P0 e( z$ S shr eax, 163 ~& C' \. k& o# a- g/ n
mov [ebx+2], ax5 P* F" e- ]' C& F; o- C, u9 J
sti
) `& ~: @$ o6 a+ U$ O$ z leave
- @ q1 v# C; g# H8 I6 i4 y iretd0 [7 ]* }$ o' y6 m
}6 g$ k& X- r/ j9 C# u( p
}* e |) Z9 k) P# L; ~' l0 e" k# Q
" T7 i8 S' g) D
void GetIDEInfo()
7 \8 f! h( b' P7 k{! w2 T6 O! ^; ?! j7 a1 ?9 x0 M
DWORD dwExcept;
* W8 N+ P; A" w6 ]' Y' s
" ?# R/ Y& p/ t* K# [ dwExcept = (DWORD)NowInRing0;
) @9 q# P2 |( U6 @3 p3 ^0 G7 q9 j' B/ t( O: \
_asm: N+ y& ^' B& [9 B5 d
{0 q K2 b+ S6 c- q9 [& g4 t F; G
mov eax, fs:[0]2 G( M3 H; O; a
push eax% p) j5 F2 U) B4 N. H% u5 ?
sidt [esp-02h]
9 I2 B& k: m! N" E5 B4 K5 { pop ebx9 m, T! K1 d' d; P8 Q
mov idt, ebx
" }/ V; `/ S/ L% |( ~: l7 } add ebx, 0x1C" w5 O5 W# O _* p7 s
mov int_idt, ebx0 c* Q3 K! {& b3 t+ A5 ~( g2 G
3 R: t! A* f6 x
mov eax, [ebx]
+ L' i$ O! x } mov [Base], eax' P% S. y9 o& U( V; }* a0 ?" O8 B/ r
mov ax, [ebx-4]
* ]/ a4 j* ]3 O# B& a8 F mov [Entry], ax
/ L1 S5 c& j$ k& s4 Z7 j8 i2 I7 Q/ O5 T: k' U! J# M
cli, ], w% o0 \3 C7 d6 \) ?
mov esi, dwExcept
8 w7 a P+ t/ {8 M5 y* F* P push esi7 n5 o; R9 e# W: W' }
mov [ebx-4], si
, t0 s6 v* t) y7 f: S% e shr esi, 16/ N# U3 i; e. r; ~
mov [ebx+2], si
! o- q# b1 e( U) f6 l; j pop esi) s* i# E4 C# @& D* n+ b' G+ w5 F
sti' D# @: B2 m8 A7 H" z# }
" T+ O( R* ^& e3 l3 q+ A int 3; l! C) A# d* r/ |2 F+ w
}
2 j) R8 _4 [$ g" S}
% p2 o! l8 J7 d% n9 gint main()
% T: M g+ C, u5 [# f* N. t{
* ?* d+ b3 |9 o7 A* K. Q0 ~* ?9 i; x* q char s[80];
. }/ R+ X, T0 C' q" q* B1 {4 c# c i register i,j;2 U; q2 @% l; w1 \; I
unsigned long id = 0 ;
2 O& O6 N& D, @% Z- X E: e2 |/ x
0 y' c: [) \- x5 v. X. c//特别注意:这段程序不能 Debug/ E6 o9 u" g4 }/ s
for ( drive=0 ; drive<4 ; drive++ )
5 V" }" V) ?* N$ N8 ~1 ~" A2 w- ? {
6 T7 F* B* y. h3 }, `2 Q memset ( pw , 0 , 256*sizeof( WORD ) ) ; ~2 `5 G1 O7 Y. H6 i
id = 0 ;, f( A& h" x/ T! Q1 ^6 |
al = 0 ;
9 ?. Z3 z" T5 h3 j7 J al1 = 0 ;; v1 I0 L9 [7 d
GetIDEInfo();
+ I$ c* Y3 B4 Z2 @; A2 _: C
9 c* c' b1 k) S/ G5 L/ y1 D$ x for (i=0,j=0;i<10;i++)6 S; F' w# B) x# \* ~5 B7 D$ W
{
}2 h+ v8 @- ^! s s[j++]=(char)(pw[10+i]>>8);
1 b6 c. g/ {9 S s[j++]=(char)(pw[10+i]&0xFF);! [( U9 t2 f. v( ]% B
}9 _9 Q. O# v$ l9 ^$ x8 C% Y' ]3 h, m
s[j] = 0;
8 z+ h" n7 _' V. N, P
4 O4 g8 C) l1 g1 b% t// for (i=0;s;i++)printf("%d,",s);printf("\n");/ V9 ^& B: \( {; G2 @
printf("Serial=%s\n", s);
7 J5 d0 G+ J# s; C3 L, [+ W( l. P. `* A: x$ B7 t {8 h7 |
for ( i=0 ; s ; i++ )
3 C/ b- L* P5 E; c8 ?( c4 j {
( v# X' C- Y8 f if ('-' == s || '/'==s || ' '==s) continue;) n9 z2 G# }* R
printf ( "%d," , s ) ;+ ?3 `* K& ~9 d o
id *= 40 ; //10 ;
0 Z: O1 l1 n& v8 N3 I2 W1 ~ switch (s)
7 }8 a/ {- `9 P8 B {' ^# j q7 T7 v3 d' T9 L) W
case '0': id += 0; break;2 T! E3 V+ u: J
case '1': id += 1; break;
2 w6 ~$ N6 d+ }- r) F case '2': id += 2; break;; R5 l5 y! X+ e5 t3 m; J
case '3': id += 3; break;
$ k% [# j+ Z* l Z* w2 }0 t' y case '4': id += 4; break;! \$ g4 u! B8 ~" S- D9 s* b0 \
case '5': id += 5; break;
n% a1 t2 n0 ^ case '6': id += 6; break;) A# ~5 K, n# C
case '7': id += 7; break;3 Z* t8 z/ x8 e$ L
case '8': id += 8; break;! } w$ R% J/ ^# b
case '9': id += 9; break;
. U$ m e; k, F- s& F: D case 'a': case 'A': id += 10; break;( F: d$ O4 c* |8 e4 d# Y V% }
case 'b': case 'B': id += 11; break;
. r9 T( C9 U3 M" z6 U4 p case 'c': case 'C': id += 12; break;
! E9 y* K4 k* K+ S case 'd': case 'D': id += 13; break;
0 I/ w8 ^( w" m7 K0 U9 l6 V" J( M case 'e': case 'E': id += 14; break;0 m% O* R$ p/ l5 _! U, ]
case 'f': case 'F': id += 15; break;9 k, W$ X& ~& [
case 'g': case 'G': id += 16; break;
7 `0 m8 C# h3 a case 'h': case 'H': id += 17; break;
. L" i6 T* f: N6 a! I- J7 m! @4 D case 'i': case 'I': id += 18; break;/ V- E* T0 c4 X3 @
case 'j': case 'J': id += 19; break;% W9 m# g: I: Z* M
case 'k': case 'K': id += 20; break;
- e! I3 j7 i+ J5 Q( C7 }3 m7 I2 v case 'l': case 'L': id += 21; break;
; Y' K9 M+ g6 d$ n case 'm': case 'M': id += 22; break;0 j. r& _& G, h! T" o+ c1 a; a7 D l
case 'n': case 'N': id += 23; break;
2 }2 Q3 s0 D) v/ e case 'o': case 'O': id += 24; break;
7 ~1 N2 o! V2 V e$ e% o2 x3 N( _ case 'p': case ';P': id += 25; break;9 F! u# s8 n2 T4 C
case 'q': case 'Q': id += 26; break;
: |" U* j+ P* X& v3 H, k case 'r': case 'R': id += 27; break;
- U; K( _& I6 B" e case 's': case 'S': id += 28; break;
; f0 X6 }$ U- C7 c case 't': case 'T': id += 29; break;2 P' D' ~6 p/ Y+ W
case 'u': case 'U': id += 30; break;
0 T- o& e! ^- f case 'v': case 'V': id += 31; break;, s/ S# [# T" g+ H8 l
case 'w': case 'W': id += 32; break;
$ O3 P& J/ n! C$ n/ u" I case 'x': case 'X': id += 33; break;
8 C7 W8 O7 D9 J( X case 'y': case 'Y': id += 34; break;9 Q5 l6 s; F7 M8 w+ v+ b
case 'z': case 'Z': id += 35; break;8 A( b0 h1 ]3 W, ~6 k
default : id /= 40 ;! v, [8 A0 o% w" I; k) [$ ~4 l
}
3 h0 z+ N, A* i& z. y }
$ }6 P: M' X1 r+ z- Q9 @0 { if (id > 268435455) id %= 268435456;& C- w; ~9 s) L& y6 {
y5 C% E* q. V8 ~// if ( al1 == 0x58 )
; g/ N" W- y4 E printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;" L6 n0 F' j2 p& Z: b- F1 S
}
) y& d& j4 K7 v: Y1 q- i getch () ;% C" b6 r( Y" N$ y4 E$ @. l
return 0;& ] I8 {- F$ o% g- V
} |
|