|
|
WORD pw[256];' r% m+ h- T6 m5 _
I. u) W2 g! \7 t
static DWORD idt, int_idt;
0 T7 X4 L% w5 S/ p* i7 M$ }static DWORD Base;+ v/ {5 { j" o) C, Z S* Y
static WORD Entry;
1 f( `/ X8 G3 G) K
4 B2 C: e. O' A# T: O8 c$ V#pragma warning (disable:4035)
9 e! j9 r6 [2 w8 mstatic int inp(WORD rdx)
4 V: Z2 _1 Y& b5 q{
$ b) M" `+ z9 @6 L5 a( B2 ^' I _asm xor eax, eax& b! O2 U4 v6 _ P7 `1 K
_asm mov dx, rdx( j* h; L4 `4 [# M6 O0 q* e) a/ O
_asm in al, dx
3 s- D* b- F% r3 f4 o) t}
7 z* R: E" e% `) R- e" j
B* L3 y4 g! q1 f6 Ystatic WORD inpw(WORD rdx)
7 t' S! B- r" J7 r{/ U% |0 ^" ?7 G+ s1 F: v) N
// WORD retData ;' ~: F/ ?- U/ M5 C5 b# ~$ C
_asm xor eax, eax/ {1 d, G: t' o) K1 N. [
_asm mov dx, rdx
+ `% z x- x, B* H4 ^ _asm in ax, dx1 | { z8 U, z; k' `4 _9 x
// _asm mov retData,ax) h9 z' W+ ^ W
// return retData ;
! R6 P& U) r+ m4 R7 g0 Q+ L" I}, j: z- T2 R: J7 t
I- {1 P9 g& y# Tstatic void outp(WORD rdx, int ral)
9 K- b6 t1 r' h: r4 Z% H) M{) Z1 [$ F& A$ f, N3 C" }; U @
_asm mov dx, rdx" G- h1 z7 Y% [/ n
_asm mov eax, ral
( R Y+ r% T/ h _asm out dx, al' ~/ [8 d5 W9 E" Z$ Z! \4 n8 o
}4 ~5 o' ~& u' e2 T' h
/****************************************************************************/% G3 j C E6 ^) X$ b
WORD baseAddress;$ H& \/ t S$ ]
int drive = 0 ;
& r' m2 R, H9 y5 ]% u% y# n. `int al ;! I! Y" x" h* a( F, ^
int al1 ;; Q5 d7 [7 }4 Y L( R
/****************************************************************************/5 _8 S' \5 V; J1 ~ E" p
static int WaitIde()- Q$ x2 v1 M% z" D0 L" y! A3 l7 U/ i
{- W0 C3 H. B& K: c# b
int al;
3 L, ]: U, e4 }+ e al = 0x80 ;
/ j- P3 S r6 m" r4 w+ q
5 }4 J& a. l2 {1 f while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
" O3 S7 v# d! z- d# b n+ L* \/ A. M' V! S# ]% M6 N; F: w
return al;2 f$ i8 P H6 l+ p$ z
}% c* H( S: k8 }& M) U% I
/****************************************************************************/4 b% B- M8 }. C5 h, t
static void ReadIDE()
' s, N% w* f) e$ g{, D' P3 |! a7 y& ]. P3 f- X
int i;
, M8 ^. e, m2 \5 J7 N! v( E$ S( l switch (drive / 2)5 [9 y& B, _* f
{; g3 k( ?( f- }8 }. K% @. K
case 0: baseAddress = 0x1f0; break;
1 Q3 T2 g; y% c case 1: baseAddress = 0x170; break;
9 S: t# ^" q! q( s) y9 R8 V case 2: baseAddress = 0x1e8; break;$ g1 w4 {8 e2 ], \
case 3: baseAddress = 0x168; break;% B3 L6 M0 W3 I% {& B& ]) k1 E
}3 O Z# R' C9 y
+ u6 \% f4 T X7 ^ WaitIde();
8 x& k j" |. x2 y5 W outp((WORD)(baseAddress+6),0xA0);: p( l! J- z9 O8 T% ?. n" m( H
al = WaitIde();
8 U, g& U# ^( Z; }1 d0 S- d7 P
if ( 0==(drive%2) && (al&0x50)!=0x50) return;
( Q/ p9 p* e* X' Z- ]6 q5 A if ( 1==(drive%2) && (al&0x20)!=0x20) return;
) [5 w% m, b \. g
6 t1 z" A {! L7 K if ( 0==(drive%2) )
' q% A6 v5 L4 S$ o outp((WORD)(baseAddress+6),0xA0);
% [# q5 g* s0 C( |, q6 c else
' v. Z; ?5 W4 Q! {3 ` outp((WORD)(baseAddress+6),0xB0);
7 E* Y: b3 r& D3 D1 o- I) T; o7 a6 |. q+ u7 o- Y
outp((WORD)(baseAddress+7),0xEC);
; y% E8 L6 {6 a al1 = WaitIde();
9 P2 H3 ]; ]+ m7 \1 Z/ } if ((al1&0x58)!=0x58) return ;
- l; E& P( x( W1 s
/ P5 Y% P) d& x- l for (i=0;i<256;i++)
. U: s9 T& j) X" `3 D, V9 r {: V, x0 Q! w5 ^0 c! l
pw = inpw(baseAddress);, L$ @7 F, O! Q5 C/ q
}2 a1 z6 Q2 j$ q9 B+ G
}
7 m" y/ j$ u. |1 N, @4 i
5 f, a# j$ k! k/ K9 xstatic void __declspec( naked ) NowInRing0()
) t/ O" a$ `3 Z" }8 {: S. l{# t& P0 b2 o! p3 s1 z8 N- O
_asm$ [1 u* k( a* S# q m$ ^ q
{6 u8 {: E) F0 U4 _* ]" I0 v. A
push ebp
& ?; {$ B" u' [! d mov ebp,esp3 ^+ t& `8 }. j" ]6 O& `' _" L6 C
% j& P/ h _' q3 Z call ReadIDE
6 S9 W8 R+ `8 F$ k cli
2 u3 [2 [7 X' X5 c G9 t mov ebx, int_idt
( m7 y6 w# I4 Y mov ax, Entry
5 U) ], H! d1 p* f* e# \ mov word ptr [ebx-4], ax
}- \) P2 `- v# s mov eax, Base3 @( w1 c, s1 E% h
shr eax, 16
- B6 R e4 |* K3 h! k) { mov [ebx+2], ax4 z V+ }& a( v! A, J
sti
, u4 o8 I) ?+ p9 B leave
1 a1 |) N' f! ?8 @ iretd
+ Y4 b: C8 Q L e+ T }' n- b2 d) W4 x; Z: C3 j
}
2 }% ]! F$ Q0 N' U
: y2 F' A2 k; @void GetIDEInfo()% F- j! T ?2 S, @, [
{
/ y5 U3 O7 w1 I) Q+ l. K DWORD dwExcept;
" k: I4 F: C' U8 J7 ]. t1 H# m# K6 \. x& |- m' ^( Q7 F
dwExcept = (DWORD)NowInRing0;
& ?8 [6 P( p6 a( B2 D3 _! R6 y
$ d' A* _) F1 s4 W: e. _' i7 J9 e _asm! I8 y( C1 |2 f/ w8 E. e. M3 \5 `, g* \5 [
{' h& B F3 t2 e4 R6 S6 L" u, ?
mov eax, fs:[0], T0 a# ]0 J. x+ O
push eax
0 s; \ d* _0 H% {) d sidt [esp-02h]! c3 `* ?& u7 O; I. @
pop ebx% \5 M/ j: m* |5 X8 y+ R; l
mov idt, ebx
1 M% O* p! b# s+ ^; @ add ebx, 0x1C2 H; b1 B; `( Z9 ^7 _, T
mov int_idt, ebx
4 X6 D% V9 _8 V$ i4 v
: f& `' |" B8 U% ?2 ^" r mov eax, [ebx]
0 A. ]; ~. |' _7 A# l1 v! T7 Y5 x mov [Base], eax
) ^2 _+ H7 l7 E7 v E; M# M mov ax, [ebx-4]
9 g- x3 E$ g& |" @* N mov [Entry], ax
5 v& V x, o* g& g8 E
1 l! P2 P4 i0 @( h% G cli$ i9 j$ I- _ ?. D0 e) a+ r
mov esi, dwExcept4 D$ h) Q8 ]! A6 }8 [; P
push esi: F E4 X% O& ~: `8 t& _7 y$ z
mov [ebx-4], si
5 y! l. D3 u( M3 J+ g2 x( H' r shr esi, 16) c6 K6 N: T3 ]! f9 G
mov [ebx+2], si+ I+ t2 x8 {. P% p: r
pop esi
' s* D( l7 B! |( [+ _1 z: { sti
X; _4 U' Q5 t1 L( }1 ?" }, s8 r! z+ `" {9 F- P+ J4 \1 d
int 3
: P- }8 d* _$ V* {- R# l" \ }' V- T4 y' n! R! e, {/ B1 C G
}
, z- t+ ]2 U$ g% u; eint main()0 v9 c+ I* q( e7 p, f( b! `7 H
{9 ]" V! j; M, Q8 F* E) G
char s[80];
! x# x! K6 @4 m. x5 { register i,j;0 ?6 G: _$ Q2 W- |
unsigned long id = 0 ;
& j2 D2 a! S$ x% ~# Q3 {. L
" D7 P- I2 u H, P8 u//特别注意:这段程序不能 Debug `) R& c7 y# `* m
for ( drive=0 ; drive<4 ; drive++ ); p( T3 x# c0 v) k9 J
{
n* {! P4 L8 Q# v/ ^ memset ( pw , 0 , 256*sizeof( WORD ) ) ;
) L9 U/ y1 |8 x2 z$ | id = 0 ;( a& b/ H: R9 X+ O
al = 0 ;4 ?/ w y( ]" _. s+ h
al1 = 0 ;
8 S' q/ }' g4 w* a GetIDEInfo();9 B1 p6 Q. X) i6 K! ^$ l
7 ^; U. R, j# y6 q6 g, a) x5 P
for (i=0,j=0;i<10;i++)
9 I0 w/ e& \' M {
: h' z" S# q2 k4 e7 w1 M9 c0 ? s[j++]=(char)(pw[10+i]>>8);
' W. Y0 t' e2 I8 ?, r4 O: _0 F9 f$ P s[j++]=(char)(pw[10+i]&0xFF);
$ i/ _/ ~$ w9 E9 U! k& K }5 N# X9 t$ l( l, _" m3 t9 T5 T
s[j] = 0;! i5 r( |" r2 d0 p c
- H' f+ E: ~ C
// for (i=0;s;i++)printf("%d,",s);printf("\n");
; m. [6 C' F! ]8 y! ^+ ~0 {3 Y0 F printf("Serial=%s\n", s);
+ g5 K% i# A! g+ i. F
* S; F+ ]& s2 K Q for ( i=0 ; s ; i++ )
4 i4 m) l% V& N* F5 W- P {
, o& B6 r, y2 \; {/ R if ('-' == s || '/'==s || ' '==s) continue;. J0 t; |: h2 }3 U. h' u2 R0 S3 P
printf ( "%d," , s ) ;
- P6 }: U5 o, O, ` id *= 40 ; //10 ;
5 \& S, E6 |% S6 S4 r switch (s)" }3 s x8 y! O8 E8 ~, z' s3 N. b
{
" D$ k2 h% V) D" s3 T1 \/ R case '0': id += 0; break;
# ?1 t$ {- p4 Y8 g* P( \$ Z, Z case '1': id += 1; break;8 K0 y; Q' K5 i, t
case '2': id += 2; break;
* Y7 ?/ L! r- E. S1 ?7 P5 H case '3': id += 3; break;
9 P, X% J: |& p2 y" s case '4': id += 4; break;
0 f: y8 W1 K# v6 M case '5': id += 5; break;) O+ a: A0 P8 x" L# k& X% b
case '6': id += 6; break;' z: Y2 t' U( v7 Q% I7 N
case '7': id += 7; break;4 B+ l1 D+ B. x/ T
case '8': id += 8; break;
) {9 b1 I3 L% v/ r% P/ V( o case '9': id += 9; break;
# ?3 E. |8 w4 v0 \5 [ case 'a': case 'A': id += 10; break;
9 f7 K/ V! V4 e4 y5 f case 'b': case 'B': id += 11; break;
% a; s9 N% E; J. B4 f( { Z1 { case 'c': case 'C': id += 12; break;, n8 Z9 ]& C/ g' t9 v( }
case 'd': case 'D': id += 13; break;, c+ s! s0 z6 K; M) C- \
case 'e': case 'E': id += 14; break;
( U* n) @ c, @9 o case 'f': case 'F': id += 15; break;9 C" i4 j. I2 M6 t
case 'g': case 'G': id += 16; break;
2 o9 O! A/ A C0 e! v' }& I' b; \ case 'h': case 'H': id += 17; break;
; c- L; ?% l8 q+ {0 o v& x: j case 'i': case 'I': id += 18; break;& [, k+ b' G9 w
case 'j': case 'J': id += 19; break;
. b2 l2 x% A, \6 k& p, p case 'k': case 'K': id += 20; break;
& K. N" F0 u. Z' d+ d I5 d case 'l': case 'L': id += 21; break;
e6 S; S( `! E6 i- `2 u case 'm': case 'M': id += 22; break;
# d5 }2 V4 M/ t3 I" M1 ^: V case 'n': case 'N': id += 23; break;5 S* |& b5 v+ c. }( F3 W: U
case 'o': case 'O': id += 24; break;9 V5 q1 v2 y# p$ |* |6 r
case 'p': case ';P': id += 25; break;/ n) N& i; W7 b$ ?6 ]4 ^% g" U
case 'q': case 'Q': id += 26; break;9 J- Q I- o0 b4 r% O
case 'r': case 'R': id += 27; break;, q6 i- F: l4 n
case 's': case 'S': id += 28; break;
) [) N& `$ [9 `3 j% B1 l7 W case 't': case 'T': id += 29; break;. [+ @5 G4 S2 s8 u) s
case 'u': case 'U': id += 30; break;* f" v& {3 I( g% e8 e& q
case 'v': case 'V': id += 31; break;
! Z! N4 d; s9 l$ ~$ x case 'w': case 'W': id += 32; break;7 v( p8 M% [6 q8 ?5 m3 o6 Q* E3 H0 w
case 'x': case 'X': id += 33; break;( ~ w' Q" f2 H @1 L
case 'y': case 'Y': id += 34; break;
. L$ m+ C7 W" J& |- `& s0 c/ O case 'z': case 'Z': id += 35; break;% J0 I6 L2 b2 |0 A5 R; {
default : id /= 40 ;
3 A8 _" v m- Z! _ }
% k0 _$ C% f M }
- A' i& H) A( _% b! M if (id > 268435455) id %= 268435456;
2 t' ^! ]5 T. v7 q
5 c) F' r) k. t! R: z2 L3 i$ x// if ( al1 == 0x58 )
4 _0 L, G: x/ |; a% f/ {5 y printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
4 P j4 b2 k6 I' P }
7 j! X; R9 ?! p+ T s8 E: ? getch () ;/ M8 G* w3 r7 {6 U, T2 Y) a8 n
return 0;
9 ^4 E0 `" L+ }} |
|