獲取硬碟物理序列號
最近才做完了這個獲取 ide 硬碟物理序列號的程式。宣告一下,這個程式是我根據 lynn mcguire 的那個 diskid32 的源**做了些自以為是的改動得到的,只能在 nt 平台下獲得第一塊 ide 硬碟的物理序列號。同時,這個程式用到了不少未公開的 windows 的結構和常量......
下面就是相應的 c++ **,在 xp sp2 + vc 2005 express 下除錯通過。
void getdiskphysicalsn(char pchdiskphysicalsn[14])
getversionoutparams versionparams;
dword cbbytesreturned = 0;
memset ((void*) &versionparams, 0, sizeof(versionparams));
if (!deviceiocontrol(drive, dfp_get_version, null, 0,
&versionparams,
sizeof
(versionparams), &cbbytesreturned, null))
if (versionparams.bidedevicemap<=0)
byte bidcmd = 0;
sendcmdinparams scip;
bidcmd = (versionparams.bidedevicemap >> 0 & 0x10) ?
ide_atapi_identify : ide_ata_identify;
memset (&scip, 0, sizeof(scip));
memset (idoutcmd, 0, sizeof(idoutcmd));
scip.cbuffersize=identify_buffer_size;
scip.irdriveregs.bfeaturesreg=0;
scip.irdriveregs.bsectorcountreg=1;
scip.irdriveregs.bsectornumberreg=1;
scip.irdriveregs.bcyllowreg=0;
scip.irdriveregs.bcylhighreg=0;
scip.irdriveregs.bdriveheadreg=0xa0 | (((byte) drive & 1) << 4);
scip.irdriveregs.bcommandreg=bidcmd;
scip.bdrivenumber=(byte) drive;
scip.cbuffersize=identify_buffer_size;
if (!deviceiocontrol(drive, dfp_receive_drive_data, &scip, sizeof
(sendcmdinparams) - 1,
(lpvoid)&idoutcmd,
sizeof(sendcmdoutparams) + identify_buffer_size - 1,
&cbbytesreturned,
null))
ushort *pidsector = (ushort *)((psendcmdoutparams) idoutcmd) ->
bbuffer;
int nindex=0, nposition=0;
for (nindex=13; nindex<20; nindex++)
}
需要自定義的常量和結構為:
// ioctl 指令常數
#define dfp_get_version 0x00074080
#define dfp_receive_drive_data 0x0007c088
// 用於 ideregs 結構 bcommandreg 項的有效值
#define ide_atapi_identify 0xa1
#define ide_ata_identify 0xec
#define identify_buffer_size 512
// 結構體定義
// 儲存磁碟驅動器的資訊
typedef struct _getversionoutparams
getversionoutparams, *pgetversionoutparams, *lpgetversionoutparams;
// ide 暫存器
typedef struct _ideregs
ideregs, *pideregs, *lpideregs;
// 傳送磁碟指令的輸入引數
typedef struct _sendcmdinparams
sendcmdinparams, *psendcmdinparams, *lpsendcmdinparams;
// 磁碟狀態
typedef struct _driverstatus
driverstatus, *pdriverstatus, *lpdriverstatus;
// 傳送磁碟指令的輸出引數
typedef struct _sendcmdoutparams
sendcmdoutparams, *psendcmdoutparams, *lpsendcmdoutparams;
同時,還需要提醒的是,這個程式需要用到頭檔案 iphlpapi.h,並需要將 iphlpapi.lib 包含在聯結器的庫檔案引數下。
其中很多的細節我還搞得不是特別清楚,該死的微軟,那麼多的好東西都不公開......
VC獲取硬碟物理序列號
以下完整內容 最近才做完了這個獲取 ide 硬碟物理序列號的程式。宣告一下,這個程式是我根據 lynn mcguire 的那個 diskid32 的源 做了些自以為是的改動得到的,只能在 nt 平台下獲得第一塊 ide 硬碟的物理序列號。同時,這個程式用到了不少未公開的 windows 的結構和常量...
獲取硬碟序列號(VC)
說明 經過上百臺計算機測試,ide和sata硬碟可以獲取序列號 scsi硬碟沒有測試環境,無法測試成功與否。請有條件的朋友幫忙測試下,給個訊息,謝謝。虛擬機器上測試不了,不用測試了。ide測試出來全部是0000等數字。網路流傳的版本不少,下下來測試修改了下。include include inclu...
XE 獲取硬碟序列號
function tdmcommonfun.getideserialnumber ansistring stdcall const identify buffer size 512 type tideregs packed record bfeaturesreg byte used for spec...