找回密码
 注册
搜索
查看: 6284|回复: 0

在windows下怎么获得本机得硬盘序列号

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];' n$ V6 O' R8 o5 h& B5 b  |

* t  l% u4 x8 H/ t) ~static DWORD idt, int_idt;
" r  z9 H4 ~9 n+ Kstatic DWORD Base;1 x  l6 |. C0 {6 x$ t/ M4 M
static WORD Entry;
4 t5 ?. p% I( A, t1 ?
" m: e: t9 [! X& |" n#pragma warning (disable:4035)
/ H" `/ a6 |2 j/ `- i" b! bstatic int inp(WORD rdx)9 r3 F. I+ U+ N
{
1 X  @3 D. c8 a/ K+ @" p5 |. T   _asm xor eax, eax) c6 X' \# I' O$ J4 m2 K
   _asm mov dx, rdx2 V6 b) m2 X( L
   _asm in al, dx, Q0 O! b4 }- k; I$ g  W$ ?
}9 j: X) a& I5 d( t6 G1 v
8 Q' h$ r/ R/ H6 [% z& M
static WORD inpw(WORD rdx)
+ v( h) f7 T2 p{8 ?9 K3 b4 a6 M# z% M1 y
//    WORD retData ;
9 `' X; d; ~8 Y5 }1 a0 h4 f   _asm xor eax, eax# g& I, I' i8 m0 O  u! x
   _asm mov dx, rdx
2 T8 ~; r- @3 O/ C' q   _asm in ax, dx' I! t: _+ V, `1 F" V
//    _asm mov retData,ax* x( M. W3 H* [9 {" F( X1 ]
//    return retData ;
; q0 P! z3 u3 V3 j  l9 f}
" x& @+ `3 }4 M1 H
: [. S  t$ T, c) O% Sstatic void outp(WORD rdx, int ral)
& F5 r8 y, c1 {1 s4 d/ g{
, i# z( T& z* P1 L; `   _asm mov dx, rdx
7 k6 G+ Y' O5 A) W   _asm mov eax, ral9 c) y' G2 `8 \# V/ X
   _asm out dx, al- [( }0 @! E' h9 e
}3 D% H8 e& `6 y, V3 I
/****************************************************************************/
+ G' u% }$ f' l% F" {6 |) C. _- xWORD baseAddress;
0 x! W8 @4 a% ]: k3 |" xint drive = 0 ;
* F# g# q. J  t! `5 u% zint al ;, b; ]# |: W& m4 C
int al1 ;& ^0 y) f# d. g6 C' a7 S6 l' `8 `
/****************************************************************************/
, h5 X' l) Z( w2 l% X( X* t+ S* Gstatic int WaitIde()
' {- f; A; s( [* [( Y{- s: E( K; N9 A& F/ S, `/ f
   int al;
" O, ^5 e* e! q   al =  0x80 ;
: x  _- h# [# l$ t1 K2 b+ g6 b7 }2 C) y( B
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
0 b1 l% v1 k) ]1 R
( N' g5 K) |" G   return al;: a9 H! O5 m2 [' U) ~, \$ i
}
6 l' D6 e% X! k% a# J6 H/****************************************************************************/
5 X% `) ?  n- q- I& Jstatic void ReadIDE()
- H) W: O! U5 X% ^2 ~; P{
+ W0 H+ G2 C7 x1 v   int i;
; ?! ?# j) L& r& X   switch (drive / 2)
% u8 n& O" J/ |   {
9 V: f$ f6 J7 l# I       case 0: baseAddress = 0x1f0; break;- V6 a& u6 U" i& Z# b
       case 1: baseAddress = 0x170; break;
9 \" _( f2 u5 Q0 {3 A4 r. I5 X       case 2: baseAddress = 0x1e8; break;; Y# C' ^* S7 q0 m6 |) v
       case 3: baseAddress = 0x168; break;# Z  k3 R1 ?( B) W% b9 k$ r
   }
. ]4 p+ A0 G; W: X; E* b: {* n# U1 l. P0 j- O
   WaitIde();1 m4 p$ b+ T, z" l# i( a" d* G+ a
   outp((WORD)(baseAddress+6),0xA0);5 W9 N( K4 A4 g! L5 m
   al = WaitIde();
- i2 j  U9 c, _9 M
# B- c! N& s9 |   if ( 0==(drive%2) && (al&0x50)!=0x50) return;
! L& J) W- `2 i- i# `+ m   if ( 1==(drive%2) && (al&0x20)!=0x20) return;
  C! {" J9 L5 x3 z" o9 W8 a
5 a, T9 B. x  g: [. s1 n6 H. Q   if ( 0==(drive%2) )& ~5 q' N6 V! R
       outp((WORD)(baseAddress+6),0xA0);
: ]1 e! p8 ^2 j& b8 k4 Q9 C5 ?4 ?# ?   else, O5 r( e' b% t3 E4 d
       outp((WORD)(baseAddress+6),0xB0);; T7 O/ i( W8 M! u5 {7 B

. `4 A$ X6 t* t: ^: L" ]8 ^   outp((WORD)(baseAddress+7),0xEC);
: o8 F3 j9 ?! y5 v5 \   al1 = WaitIde();: Y" P0 m2 p5 A: k0 h4 g. T
   if ((al1&0x58)!=0x58) return ;/ V% B$ K  P9 C0 ^) l

) J. y* V  W* P" p/ C) Q/ p4 Z/ G) F. f# |   for (i=0;i<256;i++)
) A% I/ U& v7 h; q   {! V: s2 L3 {/ `2 p
       pw = inpw(baseAddress);
  t+ ~' E& R% K6 s: Y   }
0 n; ^$ O, |# g8 {* S( F* }5 Y}2 ^9 F: j+ u5 }9 b3 M& w4 v! [

, b) w- Q: o! X! |* K) P1 istatic void __declspec( naked ) NowInRing0()
) V1 }* |/ |% U. Z, y; V{9 |* e$ O) m5 V: _! e
   _asm8 _  x: s; g3 K% C+ k
   {
: V8 v. Q' g' E  `5 ^% B* L       push ebp0 p1 X$ \* Z/ u, s
       mov ebp,esp$ K! R) f0 G% y

* |& E  r  M+ w* u7 l3 A8 G       call ReadIDE
+ k) B8 T" L2 {. I2 c: Y3 ?       cli
% V7 t9 o1 t- @, `       mov ebx, int_idt* c2 \' k5 S' v% k5 B: g+ f
       mov ax, Entry0 S) W+ n4 t; g' g9 B* C1 ~9 L( ~
       mov word ptr [ebx-4], ax
