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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];) O5 M/ o$ ~% f6 d! u

' u* t/ ?8 B" `" D6 T0 F  Astatic DWORD idt, int_idt;% j# ?. ^" s, W
static DWORD Base;4 ]# Y: p: O9 R+ M( U' O# o8 @
static WORD Entry;1 o5 M5 i$ o! u, u

. q3 {- {7 |/ q5 C, ~) P9 z#pragma warning (disable:4035) 1 G) W' v1 P5 d" t7 k" o3 o
static int inp(WORD rdx)
/ V; \7 g+ E+ G! ^/ o( l4 j{3 x  {0 J( x! V4 x
   _asm xor eax, eax
) q2 s2 a( S2 K, b+ y& b7 h   _asm mov dx, rdx
9 V9 O/ L# G3 U$ E* ^  O   _asm in al, dx* n) p& d& o' p0 l5 \
}3 [2 I8 F3 B$ n% T5 w3 w& p5 f

7 M. u' B( N' ^% J8 Dstatic WORD inpw(WORD rdx)
$ j- A* a! q/ S+ q( j8 d8 [6 A{
& }# G  R7 {2 ?//    WORD retData ;9 v: p2 C( b; z/ B
   _asm xor eax, eax
( [, C* E, s$ d, E* y% H/ n   _asm mov dx, rdx
9 `7 p8 E& G$ g! ^) O( E% D3 [% g  D   _asm in ax, dx
/ D9 x# _8 `  q: `, G  P' S//    _asm mov retData,ax  ?9 ]9 S, c; I, f. d+ F* h
//    return retData ;) S1 g* ?( H$ g2 [
}
5 Q2 C4 }) |; }5 B: V4 E/ H+ g$ {' P0 T$ M3 S
static void outp(WORD rdx, int ral)
1 ^' K8 ~0 @1 Q4 X) _( v{' A6 M/ P& K! T5 ]4 Q# s4 S8 m0 i
   _asm mov dx, rdx* W; w/ b( U3 E; D5 D7 }# H; H
   _asm mov eax, ral) S2 z- A8 f( S. u6 _
   _asm out dx, al2 h8 P1 X9 ~4 M  H2 b
}  s! Q) E; {! y- O+ u& n
/****************************************************************************/
3 W8 x* E/ a- I! R6 M. FWORD baseAddress;9 N* }1 h; Q: W0 r& X/ }7 T5 Z
int drive = 0 ;. ^' \$ y. ]) u! Y& J$ m  _
int al ;
) a5 O- L% ]! aint al1 ;! b5 P. [0 l# i, l  A2 K
/****************************************************************************/
1 H2 z4 P( b4 e  @/ ?static int WaitIde()
- [* t  g2 w; v# q{$ f$ p% `3 [* V7 Z3 k; ?4 n
   int al;
; w* U( _8 Y+ S% ~1 j. Q9 T  h+ A   al =  0x80 ;
6 ?) H. j) r, ~4 ^% a1 k. z) U' [- L7 q0 z6 Q$ [8 Q" ?2 k& Q3 Y
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;
) j6 ^, F. O7 z& I
9 ]2 Q+ \" Y& m  L1 o2 B9 g   return al;
& }# q+ V. z7 l# J$ Q}* Z  J( M9 q2 e
/****************************************************************************/
" @. r. X0 d5 x1 Lstatic void ReadIDE()
+ V) I7 I9 e; v2 M0 I7 K5 r{4 T* m% E: f# t2 `, g) {  Q  K
   int i;) q! F. [4 O* y0 b9 A3 ^/ i+ [
   switch (drive / 2)4 {! _6 v  c" |0 ?, I8 C
   {
9 I3 `! H7 q1 n% ]' S3 T( h4 P+ X       case 0: baseAddress = 0x1f0; break;
2 I0 N- a- C& ]% |4 E" E8 u       case 1: baseAddress = 0x170; break;
: M8 S: k: R7 |, o7 l       case 2: baseAddress = 0x1e8; break;/ i2 g& F5 V3 b" o
       case 3: baseAddress = 0x168; break;+ ?0 \+ d0 y  d; ~
   }+ V4 P9 O# [* X  `7 u
9 w4 B6 B- o# v2 L9 e
   WaitIde();$ ~; S0 ?- {6 R5 ]. m2 Q
   outp((WORD)(baseAddress+6),0xA0);/ r/ J# _1 P, i5 \2 S$ }9 J% I
   al = WaitIde();
8 e( U+ @- t; M% q/ ?& ]8 }1 ^2 q$ \  u7 V  s% I# Q
   if ( 0==(drive%2) && (al&0x50)!=0x50) return;
6 c" L5 T; i0 _. l2 q   if ( 1==(drive%2) && (al&0x20)!=0x20) return;; R7 T  [7 q& Q& V* @+ b

& I$ Y* l7 w2 c: y   if ( 0==(drive%2) )
9 Y. s- s- n+ r       outp((WORD)(baseAddress+6),0xA0);" a$ z% J& Q( t# o
   else
# p: A5 j, `2 W' J+ G/ G' n& W       outp((WORD)(baseAddress+6),0xB0);; K# D7 w, E6 X- h$ L4 V% _
2 t3 X( U7 r6 s. i+ u7 l3 S1 G
   outp((WORD)(baseAddress+7),0xEC);
3 }8 @& g7 E7 z5 C' ^   al1 = WaitIde();  ~: P+ s2 l' v
   if ((al1&0x58)!=0x58) return ;
0 z$ O3 V; L  v+ |# H/ s  l5 F- R' f( [) n3 ~
   for (i=0;i<256;i++)
9 D4 K& t, Z% \$ Y) Q% K   {$ T- t+ h. ]: s$ U  _( F
       pw = inpw(baseAddress);
2 V; r' y5 A. F; d& ^/ x5 |( X   }: W  C( {7 f* E3 K
}/ U4 q2 J) k% Q

! F6 a& X; M4 ]7 astatic void __declspec( naked ) NowInRing0()
+ \, D' S: ^0 o/ J3 e{
( o& m" Q, Q( {   _asm; v; ~. C5 t# f1 z7 L/ s8 {
   {
; d8 o# \8 W% j) l1 B/ Y! r  X       push ebp
# h0 P9 h- Y; }8 j       mov ebp,esp
" K: m  w1 e; r6 }* g( Q& B9 q
1 @% m; f" c5 e5 j. N3 [/ X       call ReadIDE
# X2 V8 B7 B' M: X. `7 l       cli: |' l, M# h2 w7 e
       mov ebx, int_idt: `( B2 M6 n; e( l: V
       mov ax, Entry
& f6 i& L; U# N$ l       mov word ptr [ebx-4], ax
2 D/ r6 t8 b& v' D* I1 [0 n       mov eax, Base
1 Z. P0 e( z$ S       shr eax, 163 ~& C' \. k& o# a- g/ n
       mov [ebx+2], ax5 P* F" e- ]' C& F; o- C, u9 J
       sti
) `& ~: @$ o6 a+ U$ O$ z       leave
- @  q1 v# C; g# H8 I6 i4 y       iretd0 [7 ]* }$ o' y6 m
   }6 g$ k& X- r/ j9 C# u( p
}* e  |) Z9 k) P# L; ~' l0 e" k# Q
" T7 i8 S' g) D
void GetIDEInfo()
7 \8 f! h( b' P7 k{! w2 T6 O! ^; ?! j7 a1 ?9 x0 M
   DWORD dwExcept;
* W8 N+ P; A" w6 ]' Y' s
" ?# R/ Y& p/ t* K# [   dwExcept = (DWORD)NowInRing0;
) @9 q# P2 |( U6 @3 p3 ^0 G7 q9 j' B/ t( O: \
   _asm: N+ y& ^' B& [9 B5 d
   {0 q  K2 b+ S6 c- q9 [& g4 t  F; G
       mov eax, fs:[0]2 G( M3 H; O; a
       push eax% p) j5 F2 U) B4 N. H% u5 ?
       sidt [esp-02h]
9 I2 B& k: m! N" E5 B4 K5 {       pop ebx9 m, T! K1 d' d; P8 Q
       mov idt, ebx
" }/ V; `/ S/ L% |( ~: l7 }       add ebx, 0x1C" w5 O5 W# O  _* p7 s
       mov int_idt, ebx0 c* Q3 K! {& b3 t+ A5 ~( g2 G
3 R: t! A* f6 x
       mov eax, [ebx]
+ L' i$ O! x  }       mov [Base], eax' P% S. y9 o& U( V; }* a0 ?" O8 B/ r
       mov ax, [ebx-4]
* ]/ a4 j* ]3 O# B& a8 F       mov [Entry], ax
/ L1 S5 c& j$ k& s4 Z7 j8 i2 I7 Q/ O5 T: k' U! J# M
       cli, ], w% o0 \3 C7 d6 \) ?
       mov esi, dwExcept
8 w7 a  P+ t/ {8 M5 y* F* P       push esi7 n5 o; R9 e# W: W' }
       mov [ebx-4], si
, t0 s6 v* t) y7 f: S% e       shr esi, 16/ N# U3 i; e. r; ~
       mov [ebx+2], si
! o- q# b1 e( U) f6 l; j       pop esi) s* i# E4 C# @& D* n+ b' G+ w5 F
       sti' D# @: B2 m8 A7 H" z# }

" T+ O( R* ^& e3 l3 q+ A       int 3; l! C) A# d* r/ |2 F+ w
   }
