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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];' ?* S6 {2 u+ R: K, I6 K: ^$ H
1 E6 k* s  N9 k4 E
static DWORD idt, int_idt;' D8 p( w- r" F! n/ N
static DWORD Base;: i0 A2 [/ ^" x& Q& {) u, T
static WORD Entry;  R& ^9 A- U' W: R6 T1 c) G# M! s

! P2 L4 n% l% {#pragma warning (disable:4035)
! x0 S' @$ e$ u% C% u9 Xstatic int inp(WORD rdx)6 ]! E2 J5 [& J9 k# ~/ B% T& d
{% I0 Q7 X$ u/ t1 M
   _asm xor eax, eax0 i5 N, {; G1 _7 V$ Y
   _asm mov dx, rdx
* ?" _: \8 Q- N4 f% r" s/ ^   _asm in al, dx
% i7 k  S2 z) ]6 V}# o% u: g# X! Q% I' S& J8 J. Q/ a

2 ~# i4 f5 U+ m! W) X1 n+ m% ustatic WORD inpw(WORD rdx)
4 u" `8 P8 I: S3 a{
4 U" p9 @8 X; q+ D//    WORD retData ;
2 N3 U+ t# E: ?+ o, A# F! @; G  u4 f' @& V   _asm xor eax, eax
' y: R$ |5 `" I0 E. A3 r: X   _asm mov dx, rdx
9 d" {! Q( ~* P- b3 V% A   _asm in ax, dx
9 F0 ^; T/ t/ |( f: |/ Y- q//    _asm mov retData,ax* Z/ Y3 E/ F  t* y
//    return retData ;: I4 H1 l1 R4 ?8 \+ D1 j" M- S
}
8 J  ^; x, I5 C4 j) f- e6 k
. F5 E$ ]8 Y1 Q0 d6 q, }static void outp(WORD rdx, int ral)
. h2 y3 A/ @! j7 y5 V% Z5 d{% g+ v9 G% i( z+ a/ u+ A
   _asm mov dx, rdx( y9 |& S' U% r& H0 N
   _asm mov eax, ral
, Z) ^0 g) L5 y   _asm out dx, al# x& ]: m- v1 h2 E- t
}
, x! Y* @7 w* K' P3 ?; B' |! M/****************************************************************************/
8 j: s+ O# \) p* U' P0 qWORD baseAddress;
+ t$ Z" e: K: u  Z6 ]1 `& [int drive = 0 ;- e' |2 h* t9 }# n. t' Q; }2 d
int al ;
% D4 j/ E8 k# @! |int al1 ;
0 M( ~1 U2 R: A( }/ `/****************************************************************************/; m# f- J0 B0 P
static int WaitIde()
9 H' b6 `! \" n0 T6 H; ~{
, `2 k/ N# u* L/ W   int al;3 U0 Z  D0 h6 s. z8 v
   al =  0x80 ;
, r- B1 A5 \/ U! X6 O8 o. H1 j: S, k5 L. D
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;! |9 B1 F0 d% n% `
" }# `2 j6 e! j3 N7 L, S  e7 b
   return al;
9 E7 T  A+ U3 u4 N- p/ {}6 y9 G; o  D! U$ |, I
/****************************************************************************/. t( t1 t# R  Z2 _# j1 W* g) F
static void ReadIDE()* T+ l0 `8 X' e7 k( q, C0 h5 @
{! |1 C9 g' O7 }
   int i;
7 ?$ q/ A. m: Z; D* H   switch (drive / 2)
% r4 q7 n* X& {# i   {
; v9 d5 x# N" p$ m4 U       case 0: baseAddress = 0x1f0; break;2 E) S, r. \7 X" X# t: Y
       case 1: baseAddress = 0x170; break;
6 C/ C$ ~$ I7 F$ M, {, h       case 2: baseAddress = 0x1e8; break;4 p3 A$ V% e* m) ^% X) v
       case 3: baseAddress = 0x168; break;
2 X  ]7 b( N* O% f8 M: _" L5 M5 E   }
" H7 Q7 m! ^0 z: x; d/ \
- D& A: U0 _5 D" p$ N$ w) _   WaitIde();
% z* d1 |/ h0 ?   outp((WORD)(baseAddress+6),0xA0);
/ r5 T2 N3 v6 t" z  g% u; O7 r0 S   al = WaitIde();
( h: g6 @  T" z- y4 m% M" R. Y: N5 K7 k' d9 L
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;0 s0 J" n' N+ c$ f6 f! q7 q
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;
9 x4 S7 c# h8 s$ a6 _9 \" L! ^% i2 R% d3 d
   if ( 0==(drive%2) )6 u8 |9 _( P# T* \5 M
       outp((WORD)(baseAddress+6),0xA0);! ?" ]0 B! @8 [& _8 f
   else
; {5 K& D2 V. U! Z  d       outp((WORD)(baseAddress+6),0xB0);
$ {9 _1 S2 N* g* l7 m' m5 m
4 \/ @4 ~. B# d   outp((WORD)(baseAddress+7),0xEC);
, n7 U6 @9 F, Y* u" U# ]   al1 = WaitIde();& B0 ^3 E7 Q3 h# ~* M8 V$ z/ m/ s
   if ((al1&0x58)!=0x58) return ;
0 K/ b9 h9 A4 a
/ U% A5 }' g9 v) J& x   for (i=0;i<256;i++)5 {% P' {9 r8 D+ \6 _) N. ?, N
   {
, D: y% N, G" X       pw = inpw(baseAddress);" t7 G$ r- t5 A7 y6 X
   }
0 G: j' c& t+ h& z; }# i7 v! s}$ O9 S; o+ g5 X' t) S3 C

  {. Z; u- \$ J! G2 c& P$ astatic void __declspec( naked ) NowInRing0()
3 \6 @8 [" `/ m( z) C* |6 b{' q: f! C  i" t4 C' x  ]
   _asm# T2 V/ U! |5 _- T2 f/ W8 a
   {
) D# }7 M- J; H       push ebp
% Q( g0 x" g$ m9 |# J       mov ebp,esp
# h4 C$ X: ?1 r1 F3 U$ p
% P6 G& y. ^' t0 w       call ReadIDE
1 S; }4 Q6 @# I; |+ a       cli/ O# q" p" B  O) d( z
       mov ebx, int_idt
0 g' U# x: z. ]       mov ax, Entry
! {- I2 p8 Z" N' c% r       mov word ptr [ebx-4], ax
/ C* u& J8 X& ?, a& F+ C) S9 |       mov eax, Base
" l' X" }/ U% [9 [       shr eax, 16
- }0 B$ }* d& [, u       mov [ebx+2], ax
. A' @' J" [! @       sti* b7 C% N# c% ]* t; Y8 Z8 m
       leave6 \! h3 T- e5 f
       iretd
: R% L1 z" R* F' T' H. T   }
* v1 [% b* W" M, A, h/ }}
# z+ x! M' ~# g" n4 R- t0 p4 b+ E9 L9 |
void GetIDEInfo()
. n  s- N1 p3 x{9 M. V; J$ H: }  l6 h
   DWORD dwExcept;8 o, D4 M. |8 T9 x% j/ f

4 I1 _/ M$ y2 Z1 b& o) o   dwExcept = (DWORD)NowInRing0;5 Z' e2 ]8 n7 Q$ ~- U8 a6 Q
. ?' w/ ~+ A9 R
   _asm# v/ ]: _0 n# j1 f+ G7 z
   {
) v& g6 V2 V/ ]8 J7 }$ L       mov eax, fs:[0]
, X  F, u( O( M) P       push eax
' s/ ~- {% A2 R; J       sidt [esp-02h]& l: @" d4 X' U5 O# L$ F- T
       pop ebx
: b5 R1 z0 g5 x       mov idt, ebx
7 j- J6 P( K) o       add ebx, 0x1C
( c2 P+ b6 z5 s, ~7 n/ v6 Z1 `       mov int_idt, ebx  }$ c; d' |  Y7 X4 A+ |  x# X2 w

  l* u* `# u' t       mov eax, [ebx]
- j% s* I3 S8 ~- x7 t6 `0 [       mov [Base], eax
. ?' ~$ X8 X# T0 k       mov ax, [ebx-4]1 s, e- s, S) r$ `
       mov [Entry], ax+ y+ \/ S, ]4 @: W4 L2 }( ]