4 n2 y6 T8 i' v+ K0 X; D4 n2 q       mov eax, Base
% O- {. n- u1 e$ ^# S: b3 W       shr eax, 16' f7 v7 R1 b1 @9 v8 g8 }& C
       mov [ebx+2], ax
8 B3 Y7 I" v7 {7 Z0 R6 ^0 ~  P       sti
( Y+ y9 Q# Y% i  K4 A; G' T9 D       leave
# T7 ^" {' Z# L1 T$ M& P       iretd
- \6 }* t/ t- ?2 z: k, W8 h- R; R   }3 |& h( k- p$ V
}! z' P6 G7 n3 H! f3 e* o6 d3 p( a8 i
9 N" j, ^+ I7 W+ v1 m0 l4 f
void GetIDEInfo()- S  F/ t' x% a/ _- n; X. W$ e
{3 ~7 G- G9 _( U8 y2 s9 F
   DWORD dwExcept;0 T* s7 L" H% z) m: l0 E" \! r4 Z
0 N- {8 q* o. j+ p
   dwExcept = (DWORD)NowInRing0;
) j* Z7 P; Q- A& r) q# d/ {
, M2 \/ a& R2 C6 E$ a6 J   _asm- E2 s& H4 G  B, e3 Z
   {
3 H+ f! p& E2 _( t  Z; K       mov eax, fs:[0]; a6 k; R- v+ x0 I# b6 d
       push eax
# ~0 h0 ]/ C  a       sidt [esp-02h]0 o8 D; Q8 n- F  o' b1 ]
       pop ebx2 s4 ~1 M) V: R/ Z- @
       mov idt, ebx
) G+ K1 n' O( R+ _       add ebx, 0x1C
7 T/ n6 ^; _: N9 q* u       mov int_idt, ebx
& x; V: Y# T/ B3 d4 e+ D& ]) D  z
0 X5 x9 ~0 H' Q. ~& g. ~) @% o       mov eax, [ebx]" f) e: u$ q9 g2 c$ _# N- Z
       mov [Base], eax  \# J; W- O- k) x1 b
       mov ax, [ebx-4]
5 J2 S. ?, J# u/ V       mov [Entry], ax$ @5 I- O9 B2 I& Y/ u+ ]& k/ n! Y4 F

5 w' `- V- W7 E$ M2 P; l4 R       cli# y: c5 O3 d+ D' l3 H  g
       mov esi, dwExcept2 t8 R# m' y. p4 i$ C  _
       push esi
; H/ @9 n3 m) M/ \& e+ a9 W       mov [ebx-4], si
6 q# A& |2 Q( q: `6 N9 f/ W       shr esi, 16
& C0 O" t' m1 r/ h: W       mov [ebx+2], si
. W5 z, j+ o9 q       pop esi
* \% M# s2 K8 C% q8 I( A4 Q: X% w       sti! }6 Y( [! E0 Q, p: r# Z  w/ X
& ?$ G- x) `: @* n# b4 ]) w* `. x& _
       int 3# M3 h; \7 ~) p" M3 f
   }