2 j) R8 _4 [$ g" S}
% p2 o! l8 J7 d% n9 gint main()
% T: M  g+ C, u5 [# f* N. t{
* ?* d+ b3 |9 o7 A* K. Q0 ~* ?9 i; x* q   char s[80];
. }/ R+ X, T0 C' q" q* B1 {4 c# c  i   register i,j;2 U; q2 @% l; w1 \; I
   unsigned long id = 0 ;
2 O& O6 N& D, @% Z- X  E: e2 |/ x
0 y' c: [) \- x5 v. X. c//特别注意:这段程序不能 Debug/ E6 o9 u" g4 }/ s
   for ( drive=0 ; drive<4 ; drive++ )
5 V" }" V) ?* N$ N8 ~1 ~" A2 w- ?   {
6 T7 F* B* y. h3 }, `2 Q       memset ( pw , 0 , 256*sizeof( WORD ) ) ;  ~2 `5 G1 O7 Y. H6 i
       id = 0 ;, f( A& h" x/ T! Q1 ^6 |
       al = 0 ;
9 ?. Z3 z" T5 h3 j7 J       al1 = 0 ;; v1 I0 L9 [7 d
       GetIDEInfo();
+ I$ c* Y3 B4 Z2 @; A2 _: C
9 c* c' b1 k) S/ G5 L/ y1 D$ x       for (i=0,j=0;i<10;i++)6 S; F' w# B) x# \* ~5 B7 D$ W
       {
  }2 h+ v8 @- ^! s           s[j++]=(char)(pw[10+i]>>8);
1 b6 c. g/ {9 S           s[j++]=(char)(pw[10+i]&0xFF);! [( U9 t2 f. v( ]% B
       }9 _9 Q. O# v$ l9 ^$ x8 C% Y' ]3 h, m
       s[j] = 0;
8 z+ h" n7 _' V. N, P
4 O4 g8 C) l1 g1 b% t//        for (i=0;s;i++)printf("%d,",s);printf("\n");/ V9 ^& B: \( {; G2 @
       printf("Serial=%s\n", s);
7 J5 d0 G+ J# s; C3 L, [+ W( l. P. `* A: x$ B7 t  {8 h7 |
       for ( i=0 ; s ; i++ )
3 C/ b- L* P5 E; c8 ?( c4 j       {
( v# X' C- Y8 f           if ('-' == s || '/'==s || ' '==s) continue;) n9 z2 G# }* R
           printf ( "%d," , s ) ;+ ?3 `* K& ~9 d  o
           id *= 40 ;        //10 ;
0 Z: O1 l1 n& v8 N3 I2 W1 ~           switch (s)
7 }8 a/ {- `9 P8 B           {' ^# j  q7 T7 v3 d' T9 L) W
               case '0': id += 0; break;2 T! E3 V+ u: J
               case '1': id += 1; break;
2 w6 ~$ N6 d+ }- r) F               case '2': id += 2; break;; R5 l5 y! X+ e5 t3 m; J
               case '3': id += 3; break;
$ k% [# j+ Z* l  Z* w2 }0 t' y               case '4': id += 4; break;! \$ g4 u! B8 ~" S- D9 s* b0 \
               case '5': id += 5; break;
  n% a1 t2 n0 ^               case '6': id += 6; break;) A# ~5 K, n# C
               case '7': id += 7; break;3 Z* t8 z/ x8 e$ L
               case '8': id += 8; break;! }  w$ R% J/ ^# b
               case '9': id += 9; break;
. U$ m  e; k, F- s& F: D               case 'a': case 'A': id += 10; break;( F: d$ O4 c* |8 e4 d# Y  V% }
               case 'b': case 'B': id += 11; break;
. r9 T( C9 U3 M" z6 U4 p               case 'c': case 'C': id += 12; break;
! E9 y* K4 k* K+ S               case 'd': case 'D': id += 13; break;
0 I/ w8 ^( w" m7 K0 U9 l6 V" J( M               case 'e': case 'E': id += 14; break;0 m% O* R$ p/ l5 _! U, ]
               case 'f': case 'F': id += 15; break;9 k, W$ X& ~& [
               case 'g': case 'G': id += 16; break;
7 `0 m8 C# h3 a               case 'h': case 'H': id += 17; break;
. L" i6 T* f: N6 a! I- J7 m! @4 D               case 'i': case 'I': id += 18; break;/ V- E* T0 c4 X3 @
               case 'j': case 'J': id += 19; break;% W9 m# g: I: Z* M
               case 'k': case 'K': id += 20; break;
- e! I3 j7 i+ J5 Q( C7 }3 m7 I2 v               case 'l': case 'L': id += 21; break;
; Y' K9 M+ g6 d$ n               case 'm': case 'M': id += 22; break;0 j. r& _& G, h! T" o+ c1 a; a7 D  l
               case 'n': case 'N': id += 23; break;
2 }2 Q3 s0 D) v/ e               case 'o': case 'O': id += 24; break;
7 ~1 N2 o! V2 V  e$ e% o2 x3 N( _               case 'p': case ';P': id += 25; break;9 F! u# s8 n2 T4 C
               case 'q': case 'Q': id += 26; break;
: |" U* j+ P* X& v3 H, k               case 'r': case 'R': id += 27; break;
- U; K( _& I6 B" e               case 's': case 'S': id += 28; break;
; f0 X6 }$ U- C7 c               case 't': case 'T': id += 29; break;2 P' D' ~6 p/ Y+ W
               case 'u': case 'U': id += 30; break;
0 T- o& e! ^- f               case 'v': case 'V': id += 31; break;, s/ S# [# T" g+ H8 l
               case 'w': case 'W': id += 32; break;
$ O3 P& J/ n! C$ n/ u" I               case 'x': case 'X': id += 33; break;
8 C7 W8 O7 D9 J( X               case 'y': case 'Y': id += 34; break;9 Q5 l6 s; F7 M8 w+ v+ b
               case 'z': case 'Z': id += 35; break;8 A( b0 h1 ]3 W, ~6 k
               default : id /= 40 ;! v, [8 A0 o% w" I; k) [$ ~4 l
           }
3 h0 z+ N, A* i& z. y       }
$ }6 P: M' X1 r+ z- Q9 @0 {       if (id > 268435455) id %= 268435456;& C- w; ~9 s) L& y6 {

  y5 C% E* q. V8 ~//        if ( al1 == 0x58 )
; g/ N" W- y4 E           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;" L6 n0 F' j2 p& Z: b- F1 S
   }
) y& d& j4 K7 v: Y1 q- i   getch () ;% C" b6 r( Y" N$ y4 E$ @. l
   return 0;& ]  I8 {- F$ o% g- V
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 08:51 , Processed in 0.034963 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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