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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];* R" H& Z! J, q; v

' K1 M: _, m. estatic DWORD idt, int_idt;( I# |' H" v1 R# K$ }
static DWORD Base;
- M; X- {* _- f. \; p; f5 _- Bstatic WORD Entry;3 L( ^5 y/ A. g6 M8 l& r

0 e  d5 l0 q- i: a' K( P) \. e#pragma warning (disable:4035)
, E2 X$ q, a. Zstatic int inp(WORD rdx)9 w2 N& s$ U" S: F1 T
{" s3 V  b# e7 j1 Y# p
   _asm xor eax, eax+ G3 {4 Q7 |* z
   _asm mov dx, rdx
& R& z3 d2 o+ z! |0 @   _asm in al, dx( \5 ?* e2 u+ C1 i
}4 V' K) J% K' L" Q
+ ^# B$ ~$ ]' X$ [8 x! X
static WORD inpw(WORD rdx)
: D' }& a2 J% G; X) l{
( z4 X* k2 y+ T0 s7 |/ x$ d//    WORD retData ;' O; t1 E- ~$ z4 V# B
   _asm xor eax, eax
; u6 b) u6 B) g7 V$ z2 k   _asm mov dx, rdx
; D( T( |! f6 M0 A+ n' E! q   _asm in ax, dx
1 D$ d! e* ]( R5 T- \; v7 ?  j//    _asm mov retData,ax
0 s4 y7 j+ A4 A6 Z: b- a//    return retData ;
0 M/ k' O( K* B}
. T" q" r6 H4 m8 \2 E4 k- J
+ @; q' b. h& fstatic void outp(WORD rdx, int ral)1 b- y, `- t5 N! ]
{7 y+ X* r3 P1 R0 v  a5 D2 H/ ^
   _asm mov dx, rdx
  v( P. }! u8 ]% @! T" j   _asm mov eax, ral
  F$ T1 ?+ o! N! s+ y   _asm out dx, al
% W( D. n- z' j- h0 K}
. G* Z9 [# D( T& C/****************************************************************************/
/ ~( E0 j1 P! f/ OWORD baseAddress;: v: D" y* ?  j' [4 n7 N
int drive = 0 ;7 n0 b, N2 A( S
int al ;
9 p8 D, O; X0 _. x* w( nint al1 ;7 _( e8 Z  l6 M7 y: n
/****************************************************************************/
- d6 I4 B% }. Rstatic int WaitIde(): T- E9 J/ N( T' D
{: V% }) p; i# X/ h; V: e0 ^
   int al;
1 B  f3 K2 s4 |   al =  0x80 ;  z. O1 j5 ]; U( n3 k# L/ [

+ O1 f( m4 ~4 B1 g% Z   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
9 f4 d9 G: r& u
) P* R% O- d! Y( f   return al;
2 S) D) V# R1 e+ w! x& R}# ?. ]3 A4 X4 l- N
/****************************************************************************/. n% k, A2 f( e! m( o
static void ReadIDE()& Z* b# H- e& x" K  t
{
/ l# w1 C0 h& T   int i;
9 N6 R7 D0 C* B5 L   switch (drive / 2)' Z( i6 Y. F( @
   {
: M/ \. o, L' j& ?       case 0: baseAddress = 0x1f0; break;/ y  B& g& g+ F
       case 1: baseAddress = 0x170; break;+ Y( ^# t% f4 {) i; H
       case 2: baseAddress = 0x1e8; break;0 w, k, C4 A" O5 ]( l" X5 b
       case 3: baseAddress = 0x168; break;
! o$ P, J8 ]0 Y. t' T   }; ~6 }# h9 F3 x& s+ @! A4 P9 |
) U1 t0 e- @) K1 D
   WaitIde();9 G8 y1 _+ e, Q3 m
   outp((WORD)(baseAddress+6),0xA0);
" D+ w1 D- x# g9 @   al = WaitIde();
% h  ]- s+ l$ w% V* h& C  z4 @9 S5 N& g7 ]) ^, B( I
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;7 `( f2 l/ |! y8 m) R
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;
8 h) r! Z5 A' S+ T# d) P# g: g! W, i/ @* }
   if ( 0==(drive%2) )
1 L) ^: T( |/ M7 D       outp((WORD)(baseAddress+6),0xA0);
0 w* O. V& }  x   else9 o' B& k  `' p+ c1 `1 ?
       outp((WORD)(baseAddress+6),0xB0);/ m' b. Z0 l. `
' K: |8 }2 L4 _5 z! b- |
   outp((WORD)(baseAddress+7),0xEC);1 q  O0 N/ A$ [
   al1 = WaitIde();
8 u1 |6 I7 ?- @* V8 Y) P8 x4 h" Y   if ((al1&0x58)!=0x58) return ;) P/ w9 k3 q) [

  C/ ^- B% X6 G( p$ a/ H' B5 X4 }   for (i=0;i<256;i++)
, U! n3 V0 \' @2 t+ S  y4 g0 q9 V   {
" P8 B' A8 U! O  b0 H# L       pw = inpw(baseAddress);
( X$ G5 A/ t4 u" L+ ~: y   }
) a# A* e: }* `. W}1 G. j0 k& [# M) |" k& V

; q, ?8 i2 v" N0 ^0 }6 Ustatic void __declspec( naked ) NowInRing0()  d) Y; {' c6 ^+ M/ Z6 ^3 M
{0 S1 V! A% R7 J1 g7 _( j$ l
   _asm, o% a' O8 T6 B* B
   {
, S9 u4 B$ M" [; Q2 q& L       push ebp
/ S+ [$ z7 z: Y1 V! C       mov ebp,esp  L3 ?! q/ |0 q- O1 r
+ p/ ^$ o- l1 f2 @6 G  ^9 m
       call ReadIDE0 [/ n, E' n" v
       cli  [8 _* A" i1 t5 y2 n1 {
       mov ebx, int_idt9 f: J% B) t6 O: T% \
       mov ax, Entry
  H% j1 h% {, B' G; _. L       mov word ptr [ebx-4], ax
; H# h/ E1 Z- M% f& W* M       mov eax, Base: i- v& m, c4 ~* B& a& f5 `) @- N6 q  X# H
       shr eax, 16
# R: ~8 k+ O, l2 J& |9 V       mov [ebx+2], ax: A5 I3 h% J) ?3 \6 y
       sti4 R: F" P, z3 A3 I9 G2 O
       leave8 G* B* G2 O2 Y; m
       iretd
8 w" E4 q0 s% y8 y4 T8 \6 ]: ~   }1 R; r9 y% b% y9 d* A
}
& l0 F+ ^. f8 Y' i# A
2 ?: ~# ]0 w6 y% Lvoid GetIDEInfo()
6 z4 Q" Q, I  k7 R. d{" l9 D1 }$ C0 v  w2 ^/ [3 i, O
   DWORD dwExcept;' N' u% Q0 G5 t7 X7 b
% k$ R" }7 o/ e. N" D
   dwExcept = (DWORD)NowInRing0;- O$ T3 H" i1 B# ]4 O3 w

- D" E7 R5 p/ L4 y5 o' I   _asm# D4 F% v8 i" s
   {
/ \" G) l" i7 K: l* q# T6 U# Q  ^       mov eax, fs:[0]
. s* n/ j- G% t* _* J. j       push eax& J6 ^6 m$ w9 o, o* a" G
       sidt [esp-02h]3 z. c9 U: t& b+ ?) g" }+ L" ^
       pop ebx
1 d8 N6 i. O8 O3 F+ o8 U) D" J       mov idt, ebx
5 a2 e& m' I/ `0 k9 i       add ebx, 0x1C  q& X9 ~6 ^* n7 D% {% ]& c" n) O5 b
       mov int_idt, ebx  k$ D/ C' C2 y! v

  x1 R6 a/ L& ^( E8 p: x       mov eax, [ebx]
4 E( T2 P& A1 g' m5 [; a& }* s# y       mov [Base], eax$ p( q* _/ Q3 E6 _; S
       mov ax, [ebx-4]
7 k( Q0 O) Q% g1 @& h4 n4 Q       mov [Entry], ax0 A3 m, j  ~# F3 E
& v# w  L+ f: k. a( Y0 \# R7 v5 @2 G
       cli1 K. N- O" K$ X" V; z: _
       mov esi, dwExcept% Y+ C8 d! q8 W" q/ J/ l: s
       push esi: w0 q& c" f7 |+ z
       mov [ebx-4], si" m" o3 w/ s) z
       shr esi, 16: ]0 _8 ?  P$ b* i1 Y$ r, u4 {
       mov [ebx+2], si
0 l1 D6 p1 c/ V- j5 c- P' q       pop esi
  B; J" {6 J+ \5 S1 M" M7 z       sti
( [% t- n5 v  z+ Y# p
) {+ e: y: S6 _9 B8 q! ]       int 3
; }# ]( v1 x8 y, P/ U# ?   }
% J' H8 G# y* \  {}
8 I: x0 V+ W5 X5 T' C' i1 Nint main()
% E6 d) n8 h5 s* H{) k- ]2 m4 n/ J- t
   char s[80];
1 r1 W7 t/ K% S   register i,j;1 b" d$ R" |, A0 `6 c0 S: ^
   unsigned long id = 0 ;
+ K( }7 @; g0 f& @; a: g) ?# Z% Z6 m) w5 v4 V7 ~& X2 I$ h
//特别注意:这段程序不能 Debug. \7 p) d6 g: O, @$ b
   for ( drive=0 ; drive<4 ; drive++ )
5 o4 d; o) g" d) c   {
( L! H, I8 x9 |% N7 q# |- d       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
& r" {4 U! o( i; i: e6 A1 {* k       id = 0 ;4 q7 z0 N# r/ ?# G  S
       al = 0 ;
" y- Y, l. F) s  }* B, E       al1 = 0 ;  y: m: O8 \0 V( P& N
       GetIDEInfo();
0 h* E) D3 X( b  A
* A2 b# A# U# |2 d" s$ q       for (i=0,j=0;i<10;i++)
% n* X6 G# O1 P6 c* _       {+ [/ L0 z! [! }' I
           s[j++]=(char)(pw[10+i]>>8);
5 L( {% `. D3 E% {. s5 u           s[j++]=(char)(pw[10+i]&0xFF);; s, a0 B: `' J# R1 I% b6 c
       }0 x- I  L% B( K! i
       s[j] = 0;
  e4 E# H/ ~% q$ ^( q% Q) V. f
5 _5 q4 F3 ?# ^; y& w, w" E//        for (i=0;s;i++)printf("%d,",s);printf("\n");/ J# Z- a3 M9 g9 o6 y
       printf("Serial=%s\n", s);
, L4 s& A7 ?0 `- `
# @3 z- v2 v+ `- D3 ^$ U1 j: Z       for ( i=0 ; s ; i++ )
& x5 T$ {9 V0 ?* T7 k7 p  T       {
7 V3 j7 G; V8 _# Z( t7 D1 [           if ('-' == s || '/'==s || ' '==s) continue;4 Q1 l9 s# g) \
           printf ( "%d," , s ) ;
0 ], U: E' p* u4 Y$ y           id *= 40 ;        //10 ;
4 y% E% o0 ?2 [3 i. M: e3 ^4 t" q1 w           switch (s)
" I  m/ U0 K% Y6 X, @$ z           {. f' c+ ^& g$ C; k, |
               case '0': id += 0; break;4 o3 v- K1 k1 O" K1 y3 b: c3 ^( ]
               case '1': id += 1; break;& j% I# ^1 R% J
               case '2': id += 2; break;: Y1 l# E0 n8 t( f
               case '3': id += 3; break;
2 T, }; m; a3 ?. o2 o8 R( Y               case '4': id += 4; break;
( g! k& g" Q7 B' x! B% b! [               case '5': id += 5; break;% p$ r8 t( w; @2 t' X) f7 m
               case '6': id += 6; break;$ v- r, b5 G* d) s
               case '7': id += 7; break;" M( o7 H+ H6 p7 S1 W
               case '8': id += 8; break;
8 \# K  G$ x  R               case '9': id += 9; break;
5 f" R, N) S* w7 [+ S7 }. |" B# x               case 'a': case 'A': id += 10; break;" K8 ^1 Q! g/ c$ H
               case 'b': case 'B': id += 11; break;* |7 C! M3 a) x5 `/ n  f
               case 'c': case 'C': id += 12; break;! `$ q9 N( p) e, n
               case 'd': case 'D': id += 13; break;
8 Q- T; M  K- q, W7 i$ V               case 'e': case 'E': id += 14; break;! g0 K. p( S$ X# i# E8 i; @7 B
               case 'f': case 'F': id += 15; break;) j5 k" H8 r: B5 m$ k
               case 'g': case 'G': id += 16; break;: T8 W* p" {+ l% U( p6 @8 ~
               case 'h': case 'H': id += 17; break;! [( @. r3 t6 X6 G+ X
               case 'i': case 'I': id += 18; break;
- J) Z. n; V) z2 X9 F               case 'j': case 'J': id += 19; break;
0 M5 L  |, i' |               case 'k': case 'K': id += 20; break;: }1 \' g* j% I2 h" d* L' z8 b) @
               case 'l': case 'L': id += 21; break;* _5 ^! m) d$ `' {1 \
               case 'm': case 'M': id += 22; break;
% b  C5 a6 R2 [1 k               case 'n': case 'N': id += 23; break;: m: g3 E, y+ ^( p  I% e
               case 'o': case 'O': id += 24; break;8 M2 W6 c3 y* K/ l
               case 'p': case ';P': id += 25; break;
5 x& _* n$ A. [$ U               case 'q': case 'Q': id += 26; break;
0 H7 X5 V$ H0 V6 T9 a               case 'r': case 'R': id += 27; break;
# J) a7 L8 v) V% C6 ?               case 's': case 'S': id += 28; break;" C& X) }, `0 U/ a- U! P' S
               case 't': case 'T': id += 29; break;1 M; a8 G3 t8 W  t! @, I
               case 'u': case 'U': id += 30; break;
& ]* A/ }+ A) u" {; X2 h# n               case 'v': case 'V': id += 31; break;
7 ~  X5 f& [* ?' E) l               case 'w': case 'W': id += 32; break;
: `$ u- L- Y3 \5 x2 N0 V               case 'x': case 'X': id += 33; break;- k6 L2 m  w0 q8 ?
               case 'y': case 'Y': id += 34; break;7 E3 i' z( G/ P) `
               case 'z': case 'Z': id += 35; break;$ c( L  ]. \: b& _
               default : id /= 40 ;
! Y# Q5 i2 e1 Y5 E: ]: B           }( Z1 i7 @& U3 d7 i
       }/ M+ v4 R, V2 F$ L
       if (id > 268435455) id %= 268435456;- {# ?3 v5 J/ l2 t! K

7 k# D) H+ [1 t1 C! d  g//        if ( al1 == 0x58 )7 k2 U, T: }+ R8 u: p6 B
           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
- B6 x2 {# ?3 D/ s  p& x   }. c- _& y( P7 @: z5 j4 v7 ~2 @9 ?
   getch () ;
% r5 S/ B0 d- D3 W- c3 J   return 0;3 W! x9 y7 p6 i6 C! G
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:12 , Processed in 0.021446 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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