獲取硬碟物理序列號

2021-04-08 17:42:41 字數 2746 閱讀 8914

獲取硬碟物理序列號

最近才做完了這個獲取 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...