找回密码
 注册
查看: 6321|回复: 0

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];2 m: g4 R3 X4 w9 K8 v
1 j6 x* X: ~0 N
static DWORD idt, int_idt;
' t( r  l4 ?1 J' Pstatic DWORD Base;
( R9 c: `% E4 |/ b' G7 t* ^, {static WORD Entry;
" O9 `6 i5 L5 V1 W) A" i$ s' D8 V* e- d
#pragma warning (disable:4035)
# P! }% _" |7 a6 ^, Q4 @' L% j5 Astatic int inp(WORD rdx)0 Z4 J" K6 |+ S" @: P6 o+ S( P, I9 ^' h
{
! I" Z, v2 n; y5 H0 \& n4 j   _asm xor eax, eax+ h# z, Y8 R% [9 C3 j8 y
   _asm mov dx, rdx
! @$ h; l$ u+ L3 z7 l" [5 A   _asm in al, dx7 `8 Q$ v9 h9 P# I
}$ A% R0 _$ m) b0 P* N/ |
, g; r9 [) f" A/ G/ X
static WORD inpw(WORD rdx). U/ s) X, r, f! q8 F
{' e: h1 y: B+ r/ `! T, u, o
//    WORD retData ;
8 O* M6 ?2 ~6 c- |3 E% q   _asm xor eax, eax
& V( L0 \( U6 a; k  v; b  @   _asm mov dx, rdx
/ P1 z& P% F$ V   _asm in ax, dx4 m! s0 T6 Y2 o9 p1 P  N- n7 G
//    _asm mov retData,ax
9 B5 l% i! T* K# {' h( {6 V) ^7 h//    return retData ;: g7 E! F, y8 `: r7 H& X* k9 o
}7 D# g' D: f, A7 o: |

, \* e9 e0 w' L+ u- t1 O! nstatic void outp(WORD rdx, int ral)- Y/ e/ l9 A7 h* H3 E
{
  g5 W- ^9 \3 }2 P   _asm mov dx, rdx  h% r* [) s3 P' H' Q
   _asm mov eax, ral
8 y+ }7 \  l/ t5 h, F   _asm out dx, al* h" e) a9 @( V* F/ ?( }* {
}) y- u8 `7 O' O  J" x, d
/****************************************************************************/: O0 f  F9 ?/ e) d9 F
WORD baseAddress;; M" _* l2 T8 l/ J. V; v9 W
int drive = 0 ;& h4 i$ G3 O; @; l8 f. i/ B6 h0 W
int al ;& {. x6 b( Q4 V# v0 u
int al1 ;$ S# N; d/ E1 y( {. @  ~# r
/****************************************************************************/
5 k6 p- S. n- d. ostatic int WaitIde()# Y, u* \1 F) i) I/ G
{& s* {- M/ d! E0 N) M& w! r3 B
   int al;
# e: U1 u4 I% e   al =  0x80 ;
+ Q2 p0 t' v* v: E) ^! x, ~+ b' L0 H
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;) p! K/ t4 X6 M! Y

2 Q8 @: ^: M% S& [   return al;
! a& q3 F3 Y: J( ]}
; }1 n: I: S/ x" M2 m/****************************************************************************/& v0 k; M5 V! \7 {$ z/ B
static void ReadIDE()2 [5 g) X' j  R$ c4 w. U" s! b% l# A
{
5 {3 R/ C. k' X; s% I7 h4 h   int i;6 m. v  ~: D( l! C
   switch (drive / 2)" O5 B* w- W8 d+ k& G1 l
   {8 n: }6 T' _# \
       case 0: baseAddress = 0x1f0; break;, r, \1 w) [( ~7 j3 t4 f! h8 o
       case 1: baseAddress = 0x170; break;
" U0 a3 v. ]+ F% o% L' L: G- i       case 2: baseAddress = 0x1e8; break;
& V/ [  o2 C& H1 }8 L5 Y0 g& G, a( c       case 3: baseAddress = 0x168; break;/ W; ?4 I2 c' ?' P$ S
   }
+ w% |! T. A, Y! m7 O& ^9 a1 d9 M; F  H+ `2 o8 R
   WaitIde();( D) O( u. K: x) o2 \
   outp((WORD)(baseAddress+6),0xA0);4 n' W6 @$ T2 M9 X$ s" c
   al = WaitIde();4 H1 Y% P( I# X
' \7 a" t/ \. `0 u4 r% ]& O
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;
) F# s3 ?) _  ]   if ( 1==(drive%2) && (al&0x20)!=0x20) return;6 W  g1 x% x5 N% q' n

