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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];: X- ~* @6 S+ k- B$ B6 z! Z

" d$ g) d$ a, P2 tstatic DWORD idt, int_idt;
3 c' ^6 ~* b$ h# c8 r+ }0 x2 R8 mstatic DWORD Base;. Y" j* w+ J; H5 v8 z) k, A
static WORD Entry;
; ~) j" @6 W% K% L6 p
: T, c1 G2 K; O2 X4 z1 k4 U#pragma warning (disable:4035)
; g+ X  K/ E( v$ D# f% f; |; ustatic int inp(WORD rdx)
$ y8 m% B7 \6 g; d7 f{
. u0 e' i+ A$ p$ M; r   _asm xor eax, eax6 H5 n* C+ t5 M, o8 O
   _asm mov dx, rdx* m' i3 K; d+ {9 s8 y7 ]
   _asm in al, dx
5 m9 P. j$ k; }: l, h}& i, L, d8 V$ b7 L5 B4 C- Y
8 u" c* s  n# ?* s* Q  P
static WORD inpw(WORD rdx)* j% V- X! c! E) |- p
{
. |: p; q. a0 g; n: F2 _//    WORD retData ;' x. X' R1 _1 W6 h+ n
   _asm xor eax, eax
! l7 h/ W7 [0 \% L# p0 T   _asm mov dx, rdx
- Q9 U) _# b" {% K* s3 u% k6 [. R   _asm in ax, dx
7 n* k4 P+ P" N7 s; G//    _asm mov retData,ax
" w. c+ T+ O! [( }2 j2 H3 z6 J" P//    return retData ;: D+ s) W) w3 L6 Q# s3 E# C
}+ N1 P* G4 }: h8 n5 k
7 L8 z" n- S% l8 S/ x
static void outp(WORD rdx, int ral)
1 j( \' {4 A/ o/ D  H! T{2 S% R5 t7 h7 Q
   _asm mov dx, rdx
  }; I+ z+ {# b   _asm mov eax, ral
0 U3 i2 H, y- H+ I, D9 D0 y   _asm out dx, al9 t! k- f* f' r( f6 |* O0 ?2 F
}! x$ Q. n  A% P5 L* b  V
/****************************************************************************/
  u; k+ A: @' p+ u: L- t5 XWORD baseAddress;
/ n: E" L4 i' E) P) \. d# T9 rint drive = 0 ;
/ t+ a7 g! r6 m  G: nint al ;
+ t% ^/ I; W6 t! W5 R; oint al1 ;
  K  F2 M8 m* D) ]3 A) u/****************************************************************************/
