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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];
0 g. O9 x  F6 C. n/ L7 X9 z- C7 d3 B
static DWORD idt, int_idt;* }" t6 I2 N- }
static DWORD Base;' ^7 {' D( L7 t
static WORD Entry;
: Q+ z9 U. ^# @( e" w; {: y: b$ U1 \( ?0 ^' B
#pragma warning (disable:4035)
% ^5 a* v: }- t1 ^) V- o! Lstatic int inp(WORD rdx), m5 \4 @2 U% S/ k; G1 k; N  u
{
2 C/ [; l* C" {" i   _asm xor eax, eax
( V& d5 Q$ o. N9 Z! ^   _asm mov dx, rdx: w0 a/ p  {3 ?/ `7 a; g# c
   _asm in al, dx
+ S8 r# n) S" y' z& F3 _$ ~- f}
* D& ~' v" W) V. G0 x
% j. e8 _# Z6 ?static WORD inpw(WORD rdx)
' N3 m. d( L% T; R- C. f{" ]* n6 k# D. ?  {* T+ r1 i& F
//    WORD retData ;, O2 U" h# N3 M" f
   _asm xor eax, eax* S5 Z1 N# N% u# [& `
   _asm mov dx, rdx
, w) K% p- P1 r5 x' L2 m: g   _asm in ax, dx
! _5 J$ |1 X9 f  u) ^7 e5 D+ H* |* M//    _asm mov retData,ax
. S7 r7 D( |, C& {  c; F/ u. u//    return retData ;
% p; t/ j, N( @* d2 M3 u  u! e}
: {3 Q; z3 r$ }* F. A/ Z7 _, l- ~7 r* P9 G
static void outp(WORD rdx, int ral)3 S1 k/ t$ I+ l' J# j. A2 R
{
9 X: p; W8 \& M) [   _asm mov dx, rdx5 h; d. j' m; }5 \8 y) m" B( Z
   _asm mov eax, ral
3 Z; H+ O2 I/ d' S3 A" y0 I- x' A   _asm out dx, al8 {* [6 T: r: ]: X
}
* D& j0 R$ F% a4 h! o/****************************************************************************/
/ I/ p$ Y1 f9 L6 |& C7 t* b8 LWORD baseAddress;5 v7 Q, _2 q7 K. n7 _
int drive = 0 ;
9 Q1 |- V! J* C# N2 Zint al ;
6 p6 j' P: b. X  W# L! nint al1 ;3 J1 y+ K- `- s5 q9 N
/****************************************************************************/
4 d; x& A8 _( P0 Qstatic int WaitIde()
: a2 c0 l  _$ ]# y6 I* R! j3 K{, ^# d5 Y; |- g) e
   int al;2 J' {; |: ]5 Y
   al =  0x80 ;. v, ~/ b- X% N( P) }- q- |9 y( G+ L. N

4 i6 r1 m8 X3 O; O   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;3 q9 Z$ U+ Z: J0 M, u4 `9 G
# V3 n" |% s8 ~; `3 u& [
   return al;0 A( k5 @" g/ Z
}
' y& r9 y- v6 F/****************************************************************************/! e  Z& o1 h. l$ m* A3 D
static void ReadIDE()( R% R' p) m* S" f9 V
{
& ?* ]( J0 l/ t8 f# m1 L9 f   int i;1 Y, K: s, }7 [( K  H& J
   switch (drive / 2)5 _5 b) n% @$ h) z. s& M
   {
; d) @/ g. a  n5 p5 A* b       case 0: baseAddress = 0x1f0; break;7 X/ L* A' {3 ~9 _- n7 }
       case 1: baseAddress = 0x170; break;
8 P9 m% y" ?8 o3 V       case 2: baseAddress = 0x1e8; break;( D# q+ O" i& N; \# s
       case 3: baseAddress = 0x168; break;/ W  @' Z; {1 T
   }: b/ z; x6 t2 }9 w) _
; y" X. L/ C% g5 D8 R: m
   WaitIde();
: b1 {2 a4 `. ?4 b* J; q   outp((WORD)(baseAddress+6),0xA0);
- G! V" m3 P* z# u   al = WaitIde();, j/ q  u0 M! Q& V

2 N0 l; }; W; @( G* Q3 z   if ( 0==(drive%2) && (al&0x50)!=0x50) return;
# I1 i; M8 `4 U2 h( d7 T; N   if ( 1==(drive%2) && (al&0x20)!=0x20) return;! N4 E( f& I  Y- J
( L+ l6 H( `* J7 {
   if ( 0==(drive%2) ): ?  R5 {3 K) f* I
       outp((WORD)(baseAddress+6),0xA0);
  N7 u9 ]2 P4 [0 r9 @+ l   else; e* V+ q6 ]7 S( l3 y  l
       outp((WORD)(baseAddress+6),0xB0);' Y; D5 H* ]' B/ ^' x
& t' P1 L4 z- l" ?3 }8 \
   outp((WORD)(baseAddress+7),0xEC);, |- u& u7 o4 {" c. N5 h2 g
   al1 = WaitIde();
! l: L' x' d% i* n, s   if ((al1&0x58)!=0x58) return ;
/ X& ^2 o/ [6 }% H$ I& M6 n$ D3 p4 g/ l+ I( v, P4 u
   for (i=0;i<256;i++)
; L9 n/ n9 v2 ]   {3 o/ `# t7 ^$ I2 \
       pw = inpw(baseAddress);
8 p6 ]- F: J( v( j  h1 D   }  h" a' u, `3 ~5 i: G) ^0 L) }
}
$ [: K% _2 ]" n, {' O0 a, E3 \2 i& W% `2 c
static void __declspec( naked ) NowInRing0()* ?, U6 F; [. n  v$ D4 a& T
{
6 {8 I. n! c4 t7 ~5 k" F8 ^$ r   _asm1 i3 X7 T) H4 A* M- Y
   {- L( q; T% N2 m; C. w, f
       push ebp
2 B3 \" o: ~: U. k       mov ebp,esp
. a+ d. ?$ L  T. Y/ i
% J: R7 i+ e9 `0 {+ }& S       call ReadIDE
. T: \. s. `/ r/ c: m9 Q       cli, ^  S" X. ~2 b' m
       mov ebx, int_idt& J4 `9 d1 e% K3 x: q
       mov ax, Entry; b) z3 ~' H% B; @& i- y$ X" q9 ^
       mov word ptr [ebx-4], ax
3 }; P0 W& E- f       mov eax, Base& a' J# @0 a$ S3 v1 M/ c
       shr eax, 16
6 t  _: z/ g# z! z; V2 V; w       mov [ebx+2], ax6 h) S1 B7 J4 R; N, L, v
       sti
6 F: H. t+ J: x" X. [" j       leave2 _2 s+ \8 c8 |1 I* J- {6 D
       iretd* f, s! A6 k/ F% S, g
   }
! D) h9 @! e$ Z' q# o: t. X* ~}- G. L0 I% b' s( x% S
4 W  N' D3 b$ G5 I
void GetIDEInfo()3 u- o8 H) Z/ U+ j
{
" Q$ ^. m/ ^9 g/ `- I' K; I% s3 u   DWORD dwExcept;. E& }9 I2 s/ }0 I

$ s7 L% q1 {) x: V. O   dwExcept = (DWORD)NowInRing0;3 R* ^( q5 z9 l* ]

; \! Q0 A( o5 T6 K+ Q) p   _asm8 X2 E1 M5 a6 {" P) B0 Z: P9 Z; ?
   {# p1 @1 W# Y- m+ u* y' O% m& E0 u. D
       mov eax, fs:[0]. T$ a7 [) \6 g
       push eax5 T2 M; ?3 U' R  [
       sidt [esp-02h]
/ f( o0 X: O1 g/ @4 J. j' ^4 z       pop ebx9 e/ D: z0 E) t" ?, C( A
       mov idt, ebx. O7 V+ m: y7 f; @7 {0 D
       add ebx, 0x1C
8 u3 ^" [/ ~4 M& \       mov int_idt, ebx8 }9 h* P" x' S: W6 x! I

7 |1 g0 R* Z& @( N( d: s+ D" z       mov eax, [ebx]
5 N9 s+ G! W; ^* E       mov [Base], eax& B3 r% O, c. O
       mov ax, [ebx-4]
0 U9 X0 }5 b6 D       mov [Entry], ax' g5 k# ?' Z6 f# F7 c9 i

- L0 h: b9 D/ u       cli4 U% n( Z3 H- N; i3 P8 i
       mov esi, dwExcept
7 I  M+ A4 z% b  j8 ?) ^       push esi
+ ]+ Z5 O3 `" A" d6 u       mov [ebx-4], si8 l9 j. u- L3 I# q0 c: @7 f
       shr esi, 16
  u; g. s( E/ h0 R4 _       mov [ebx+2], si5 B+ d$ F) i6 u7 I8 H
       pop esi
2 Y. v" t. ~( `& o( g+ l  a: P       sti% {+ F; v2 Z* ?9 M4 H; e4 g8 y4 R4 q% k

: Q3 r/ M% z8 B3 S- t       int 3" ]* V7 l7 u: D- r, i. P5 _
   }: ~4 A! g- _; e8 |; `6 q/ F! o
}
5 C% U$ z/ \; ^9 ~( k9 z0 s; nint main()
) D3 y' W& A6 ^; U8 q6 Q{; c1 A( u2 }  w5 D5 |" j1 P1 \
   char s[80];
: N/ y0 S. x" e  B   register i,j;( S) @6 D$ T3 _) T
   unsigned long id = 0 ;
4 B6 \; m0 }. J% y
. _* S  O: K* p3 y) l: |* _0 g' q//特别注意:这段程序不能 Debug3 r; j: }8 n; O
   for ( drive=0 ; drive<4 ; drive++ )9 i: C, Y- I  T( G3 P
   {' ]' I; Y2 m) [
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;# l" d. |- T7 h
       id = 0 ;
7 p  r7 e4 d, B; m- u       al = 0 ;
4 m$ V9 V1 ]; q! S; T* [. {7 L       al1 = 0 ;
5 a1 d4 s1 V/ H, X5 g. c4 |& C       GetIDEInfo();
7 J* e- y8 _8 Z& o' h" |4 Y* p( ^/ o) P# S
       for (i=0,j=0;i<10;i++)
! ?* R( A: i1 P5 C' r0 P( ?       {6 B; L3 _5 j, n9 r
           s[j++]=(char)(pw[10+i]>>8);4 x8 V" B& k. }2 A
           s[j++]=(char)(pw[10+i]&0xFF);
- a6 o7 p- Q# t4 I$ ?$ R       }
6 P  C: G( d7 F! j( z       s[j] = 0;
* C9 j3 S! C) K3 f: u
+ o5 w4 x: T% r* u- h, E//        for (i=0;s;i++)printf("%d,",s);printf("\n");/ p% Z2 \2 @8 C1 a3 \. E; V
       printf("Serial=%s\n", s);
- M, K+ c! d# r- P
, g+ P2 p; I% P# l& Q) u+ i) w       for ( i=0 ; s ; i++ )9 f2 z/ m4 b; X2 W4 S; r2 R
       {- Y& ?- h. G0 R- v, X8 Y
           if ('-' == s || '/'==s || ' '==s) continue;- s# G8 H6 h7 p1 T8 U5 `
           printf ( "%d," , s ) ;' q8 V2 I( i" }+ l+ \. a0 [
           id *= 40 ;        //10 ;
! K$ Y! |( l3 N, @  w* z           switch (s)
* i. h" V7 s/ c/ r5 \" Y           {7 e$ v4 O  n. G7 L9 M. a
               case '0': id += 0; break;
) q4 o. r4 }4 g5 H7 r               case '1': id += 1; break;& t6 ?( q( u4 g6 Q4 S5 e
               case '2': id += 2; break;
1 Y- w; n4 }1 O" ]               case '3': id += 3; break;
5 N3 L: R$ K+ D  C# t* A. Z               case '4': id += 4; break;5 K: ^% q7 J3 n# U/ X+ a* c
               case '5': id += 5; break;- i* x) G0 s: ?0 }$ b$ K3 a
               case '6': id += 6; break;) b3 ~& }/ K$ I& P
               case '7': id += 7; break;
( [5 o" B3 ^# [1 M$ c               case '8': id += 8; break;
6 f& l& d% U5 |! X  q( w               case '9': id += 9; break;, E2 M: M6 w  S+ u1 A4 ]: s
               case 'a': case 'A': id += 10; break;
* ~- \* W6 Q& P. T+ Y               case 'b': case 'B': id += 11; break;
8 S* Z/ c- N( q- a. K8 Y4 v               case 'c': case 'C': id += 12; break;
+ ?) s1 K+ W, T$ F- C               case 'd': case 'D': id += 13; break;. N* L/ E* g! i
               case 'e': case 'E': id += 14; break;" Y7 E' _& h0 L. G3 O4 @5 R
               case 'f': case 'F': id += 15; break;3 F3 Z: j) D: ]' O, j
               case 'g': case 'G': id += 16; break;
7 t* C. j, s& g% ^( t. Z/ j               case 'h': case 'H': id += 17; break;
+ c( \1 B4 ~) m1 u. `6 P! t               case 'i': case 'I': id += 18; break;. ~- [9 v' F6 y* c
               case 'j': case 'J': id += 19; break;
( ^. V7 h4 _  \, ~( n! I               case 'k': case 'K': id += 20; break;. r1 ~9 K9 S; k2 b
               case 'l': case 'L': id += 21; break;1 q, Y; {/ ?+ F6 H" d
               case 'm': case 'M': id += 22; break;
& }' k- {3 T5 r               case 'n': case 'N': id += 23; break;
1 m1 G/ S8 z* t2 {% u5 q               case 'o': case 'O': id += 24; break;
8 O3 J6 v) V" w) l/ x               case 'p': case ';P': id += 25; break;
1 s% `" T6 |/ B/ p; E! ~               case 'q': case 'Q': id += 26; break;# \' ~$ F7 q0 @7 B
               case 'r': case 'R': id += 27; break;
3 D+ v* a- i' y7 X) I2 Y               case 's': case 'S': id += 28; break;
5 b$ k! r" u" N8 g1 _               case 't': case 'T': id += 29; break;
- L/ I& S5 W) A1 _% {               case 'u': case 'U': id += 30; break;: L1 }) q: O8 K* f. h8 |
               case 'v': case 'V': id += 31; break;& i; s: @( I6 e
               case 'w': case 'W': id += 32; break;
& p3 Z' l* a& v) J. h. V$ ^! j               case 'x': case 'X': id += 33; break;
9 z3 h5 Q6 O+ P3 @               case 'y': case 'Y': id += 34; break;
, G8 @8 |( s/ z6 x" k$ ~               case 'z': case 'Z': id += 35; break;/ ~8 J. R+ _# o3 A  }9 c6 O2 s# v
               default : id /= 40 ;$ x4 C- ~1 O+ i/ h" ?! V
           }
' [' p1 t7 F# t3 r       }
( j& V  V* A+ c* I       if (id > 268435455) id %= 268435456;: K7 J+ ^$ N# s

$ P& E) S3 V$ \  y# x//        if ( al1 == 0x58 )
. `3 @; h4 A* l; Y3 v0 B           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;3 I1 x0 s# k+ t9 ?/ [+ `
   }. `+ U, }+ X$ _6 H
   getch () ;
0 `7 _0 }" z5 J4 N: m   return 0;  n+ m/ D3 G6 P6 P- n$ n
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:14 , Processed in 0.018785 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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