日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hd获取硬盘序列号_获取硬盘序列号

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hd获取硬盘序列号_获取硬盘序列号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:經過上百臺計算機測試,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?? {

BYTE

bVersion;??????? //Binary

driver?? version.

BYTE

bRevision;?????? //Binary

driver?? revision.

BYTE

bReserved;?????? //Not?? used.

BYTE?? bIDEDeviceMap;

//Bit?? map?? of?? IDE?? devices.

DWORD?? fCapabilities; //Bit

mask?? of?? driver?? capabilities.

DWORD?? dwReserved[4]; //For

future?? use.

}?? GETVERSIONOUTPARAMS,

*PGETVERSIONOUTPARAMS,?? *LPGETVERSIONOUTPARAMS;

typedef

struct?? _IDEREGS?? {

BYTE?? bFeaturesReg;

//Used for?? specifying?? SMART

"commands".

BYTE?? bSectorCountReg;

//IDE?? sector?? count?? register

BYTE?? bSectorNumberReg;

//IDE?? sector?? number?? register

BYTE

bCylLowReg;?????? //?? IDE

low?? order?? cylinder

value

BYTE?? bCylHighReg;

//?? IDE?? high?? order

cylinder?? value

BYTE?? bDriveHeadReg;

//?? IDE?? drive/head

register

BYTE?? bCommandReg;

//?? Actual?? IDE

command.

BYTE

bReserved;?????? //

reserved?? for?? future

use.???? Must?? be

zero.

}?? IDEREGS,?? *PIDEREGS,

*LPIDEREGS;

typedef

struct?? _SENDCMDINPARAMS?? {

DWORD?? cBufferSize;

//?? Buffer?? size?? in

bytes

IDEREGS?? irDriveRegs;

//?? Structure?? with?? drive

register?? values.

BYTE?? bDriveNumber;

//?? Physical?? drive?? number

to?? send

//?? command?? to

(0,1,2,3).

BYTE?? bReserved[3];

//?? Reserved?? for?? future

expansion.

DWORD?? dwReserved[4];

//?? For?? future?? use.

//BYTE

bBuffer[1];?????? //

Input?? buffer.

}?? SENDCMDINPARAMS,?? *PSENDCMDINPARAMS,

*LPSENDCMDINPARAMS;

typedef

struct?? _DRIVERSTATUS?? {

BYTE?? bDriverError;

//?? Error?? code?? from

driver,

//?? or?? 0?? if?? no

error.

BYTE

bIDEStatus;?????? //

Contents?? of?? IDE?? Error

register.

//?? Only?? valid?? when

bDriverError

//?? is?? SMART_IDE_ERROR.

BYTE?? bReserved[2];

//?? Reserved?? for?? future

expansion.

DWORD?? dwReserved[2];

//?? Reserved?? for?? future

expansion.

}?? DRIVERSTATUS,?? *PDRIVERSTATUS,

*LPDRIVERSTATUS;

typedef

struct?? _SENDCMDOUTPARAMS?? {

DWORD

cBufferSize;???? //?? Size

of?? bBuffer?? in?? bytes

DRIVERSTATUS

DriverStatus;???? //?? Driver

status?? structure.

BYTE

bBuffer[512];?????? //

Buffer?? of?? arbitrary

length

//?? in?? which?? to

store?? the?? data?? read

from?? the?? drive.

}?? SENDCMDOUTPARAMS,?? *PSENDCMDOUTPARAMS,

*LPSENDCMDOUTPARAMS;

typedef

struct?? _IDSECTOR?? {

USHORT?? wGenConfig;

USHORT?? wNumCyls;

USHORT?? wReserved;

USHORT?? wNumHeads;

USHORT?? wBytesPerTrack;

USHORT?? wBytesPerSector;

USHORT?? wSectorsPerTrack;

USHORT?? wVendorUnique[3];

CHAR?? sSerialNumber[20];

USHORT?? wBufferType;

USHORT?? wBufferSize;

USHORT?? wECCSize;

CHAR?? sFirmwareRev[8];

CHAR?? sModelNumber[40];

USHORT

wMoreVendorUnique;

USHORT?? wDoubleWordIO;

USHORT?? wCapabilities;

USHORT?? wReserved1;

USHORT?? wPIOTiming;

USHORT?? wDMATiming;

USHORT?? wBS;

USHORT?? wNumCurrentCyls;

USHORT?? wNumCurrentHeads;

USHORT?? wNumCurrentSectorsPerTrack;

ULONG

ulCurrentSectorCapacity;

USHORT?? wMultSectorStuff;

ULONG

ulTotalAddressableSectors;

USHORT?? wSingleWordDMA;

USHORT?? wMultiWordDMA;

BYTE?? bReserved[128];

}?? IDSECTOR,?? *PIDSECTOR;

typedef struct _SRB_IO_CONTROL

{

ULONG HeaderLength;

UCHAR Signature[8];

ULONG Timeout;

ULONG ControlCode;

ULONG ReturnCode;

ULONG Length;

} 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)