3 I! @% a2 ^% q0 }4 ?( [6 c       cli6 J% a' t: l4 W
       mov esi, dwExcept. s( ?! i& v0 M! [8 @1 s; w
       push esi0 z0 ~5 T! K5 I; I
       mov [ebx-4], si4 |; Z& `' N9 D; S* M% L: p
       shr esi, 165 `; A; q. E1 ^' I" `7 L3 i8 E
       mov [ebx+2], si1 |# `3 A4 D2 [8 I' s
       pop esi) R. r! d& i+ p2 `% L
       sti# J# S4 }- ^0 m3 T9 t0 a

/ B0 Z! @; r/ L       int 3
. f* x! w' N9 T: J. t  P- X   }
' I# B# }3 e. l7 q4 Y$ N7 C}
! H+ y/ q( Y: @) [& B* Kint main()
- f$ Q- }" F6 P+ x{  v; a1 K+ j, ]" o, F( w2 ]
   char s[80];
# E. s% u' n/ t* \# ~  ^5 d3 `   register i,j;
6 ?: C; `( V% {. a   unsigned long id = 0 ;
# Z2 K" b  p5 V; t4 ^! G8 S, M/ R% \) C4 Z  G* I2 g
//特别注意:这段程序不能 Debug
, I1 r) D9 q  a- v: x( W& ^: T   for ( drive=0 ; drive<4 ; drive++ )
  I9 L8 X7 J* T; [, A$ i0 e7 R* t   {3 r# L* P/ B& @0 b& ?  R, `
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
7 y/ Q9 C. \+ E+ U! A       id = 0 ;
) B, L- K( R* k       al = 0 ;; s' Y2 X+ [% @; C9 x/ e
       al1 = 0 ;6 k3 X- C$ m* o7 r
       GetIDEInfo();' t2 o0 `5 b5 G( }! F0 @

; U3 Q1 `# S3 _       for (i=0,j=0;i<10;i++)
  t! M0 j# ^' M3 {7 u- k       {6 W1 Z# T' k7 e" m6 U
           s[j++]=(char)(pw[10+i]>>8);
* W9 A9 `- H% Z0 r# o# J5 ?+ r5 z           s[j++]=(char)(pw[10+i]&0xFF);
# s/ G$ ~- F) l; c       }
$ L& W2 A4 ]# x( A, X9 @& k: M       s[j] = 0;
  C* Z* [7 H4 S5 E- x9 A- u& c4 v8 {5 x$ A4 s
//        for (i=0;s;i++)printf("%d,",s);printf("\n");2 E( F+ I7 O( Q3 q9 P+ B" q# d
       printf("Serial=%s\n", s);/ \* e2 s* C7 V0 }4 ~

8 t8 q0 k3 ?3 ^" ]& y/ d       for ( i=0 ; s ; i++ ); D- V& W/ l5 C4 S6 {6 s
       {+ o) ?: q, x: M$ k: _2 U
           if ('-' == s || '/'==s || ' '==s) continue;
, @- n$ L, g; u3 k           printf ( "%d," , s ) ;
5 e( x- B: [" h' z8 z" g           id *= 40 ;        //10 ;) U8 H3 I( @1 ?
           switch (s)
" C- W  F  ^$ ^( G% c0 s7 W6 b& }           {& p4 B4 J$ H! Q* W" i) |# P( m
               case '0': id += 0; break;9 m. A4 h& J8 ?( ?; K9 V
               case '1': id += 1; break;
, g# @6 ?0 y7 }/ e) Y( G6 ]2 W               case '2': id += 2; break;
( X0 a! `* ~2 z5 E) |, j               case '3': id += 3; break;' ?8 c( e6 @1 w, w" V! e1 Q
               case '4': id += 4; break;3 L% p& e5 o! V1 C2 F
               case '5': id += 5; break;' ^8 g1 k. a+ Z0 f) y
               case '6': id += 6; break;
. U! q# [- y  ?% c/ _               case '7': id += 7; break;1 j* E, `. ]3 I# f+ \+ ^
               case '8': id += 8; break;
" _4 u4 i, n! R" [6 T               case '9': id += 9; break;; b. Q* h: c) j8 l5 m4 m$ C; e! D
               case 'a': case 'A': id += 10; break;
- X* P. X  Z- _4 t6 z+ Q               case 'b': case 'B': id += 11; break;
" y; F2 o1 |! o6 x3 d               case 'c': case 'C': id += 12; break;& U5 k" V5 q/ \2 K
               case 'd': case 'D': id += 13; break;
7 T) J1 y) p3 G: j/ G, u- `+ p               case 'e': case 'E': id += 14; break;
* W0 B% V1 u9 a% M7 s4 y/ D               case 'f': case 'F': id += 15; break;
, }" c! }, H0 E5 `: Y0 q- y               case 'g': case 'G': id += 16; break;
& j1 l* ]3 a' I& K- M% V               case 'h': case 'H': id += 17; break;
  V2 v' A+ j. e, K2 h. ^# `               case 'i': case 'I': id += 18; break;# a9 f3 Y$ E! |2 b* x
               case 'j': case 'J': id += 19; break;
8 v4 Q9 P8 z8 z* m4 y' v               case 'k': case 'K': id += 20; break;( r2 j) K/ T3 i5 X1 V9 s
               case 'l': case 'L': id += 21; break;
, _5 P! Q5 F4 p. C- A2 n               case 'm': case 'M': id += 22; break;
8 @/ s  d$ E- C: H               case 'n': case 'N': id += 23; break;# R8 e: @0 ^+ [% R9 S1 P" x+ k
               case 'o': case 'O': id += 24; break;
4 F" @& w9 {" R: t# o+ t$ g4 A" m: u4 {# b               case 'p': case ';P': id += 25; break;
7 N/ p4 }7 _9 W% Y3 P0 Z               case 'q': case 'Q': id += 26; break;, Q+ p: K; f/ _( v7 G( L
               case 'r': case 'R': id += 27; break;# H6 @( I2 }; f! F3 y, r0 _& g; {
               case 's': case 'S': id += 28; break;, k  r, E4 V) [
               case 't': case 'T': id += 29; break;
" k3 P) `# P8 R               case 'u': case 'U': id += 30; break;
! Q3 W$ j( s; ^2 l* J; H9 V               case 'v': case 'V': id += 31; break;, |6 ?9 h$ o9 R2 f* J4 L, L# B* {
               case 'w': case 'W': id += 32; break;
+ I- f1 c8 z4 |; g8 {               case 'x': case 'X': id += 33; break;, V* K& Q) y1 w* f' b4 V
               case 'y': case 'Y': id += 34; break;% b8 f: ]2 x! n4 ?5 H
               case 'z': case 'Z': id += 35; break;4 @- E& Y% |2 [9 Q  S# R6 A
               default : id /= 40 ;# ]8 S- D$ G/ W) [. I
           }  z; f& W/ M9 m' k  n$ Z7 {
       }, |) s% t1 ?) X
       if (id > 268435455) id %= 268435456;8 j7 z* T- S0 y; }
- ~  S- A) b5 J( e+ f
//        if ( al1 == 0x58 )
# z0 O% }5 u; S9 E# l           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
' T7 S4 F+ q0 ~* s   }6 r* O9 K4 O. X. C6 D' z3 @
   getch () ;
+ a1 u4 g3 o. J( {0 {   return 0;! W3 ]8 v) o- j8 h4 @6 ~+ p7 s# ?0 l
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 08:28 , Processed in 0.019326 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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