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

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

  [复制链接]
发表于 2006-3-11 14:49:04 | 显示全部楼层 |阅读模式
WORD pw[256];
. K( }8 }0 w1 K. F  j* {4 D+ y0 y7 B& l' R" b  B- p
static DWORD idt, int_idt;
# B- Y# U& J/ n- lstatic DWORD Base;
2 x# V2 V) i( y9 w: ~% Pstatic WORD Entry;
, t# [3 z- {0 Q  d5 z4 Q* T5 o4 k# U  V8 ~  \% s' o5 ]
#pragma warning (disable:4035)
# f$ T4 D' y: U1 r/ K) sstatic int inp(WORD rdx)7 p" ]+ [7 f7 [
{% x! b6 Y/ n) a' w2 q
   _asm xor eax, eax8 h5 k5 E" N4 U. t" c6 Y' ~
   _asm mov dx, rdx0 Q) B# H7 [" A; _( [- V
   _asm in al, dx% X  P9 ~1 g8 e/ I6 `7 t
}. i% [' C0 D4 S8 I- D" `
3 c; h0 w$ F" ~6 J3 J
static WORD inpw(WORD rdx)6 ~3 F6 `3 U1 v( E6 K
{
1 s- Z3 ?# y% Y% b" ]//    WORD retData ;
4 H. e. n: [/ S3 v  Z   _asm xor eax, eax! l$ D5 e0 m+ h' w3 q  \) U
   _asm mov dx, rdx
1 b7 [9 ^0 `$ t   _asm in ax, dx8 e/ T/ H3 |5 f7 Q1 o1 r5 }3 S9 ^
//    _asm mov retData,ax
; `! K8 t6 j4 x  Y/ D1 K//    return retData ;
0 ^( v% V: U4 u# h3 i& H( w2 a; P}3 e/ F$ C, N$ S+ i' K

: U, t3 C& j1 E2 k, v& Bstatic void outp(WORD rdx, int ral)/ ]" D. c' L+ r- L# Y
{
' g' [* }  a) P6 L' ]- r$ R1 I   _asm mov dx, rdx0 M: K  Q% ?. Y% W
   _asm mov eax, ral2 D, P+ y2 A! h, }. `: O8 e, _
   _asm out dx, al
! G. N0 Q: m; k1 e# K}/ }# f# ^- Z9 j
/****************************************************************************/
2 R& V! n7 s6 g; J" \/ aWORD baseAddress;
  E" ~6 I: g9 a* w7 iint drive = 0 ;+ H3 T1 u3 U- Z6 U
int al ;# c$ ]' p7 j! u3 `' t8 H
int al1 ;
  [6 I; n7 j% G! Z: G/****************************************************************************/9 [& |# U! G& a( X" w* S) t* |
static int WaitIde()3 c, @8 _( V7 ]% L3 j/ {
{4 \( w) s& |1 l! ]/ S9 {* p
   int al;
& B- R' ]+ p3 ~   al =  0x80 ;
+ \0 v: O: k; N+ y4 y+ Y- @: |  g* O+ G6 Y) @" Q
   while (  al & 0x80 ) al = inp ( (WORD)(baseAddress+7) ) ;! Y- g) N2 x  e7 g4 W
* M" a% y/ M3 q4 s- f
   return al;$ r1 k# [" ?2 Q1 S: t
}2 A# }3 R* Z: K% x
/****************************************************************************/
0 B6 x4 P+ i- z6 n+ k# p% i, Astatic void ReadIDE()& S) R$ T6 z1 W" r" R6 l' w) v. y
{: o2 q" Y% K( ~$ ?5 d) e4 U, x
   int i;& m# [1 k% _6 S4 J2 ?$ T5 U
   switch (drive / 2)9 d$ ]# p5 W# _  g. G) F
   {
& t6 ~- @3 h7 G! Y5 A+ u4 ]       case 0: baseAddress = 0x1f0; break;
  X8 Y. }1 |1 Z; H; @% o       case 1: baseAddress = 0x170; break;. I0 R. B/ c8 o7 E/ ]# A8 H
       case 2: baseAddress = 0x1e8; break;