0 z. ^' ~7 u, K/ Y7 gstatic int WaitIde()
- I  A# ]" O4 Y" I0 X{
' ]* w! k5 e9 J# j5 Y   int al;" P( U3 ]: ^4 j! w& e' j+ K: _3 [" s6 {
   al =  0x80 ;: Z# V* Y7 M% \. j
: ~, m5 m# b" B, U% S; B
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;6 K) u- A- S2 {( |! F  ?

+ X2 {4 `. @" g& o. j   return al;
/ P9 K: J% {, ^8 p# W+ C! D}0 r/ b, a. E- ~6 r% G) @
/****************************************************************************/8 N  {+ v5 ^% |3 h& E
static void ReadIDE()
9 J( Q3 Q4 L" F  h% F) `6 \3 N{2 @- v5 ?/ k/ A2 o
   int i;# r  p! ^1 a5 `1 P& P
   switch (drive / 2): D! f5 b$ t  }/ I% j
   {5 q5 N. Q) S/ X, C$ L! T. _
       case 0: baseAddress = 0x1f0; break;
( |" L4 I5 `! l# `8 ]1 r( f3 i( z       case 1: baseAddress = 0x170; break;! [! R1 K' ^; {3 D: ?
       case 2: baseAddress = 0x1e8; break;
" L0 ]: ^$ Y3 U/ _& e5 g: m       case 3: baseAddress = 0x168; break;
- `: g% S" M2 ?5 L   }
" t5 l* Q. X1 v& K  h
+ P3 n0 W: M% ?3 G- }   WaitIde();
! W1 Z' H2 ]- X# L   outp((WORD)(baseAddress+6),0xA0);: Y9 t& v6 `* u- c+ B  ~
   al = WaitIde();
9 q* ~; b! F5 N- a/ z* P& ]; U
$ z8 n6 G/ u- y( O   if ( 0==(drive%2) && (al&0x50)!=0x50) return;0 V0 t( |% ]$ C% K- C
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;; q* @' M& [- \4 y
: ~" u( G, h/ S* [7 b6 ~2 [9 k
   if ( 0==(drive%2) )- p! k8 i- }$ J0 k& q
       outp((WORD)(baseAddress+6),0xA0);5 j# }" _5 N- m1 b5 I: d. r) d
   else8 I4 t- J3 S) G$ A2 i/ q& A
       outp((WORD)(baseAddress+6),0xB0);
" X- W' j! D+ w" X5 \' E" z4 m, ]3 c: ?4 t
   outp((WORD)(baseAddress+7),0xEC);
7 V( R7 l1 b1 n0 K8 _) ~   al1 = WaitIde();) i- H1 Y( G4 x0 _
   if ((al1&0x58)!=0x58) return ;
1 a- L! M4 H  {% V  T$ R+ ?4 M) C$ y% ]5 g. b' H. L
   for (i=0;i<256;i++)
9 h: n6 p1 K: u3 |+ @   {- u7 \+ V( }$ r+ A
       pw = inpw(baseAddress);
  z! Z' a0 n2 I  h5 l; f   }
  E. _0 H  R$ T1 P2 R* t}
5 U& P% M2 n$ r7 y" ]5 M0 }7 _
: y# L2 X" a5 i6 c6 Hstatic void __declspec( naked ) NowInRing0()
- @) O' {# e  V{
# d. B* X% D2 Q" r% B3 m% n  r7 U7 `   _asm
$ Q( W: ~/ u$ ~7 w' y, U* {   {
6 w3 s6 F' A# U       push ebp; V: U+ a3 o  }( y& z! F9 L5 @
       mov ebp,esp1 S+ o4 ?, X& }; s2 Z  \3 l
% Q2 X5 p6 |) c+ l9 z
       call ReadIDE+ S( W7 f1 n+ k! U$ B$ t) T! B
       cli
8 ?( `0 }: c/ X- W- y       mov ebx, int_idt
$ R7 b3 g- {% f       mov ax, Entry# L' e+ K" {9 H+ m% l0 k/ p6 K3 E( |
       mov word ptr [ebx-4], ax! N3 Y4 k- U9 P* B
       mov eax, Base
; @! w! i3 s/ D7 R/ o  G: G       shr eax, 16! d9 l9 `: S5 m% U
       mov [ebx+2], ax; S7 G* Y! A, c4 f% {* l5 s3 `: g
       sti: U6 v1 Y4 y; C7 v( x
       leave
# o  c& [( t" J( E5 r8 v2 u       iretd5 ~% O  T! N  w% n
   }
4 [, d  z2 Y: B0 [* `}
5 o9 l. V% G) F5 H4 p, y0 x5 G; F. l' U4 G0 t
void GetIDEInfo()( M4 }2 ]* ]- s/ @* c( x
{
4 L, p) p* [6 e# ~6 }5 M6 W9 g5 b% ?+ `   DWORD dwExcept;2 b5 S/ q2 K5 Z, d( z5 L6 O

( K. c) z% h1 ^1 ]1 C0 {   dwExcept = (DWORD)NowInRing0;
, s) R8 f$ Q6 ]5 m2 n5 _! e7 A4 q( Y. v  _0 `5 R+ z
   _asm
1 w- P; W$ Z' A0 U9 ?+ E   {
0 A; i: v9 i4 \6 w5 L) B; o       mov eax, fs:[0]" J5 D; l; v; d. T
       push eax# J/ P/ A1 J& j- Z
       sidt [esp-02h]
- K: R* x1 ^' r2 @6 e  m       pop ebx8 b- U. k, N) F+ S" z
       mov idt, ebx) z" ?/ T% J& b
       add ebx, 0x1C& @8 |* {# o* g% P
       mov int_idt, ebx2 h  k* k, V% m5 I& {
9 P) A  d! x4 `
       mov eax, [ebx]
7 w& l. U. Q) I/ p" B& D* ]       mov [Base], eax
  t1 {& n1 Y" j% n1 U7 b5 ^       mov ax, [ebx-4]: O3 O. c. B' Q
       mov [Entry], ax: z1 j- U. E5 x" \3 M+ Q2 s

5 x& O. M  S7 [' C8 e       cli
0 Q! z2 k( R, P4 l6 @. P       mov esi, dwExcept
2 ~3 [! n8 X; N2 w- W$ \0 p) e. O       push esi. N8 a% q8 a/ B* _  W$ i) i) X
       mov [ebx-4], si
6 i! a. e. F5 M# P, R, F" G       shr esi, 16
8 v$ e4 P) L- @& {       mov [ebx+2], si3 T: q( _$ c" ~! c% w3 `+ a5 a
       pop esi0 ~) J* n0 T+ [1 n
       sti& k* Y- T; f  s2 E* o. B3 [0 m& ?
( }" A' M# d/ Z! a6 p" S3 H$ @
       int 38 }* k- C7 o2 q- {, o
   }
  I: R+ d/ D  L; z; ?}/ p! }! c+ E% D& b( i) |. u6 L6 _
