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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];- m9 C' \. c. x- S: [
! G- {+ s# \6 w& _) K
static DWORD idt, int_idt;! e) @4 c0 C0 V9 r6 b
static DWORD Base;  V$ _- m, o' i4 X2 U- @
static WORD Entry;" J  N5 V- o5 K/ A, v  J
8 P2 a/ x6 a4 R5 Y( h) m/ U
#pragma warning (disable:4035)
$ R: O4 n% F( istatic int inp(WORD rdx)
; C; }# g2 h  {0 W7 ]9 _# {4 h  V; X{' E2 f7 Q9 ?- q' A
   _asm xor eax, eax9 {7 U% j, ~( K
   _asm mov dx, rdx
( Z& B. u# P$ C9 k- P   _asm in al, dx
4 e  N; a! I2 ~0 r6 T3 N}
! S, k6 c; D/ A# b( ?- o* {* n# r/ k4 M* n* ]+ E# p
static WORD inpw(WORD rdx)
/ s* K2 \1 q, }# y; d. [- |{6 l8 b+ z2 [& W2 t0 A! G9 X
//    WORD retData ;
9 E( K0 M& ?& q   _asm xor eax, eax
* w# U/ a2 k$ n$ V, d' Q3 F  H" A   _asm mov dx, rdx
# p+ t. `' Q6 w; L, B3 j' t$ n" b) p$ y   _asm in ax, dx# @' y, \" s) v/ _, g: O" u
//    _asm mov retData,ax
' [5 s) x: F0 j" d. b) W+ j+ X% q//    return retData ;1 k; T9 E; d5 g
}! D1 [7 _5 O0 s6 M' }( E# C6 y1 T

9 u. n/ ]  E! O  estatic void outp(WORD rdx, int ral)7 G3 k4 c  T+ M, G8 ~7 k
{
% J9 B. ]' T9 q   _asm mov dx, rdx0 y& _9 Z, }3 T# o# n" _9 p+ d
   _asm mov eax, ral/ P8 X& H6 Y( }' S3 B8 ?: q
   _asm out dx, al2 b% l) ]# w' f; X
}
, _/ R+ s4 P* I% v3 p/****************************************************************************/
$ j% t  b" _# l7 d# x. g% KWORD baseAddress;/ n, h7 A" ?  Z/ L
int drive = 0 ;/ H: C6 [: ~0 J' S1 N) o
int al ;
# v+ I9 O/ k3 G  p& h! U' s( X( K0 Bint al1 ;- r/ W1 h3 m" ~# n  K& q( @* O7 G" I
/****************************************************************************/
+ F% d; R- R1 i6 ]! ^2 l+ Jstatic int WaitIde()3 f2 a! @& I& O. K. B2 n! {
{% t1 J: V1 ~+ p* i+ m6 b, j
   int al;0 N9 \. Q& h0 u! h
   al =  0x80 ;& _2 C3 H4 _+ _) M8 `( o& T# A

% \0 t. f7 n( @5 H8 h1 `   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;, ?/ W  i/ U4 Q/ o: X  W

5 `8 C" W3 f- }' R' e3 N! x* N7 h% M   return al;/ ]+ B. X7 l8 P2 \0 Y3 W
}
, T' Q7 H6 N8 a! z/ Q( S& m/****************************************************************************/9 s8 b- t; }9 A3 c) n
static void ReadIDE()
9 ?# e- [* L6 R5 n- ?$ s5 v- H{2 s$ u' I+ O, m; s) J
   int i;
% a' W5 E5 R+ N9 z   switch (drive / 2)
, T9 c0 g3 z' E* F   {
* ~: I# _6 ]) _4 V! ]       case 0: baseAddress = 0x1f0; break;8 x1 W* b! \9 {4 c9 W- T9 p/ }
       case 1: baseAddress = 0x170; break;# z) [  u' f5 c) L7 T+ q; Y
       case 2: baseAddress = 0x1e8; break;
% O) z( F) L( K& c$ V6 \0 p9 b       case 3: baseAddress = 0x168; break;
1 L! u) s. D3 x% V1 }* }   }) i. K  O6 L8 u

" N) z2 u1 \+ }$ D+ z5 i  i   WaitIde();9 o1 q( s" n' H; J% C7 w  Y
   outp((WORD)(baseAddress+6),0xA0);  [: C) s; G) {- e/ u1 e0 r
   al = WaitIde();8 _/ N- l$ L; H1 `9 ]' [4 M3 m
