|
|
WORD pw[256];
4 P; \0 b/ A" }; ~: v% {0 W' Z" y j" G
static DWORD idt, int_idt; z1 v6 S. u# G
static DWORD Base;
" s+ o+ g! w$ f5 h; hstatic WORD Entry;) ~* t+ q4 d. l: t. {% v
( _" s: F" _: W#pragma warning (disable:4035)
* r3 ]. t3 ?3 Y2 astatic int inp(WORD rdx), a9 w% ^& C5 _& Q h
{ a) n, S/ l, K2 f) ^
_asm xor eax, eax1 p, Q# }( O* \
_asm mov dx, rdx
0 a7 j3 j0 g0 T8 ^+ e _asm in al, dx( q: W6 u7 u' r' t
} O4 B4 ~& y% u! d! l. R2 m3 f( ?
7 S7 ?, U( q" J7 u. Y) fstatic WORD inpw(WORD rdx)4 q" i g3 s/ L' [) [
{
. X7 }- }+ P5 F3 C// WORD retData ;7 U" \9 A" c- r% m" U
_asm xor eax, eax( H3 [; Y/ j) G0 G$ k0 o) z8 d6 n
_asm mov dx, rdx% U; i8 s K: T( X, o3 k; b# E
_asm in ax, dx! D, K2 r# `8 J$ d4 c z K
// _asm mov retData,ax% S6 t# r/ D. V
// return retData ;4 c- ~5 c- D/ @* R
}% L+ z0 e' Y+ R, g9 b
+ h5 B B- N6 \
static void outp(WORD rdx, int ral)
, b2 U& ^6 W+ c{
; z6 K: w3 h' [# [ _asm mov dx, rdx% I& T% R' u p! m$ l9 \
_asm mov eax, ral, T, |% y; S/ o' B
_asm out dx, al
: T3 N4 E( S2 Z2 I# r# x5 U5 I}+ O; g% T- w, L6 R% T- ^5 [
/****************************************************************************/
! ]4 W2 d2 T7 X8 Y9 WWORD baseAddress;
/ m, U6 b4 G# Cint drive = 0 ;9 M6 ~- c5 ]/ x ]: T; K
int al ;
, t7 H0 j" P4 }int al1 ;
+ f- u) _ Y( Z J: M/****************************************************************************/
8 l4 z, ^5 d" Sstatic int WaitIde()5 i1 [( Z3 O3 o D9 _2 v9 ]" |
{$ x; K0 @( u" L9 h
int al; J* _3 M1 ?9 E
al = 0x80 ;
7 V7 z6 R# N$ X- r
$ F& {" ]6 a) V! y" E$ v while ( al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;4 y, x. Q0 l3 A% n4 e
6 U" n k& ?/ ^/ c$ z return al;
0 @$ |) D$ y' R' J}
0 P3 Y8 p) ?9 _; n# @/****************************************************************************/
. n5 X7 ]4 @' N! tstatic void ReadIDE() m' C% k0 Q# `, D& U! W& C. X2 p6 ^& G
{4 u- `: U2 i- k
int i;5 f7 S. C; F, Y' A6 ~- n
switch (drive / 2)
- W( h( I- E) z* v$ _' N% E {
& ~4 m! D# t1 \, s: O% d case 0: baseAddress = 0x1f0; break;
7 i) q9 _7 y9 u# Z- j3 S case 1: baseAddress = 0x170; break;" g* I/ u; s4 }, u9 o
case 2: baseAddress = 0x1e8; break;. n' H9 a& k ?3 G# d% y* f; ^/ ?% ?
case 3: baseAddress = 0x168; break;4 S8 O# @ H4 I. H' ^5 C
}( Y( l9 n5 k+ t; ~
# N/ u- C! L5 G2 W( @9 I2 t& ]
WaitIde();
: M6 _, J; c) A3 }4 }; C% {" _ h outp((WORD)(baseAddress+6),0xA0);
C2 s2 Z$ P8 i) V al = WaitIde();
+ m1 a# x. X. ?3 r5 u3 k
( a; O8 B0 J( E if ( 0==(drive%2) && (al&0x50)!=0x50) return;! q/ r/ q$ |# b7 A3 x# |1 \1 A
if ( 1==(drive%2) && (al&0x20)!=0x20) return;
0 V# V K+ Q Y8 P! c# B# B! `* A r4 |# R& o6 Z8 l/ v
if ( 0==(drive%2) )% C4 Q9 i) f/ w* m
outp((WORD)(baseAddress+6),0xA0);* e2 ]% i* w3 A( t9 y( j
else
, C' u3 t/ I/ l' b. f( L outp((WORD)(baseAddress+6),0xB0);
) Y. |9 x e, I2 q4 F9 F& t+ x% J7 w( Y
outp((WORD)(baseAddress+7),0xEC);0 |; n1 V8 j4 e/ n4 @; [% b
al1 = WaitIde();
/ I+ o a$ [, w if ((al1&0x58)!=0x58) return ;
% c5 X& \; m6 Q( w- x
) U4 f+ f$ X6 { for (i=0;i<256;i++)
1 }" |4 C/ B: r H& Q {
! I2 K# r/ I3 X; `, k3 T }. m pw = inpw(baseAddress);9 {- ~/ J0 N8 v* H* g: U# F
}0 p/ G4 m1 ^) V$ d' u2 V0 P: w7 V
}8 y2 A( e- h H8 |7 C- ]! M
# q0 `& a: l" s
static void __declspec( naked ) NowInRing0()0 `+ \$ K# D1 t& k6 e
{. \' k' _& V2 {; F: ]5 \& i$ |+ h, m
_asm
' l2 c) w9 c. L# O& K {
5 \3 X8 o% n. V( ]) L push ebp
9 R% v/ ?9 c# z9 R( F% X: x1 M8 N/ K mov ebp,esp
4 m5 d e' b5 ^- J" o% ~
' f% J& N, a+ w call ReadIDE
! g+ K! Z, v* n$ \; o% S: { cli
9 B5 C' x3 x8 O K7 A mov ebx, int_idt4 E% z& W$ ]( w+ J8 K4 I i
mov ax, Entry
6 m1 d4 u- C# f3 Q mov word ptr [ebx-4], ax
2 o& e; h6 x4 ~+ s mov eax, Base
, u* j' C# m2 J& B0 ]+ \: B shr eax, 164 d2 ]$ _ a4 F1 ^' ^# o
mov [ebx+2], ax$ L& d' F. i# l; v% E5 e
sti# x/ R1 y8 n: J" T, { ~- i& x6 m$ \
leave
- O% p6 j3 B: |* Z. o" H iretd- w8 w7 X1 G7 @, V2 M0 r3 W' P
}
- x$ n. C; [1 m. i$ y( U! X+ L}
' F8 V/ j. {, h5 _3 O
8 d& c; t% _$ y4 [# I# O1 r: [& j- Ivoid GetIDEInfo(), m) w+ @& u0 o) J
{
* j4 c+ L' Q" ]% N& L6 _ DWORD dwExcept;# J0 w+ V1 |+ ^* r9 v
' `3 D5 R& A! b) I7 y# v: o. f dwExcept = (DWORD)NowInRing0;9 I/ c$ X7 M) {6 I1 I
4 [1 y& \; \3 s, H9 Y _asm
5 Y% O+ }" K& D* z% W: U {
& r& n4 {( Y% x! J' [2 t mov eax, fs:[0]
+ M2 I+ |, ~( i8 \4 B push eax Z# \5 [) d5 Y5 U! C7 A. j
sidt [esp-02h]; r0 L9 e3 w4 ^. ?6 Z' I' D; ~
pop ebx
9 _6 }9 x/ C. `, d. w mov idt, ebx
9 a! V5 ]* e3 |0 L: J6 A add ebx, 0x1C' M5 U. o- p, _8 o; F
mov int_idt, ebx' }/ i: D5 P9 P
3 e" O6 U$ e& P5 b( t* V
mov eax, [ebx]
5 h1 d' x8 x+ Z z6 y mov [Base], eax$ k0 @- K( z, r* g( g
mov ax, [ebx-4]
+ x8 d2 v& d0 V! O mov [Entry], ax+ z. P2 c+ w; _* H0 V+ W$ `' O
( \1 q' k! z3 j6 H3 E- n! e( z& q cli
" ]/ n6 W6 u8 W6 W5 E! Z& B mov esi, dwExcept
# ?! E) A* w& P+ g# @ push esi
$ k' ^0 y0 |. g mov [ebx-4], si+ L9 w: ]2 M$ b2 U' k1 I
shr esi, 169 d" n4 f; o. D+ t8 u
mov [ebx+2], si
' c7 R+ }' I3 v- G8 n/ a pop esi4 t1 }, E0 O% ^# d J5 S$ V
sti, W3 _" \ [; d$ C# u K& H" J3 d
7 M: U: U: b" d& _
int 3
3 l1 J! g& D% e1 _+ L }" C" F/ F) {. v* r/ G( G% G
}& C5 I$ S2 ^. @3 Y
int main()( n% ]; }7 T: x) z& f
{) ?6 P C4 _! C) q7 T' w
char s[80];$ g" F% {( B0 D. d
register i,j;
j" L+ o6 z) ?2 {5 p% z3 Z3 c unsigned long id = 0 ;
S8 U/ g$ ?! D8 A0 m. G- ] K! r" z% o2 K9 y7 H# t
//特别注意:这段程序不能 Debug& o5 a. ?1 c1 O* x
for ( drive=0 ; drive<4 ; drive++ )
7 T% B4 F; ?7 f9 M {* z3 Y1 U/ [7 S
memset ( pw , 0 , 256*sizeof( WORD ) ) ;
3 O$ c6 Q( [6 g id = 0 ;3 a5 z1 D- B8 d# p( H# E
al = 0 ;2 `/ e+ I& _2 w1 i6 f2 J4 O( K
al1 = 0 ;6 f- G3 ~. W/ @# T
GetIDEInfo();
: [' o7 c% i$ G# E2 Z! c! Q! w8 R7 Y
for (i=0,j=0;i<10;i++)
$ R4 v, W8 V7 S! |4 b% k8 [ {
$ w" {% e3 ?7 v+ H9 a5 A s[j++]=(char)(pw[10+i]>>8);# [/ H2 A( p7 X& J0 D
s[j++]=(char)(pw[10+i]&0xFF);
4 C+ x6 P' g- ]4 d5 y; Y- n! O }
; C. {% s9 ^+ m& r; w s[j] = 0;5 U. Y* ~6 Q6 X5 g4 D; ~8 X
/ T# s8 d, W9 _// for (i=0;s;i++)printf("%d,",s);printf("\n");
/ P& p5 c8 p* n printf("Serial=%s\n", s);
! f* J3 e }* @' A# t# E7 {- _2 D7 g$ l, a& ^; O& A) {9 f+ r
for ( i=0 ; s ; i++ )
! Q% u) r0 ?- k3 K+ o) z+ e- w5 H { {
" e! q5 i. {& P$ O% @/ ]' {) G if ('-' == s || '/'==s || ' '==s) continue;7 `& [% N: n! u ?2 b. b
printf ( "%d," , s ) ;" D/ B; w: o, l& i3 P1 o' Q
id *= 40 ; //10 ;
- j% S ]. N2 h1 ?2 a7 _. Z switch (s)
5 T ~2 `0 A8 C% | O. H% _* [ o {
: ]% Y4 T4 G' H/ ]; N% w& N2 B case '0': id += 0; break;
7 n5 b" }7 s) n' F case '1': id += 1; break;
- I9 H; V* ]1 V; l; d. L1 X case '2': id += 2; break;
& o$ I, u# r- V4 b: S) D2 M case '3': id += 3; break;; F G! F3 @" i5 N; X) g
case '4': id += 4; break;
$ }# v2 x$ }4 x, S' r3 ? case '5': id += 5; break;" T L- m' o/ ^! k/ P2 E. G
case '6': id += 6; break;
& A( Q( T# g+ `# ~, b, T! k case '7': id += 7; break;# e. W( w! j6 ?5 h, a& Z2 C5 Q
case '8': id += 8; break;9 ? B k. p, {# J* K
case '9': id += 9; break;, f' C! H2 P" j6 k
case 'a': case 'A': id += 10; break;* ^% q/ i. K" Q8 e' A
case 'b': case 'B': id += 11; break;
6 h a$ l8 n( A$ g$ z z0 l case 'c': case 'C': id += 12; break;% C7 \2 L# J2 t H7 X
case 'd': case 'D': id += 13; break;
" C, H, P. b, z: n* i' a case 'e': case 'E': id += 14; break;
3 ~9 Q7 ]9 x6 [" c, J6 S. H case 'f': case 'F': id += 15; break;
7 S; B2 o* A6 G- d `7 G { case 'g': case 'G': id += 16; break;
8 n1 W9 N" N3 H$ k$ v7 z- W case 'h': case 'H': id += 17; break;; b9 [! n7 W h3 N( K
case 'i': case 'I': id += 18; break;
. s1 \: K* F: y e; D case 'j': case 'J': id += 19; break;, R8 n M0 U' `% f3 {8 n7 |+ r
case 'k': case 'K': id += 20; break;
: s% h' W& }# T$ f( {, q case 'l': case 'L': id += 21; break;4 k- @5 c, x; r& M3 @' H6 Z( U
case 'm': case 'M': id += 22; break;: @: x) {& ^/ j7 f
case 'n': case 'N': id += 23; break;+ O6 r \! s" z% ?4 w
case 'o': case 'O': id += 24; break;
8 q4 A+ O: }9 I0 V* q# Y- ` case 'p': case ';P': id += 25; break;8 q% B/ c8 W) S- [ M
case 'q': case 'Q': id += 26; break;
8 L! t) F" C9 X) c' j case 'r': case 'R': id += 27; break;; f" Y' @( m5 o( f% G" W
case 's': case 'S': id += 28; break;
5 L2 \ {+ {8 L. w case 't': case 'T': id += 29; break;
) |2 e# f9 l8 } U# d; c case 'u': case 'U': id += 30; break;. x. R6 V- I0 L% Q- l( c
case 'v': case 'V': id += 31; break;
) s' \1 ~1 e0 F5 k( h. P case 'w': case 'W': id += 32; break;
$ h$ v& i+ ^# {! R3 l case 'x': case 'X': id += 33; break;
* o( M# J, t: G case 'y': case 'Y': id += 34; break;3 s, y7 Y! o3 M0 `4 @
case 'z': case 'Z': id += 35; break;! Y$ }6 a& i" [/ I6 L( E4 x
default : id /= 40 ;5 z- R" b& A7 U
} B0 D& x+ D8 ]+ t0 L' Z
}
4 g* g. _1 v! h( k1 B; g b9 r$ e if (id > 268435455) id %= 268435456;
0 v( T W$ M) m _. [+ H) R' v' O' J+ f g, @3 A
// if ( al1 == 0x58 )4 N' Y% S' l/ }- r
printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;5 j6 i) w* p, D( ^* L8 H
}. Q. Q/ ~6 d4 y; X
getch () ;6 h6 H4 F6 D+ s4 d% L
return 0;
5 B7 k8 Q! r5 p% w2 W8 u4 u} |
|