int main()  E- C& J* X; t4 Q9 _+ f! Z
{2 {) T& C7 m, N8 o2 s% G* f: X
   char s[80];0 e! M8 V$ R4 b6 M" I8 S
   register i,j;  s% I6 m/ _, [, g* k, @
   unsigned long id = 0 ;+ {: z& x( y! b8 E. S
) p/ ^! o2 C8 o) g
//特别注意:这段程序不能 Debug# E5 q( o# b4 W& @7 r0 X
   for ( drive=0 ; drive<4 ; drive++ )/ m4 A7 T% F+ g1 L9 P
   {
, Z. R' g, F$ O+ z       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
9 J! }; E$ M# r0 m0 b       id = 0 ;# g& R! ?' F' i+ l* D1 Y! G
       al = 0 ;+ k+ u$ A6 v8 e+ @9 B/ `
       al1 = 0 ;
, v! S7 s7 t# M& @  E0 @       GetIDEInfo();4 J& B- D2 s. L* U6 u1 I

' I* ^% r, h9 p+ J       for (i=0,j=0;i<10;i++)
; Y0 T; v9 j2 S9 \2 B: |' ]# x3 M       {+ G  e) H, I# N* d. A, f- k; n
           s[j++]=(char)(pw[10+i]>>8);
3 u/ U( S# [0 Q: I           s[j++]=(char)(pw[10+i]&0xFF);
6 _' T: ]( ]" z0 p( K1 r' \# b& i9 m       }! d+ p  J8 c: W& k( t+ P
       s[j] = 0;
3 a; w* s$ `* Z" C$ E/ C
6 Z3 O) |/ I0 X" V//        for (i=0;s;i++)printf("%d,",s);printf("\n");! D8 c6 P( G. d" R
       printf("Serial=%s\n", s);
; j: [9 k9 Y& x: }* i0 ]( l" b
6 M* k8 I9 u% C9 M1 y2 W       for ( i=0 ; s ; i++ )' R6 K& C* V  }3 c
       {$ S3 C* G# V0 H3 C& w8 f
           if ('-' == s || '/'==s || ' '==s) continue;; c) T/ o/ k7 Q
           printf ( "%d," , s ) ;
% Q, P& C: ^" I) p           id *= 40 ;        //10 ;# F4 D. F7 k9 T" k' Z
           switch (s)
0 A7 S0 X$ V0 z9 U; s           {
$ |6 h3 L. d# b6 i0 H/ T               case '0': id += 0; break;& p4 o5 Q6 D6 Z, p$ b4 M+ x2 w& E
               case '1': id += 1; break;- s% w9 |( m; N
               case '2': id += 2; break;
: }' O4 G2 b( W3 m% D! o4 f9 C. p" \               case '3': id += 3; break;8 H% \4 X' E2 E$ u/ q$ \% U# a
               case '4': id += 4; break;+ o' T) T+ ?  h6 |8 F7 A
               case '5': id += 5; break;9 I; F" ?0 ?5 m
               case '6': id += 6; break;
; Y5 z, I2 R+ D  e4 r               case '7': id += 7; break;; Q! g' q% K" l2 f3 ?! K
               case '8': id += 8; break;9 r6 ^/ h  b& H! k! |7 N
               case '9': id += 9; break;
3 t2 F  K  J1 x8 Q2 K* y! L               case 'a': case 'A': id += 10; break;
9 L0 q" ~+ H6 x2 P5 J               case 'b': case 'B': id += 11; break;
6 d" Q$ X, Q  `. q! z               case 'c': case 'C': id += 12; break;% ]$ X" d1 ~& a& a; K
               case 'd': case 'D': id += 13; break;# @' b& ?1 {! b8 ~( w
               case 'e': case 'E': id += 14; break;* H* Z5 b  W) Y0 }  N
               case 'f': case 'F': id += 15; break;1 Y2 C. k' A7 S7 s6 {
               case 'g': case 'G': id += 16; break;