+ G; Y6 X6 C$ k  |( f   if ( 0==(drive%2) )* o: Q5 ^' p$ b2 F
       outp((WORD)(baseAddress+6),0xA0);
* J' @/ U! i* V+ D, o   else% l2 P; J1 r9 P  R' ]( J5 w
       outp((WORD)(baseAddress+6),0xB0);- E5 X/ h6 ?5 w5 A# b0 ~) S( [& j. m

0 E& b* o4 N( B) d' F2 v5 u$ S   outp((WORD)(baseAddress+7),0xEC);2 t9 O6 o- x8 f, f9 ]/ j5 t
   al1 = WaitIde();% W3 l" l: D+ L$ V- J
   if ((al1&0x58)!=0x58) return ;
6 u0 a  k1 r+ r% o9 O' Z# d8 W
6 c. I* C  U* i6 Z! n   for (i=0;i<256;i++)3 Z; |7 k7 K/ L6 j
   {$ _" d  n. M7 Y/ Z3 S: u
       pw = inpw(baseAddress);5 S* T7 T! O* Q) a7 }5 o
   }
8 l* N, a! W  W}
' w4 h) T' E% l7 p/ @1 u- W' L# p, D
1 F! r% F; n! @static void __declspec( naked ) NowInRing0()
9 }* S- X: J9 X: f+ H- w{
6 r* Q% G$ H" ?2 x6 [3 R$ s   _asm0 i# ], [5 y) F8 l. J7 o4 ]6 y7 V
   {% ~/ B6 B6 E; Y$ p  I
       push ebp$ X, y) i, W( ~+ g3 P# F
       mov ebp,esp
7 m' i, R/ o; O& Y0 D! N/ `$ z1 Q7 j* q1 w. d6 P1 H
       call ReadIDE
! {. f, s5 b% L" A       cli% u9 Z6 }8 u+ ]: \5 I
       mov ebx, int_idt) {6 }/ b) a. v4 _* [1 e
       mov ax, Entry$ V7 T  ]! K# \3 [- x9 _
       mov word ptr [ebx-4], ax
( e: `9 ^+ m: m# V  J# s5 H       mov eax, Base
3 X! D2 ^" ], i! ?# |       shr eax, 16+ Z( w3 B$ y0 x9 W* c
       mov [ebx+2], ax
# g* e4 w, e5 O' I6 D       sti0 ?- n2 ]! O" a
       leave) T- {2 J, @$ X/ `% K' m
       iretd" \* @7 S3 |5 D( y( J5 w
   }
: q5 F- a+ V& V9 p, R% Y. K}6 ^' \/ I. ^$ L
7 ^. R1 W8 W# N2 S
void GetIDEInfo()
  S4 F& [! N; r8 W$ ?+ z' E{
( k7 D- _' \) w   DWORD dwExcept;
' ~9 @: `& j! Q1 h) M/ h* ~& r
   dwExcept = (DWORD)NowInRing0;. F) k- G/ a& m+ y( O' T
2 ^* f5 g0 N# h! M3 B. y
   _asm
) y% Q! _( l/ s, s! K- G   {8 t5 H$ k3 ]- ^$ g0 X
       mov eax, fs:[0]0 K4 z, P, a" K/ }5 K: j
       push eax$ I5 M6 O) v4 u# [
       sidt [esp-02h]7 U) h2 Q$ C: n6 _/ e9 ]7 {9 U
       pop ebx
% _1 t$ d5 `3 T" R: Z       mov idt, ebx. Z7 f- k5 T6 ~6 u
       add ebx, 0x1C% E: O, R! U% F
       mov int_idt, ebx
" [- [3 x6 E) p; [+ Q0 F$ b9 q+ ?' U
       mov eax, [ebx]
6 }& i' {/ p/ p+ d0 l+ f1 e       mov [Base], eax! Y0 G! `: z4 z3 T- G3 g: l
       mov ax, [ebx-4]
0 `' I( v' ~/ p/ h; Z% A: u       mov [Entry], ax
, E, O" u* C' c! M% x) l  {: y9 h. n* G# o* u
       cli
2 h& h4 d' ^. W       mov esi, dwExcept- i* ]9 }! n! b; s: C! |# D6 E
       push esi$ d( K  B( K. i3 s4 Q1 K
       mov [ebx-4], si
  W& t( ^' f; U       shr esi, 16
' f* y* E0 C3 r% s# C( l5 B       mov [ebx+2], si
4 D- D  z9 X5 S2 \& O" W( N7 E( s3 Q       pop esi; k  b& V6 v- t2 O7 H
       sti3 P. t3 z, E' Y' w# T2 B$ Y+ F
3 Z' x3 T. z+ }  q0 ^5 i9 e7 v
       int 3
: O9 l9 ?5 H% e1 P& p- ~0 s- }   }
  s4 r) q9 x2 l* ~}
1 ~( m' V% Q8 e' \, iint main()
5 I7 W3 \% m' T! W8 M6 \{
" X, L4 L- L$ L# ^, v8 _; _   char s[80];
8 ~  n9 f, p  ?. `3 v$ x   register i,j;- z1 p- B  W( o- W; k
   unsigned long id = 0 ;
5 S) F1 z" c+ f3 _" w- X  ]# F/ N, R1 e7 z
//特别注意:这段程序不能 Debug1 J$ ^; L' r% v- L
   for ( drive=0 ; drive<4 ; drive++ )+ D/ C5 w* U3 G' t8 A( V
   {3 Q" b/ U( X6 i$ g0 a" W# e: i3 n
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;0 a7 o6 Z/ I: ^! ^( y" v
       id = 0 ;
1 @6 s  E! b, |' g0 q, t; P& X( v3 g; w       al = 0 ;! z* k, N2 H, P* s
       al1 = 0 ;* `: R: |( S8 W$ d6 d
       GetIDEInfo();, s; |$ x1 O! S. L, s5 ]/ i

8 w6 k( U! V+ I# o& C5 w$ I5 r       for (i=0,j=0;i<10;i++)
" g/ L; ^1 R6 }/ @  c       {# u" O# J: d' C
           s[j++]=(char)(pw[10+i]>>8);3 H# I0 m# e  B2 p3 Y, v1 J& b0 g
           s[j++]=(char)(pw[10+i]&0xFF);
: G" C# w: G) @! E; T& O2 w6 f       }% m. v) L1 j- p
       s[j] = 0;" C: |& k/ L' L4 k

$ w/ f" o) S7 p# c0 n//        for (i=0;s;i++)printf("%d,",s);printf("\n");+ L6 A# B1 n4 e6 F# U
       printf("Serial=%s\n", s);
$ b$ V" q: u8 j: i
+ ?# Q5 X+ u* z, z! T4 n       for ( i=0 ; s ; i++ )
0 j( A1 E/ R+ }2 }1 J& Y7 m       {, G5 r5 g/ r5 p& X
           if ('-' == s || '/'==s || ' '==s) continue;  ~/ Q+ Q. p* n  R8 C) l
           printf ( "%d," , s ) ;
  K" `5 f# R, S; x% N+ N& s           id *= 40 ;        //10 ;
. D! ?, j- F, W% w: ^           switch (s)  l- n# v0 N- z2 ^4 s1 [& T  v- Y
           {
  Z9 j" z  Z8 i) f               case '0': id += 0; break;
/ ?- v  y) B' q               case '1': id += 1; break;0 R5 n$ A7 G1 s2 g0 k) C  W
               case '2': id += 2; break;
  k7 }/ S' v4 {               case '3': id += 3; break;
) K3 j. x5 D  F1 A; R, I  c/ x4 o8 q               case '4': id += 4; break;9 s- G* @& g9 m! \+ C3 J
               case '5': id += 5; break;, |3 M; h+ ?& P  l' D  t1 S
               case '6': id += 6; break;