/ Z4 ~" M$ z  `, v) R2 h$ Q8 h8 {
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;* X9 _- i  I/ E& i
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;  S& H% E& y! d% z; {
: `# _2 l6 s* _3 }" O
   if ( 0==(drive%2) )& M7 t# O* }0 d8 A* H5 m4 t
       outp((WORD)(baseAddress+6),0xA0);
7 I2 W* l1 A9 F8 |' k# `   else
- I/ y& D6 h" v1 W& y$ C7 l       outp((WORD)(baseAddress+6),0xB0);
3 p( \# ?$ Z8 x. X# M; ]* |  V, J$ i2 H! `
   outp((WORD)(baseAddress+7),0xEC);
5 G$ ^: t1 M* ?2 R( N0 f   al1 = WaitIde();
9 M( N( x$ m4 j: o   if ((al1&0x58)!=0x58) return ;  `$ `* H1 [" H/ z
7 d  G2 i. j. J
   for (i=0;i<256;i++)
6 a0 B4 \4 O3 ?8 j   {% Q8 |# X8 h& R3 g! [
       pw = inpw(baseAddress);
. T5 g; p, u' B2 W# \& f   }+ e7 U' J9 r5 O
}
" h6 F. P$ l8 X
- U2 ]+ J2 v# s9 Z+ x. Cstatic void __declspec( naked ) NowInRing0()+ |, ^, k6 H; u4 T3 }; C/ j
{7 b- \3 w! L$ w, M* ^
   _asm
  g! M+ |% V% F& \   {
, U1 y. z: D/ X# t8 G2 P       push ebp
) v9 x3 M% _$ U- o       mov ebp,esp, m; E. G( v- q" l, ]$ k7 l

: y* M' [# h# n+ c( f7 t5 N       call ReadIDE( G0 t: U0 d7 Y
       cli
. I  f. P5 i9 g9 l* ?6 i! r5 m- V       mov ebx, int_idt1 R9 b, S0 y3 |, ?- A9 V
       mov ax, Entry) ?6 j2 l; ?1 i3 ^
       mov word ptr [ebx-4], ax
$ x4 p- n) u1 |       mov eax, Base6 [# S/ s( q- Z" Q4 D) z; X  F
       shr eax, 162 O0 b* x3 k9 A/ P
       mov [ebx+2], ax
, s' P- d9 h$ H) `: N       sti$ r7 |2 C( a8 G
       leave
, Q! I$ z$ m; r5 k       iretd
: T+ R; b5 i+ H& W9 i: o   }; s2 d8 N2 l5 [
}
/ o- s* J, B2 d7 m% ~4 b6 G4 y2 f; z, U+ o- R7 c; c
void GetIDEInfo()2 ~3 _  o% K( U; \
{, K! P% a; C7 W5 D) D( k
   DWORD dwExcept;
" j1 ~) H4 x2 K0 P' E, n) e5 [0 ]; A" O$ c% U# M
   dwExcept = (DWORD)NowInRing0;# F( q# N0 j$ }
5 j& k0 |8 v) e# m
   _asm
! ]# x1 e( n2 k# P( f2 w, }& k   {
; w- c: @! E2 q& Z       mov eax, fs:[0]
" u8 w) W# h8 q7 a  q       push eax2 V5 ~. R- a. k' m
       sidt [esp-02h]
6 a1 ~" q) V6 W" x       pop ebx2 g& [/ c5 B+ |4 C; G
       mov idt, ebx  C: W' R& i1 q9 B
       add ebx, 0x1C: q* E2 S  j4 I' z& |" ~- l1 R
       mov int_idt, ebx4 f* K* |' }" l
1 f3 k( G- a5 e7 P
       mov eax, [ebx]9 Q3 l/ L0 ~1 }  v2 n+ _. L/ o+ N6 f. E
       mov [Base], eax
) w) Q" q8 [0 _% T2 M% N) @       mov ax, [ebx-4]
4 A/ T% i& F* s" h9 m7 e/ F) X       mov [Entry], ax% I' b# E" @- v4 y' ~

0 H7 A- f* q. p  N) Z; O       cli% {  s3 i) t; f" g
       mov esi, dwExcept
7 |( J) G$ J  m       push esi, Y' x6 e: f: v) t7 n; h
       mov [ebx-4], si
0 l6 E# Y2 n3 [       shr esi, 16
: l6 e$ A+ [# F0 L- Q       mov [ebx+2], si
" |- Q, k9 y% l+ R       pop esi2 b0 L5 N, ~5 D& r& x! y8 s! f
       sti1 W* q9 {  o( ?$ l& w; N! W5 i
* |. m# @7 E& e' [3 A! J4 ^
       int 3
8 l2 n4 ~: l+ F5 d2 w   }
1 C4 H% ^0 L0 P% o8 b}# R; L' d8 ]5 P. i
int main(): b% x  k, [8 {  m
{
' l7 D- y5 d* u   char s[80];$ B- m2 |6 @. ?, ]1 J
   register i,j;, w7 ~4 ^; d1 L7 ?  d% J
   unsigned long id = 0 ;
% b* @% ~7 w6 _# e( s" u6 l9 c( _* B/ i  V, y8 i  j  @
//特别注意:这段程序不能 Debug; K. c+ ?- h% U( G. b) z/ b$ U
   for ( drive=0 ; drive<4 ; drive++ )( g/ n! y( _- [- U% j0 l
   {. K( G! g! p% b/ ^* v
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
5 }9 x; Z8 S" I9 n: o' ^" m9 e       id = 0 ;6 Z7 B7 O; @3 [1 Z: ^
       al = 0 ;: S7 q  l( _6 P
       al1 = 0 ;
6 h2 n  z9 s# J/ t+ [' J       GetIDEInfo();
9 H+ k) l/ l: C' ]8 ?" m6 w+ {7 x! j' W* o% u
       for (i=0,j=0;i<10;i++)/ K- U, M( F2 g" r
       {
! m1 h7 `& F. v+ N           s[j++]=(char)(pw[10+i]>>8);& R& Q; ?( P1 U3 z4 Y) a
           s[j++]=(char)(pw[10+i]&0xFF);
8 J# r3 s3 j9 `8 L. L       }$ {0 z0 k% a3 `" {  x: s9 t; x& K
       s[j] = 0;
9 j9 D) {! B+ |  G( `2 A% d% A- M' J/ Q0 r- h, k5 R  Y/ p  w
//        for (i=0;s;i++)printf("%d,",s);printf("\n");
, ]9 J# V4 ]0 [1 p6 J. W* X/ g       printf("Serial=%s\n", s);
& B$ S/ t' a# p5 Z1 I8 c2 ~4 G- V( d% ?: b4 A2 D7 |3 ~
       for ( i=0 ; s ; i++ )
8 G; i6 R; ?/ R# O6 ]6 y& R4 N9 g1 M       {& \4 i( O5 `: H3 ]
           if ('-' == s || '/'==s || ' '==s) continue;, ~. O1 H; C6 K. B& m8 n% z3 S
           printf ( "%d," , s ) ;* t9 ?: r$ i, }! |9 v
           id *= 40 ;        //10 ;
3 f/ \6 [9 j* v: K+ f           switch (s)
) G. ^0 s. V8 b; \3 {% {           {
+ G% @0 t/ M$ r5 c  Q# q% ]               case '0': id += 0; break;" E: w& p* S) G0 ?7 X: O) h" n0 q4 R
               case '1': id += 1; break;/ @: [% @+ w/ U' ]7 X
               case '2': id += 2; break;
1 m5 J# M* k, o* J" k               case '3': id += 3; break;
4 j- R, T+ F& g8 e4 U) m! R               case '4': id += 4; break;: ], }$ ?$ m7 L  Y( Y: Q
               case '5': id += 5; break;
. F6 f4 g1 o6 p               case '6': id += 6; break;
. E( v, p" E  W$ F3 }% t1 Q7 H               case '7': id += 7; break;" [+ y. f; _$ ~2 @7 W: [: S! U( C* ?6 m
               case '8': id += 8; break;+ p0 N: r( _9 o9 U5 \. u3 I
               case '9': id += 9; break;; u. w4 z8 Y7 A+ }0 Z* n3 I4 l, a
               case 'a': case 'A': id += 10; break;* b/ b! M4 L4 C
               case 'b': case 'B': id += 11; break;
2 ?8 @  {: v5 v3 A$ K( D               case 'c': case 'C': id += 12; break;  q& ^8 N/ R1 j2 m/ K
               case 'd': case 'D': id += 13; break;" @5 P, a9 m, e8 x% S
               case 'e': case 'E': id += 14; break;  k  m- t% S, K7 }4 J) C) Y
               case 'f': case 'F': id += 15; break;/ s+ c3 A9 O7 K
               case 'g': case 'G': id += 16; break;# W% ?0 n  ?1 L) L) j0 L
               case 'h': case 'H': id += 17; break;
. H& F0 d  h# w               case 'i': case 'I': id += 18; break;) n2 \' O% p! G2 S9 o2 H/ b
               case 'j': case 'J': id += 19; break;/ I! z, T; z9 V  i3 E% X
               case 'k': case 'K': id += 20; break;9 A9 ^2 e) O& o* P& z: I
               case 'l': case 'L': id += 21; break;  @3 a% X: Q. M+ O4 V* s6 E
               case 'm': case 'M': id += 22; break;
  G- h( n5 R; V* v* G               case 'n': case 'N': id += 23; break;
7 F* g% X; I0 }: G/ M! N               case 'o': case 'O': id += 24; break;; c  g  H0 X( y& `
               case 'p': case ';P': id += 25; break;
8 r4 w! ~6 q' q) r  w( E$ `0 Q) }- f               case 'q': case 'Q': id += 26; break;
# [5 q8 k( T% C               case 'r': case 'R': id += 27; break;
" H$ S$ Z  I. }3 Q               case 's': case 'S': id += 28; break;
' X: G8 x" x- O# k3 h2 L( v  n               case 't': case 'T': id += 29; break;
" ?5 |4 |2 E( n% |8 ^               case 'u': case 'U': id += 30; break;
" N! e- b0 _* a3 {1 [4 M               case 'v': case 'V': id += 31; break;, |, {% n6 [# G! L* W
               case 'w': case 'W': id += 32; break;
- G& b/ T- P& k) L               case 'x': case 'X': id += 33; break;
' X8 j* Y  V0 n9 W6 [* |9 u               case 'y': case 'Y': id += 34; break;
) a9 i3 V. c% X( U) ^               case 'z': case 'Z': id += 35; break;
3 z0 k' W: ?% O               default : id /= 40 ;
! z+ M$ |2 Y. C           }5 K4 y0 K! N  U+ d
       }& l6 o7 ~! ~9 k. z% r
       if (id > 268435455) id %= 268435456;
2 F. C- N" [! D1 L$ C- n( C
: ^  @! E1 I; w5 v& `+ d: e2 ^//        if ( al1 == 0x58 )
: v5 ~) E; T% p7 V% N           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;$ A- T; c/ H! ?4 s/ F  w" m
   }
# W+ l5 m) |9 W4 s% ^# a# V( B8 P   getch () ;
3 S0 O: M" M+ ?" Z   return 0;
- L) m- n  j/ R- G; c" k! Z}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 03:26 , Processed in 0.016389 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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