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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];9 Q9 `" o7 A0 e, m! {

: p7 S: j2 l$ D2 h  ustatic DWORD idt, int_idt;  K- @# h9 e& f1 F% m" U  T
static DWORD Base;* B& x' @) m. R& h% i1 @
static WORD Entry;
8 F; B, ~8 b, C8 q4 A- e( c  ?
6 R6 f! x* Y# \# f1 u#pragma warning (disable:4035)
, ^% g. ]7 o( {6 {$ [/ h  `static int inp(WORD rdx)
* S) K: [6 {) r  L  t{
+ w+ p/ s0 s# I! s# z, A   _asm xor eax, eax+ T0 h4 k4 c; E: j5 c& {. z0 H
   _asm mov dx, rdx* g. r& Z) S7 ~3 ~$ `9 a' x8 \+ |: x3 k
   _asm in al, dx
- Z. z! E$ g8 s6 `6 @+ Q& Z+ D}
; S1 w5 S# X1 i) M; [% B9 G6 d( k1 x5 G
static WORD inpw(WORD rdx)9 i# b  Q$ h" q" o+ {9 g
{
, P1 Q7 V# j2 S! N//    WORD retData ;
' B: g; J2 K0 [! u4 v   _asm xor eax, eax
  a% t, c8 x" f- t8 M* J   _asm mov dx, rdx) u% M% L& x) X9 E0 G, T3 Z' e
   _asm in ax, dx: `3 j) ?) W: o& P5 y, r
//    _asm mov retData,ax
2 S5 Z- n# H: N0 j//    return retData ;
! M; n3 C! f2 O5 y* n}
$ Q& x7 ~" u1 c8 P2 o
1 f/ M# H- c! `2 w/ @static void outp(WORD rdx, int ral)* o9 q1 p! K) i* l8 [3 q! U& V6 e
{5 O. [& O$ B3 H( q
   _asm mov dx, rdx# b+ f. @3 @+ [1 h; ]$ p- ^' E
   _asm mov eax, ral
$ Y* [* {5 P: S. b+ I" N  g   _asm out dx, al; {* w9 ]* p4 x& ]7 i9 q* e; S
}- J' t7 S  p7 ^. H) s/ h. D
/****************************************************************************/5 {4 I% m) q) Y4 D
WORD baseAddress;# s& K7 Z6 U% E
int drive = 0 ;. x: w6 \4 q& ^5 C
int al ;& ]" m8 H  a: p4 e% I
int al1 ;5 _1 s% ~1 z* H) m1 j' ]
/****************************************************************************/$ H& \: i2 A4 I4 Y/ ^. p5 ~. T
static int WaitIde()
* v/ Q. L/ P$ W. P{
. E6 A( m2 T  D! |& W3 Z   int al;9 y! [; J* y5 Q" {7 c
   al =  0x80 ;2 r+ t& H7 P# L( N% P
/ t1 d% F; J* Z
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
+ a6 u$ i" K" _5 k1 K1 [  b  s8 n
: m3 T- k8 \! G" j/ v   return al;
' x+ o3 M2 d+ F2 L( p}
# T( u* Z, @, _3 H$ B, ]/ j6 m/****************************************************************************/! ?8 P+ s1 Q& q' R/ ^9 o
static void ReadIDE()& _$ Z' z" L& n  v6 h7 }
{
! C4 H" f- q9 Q, f) R* ~, e   int i;
/ {- H$ h/ @" o( g# y   switch (drive / 2)( Q! L& `8 ]9 j" A/ V3 ?( s
   {# V: K# K/ a8 B- N1 [+ u
       case 0: baseAddress = 0x1f0; break;
: G* |: x2 K( U, z6 {       case 1: baseAddress = 0x170; break;
! s7 A: I% D3 e, h5 o8 O       case 2: baseAddress = 0x1e8; break;
( i( J) {- [( W' \$ Z/ K& f  P       case 3: baseAddress = 0x168; break;
+ y/ C7 }- Y% B1 G( M4 {   }; X# U, v7 f: l

' \/ p& g3 ~$ e   WaitIde();+ L; i/ [! o& M
   outp((WORD)(baseAddress+6),0xA0);
$ N3 Z; @+ [' Q9 Q8 Y5 w8 h- b   al = WaitIde();' b( d# e: _6 n& R0 b( c8 z4 g5 M
* E. ~$ F; o' T4 X; E
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;
% s( N, w, j" ]1 l. E& c0 x   if ( 1==(drive%2) && (al&0x20)!=0x20) return;
! R2 j& o+ e! c3 v- D, D5 k6 C( m7 i; y* B# ^5 X* ~
   if ( 0==(drive%2) )+ F" N/ l* E0 I; ^; V
       outp((WORD)(baseAddress+6),0xA0);
9 D' H$ I, Y% h" D   else; a/ E! d8 R5 b( G# T
       outp((WORD)(baseAddress+6),0xB0);/ D6 t5 _4 Q8 X. {3 V& ?  J5 F( m" B
1 I: x- R9 |7 r7 X+ Z2 O6 ?
   outp((WORD)(baseAddress+7),0xEC);) ]0 M: y# r; ^: Y$ `- L
   al1 = WaitIde();+ ^% V; r% {# ?6 ^( h/ D
   if ((al1&0x58)!=0x58) return ;
& A7 w6 b% x0 r& L  |5 ~# _9 ~
) i2 t* ^' f, J3 H  q, z   for (i=0;i<256;i++)
* a, d* f! h3 T2 g$ F5 D( T   {
+ c; u, N2 C1 f       pw = inpw(baseAddress);
) V* ^6 i9 o& K0 l/ P   }2 E$ ~+ u( O; g! ]0 i- _1 Y; X
}
3 i( a8 d3 [3 q* O/ W8 u3 X4 N) u8 I) L  [  \
static void __declspec( naked ) NowInRing0()
5 y, o7 Z8 [( Q{
1 k3 R, S; d8 A5 Y: [& O4 l5 ?   _asm& X& }$ Z8 H( u1 H* ]( R
   {
; q6 Y) Y0 K6 n       push ebp' `$ d2 [4 S5 T! Y: Z1 H+ W
       mov ebp,esp+ ^! n+ G7 x: r' R; [4 [4 H: P

; T3 X" V7 S" X2 ]  l       call ReadIDE5 b% z  ?$ J7 I6 n0 x6 J6 }
       cli
& Q* a' ]: u: W6 Q6 g9 }       mov ebx, int_idt
8 P0 ^/ K8 F# G2 J0 b       mov ax, Entry  C: I9 t1 s  U# Z. f( O: I, J& M' N
       mov word ptr [ebx-4], ax
; p1 [) _& R3 D% Q  F% j$ U       mov eax, Base
( A. `8 E& D  j5 Q$ T       shr eax, 16; N# M# i+ G- ^3 \/ ?
       mov [ebx+2], ax
7 x6 \$ Y; l7 }8 R6 [: }4 J5 q- f       sti" U- p4 p& W; \8 Z, ]6 k" R; \& C+ A6 m
       leave
# \4 [1 V$ h- ]       iretd8 y  ?2 W6 t# X) t9 `
   }; d% W: B0 I' k/ Q+ P4 S% ~2 I5 G
}& u0 {# A$ U+ N7 F5 s
5 O6 J" s  \7 l5 t( K6 }/ g
void GetIDEInfo()* J) v7 h+ Q8 [8 m# O, M
{
0 o& N# u/ q' `- a' ~   DWORD dwExcept;
* o3 e7 D) A& K4 D3 k, l7 y1 D
! _! Z6 {0 _0 X: Y3 g* r   dwExcept = (DWORD)NowInRing0;9 O' m: v7 Z& j, F1 i

% H" S( ^+ F! {' H: K- H   _asm
( i: z3 d2 [/ Y, N   {
2 W+ D  i+ b* s7 l. T       mov eax, fs:[0]. {: _( t" ]0 K& B* a) [7 i4 o
       push eax0 ^% L% s8 }, Q$ h: `
       sidt [esp-02h]
) e$ g6 e5 [4 g1 c3 I. [! A       pop ebx9 |# i* o: Z' O
       mov idt, ebx
0 U2 |1 `! U. v1 ?  P  J# F/ {       add ebx, 0x1C
& ?# p( y, q6 I2 k- c/ l! t. U       mov int_idt, ebx
3 s3 _4 v1 N& w% ~. h( A
& L% ], Z# m1 x6 q3 s8 g2 n       mov eax, [ebx]8 n# v, v- P( x! e: R- R
       mov [Base], eax
; X9 C% ~; n5 S       mov ax, [ebx-4]9 T# E% I6 ^1 I+ b
       mov [Entry], ax5 ~) ^( c. E2 N6 Q  a; Q
5 [0 X" f8 O8 N) R
       cli4 \3 y9 H$ _3 t/ a# {
       mov esi, dwExcept
0 F3 ]7 j2 P' t; u       push esi, u# g& M* [3 M7 E4 j$ g1 t1 {$ `
       mov [ebx-4], si
4 c/ |2 A! q/ N       shr esi, 16; I& ^2 u1 [2 ?
       mov [ebx+2], si
6 S: M/ {. I4 ]       pop esi1 i. c1 s, x  H7 ~1 g. y
       sti
8 {- B) o4 c: Y. F" _3 b
- q: U0 }! c$ I3 n2 }7 U: \9 G% d       int 3
" y, a6 c9 A. @* g& ]& G) c   }$ O  D: q/ y; d6 T3 D
}
5 O* I. l* |9 Qint main()
- ^' @0 _- L; r$ K/ I# a8 _{4 ?" |; g: Z* F# x1 O( x
   char s[80];
; B9 N" ~) w( s! S+ A   register i,j;1 @& M8 f, Q$ D8 I
   unsigned long id = 0 ;
" A$ l4 X& w/ y2 W7 J- r' H" j4 N: d- q* E
//特别注意:这段程序不能 Debug4 U0 P+ o/ Z4 k7 v$ Y, N
   for ( drive=0 ; drive<4 ; drive++ )
* l, U- @& H( ]& i, l% _& f" h   {" P& ~2 u" Z( I" \- N1 i
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
3 u3 [* Y0 w( ]  Y% l       id = 0 ;
$ C5 o$ M; b& W/ p5 [       al = 0 ;
0 Y+ r, ~0 s1 o* p5 _" l       al1 = 0 ;
- d) t* F7 O; j( M       GetIDEInfo();
% L4 C- ~* |4 D: V2 i& W0 v8 j: R' h; D( }" ~: ~
       for (i=0,j=0;i<10;i++): a$ ^+ ]* e% O8 t
       {
+ s' h( P' y7 G* @( |; z* D' m           s[j++]=(char)(pw[10+i]>>8);
4 `9 c8 b' g1 V& W0 @  ?( f7 R- A4 r           s[j++]=(char)(pw[10+i]&0xFF);
9 H4 A+ [3 c! u8 W* K0 F       }$ D# K  j' g2 F4 C8 r8 M/ W) u
       s[j] = 0;
/ ~4 R* }! i. X* S2 u) Y
7 D) S' ?3 o; g  V//        for (i=0;s;i++)printf("%d,",s);printf("\n");" Y( A/ n  W( h
       printf("Serial=%s\n", s);
) _- [4 d4 `& v" h/ h/ m  J  A/ a. M
9 v* ^. ?, _/ ]       for ( i=0 ; s ; i++ )
; N$ a5 _- ^3 i; R" }: i/ X       {
, v+ S) i( L6 @4 Q' D           if ('-' == s || '/'==s || ' '==s) continue;
; d8 P  W& `& @           printf ( "%d," , s ) ;8 h8 o7 z# M+ R( M/ V
           id *= 40 ;        //10 ;3 z* g& m0 h7 M. q
           switch (s)
& |; K! p+ X, |           {. K! z" }; o' {/ W% T3 H6 q) ^
               case '0': id += 0; break;
8 ^* i) O7 w- T2 v' m& A0 g. p7 W               case '1': id += 1; break;/ U! E: {! P2 o- u
               case '2': id += 2; break;) J9 Y- f" A$ P2 m1 W  O( [' _( A: Q
               case '3': id += 3; break;" T. |0 W2 Q8 B2 p' d
               case '4': id += 4; break;
% W5 q, Q6 @& V+ a' {6 [+ |) A* j               case '5': id += 5; break;
! c- u6 S% K$ p! M               case '6': id += 6; break;6 H5 I. A" K& ^# `
               case '7': id += 7; break;( a- ]# H- x/ b1 j( z# q) c
               case '8': id += 8; break;7 ^" _& M$ h8 I
               case '9': id += 9; break;1 S, O: }/ S0 n* d
               case 'a': case 'A': id += 10; break;
2 z8 j, ]* Z+ g               case 'b': case 'B': id += 11; break;
$ l- `7 o2 d4 L* l% R               case 'c': case 'C': id += 12; break;6 m- e/ Y0 [' z% a- b8 E1 G
               case 'd': case 'D': id += 13; break;
: U* {( p. o+ m# X) h               case 'e': case 'E': id += 14; break;
( N( o. G6 U0 _1 }+ D8 z( [) C6 B               case 'f': case 'F': id += 15; break;  y7 L& B9 g2 K; h: x7 C/ I( D  x
               case 'g': case 'G': id += 16; break;
! a* U* F6 [4 I/ F               case 'h': case 'H': id += 17; break;3 n. [( H) k2 C3 K" b
               case 'i': case 'I': id += 18; break;
. |# K' I4 r6 H; M1 o$ K               case 'j': case 'J': id += 19; break;
; l+ n3 D( ^1 k, C               case 'k': case 'K': id += 20; break;
  A# o# o5 e0 M3 x7 f5 h# V& o, |               case 'l': case 'L': id += 21; break;
6 c2 d8 P( l; C" Z# u               case 'm': case 'M': id += 22; break;  P) u5 K  ]. H9 R
               case 'n': case 'N': id += 23; break;
; X8 ^9 Z. Q5 @& O5 d               case 'o': case 'O': id += 24; break;
5 ^; s  B6 Y$ U$ U# J( J3 o- j& G               case 'p': case ';P': id += 25; break;8 x  R1 Z( E: }# e! X: c. a' @' c: M
               case 'q': case 'Q': id += 26; break;
/ |# Q# f' J8 j' D               case 'r': case 'R': id += 27; break;
  `1 N6 H5 O! ]5 {1 @+ p               case 's': case 'S': id += 28; break;( c9 Q* o) B; p2 e% x. N
               case 't': case 'T': id += 29; break;  `, C% |. g& u  \, l
               case 'u': case 'U': id += 30; break;2 S$ B, D0 ]/ a, a% H9 w0 M
               case 'v': case 'V': id += 31; break;+ e: R$ ~! P9 F1 h
               case 'w': case 'W': id += 32; break;% h7 s4 {- |8 ?, F
               case 'x': case 'X': id += 33; break;5 P# ^" o/ y+ U! V
               case 'y': case 'Y': id += 34; break;
  X$ F1 k4 |9 Q               case 'z': case 'Z': id += 35; break;# _) V- y$ E0 s4 g, G: F
               default : id /= 40 ;. Z# c$ b4 b" L/ J7 o
           }
" V/ b- ]) o' E( P( m* y       }
' a) Y+ L6 r4 W       if (id > 268435455) id %= 268435456;2 _! y* D& t! V

- t+ f6 V; D: L; o2 ~+ K//        if ( al1 == 0x58 )
' ?% O) @/ L1 L- }1 d  y7 h           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;3 B* J2 d6 I% V
   }
, H$ {: d0 w& U4 e7 ]" g/ D   getch () ;
+ v4 F% u0 J6 K& i   return 0;
- F" c  L7 B" k; q, Z}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:41 , Processed in 0.017484 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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