8 K1 i" [$ g+ c+ F# c) ~& G               case '7': id += 7; break;  ]9 b9 }$ H5 p8 b) H& @  U6 U
               case '8': id += 8; break;
3 @2 ?9 j9 p# C* u* Y, p' ^               case '9': id += 9; break;9 f2 j# |! h6 |: t( ?# n" G) k' _
               case 'a': case 'A': id += 10; break;/ y& ?3 m+ i* ?: y3 D
               case 'b': case 'B': id += 11; break;
( B' J0 s- h% _# q! t) x" z& s               case 'c': case 'C': id += 12; break;
# g& ]+ M+ l& H7 b0 h* o% V7 o8 v               case 'd': case 'D': id += 13; break;
4 L) A6 l: l: B$ M+ g               case 'e': case 'E': id += 14; break;
0 T0 T( J5 t8 o& k5 @9 H               case 'f': case 'F': id += 15; break;
  v- n/ f5 F+ W' P: q               case 'g': case 'G': id += 16; break;
' K: N; k, o$ c4 t. ^2 v) \               case 'h': case 'H': id += 17; break;8 g0 Y6 M0 j$ n  U; b. Q
               case 'i': case 'I': id += 18; break;
7 F" z, K7 o+ M) ^  f4 D               case 'j': case 'J': id += 19; break;2 u5 {; O5 p! f" F
               case 'k': case 'K': id += 20; break;
3 F' \9 Z! P. Z& E  R7 j6 u" i               case 'l': case 'L': id += 21; break;* o$ y+ Q% Z$ J1 K' ~
               case 'm': case 'M': id += 22; break;/ i; B! K, }: z3 U
               case 'n': case 'N': id += 23; break;
) j2 a! Z" b- {* ~( i" x+ {& P: X               case 'o': case 'O': id += 24; break;4 p$ b! Q9 ?7 i2 R: }3 A2 _1 g( v0 c
               case 'p': case ';P': id += 25; break;
+ D( b  c4 U1 l& ~               case 'q': case 'Q': id += 26; break;. ~: w/ r4 M. \; B/ u, C
               case 'r': case 'R': id += 27; break;4 e( _9 t2 x, l: N1 l2 {: u* D( ]6 A
               case 's': case 'S': id += 28; break;
0 e' b# _" G' l4 v; g               case 't': case 'T': id += 29; break;
% c1 k% C8 K  e- F               case 'u': case 'U': id += 30; break;2 i  o! X: z" E4 j  x
               case 'v': case 'V': id += 31; break;
! o3 o1 w, P% }' U. [: k               case 'w': case 'W': id += 32; break;
* {- W; Q! Y" e/ |# U4 p               case 'x': case 'X': id += 33; break;" h& r) R$ w1 N. s5 u; d& J
               case 'y': case 'Y': id += 34; break;
) m' {. F$ `# h) ^# H               case 'z': case 'Z': id += 35; break;) }1 }0 m$ w8 \* @6 y2 k: h& d! j
               default : id /= 40 ;+ n$ D$ Y8 s/ P! W9 d1 {
           }. T8 l; o& ?9 J# P8 c1 \
       }& t0 y6 i, O6 [; a7 y9 h
       if (id > 268435455) id %= 268435456;
7 c2 w( Z# ], i3 D/ g" L4 k
6 M1 B, R) r7 h4 q' C//        if ( al1 == 0x58 )
( J% i6 T* {& f6 |3 b# ?8 t4 q" G           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
5 }* m: g& p0 h! Q   }
3 e/ L. [  q) L: T, Z, ]   getch () ;2 x! ?7 U! F( X# a9 V* g" N/ @
   return 0;
; e, w5 \- Z' \6 c  l}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 05:02 , Processed in 0.016263 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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