{

USHORT?? i;

CHAR?? temp;

for?? (i?? =?? 0;?? i

{

temp?? =?? szString[i];

szString[i]?? =?? szString[i+1];

szString[i+1]?? =?? temp;

}

}

PCHAR

DeleteHeadSpace(PCHAR TheString) //刪除獲取序列號開頭的空格,便于其他調用

{

int j=0;

for(int i=0;i

{

if(!isspace(TheString[i])) break;

j++;

}

return &TheString[j];

}

void

HD_IDE_9X()

{

ZeroMemory(&vers,sizeof(vers));

h=CreateFile("\\\\.\\Smartvsd",0,0,0,CREATE_NEW,0,0);

if?? (!h)

{

exit(0);

}

if

(!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0))

{

CloseHandle(h);

return;

}

if?? (!(vers.fCapabilities&1))

{

CloseHandle(h);

return;

}

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

{

PIDSECTOR?? phdinfo;

char?? s[41];

ZeroMemory(&in,sizeof(in));

ZeroMemory(&out,sizeof(out));

if?? (j&1)

{

in.irDriveRegs.bDriveHeadReg=0xb0;

}

else

{

in.irDriveRegs.bDriveHeadReg=0xa0;

}

if?? (vers.fCapabilities&(16>>j))

{

continue;

}

else

{

in.irDriveRegs.bCommandReg=0xec;

}

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))

{

CloseHandle(h);

return;

}

phdinfo=(PIDSECTOR)out.bBuffer;

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

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

ChangeByteOrder(s,sizeof(phdinfo->sSerialNumber));

cout<

strcpy(HardDiskNO, DeleteHeadSpace(s));

}

CloseHandle(h);

}

bool

HD_IDE_NT()

{

cout<

cout<

bool IDEFlag=false;

char hd[80];

PIDSECTOR?? phdinfo;

char s[61];

ZeroMemory(&vers,sizeof(vers));

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

{

sprintf(hd,"\\\\.\\PhysicalDrive%d",j);

h =

CreateFile(hd,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 0,

OPEN_EXISTING, 0, 0);

//? Windows NT/2000/XP下創建文件需要管理員權限

if (!h) continue;

if

(!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0))

// 得到驅動器的IO控制器版本

{

CloseHandle(h);

continue;

}

if (!(vers.fCapabilities&1)){

CloseHandle(h);

return false;

}

ZeroMemory(&in,sizeof(in));

ZeroMemory(&out,sizeof(out));

if (j&1){

in.irDriveRegs.bDriveHeadReg=0xb0;

}

else

{

in.irDriveRegs.bDriveHeadReg=0xa0;

}

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

continue;

else

{

in.irDriveRegs.bCommandReg=0xec;

}

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))

{

CloseHandle(h);

return IDEFlag;

}

phdinfo=(PIDSECTOR)out.bBuffer;

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

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

ChangeByteOrder(s,sizeof(phdinfo->sModelNumber));

cout<

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

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

ChangeByteOrder(s,sizeof(phdinfo->sSerialNumber));

cout<

strcpy(HardDiskNO, DeleteHeadSpace(s));

IDEFlag=true;

CloseHandle(h);

}

return? IDEFlag;

}

bool

HD_SCSI_NT()

{

cout<

cout<

bool SCSIFlag=false;

for (int controller=0;controller<16;controller++)

{

HANDLE hScsiDriveIOCTL = 0;

char? driveName [256];

char s[256];

sprintf (driveName, "\\\\.\\Scsi%d:", controller);

//? Windows NT/2000/XP下任何權限都可以進行

hScsiDriveIOCTL = CreateFile (driveName, GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING, 0, NULL);

if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)

{

int drive = 0;

DWORD dummy;

for (drive = 0; drive < 2; drive++)

{

char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];

SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;

SENDCMDINPARAMS *pin =(SENDCMDINPARAMS *) (buffer +

sizeof

(SRB_IO_CONTROL));

memset (buffer, 0, sizeof (buffer));

p -> HeaderLength = sizeof (SRB_IO_CONTROL);

p -> Timeout = 10000;

p -> Length = SENDIDLENGTH;

p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;

strncpy ((char *) p -> Signature,

"SCSIDISK", 8);

pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;

pin -> bDriveNumber = drive;

// 得到SCSI硬盤信息

if (DeviceIoControl (hScsiDriveIOCTL,

IOCTL_SCSI_MINIPORT,

buffer,

sizeof (SRB_IO_CONTROL) + sizeof

(SENDCMDINPARAMS) - 1,

buffer,

sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,

&dummy, NULL))

{

SENDCMDOUTPARAMS *pOut =(SENDCMDOUTPARAMS *)

(buffer + sizeof (SRB_IO_CONTROL));

IDSECTOR *pId = (IDSECTOR *) (pOut ->

bBuffer);

if(pId->sModelNumber[0])

{

memcpy(s,pId->sModelNumber,sizeof(pId->sModelNumber));

s[sizeof(pId->sModelNumber)]=0;

ChangeByteOrder(s,sizeof(pId->sModelNumber));

cout<

ChangeByteOrder(s,sizeof(

pId->sSerialNumber));

cout<

pId->sSerialNumber)<

strcpy(HardDiskNO,

DeleteHeadSpace(s));

SCSIFlag=true;? // 讀取成功

}

}

}

CloseHandle (hScsiDriveIOCTL);? // 關閉句柄

}

}

return SCSIFlag;

}

extern

"C" {

char * _export _stdcall GetHardDiskNO();

}

char * _stdcall GetHardDiskNO()

{

OSVERSIONINFO?? VersionInfo;

ZeroMemory(&VersionInfo,sizeof(VersionInfo));

VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);

GetVersionEx(&VersionInfo);

memset(HardDiskNO, 0, 200);

switch (VersionInfo.dwPlatformId)

{

case VER_PLATFORM_WIN32s:

break;

case VER_PLATFORM_WIN32_WINDOWS:

HD_IDE_9X();

break;

case VER_PLATFORM_WIN32_NT: //這里沒有做處理,便于測試

HD_IDE_NT();

HD_SCSI_NT();

break;

}

return HardDiskNO;

}

調用方法:

GetHardDiskNO();

總結

以上是生活随笔為你收集整理的hd获取硬盘序列号_获取硬盘序列号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。