9 l8 O" K; X. P. v) e               case 'h': case 'H': id += 17; break;
9 G' w  u- w9 X) L  K- L/ t3 M               case 'i': case 'I': id += 18; break;& I+ J2 z' o% K2 S- n) P
               case 'j': case 'J': id += 19; break;
7 S: V6 f, m+ q' o3 R               case 'k': case 'K': id += 20; break;# ^$ S" M5 M' H" K$ k6 U1 Z
               case 'l': case 'L': id += 21; break;
4 n) C8 G! H+ C2 O* _               case 'm': case 'M': id += 22; break;
6 u/ z0 T" O! P5 m               case 'n': case 'N': id += 23; break;+ V6 V  F% B6 }0 @% s3 M
               case 'o': case 'O': id += 24; break;
$ X6 a$ z, T3 F/ ]+ L               case 'p': case ';P': id += 25; break;
8 t- r9 z2 \5 W# r               case 'q': case 'Q': id += 26; break;' M  f! y* x) L' [
               case 'r': case 'R': id += 27; break;
) ^' n: l' U5 i  e# V               case 's': case 'S': id += 28; break;% u+ w* u1 A; ]7 O* j. _, a
               case 't': case 'T': id += 29; break;
. B# ]0 Q" r7 W/ {+ h4 s; O! H               case 'u': case 'U': id += 30; break;2 Z5 B8 }2 n; E& U8 h4 v1 Y/ d" f
               case 'v': case 'V': id += 31; break;* {  _; @% a% q
               case 'w': case 'W': id += 32; break;
$ R9 d8 A0 z- \               case 'x': case 'X': id += 33; break;
, q5 V. G: b- [. @1 I               case 'y': case 'Y': id += 34; break;
0 Z- K' Y7 ]) f               case 'z': case 'Z': id += 35; break;
! O  y6 _- H. a               default : id /= 40 ;1 d, U! c- Q9 O) J  q( c; A% n: L
           }' D2 t4 P6 y, A  L- w
       }
8 [% k) ^' a8 A9 I" ~, t       if (id > 268435455) id %= 268435456;
, H' i; b4 e7 s! ~7 Z, G- M# f; x- y% Q5 c
//        if ( al1 == 0x58 )
8 F2 @1 N" ?0 y0 G$ [& [4 U7 M' B, F           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
  u. \- n- M( _5 A/ i/ k- k& v   }1 U5 d# N5 g8 h$ h
   getch () ;
7 B2 Z7 t$ E1 Z. b5 s4 d   return 0;
4 ^4 L; T+ Q2 c& z6 f}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:21 , Processed in 0.018677 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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