. j) _6 P' s% Y( @6 S}
0 B" Q, e& N4 u6 S( u4 s6 r6 Dint main()
: H- m' R1 }" L% \1 |$ v{
9 r9 {3 h( W2 a* {3 B" Y5 A   char s[80];$ E; U" A+ r' T( ~2 b- b8 U/ j
   register i,j;
  n' ^8 `" J% g+ [- U! L2 b& e1 E   unsigned long id = 0 ;2 M( ~7 b3 x0 d' M4 i

+ J- V0 P4 }1 w& H: G2 ]" `0 d: w//特别注意:这段程序不能 Debug" F5 f" S  I$ [* O$ B$ n
   for ( drive=0 ; drive<4 ; drive++ )* i4 H- s' l5 |8 d
   {
8 T0 e* I: C8 ]: g# Q2 ?       memset ( pw , 0 , 256*sizeof( WORD ) ) ;, y2 ^* u  U2 ?2 G$ H$ F9 \) V
       id = 0 ;
: k: l& i  r/ V$ F, Y# v0 g       al = 0 ;$ k) c7 X7 c4 r/ A" }+ E  _' l
       al1 = 0 ;
! {1 W1 f1 Z& W" f2 i7 o( Q2 A       GetIDEInfo();# g4 Q4 I: g& u& ~$ o$ r+ d% }

6 M  z( l3 G2 z. p1 u) r% |' b       for (i=0,j=0;i<10;i++)
" S+ c8 L: x9 W# l+ A( Q       {
, f, d; d. s- C4 u4 f           s[j++]=(char)(pw[10+i]>>8);. f. ~" M2 ^$ \* a
           s[j++]=(char)(pw[10+i]&0xFF);
3 R" O$ t% [6 A0 I1 ^; H6 U       }
5 y& t2 D! N4 ~7 l       s[j] = 0;  r2 N$ `) T$ w; h/ _

* @7 J+ B6 ~( e, j9 R: n- M; h2 |//        for (i=0;s;i++)printf("%d,",s);printf("\n");
9 U6 \: X4 _4 ~0 q0 E& B( Y9 h) v) q       printf("Serial=%s\n", s);
8 A3 l9 x& U  p  E  [! |" _3 t, ]; i5 N+ a* _9 ~5 w: ]7 [
       for ( i=0 ; s ; i++ )
9 M) f: |7 r$ K  g3 _       {/ E1 n: V. k+ S3 C- @2 c
           if ('-' == s || '/'==s || ' '==s) continue;
; V3 }4 {$ Y5 N           printf ( "%d," , s ) ;
6 w. O+ y) i2 d' f% T) ~           id *= 40 ;        //10 ;
$ H  ?# [$ Y) h. H4 z           switch (s)1 d! l( u) p5 i. l# s$ X
           {
/ x. @- x  r0 {) O) d5 \) R! S               case '0': id += 0; break;
* a2 g' |0 ^' h' C. x0 _               case '1': id += 1; break;3 l) k( i% S  D/ t7 e
               case '2': id += 2; break;4 u; i% |+ `9 _
               case '3': id += 3; break;
! f* d/ @0 H0 H, d0 A               case '4': id += 4; break;7 z1 r* S; W9 d0 O: z7 }2 d/ n
               case '5': id += 5; break;
: n9 I8 b, y" K) a; y               case '6': id += 6; break;: w. L& A6 d8 z8 J# F( f0 O
               case '7': id += 7; break;
% v4 L1 F8 X! {( e3 d$ d               case '8': id += 8; break;; i' O* N: \, _4 m: g) z
               case '9': id += 9; break;, D1 R' i3 T! F( d7 t" B* Y/ D
               case 'a': case 'A': id += 10; break;9 I4 t! N+ O! b
               case 'b': case 'B': id += 11; break;
- \$ V5 F& N8 i: j  }& j               case 'c': case 'C': id += 12; break;
* Y7 J5 Z# x7 N9 w               case 'd': case 'D': id += 13; break;+ D# Z9 J" Q, y% z  ?/ l
               case 'e': case 'E': id += 14; break;# x2 ^/ [. e- r) e$ P/ `
               case 'f': case 'F': id += 15; break;7 j' Q/ T$ x' R& h5 g: K6 V  `
               case 'g': case 'G': id += 16; break;
2 ~5 P& Q# ~2 r: T" ~               case 'h': case 'H': id += 17; break;! J/ [; w2 n7 `% c% }. O1 x  W
               case 'i': case 'I': id += 18; break;, }1 H. D& }' g; P- e
               case 'j': case 'J': id += 19; break;7 O0 s/ L- P  T' R+ W0 F  Y" I! q& _# G
               case 'k': case 'K': id += 20; break;9 x0 x! k$ v3 D% F/ w7 Q
               case 'l': case 'L': id += 21; break;/ X+ `3 b* r( K7 U& ]% y4 `7 w- Z
               case 'm': case 'M': id += 22; break;$ R, ]  M, d: D% R. B% O6 B
               case 'n': case 'N': id += 23; break;4 J5 n, ]* m) g0 m: `  c
               case 'o': case 'O': id += 24; break;
2 m! d  X2 I) d2 z9 r7 }# _               case 'p': case ';P': id += 25; break;8 B) {" n' d$ W+ Y
               case 'q': case 'Q': id += 26; break;0 p. P1 o: V+ Y% {  U' V
               case 'r': case 'R': id += 27; break;" P; X! Q' q# a6 Q3 Q
               case 's': case 'S': id += 28; break;
7 d9 j. D2 b" J7 K' U$ g+ {0 K               case 't': case 'T': id += 29; break;4 r% O& X7 k; ]& C, @
               case 'u': case 'U': id += 30; break;
) ~; m& }' H6 b5 D6 u               case 'v': case 'V': id += 31; break;& U" j" N/ f2 \0 c" T' o- o( n4 r
               case 'w': case 'W': id += 32; break;% b: r( T. X( X; H  {% V/ G
               case 'x': case 'X': id += 33; break;  p5 k- G' Q4 M, P2 K6 ^4 j0 u
               case 'y': case 'Y': id += 34; break;4 Z1 C1 ?/ [  m  i) N- F3 A9 A
               case 'z': case 'Z': id += 35; break;
+ \# _5 F, l% M- {6 C, |% f               default : id /= 40 ;" ?- `- ~4 V  H4 _, v+ z
           }
' @+ S, \1 M0 w* m$ M& ^9 B       }3 R7 Q; j" Q6 e1 q5 O4 s+ Q  ^2 \
       if (id > 268435455) id %= 268435456;9 n1 y& c" ^) f, ^* E

- ~' q5 @. p+ P2 j- H$ F& _//        if ( al1 == 0x58 )
# w5 V% r1 A# L4 p( f           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;+ e2 G7 p0 T) H* n
   }+ m0 D9 }* ~0 i8 }5 J7 a
   getch () ;
* ^3 z0 M( |0 b+ I& z" F$ G   return 0;
: w( u2 l/ J- x1 v$ T( J3 F5 ^}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-13 22:41 , Processed in 0.019578 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表