獲取硬碟序列號(VC)

2021-05-26 13:55:34 字數 3463 閱讀 6214

說明:經過上百臺計算機測試,ide和sata硬碟可以獲取序列號;scsi硬碟沒有測試環境,無法測試成功與否。請有條件的朋友幫忙測試下,給個訊息,謝謝。

虛擬機器上測試不了,不用測試了。ide測試出來全部是0000等數字。

網路流傳的版本不少,下下來測試修改了下。

#include  

#include  

#include  

#pragma argsused

#define   dfp_get_version   0x00074080

#define   dfp_send_drive_command   0x0007c084

#define   dfp_receive_drive_data   0x0007c088

#define  sendidlength  sizeof (sendcmdoutparams) + identify_buffer_size

#define  identify_buffer_size  512

#define  file_device_scsi              0x0000001b

#define  ioctl_scsi_miniport_identify  ((file_device_scsi << 16) + 0x0501)

#define  ioctl_scsi_miniport 0x0004d008  //  see ntddscsi.h for definition

#define  ide_atapi_identify  0xa1  //  returns id sector for atapi.

#define  ide_ata_identify    0xec  //  returns id sector for ata.

#define  ioctl_get_drive_info   0x0007c088

#define  ioctl_get_version          0x00074080

#pragma   pack(1)

typedef   struct   _getversionoutparams      getversionoutparams,   *pgetversionoutparams,   *lpgetversionoutparams;   

typedef   struct   _ideregs      ideregs,   *pideregs,   *lpideregs;    

typedef   struct   _sendcmdinparams      sendcmdinparams,   *psendcmdinparams,   *lpsendcmdinparams;    

typedef   struct   _driverstatus      driverstatus,   *pdriverstatus,   *lpdriverstatus;    

typedef   struct   _sendcmdoutparams      sendcmdoutparams,   *psendcmdoutparams,   *lpsendcmdoutparams;    

typedef   struct   _idsector      idsector,   *pidsector;

typedef struct _srb_io_control

srb_io_control, *psrb_io_control;

/*+++    

global   vars    

---*/    

getversionoutparams   vers;    

sendcmdinparams   in;    

sendcmdoutparams   out;    

handle   h;    

dword   i;

byte   j;

char harddiskno[200];

void   changebyteorder(pchar   szstring,   ushort   uscstrsize)

}pchar deleteheadspace(pchar thestring) //刪除獲取序列號開頭的空格,便於其他呼叫

if   (!deviceiocontrol(h,dfp_get_version,0,0,&vers,sizeof(vers),&i,0))

if   (!(vers.fcapabilities&1))

for   (j=0;j<4;j++)

else

if   (vers.fcapabilities&(16>>j))

else

in.bdrivenumber=j;    

in.irdriveregs.bsectorcountreg=1;    

in.irdriveregs.bsectornumberreg=1;

in.cbuffersize=512;    

if   (!deviceiocontrol(h,dfp_receive_drive_data,&in,sizeof(in),&out,sizeof(out),&i,0))

phdinfo=(pidsector)out.bbuffer;    

memcpy(s,phdinfo->sserialnumber,sizeof(phdinfo->sserialnumber));

s[sizeof(phdinfo->sserialnumber)]=0;

changebyteorder(s,sizeof(phdinfo->sserialnumber)); 

cout<<"\tsn:"in.bdrivenumber=j;

in.irdriveregs.bsectorcountreg=1;

in.irdriveregs.bsectornumberreg=1;

in.cbuffersize=512;

if (!deviceiocontrol(h,dfp_receive_drive_data,&in,sizeof(in),&out,sizeof(out),&i,0))

phdinfo=(pidsector)out.bbuffer;

memcpy(s,phdinfo->smodelnumber,sizeof(phdinfo->smodelnumber));    

s[sizeof(phdinfo->smodelnumber)]=0;

changebyteorder(s,sizeof(phdinfo->smodelnumber));

coutsserialnumber));

s[sizeof(phdinfo->sserialnumber)]=0;

changebyteorder(s,sizeof(phdinfo->sserialnumber)); 

cout<<"硬碟序列號:"char * _stdcall getharddiskno()

return harddiskno;

}呼叫方法:

getharddiskno();

VC獲取硬碟物理序列號

以下完整內容 最近才做完了這個獲取 ide 硬碟物理序列號的程式。宣告一下,這個程式是我根據 lynn mcguire 的那個 diskid32 的源 做了些自以為是的改動得到的,只能在 nt 平台下獲得第一塊 ide 硬碟的物理序列號。同時,這個程式用到了不少未公開的 windows 的結構和常量...

vc 獲取 硬碟序列號 和 cpu

vc 獲取 硬碟序列號 和 cpu 唯一id的方法?如題 網上找來很多資料 也沒找到,要支援xp win7 32 64 系統下都能獲取 硬碟序列號 和cpu id 哪位朋友幫幫忙 解決方案 不是很確定 沒有測試64位的 解決方案 cstring cpu id cpuid 1.format 08x 0...

獲取硬碟物理序列號

獲取硬碟物理序列號 最近才做完了這個獲取 ide 硬碟物理序列號的程式。宣告一下,這個程式是我根據 lynn mcguire 的那個 diskid32 的源 做了些自以為是的改動得到的,只能在 nt 平台下獲得第一塊 ide 硬碟的物理序列號。同時,這個程式用到了不少未公開的 windows 的結構...