說明:經過上百臺計算機測試,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 的結構...