8 j  X- a) N' }( [* w+ a       case 3: baseAddress = 0x168; break;3 N' z* G; N* b2 B  u4 E5 ~
   }: B# v3 Z- f3 C8 }4 [" s
+ q) W; Z' x" h
   WaitIde();+ Y3 N, w. Y( t' q& |+ u
   outp((WORD)(baseAddress+6),0xA0);, |$ x* k8 v0 B0 t
   al = WaitIde();
" ~% f. y' x$ f' p, [' f  s+ s
4 l2 f' G! x/ W   if ( 0==(drive%2) && (al&0x50)!=0x50) return;- e; l1 K) {8 ?0 Y4 M
   if ( 1==(drive%2) && (al&0x20)!=0x20) return;6 p  h. {$ Q3 u
/ w5 y$ O) \* {% F
   if ( 0==(drive%2) )- ]0 k+ E5 Q  j5 [
       outp((WORD)(baseAddress+6),0xA0);
, s9 ^( k6 `7 K, r3 s, w* k   else9 m; e, }( c5 D% u# }/ s8 Z& w8 R6 I
       outp((WORD)(baseAddress+6),0xB0);
  q, ~2 s2 x, s6 L6 e. J9 Y* ?( ]: w0 O8 E  U$ N* f. O
   outp((WORD)(baseAddress+7),0xEC);
5 K9 T" h  r) h# k6 v   al1 = WaitIde();
+ s( X  `. k% P8 [   if ((al1&0x58)!=0x58) return ;
9 y+ n6 S; _! T- E+ _
% y7 G! N6 H2 i$ J6 i   for (i=0;i<256;i++)
% p- X3 U1 _/ q; b# Z2 n   {6 ^9 A0 t  F3 C% l
       pw = inpw(baseAddress);
% r! f4 Q7 u) o   }
$ R0 g7 h% t% w$ D}
- t: a& M* m7 U8 ~' r5 I4 R  M5 b, ]3 N6 u& M, `
static void __declspec( naked ) NowInRing0()# x0 ^9 ~% t4 ]5 d& _
{& C6 i- A  e, y: v$ ^+ p9 {
   _asm3 l3 O/ W8 [' n8 B
   {& F$ k# K. T* }0 Z
       push ebp
0 x( }! A9 ^4 V5 q8 t" m7 e2 B       mov ebp,esp
  [1 b# B: X% G) J8 o/ \" H3 y) b2 B& `
       call ReadIDE+ `2 w$ D1 W& s0 k! ?
       cli
2 s) |4 L! Y& @6 O4 J  W       mov ebx, int_idt
3 G2 [$ d: ]5 {4 {! s       mov ax, Entry
1 E% ^( h0 c1 ?+ ]- M" j       mov word ptr [ebx-4], ax
5 ^4 L; O- U8 N, w8 A0 V: Y6 |       mov eax, Base
! g4 E! J/ `- H       shr eax, 167 H8 z, g1 ], ~. a- O7 i
       mov [ebx+2], ax: X" m" Z, Z- ^4 v8 b& ?9 U# B) h
       sti) p% [- s# ~$ O. g  T. m
       leave
8 O, B1 h5 Z1 T7 N$ o1 ?1 f       iretd
' _2 h5 X) L- V+ n) P# |, x* k8 r: S   }7 Y& I# G) q0 v, W' c7 n
}
+ D7 ]/ Q" L& R6 W4 G/ G; j- z* f8 D" w; X3 Y, J
void GetIDEInfo()8 F8 U9 k/ x& h+ _1 B
{
9 w, e/ j- {: Y) p9 G   DWORD dwExcept;
. y7 U  B6 R% q% @( V) Y" r- R0 F6 _) u8 _" Y! d4 W$ Y
   dwExcept = (DWORD)NowInRing0;
8 a( i1 a) K* v: E% C4 \" G# V/ }% x. H( f% v1 f. g
   _asm
6 g: J. Q  m% \3 H  C$ I9 C   {/ E) q0 u' T! L+ [, r: N. @
       mov eax, fs:[0]
, u& i9 @* \2 ]+ n       push eax( W0 C" S! m# k3 u, s: f! R  v+ K
       sidt [esp-02h]
( Q+ E/ d- u$ g% _* u  R! {       pop ebx
, x& b0 ]$ J( ]8 @# M2 ]0 k8 \       mov idt, ebx6 ?3 r- ^: r3 L% X* t% d
       add ebx, 0x1C
2 X5 L2 }+ b8 Q; e8 Y9 f       mov int_idt, ebx" i/ W& H$ M5 I: w" V
( J( P5 w$ u4 C( h
       mov eax, [ebx]
1 r/ f- x7 c- }0 o* @% V: X1 Y       mov [Base], eax4 G* N* u  L. ^) g% `+ x& A0 ]  {
       mov ax, [ebx-4]
1 L4 e" N4 z8 F) m' g       mov [Entry], ax5 c1 B7 l! t( c* c( c$ F* V
( w; `) e9 s# _( E. r+ O$ f; e
       cli9 e- j, {) S  r7 E0 r
       mov esi, dwExcept7 {: z2 \/ n: @1 k$ [1 ?1 O
       push esi; e' ~2 G5 M  w+ [( _; c; Q8 T3 s! Y
       mov [ebx-4], si, I: @+ G! F2 }6 Q3 s
       shr esi, 160 n" R5 U7 }! A# }) D! C# `6 J7 O8 x
       mov [ebx+2], si' v0 J+ g5 J% \  H+ P( j; w; I
       pop esi
* I' _) _- a. I4 O       sti
1 r8 r% O- R, M; q6 g$ f( x- k, }2 I
       int 3
$ l$ o* u) \, ?( B   }0 J: C- k/ y8 v+ D
}
4 w( D8 Q! F) ~. |int main()+ Z4 \! C, D! A
{: Y2 m# d2 _3 `" n' y
   char s[80];. M: y& V# V9 h4 [# X  q% i
   register i,j;
6 A& H8 v0 T' y8 X   unsigned long id = 0 ;- ]8 C' x' v* A3 T4 f9 ]4 `
+ ?( j4 w7 Q/ M9 H  K  ?
//特别注意:这段程序不能 Debug
1 \# P, w; _$ \3 C! o   for ( drive=0 ; drive<4 ; drive++ )
3 Z% a. g, q- w   {; I  l2 v" X5 P" \  L8 f
       memset ( pw , 0 , 256*sizeof( WORD ) ) ;
  }% n2 X- G+ p$ ~! \       id = 0 ;# C5 K' s2 J7 v6 W! R
       al = 0 ;
! \6 G; W( g  a7 [. c+ {' [8 v       al1 = 0 ;
  x' w3 Y$ u7 R       GetIDEInfo();7 E$ [. P8 G' P8 |$ |7 }# Q

" ]: u2 X" ^: J6 a! H       for (i=0,j=0;i<10;i++)
1 V5 i3 c& v1 D, Z9 c, H       {1 S& ^7 z1 B6 f2 w
           s[j++]=(char)(pw[10+i]>>8);, x0 `' ~1 B& B& n: |
           s[j++]=(char)(pw[10+i]&0xFF);  b2 R; S* g' N* h* w
       }/ X- d' h& P, f. g! |
       s[j] = 0;, z: Z/ H1 f2 g- o
. r$ f8 a* L2 A# w
//        for (i=0;s;i++)printf("%d,",s);printf("\n");6 H1 [: _, A. `# H$ P
       printf("Serial=%s\n", s);7 r6 `4 S  w; Y
! V. L' G7 i; Q- d* W4 w6 o
       for ( i=0 ; s ; i++ ), L4 ^& R, E2 `/ e0 a
       {5 L# z1 l9 D+ I8 h2 a0 x3 K) o
           if ('-' == s || '/'==s || ' '==s) continue;0 X7 n/ c' b$ K% _4 y% z: f
           printf ( "%d," , s ) ;
' y3 R0 G  |2 ?8 J! R9 ^* [* t1 d           id *= 40 ;        //10 ;
0 p! R9 w' I" [/ X* e6 t2 ]1 K           switch (s)
2 _9 `* A' w1 I" u+ l9 B           {% T+ X* W% b" {* h; ^3 c$ {
               case '0': id += 0; break;
3 U. e% W1 B# q( d! a: m9 C               case '1': id += 1; break;
& P* [( _0 Z# Z/ K2 I- ~               case '2': id += 2; break;8 \! b* p" v( j) D$ z0 ^! n$ d
               case '3': id += 3; break;
( B% B2 }* F8 L/ m; n               case '4': id += 4; break;8 m$ L: p: Q; X/ c
               case '5': id += 5; break;
) a- B, d8 v% E/ {# n& y7 }               case '6': id += 6; break;
( ]0 `; _; A" a               case '7': id += 7; break;: W( l% n# r; n( |/ n6 h
               case '8': id += 8; break;+ Z: v+ i/ F2 o' P3 \+ Y
               case '9': id += 9; break;
& d  m  ~' y/ {2 j* W2 ^* ]               case 'a': case 'A': id += 10; break;: A, {# X: Q$ `( _  y- ^& G' O" P
               case 'b': case 'B': id += 11; break;
, V: Z. Z' N- J8 d  w; E               case 'c': case 'C': id += 12; break;
) T7 G7 S6 E  R! v               case 'd': case 'D': id += 13; break;
% y8 s1 A7 z/ a# a& t' }               case 'e': case 'E': id += 14; break;- X, M+ x& h8 ^8 N, l& j) i) A
               case 'f': case 'F': id += 15; break;$ y3 _( Z, X5 N' W$ A* j' w
               case 'g': case 'G': id += 16; break;
9 }6 a& m9 |3 I1 ~               case 'h': case 'H': id += 17; break;; u- `3 [; P8 X  S* Y( ?" ?. X
               case 'i': case 'I': id += 18; break;
8 K' ^; d; C9 a$ ~" U% ?8 Z+ \$ k               case 'j': case 'J': id += 19; break;% b1 a5 ^( l5 p7 i9 q% H( y" I& M
               case 'k': case 'K': id += 20; break;; e% v# o5 |; m
               case 'l': case 'L': id += 21; break;
9 Y& T6 o* O6 e$ U" [2 [+ M7 |7 N$ O& l               case 'm': case 'M': id += 22; break;
( m$ }, ~" @4 R) N( e% b3 |               case 'n': case 'N': id += 23; break;
( x$ f( F' |- ^  @* x               case 'o': case 'O': id += 24; break;* s1 @& A  j; f1 H  d
               case 'p': case ';P': id += 25; break;, ~9 o# A6 X* ?' c1 V/ a
               case 'q': case 'Q': id += 26; break;- M  T* W1 a* G/ |' L7 w) w
               case 'r': case 'R': id += 27; break;2 g1 I/ Z6 i1 T
               case 's': case 'S': id += 28; break;7 U% ^( {! Q1 Z* s
               case 't': case 'T': id += 29; break;
, x6 x9 T$ G  \. O7 Y, e               case 'u': case 'U': id += 30; break;
) L5 p( r8 @, D/ W               case 'v': case 'V': id += 31; break;
# r. a8 d, Q% |9 N3 f               case 'w': case 'W': id += 32; break;
/ Y  K6 Y3 N/ s               case 'x': case 'X': id += 33; break;
  {; k2 L1 N5 l8 R               case 'y': case 'Y': id += 34; break;- x$ I/ a0 t& b% g1 N0 N$ E
               case 'z': case 'Z': id += 35; break;+ B, {5 @, v7 I, _7 c2 D7 T
               default : id /= 40 ;
/ @+ P$ ~0 ^3 e  {7 |' `0 g           }& Q, t8 E! R3 ?
       }! P! q- U# O2 R6 H
       if (id > 268435455) id %= 268435456;
& M8 h% m6 g# x. H+ H
4 i- w# q0 a" Y: G' C& V, x' U& r//        if ( al1 == 0x58 )1 y1 c: L6 r; \5 Q
           printf ( "i=%d ID=%d al=%x,%x\n" , i , id , al , al1 ) ;
8 e4 Y! c- f4 n/ y# h1 I   }- p3 b. w6 X9 n4 Z7 |% N* \
   getch () ;
2 e; s# R. q! ?; i' {; Q" u1 g0 `   return 0;! t* h# I% v; l. D7 j4 V
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 21:30 , Processed in 0.020435 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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