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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];
, F6 b$ ]# @, `8 O3 [  e
. h1 ~  R! k* [6 g; Bstatic DWORD idt, int_idt;* P5 i( _9 j2 h" `+ Q6 W8 l
static DWORD Base;# a& q. A" J, X, t5 J# l: T
static WORD Entry;  L: |( H+ L6 h+ g
% b( o, @# G9 _( C, [! d
#pragma warning (disable:4035)
2 Q8 F* U' `# h" j* I0 y1 zstatic int inp(WORD rdx)0 z$ X4 Q( y: ?4 K) J* e7 i* C
{
( M+ V0 b0 }" ?   _asm xor eax, eax
& Y+ r. m" A6 x1 T. j( }   _asm mov dx, rdx2 [" ^- M8 A7 Z) h; O
   _asm in al, dx
# @8 ^! {$ p# w}
$ A9 s% a, K$ T7 ]9 i
7 h$ @. a3 e$ Nstatic WORD inpw(WORD rdx)& b& v, Z1 M/ p2 ]
{+ x" [1 c( P5 `& M5 K- N" K7 G
//    WORD retData ;
; u" a2 V% L! {% E' x# W4 t4 _/ y' ?   _asm xor eax, eax
- I# h( o0 b5 S  H1 f( G& r   _asm mov dx, rdx
- m& y% D: H# F! M   _asm in ax, dx
- g& B8 \4 E8 [/ D. g//    _asm mov retData,ax
5 F5 y3 M; h! [& p. @" h& Q0 G//    return retData ;
8 v( s( B" u- c) R0 M- E9 d- y}' B" ?' G$ a7 y4 Q* [% {- Y

1 o4 O& t0 [& N3 qstatic void outp(WORD rdx, int ral)6 W9 L: X/ C- ~
{
4 l" Q7 @* i/ P. `. O   _asm mov dx, rdx
7 Y) W9 @+ H2 B$ z) y   _asm mov eax, ral- ?/ v+ d6 i2 Q6 G
   _asm out dx, al8 ^8 ?7 b& }7 o! F$ k9 M" q
}8 W' {# f! G" `% L4 c( p
/****************************************************************************/
+ n0 O+ q# I7 ~3 q  EWORD baseAddress;& v4 X. i# @% `' a6 G4 q
int drive = 0 ;0 R3 _  C0 P$ m' v
int al ;3 q, T3 l, S: Z3 g# T
int al1 ;
2 e; _# @. a! Z! U+ f/****************************************************************************/' l% f2 H* w6 a: t* I! j# V% z
static int WaitIde()
, I, U. i- s2 Q1 Z! K; M+ x. Z{
  e& C) X( a' I2 ^* Z( o   int al;
! e: Z8 T* H: P7 W( h3 Y! c   al =  0x80 ;- X" h3 P  K2 m- J
! i6 g* P6 l' q1 ~1 L4 P  @
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
& C) Z" v- f! N1 |9 m5 `! E2 |& J, T. K/ M" \' E# G
   return al;- u5 ~  D' p+ l
}
- {3 H: Y- Q) R2 h  m. v/****************************************************************************/
3 z$ [# N  W! ^* t2 n7 U  ?5 zstatic void ReadIDE()
& }# A& E# @% R{
$ h/ O+ y: f( t3 I% W) _   int i;
- ?, x6 m/ F1 f6 Z- n   switch (drive / 2)+ T0 e6 h2 W8 |6 O$ X
   {  Y* v* w# `8 E: R/ T9 D
       case 0: baseAddress = 0x1f0; break;
: [9 a, \: |% ^, A* g" d       case 1: baseAddress = 0x170; break;
8 x" F. e$ @4 T1 U       case 2: baseAddress = 0x1e8; break;* i2 N% c. ^8 B6 r( z( E* w& `/ o
       case 3: baseAddress = 0x168; break;0 y! l  p# Z/ M2 c
   }
2 c7 N8 c! P' I
( T- y( y, f0 D8 f* U   WaitIde();
' ~; w. U& k' r0 g. A! [) M: O   outp((WORD)(baseAddress+6),0xA0);
. L0 y1 b, h! A5 G* g* Q% q  K   al = WaitIde();
1 q& k' ?3 ?8 c  w( x
4 x2 j$ ^5 F) ~0 s$ O: a   if ( 0==(drive%2) && (al&0x50)!=0x50) return;& m& t* e' r' T+ B! s6 Y
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;
1 {( Q5 [; U9 |" ~" k' Y; T9 b
1 m+ n# a0 n/ _   if ( 0==(drive%2) ); a2 k1 i8 \( o  X3 h6 k! c8 Q+ E
       outp((WORD)(baseAddress+6),0xA0);+ u0 h% u6 p  _- c4 v
   else1 s. x# h( e2 K. ?
       outp((WORD)(baseAddress+6),0xB0);
/ L6 }) v- t" D% f) J' }: ]5 }/ V' |: z4 U1 Q$ [
   outp((WORD)(baseAddress+7),0xEC);2 U5 Y; O% F+ {+ w7 ^
   al1 = WaitIde();4 N$ ?& H7 n' o2 j: ?
   if ((al1&0x58)!=0x58) return ;2 s  P7 }8 b( N6 }
- m+ a' }) x8 V" _- w) ]4 Q2 {
   for (i=0;i<256;i++)2 J' r5 E+ C& }5 R- @# a7 F3 M5 |
   {# a5 t' P" R! F( Z
       pw = inpw(baseAddress);. z! y) d" o0 g1 ^
   }
, ~( `  l6 M* s7 M}
% k. |/ L) i* g* [3 i
8 C4 b  o3 P% dstatic void __declspec( naked ) NowInRing0()  y* }% w) D* U8 v0 O" R; i5 K
{& q' t3 ^& w, O5 w7 Z
   _asm- X3 i/ k1 Y9 I8 n' X: E
   {: m; d' g1 V* Y& n/ `
       push ebp
! c8 t0 z% b5 |* z       mov ebp,esp6 `! R8 [: s: R" c8 d) @1 x! @2 z4 Z

# b; ?4 \. ~- E2 j) R" M  x4 A8 f6 Y       call ReadIDE
1 k+ R2 ^$ R6 ?# A       cli
+ ^1 Q/ _, V7 N5 M6 \       mov ebx, int_idt
) P7 E# e& [8 ~$ o' f' k       mov ax, Entry
3 W' z/ n# m9 g5 C* |+ Q! \: }/ |7 Z       mov word ptr [ebx-4], ax' m6 L8 C6 o- I$ o
       mov eax, Base
, j0 I, o# @+ O" @. J6 R       shr eax, 169 `" a  n, ~9 V' e0 S- ?3 \. N
       mov [ebx+2], ax
6 o, F+ C0 B0 ~# z       sti
% {! C6 f3 J- a1 k& O) E( P8 l       leave$ `7 ~2 T  K' ?8 p
       iretd' ^7 t' _% k4 a  f9 P
   }5 E9 g, m/ N# Q, M; }/ c
}
6 ?9 x) R2 W* Y8 D$ m5 c; H
# D! y* F+ K$ l4 P2 }# avoid GetIDEInfo()/ _/ ~) I* Q4 U* @  m
{5 k$ _2 m5 T" o7 `) @4 P
   DWORD dwExcept;+ S6 V! [2 a# B( c* Q3 x4 ?' u# B
3 ^3 C  a- N! H$ j
   dwExcept = (DWORD)NowInRing0;
: v/ u4 F- u/ K
4 t& v" {& v, F   _asm+ @, H( i' K% l1 k: U7 @+ z
   {6 e1 a& `# |# ^- c/ W. e
       mov eax, fs:[0]
# K; N2 q% f+ @) [       push eax; _: |5 [) J! z% }
       sidt [esp-02h]
0 v$ L$ J7 x7 ~6 ?6 l       pop ebx
# S" d" ?3 P8 i1 R& M: ^+ i       mov idt, ebx
, x0 y. a; h1 u9 j: r3 l       add ebx, 0x1C
1 q6 o9 ~: ~4 C' @       mov int_idt, ebx' p9 \9 z: G) [7 r) C! p

* O% O/ g) ~  s% ]2 R2 S; P6 |       mov eax, [ebx]
$ Z! H) M- d. _       mov [Base], eax6 ]7 [9 J" W5 a  B6 d5 d* n
       mov ax, [ebx-4]# X6 H0 L# R/ h
       mov [Entry], ax
$ B) }: O/ W) K% L2 w
% e% o4 W, a! {       cli
3 Z- V* Q) v0 J       mov esi, dwExcept
9 k, x; O/ W& X) p! x: s3 E% x       push esi/ N- @$ J! g' |; V- Y( z
       mov [ebx-4], si
9 m- }7 c2 m2 y       shr esi, 16
7 c7 R: h& o- m       mov [ebx+2], si
. Q8 a% {! J9 i, r  ^       pop esi4 P2 v2 s; X" t: o3 c
       sti2 F1 d0 N7 F4 I( r! F/ p  F
: C- |6 i6 I% K  z8 W6 n
       int 3; e& D. |) J$ ~. V  B
   }& D3 n2 N8 x: N" z. a7 U6 r
}
  G3 H/ [$ B$ d7 [# t- t( Z" Fint main()
2 D- B; Y9 ]! v, _: w7 c$ i$ |. @{: B! t# H6 ?6 J- A& o) Z& H. L
   char s[80];  ]; i8 L  D9 l
   register i,j;! W- D$ P7 P* G/ e2 Q
   unsigned long id = 0 ;) ^" J( n- X7 _
; _% K0 N) r2 e  o
//特别注意:这段程序不能 Debug
2 D5 g2 x( K' i' @5 {   for ( drive=0 ; drive<4 ; drive++ )
& \. r, C5 L9 l+ O. j   {
3 x" d: R  n( i0 X0 Q" x% o       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
! ]7 Q' ^3 x) F3 ^: c       id = 0 ;
7 V" t0 i/ Q& J# E" k0 b       al = 0 ;4 K# D$ l( B8 r) C+ Y7 Q7 R
       al1 = 0 ;
  X8 N  q$ k! B3 N: ~7 N$ w) {       GetIDEInfo();
+ ?7 s' g6 o3 W( d' K) j  i5 D' @' E0 l
  [/ r& E* ]( ?4 A# ~3 h+ ^       for (i=0,j=0;i<10;i++)' ^3 v. J4 A+ w4 W
       {' h6 E' ^, c9 I5 }
           s[j++]=(char)(pw[10+i]>>8);
" Y7 i$ K: [& o; R           s[j++]=(char)(pw[10+i]&0xFF);
  J0 o3 _& V+ b; X5 k  @       }
  Y0 Q, q3 ~( W% H* `       s[j] = 0;( R% O+ |7 {0 q! ?0 Q4 U- c
* G- a( `% R2 a% u' a, R
//        for (i=0;s;i++)printf("%d,",s);printf("\n");
  \, O1 L( e$ I) Z3 z       printf("Serial=%s\n", s);2 I4 }) A" Z6 C& J

2 b4 b, \7 k; E. y; ?       for ( i=0 ; s ; i++ ); v# z" H" L0 {3 F; I
       {
5 e; u* U$ L1 q' R+ B# C           if ('-' == s || '/'==s || ' '==s) continue;
) U; S) r- h& [  O           printf ( "%d," , s ) ;
2 A; H9 C% U- y           id *= 40 ;        //10 ;  a/ f' A! @% |2 x* ]1 L
           switch (s)
# p: b9 ~) p9 ?6 P, ~           {
+ C- I5 Z4 ?% K6 M7 U& h7 Y$ I               case '0': id += 0; break;
7 X/ g# J7 j9 `               case '1': id += 1; break;8 e% c9 w( [+ I( J2 O7 k# u+ a! Q
               case '2': id += 2; break;( c" F7 U6 n. c: |* H6 S
               case '3': id += 3; break;
/ D" i/ I2 q% w6 p7 J" V8 o& y* S6 \               case '4': id += 4; break;
# x- z; L1 W' c$ h9 t- G               case '5': id += 5; break;
& h! P; w* Z. L4 b* v; P/ f               case '6': id += 6; break;1 @8 p& U5 z& M' ^8 }! C
               case '7': id += 7; break;
6 M3 r$ M. @- U' v6 M) c               case '8': id += 8; break;9 [0 J0 q( ~; S, d9 K" e" b
               case '9': id += 9; break;
+ N7 D) b/ e/ h               case 'a': case 'A': id += 10; break;+ P! b* [5 a6 A. m2 u" q
               case 'b': case 'B': id += 11; break;
2 r( c) e) k* P               case 'c': case 'C': id += 12; break;& L4 X0 d* j3 k% H: A0 z$ {
               case 'd': case 'D': id += 13; break;$ D7 ~+ E' G' r* T
               case 'e': case 'E': id += 14; break;9 H0 ~& p7 ~# ]1 O! E- I) I
               case 'f': case 'F': id += 15; break;
4 }9 P% X! }& u& [8 s1 C1 {               case 'g': case 'G': id += 16; break;$ Z4 a0 w2 s9 k0 a
               case 'h': case 'H': id += 17; break;
# ]  ]. ^3 U8 V7 r               case 'i': case 'I': id += 18; break;8 Y7 v) ]: h$ ~# O2 ^4 R
               case 'j': case 'J': id += 19; break;" \1 Z0 j$ H* ^  \: e
               case 'k': case 'K': id += 20; break;' m; t5 h' ^% E2 z( S+ o/ X) j; g
               case 'l': case 'L': id += 21; break;# w6 O- `" C( y6 T
               case 'm': case 'M': id += 22; break;
& C8 J2 h- G% I) g- K3 g               case 'n': case 'N': id += 23; break;( i# ~" k6 u% f. ^. H
               case 'o': case 'O': id += 24; break;
( i8 }$ W' d  z               case 'p': case ';P': id += 25; break;
- J* z" ]% S. j7 h5 H9 l3 u               case 'q': case 'Q': id += 26; break;
1 W: i7 l, z% ?               case 'r': case 'R': id += 27; break;
( x5 e1 Z: i9 T) f' i               case 's': case 'S': id += 28; break;
/ I. Q) q: d2 r% l               case 't': case 'T': id += 29; break;4 j. C. I9 u& ]  e" ?3 p6 Y
               case 'u': case 'U': id += 30; break;) K4 {4 R) N, [$ i" w; W3 }8 d
               case 'v': case 'V': id += 31; break;
( C7 L2 e& S  k: M+ X+ U               case 'w': case 'W': id += 32; break;
) {5 Q7 \9 [! j( O               case 'x': case 'X': id += 33; break;
" ~: B% A6 h$ Y               case 'y': case 'Y': id += 34; break;
4 p9 U6 j2 D! ~5 |* _) t' ^               case 'z': case 'Z': id += 35; break;
1 Q$ t. @" [& N; Z/ J3 c5 ^               default : id /= 40 ;. Z' f# O6 Z2 m9 F: F; |; _
           }
2 t$ V7 o6 z$ [% C       }! ~1 J: D! }! u6 g" U
       if (id > 268435455) id %= 268435456;
) `, H! d8 B8 ?3 _) _" `# w2 X& X' b% M1 w! L0 k
//        if ( al1 == 0x58 )
" r5 S7 f. O7 k, |; S           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
& x( p1 ]& l; J! ^/ N6 I8 V+ m   }4 ]5 d: k$ ~! r$ q
   getch () ;* Y2 N" q2 \8 E+ P
   return 0;
, S* T" V9 k& a& l9 [}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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