欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]两种获取硬盘序列号的方法.

[原创]两种获取硬盘序列号的方法.

方法一,0x7c088 ,

网上搜素出来一堆,自己进行修改优化,如下:

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];

	BYTE    bReserved2[512];

} IDSECTOR, * PIDSECTOR;

 //这里我把SENDCMDOUTPARAMS跟IDSECTOR直接合并来了,这样的操作方便传入输参

typedef struct _HARDDISKINFO

{

	//SENDCMDOUTPARAMS

	DWORD                   cBufferSize;            // Size of bBuffer in bytes

	DRIVERSTATUS            DriverStatus;           // Driver status structure.

	IDSECTOR    info;

}HARDDISKINFO ,*PHARDDISKINFO;

string get_HardDiskSerialNumber_1(int harddiskindex)//硬盘序列号索引,第一个硬盘=0,第二个硬盘=1

{

	char objName[50] = {0};

	wsprintfA(objName, "\\\\.\\PhysicalDrive%d", harddiskindex);

	HANDLE hDevice = ::CreateFileA(objName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

	if (hDevice == INVALID_HANDLE_VALUE)return "-1";

	SENDCMDINPARAMS scip;//输入

	ZeroMemory(&scip, sizeof(SENDCMDINPARAMS));

	scip.cBufferSize = IDENTIFY_BUFFER_SIZE;

	scip.irDriveRegs.bSectorCountReg = 1;

	scip.irDriveRegs.bSectorNumberReg = 1;

	scip.irDriveRegs.bDriveHeadReg = 0xA0;

	scip.irDriveRegs.bCommandReg = 0xEC;

	HARDDISKINFO hdinfo = {0};//输出,把SENDCMDOUTPARAMS ,IDSECTOR直接合并成一个结构了

       DWORD dwBytesReturned = 0;

	if (!DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, &scip, sizeof(SENDCMDINPARAMS),&hdinfo, sizeof(HARDDISKINFO), &dwBytesReturned, NULL))

	{

		::CloseHandle(hDevice);

		return "-2";

	}

	ConvertSerialString(hdinfo.info.sSerialNumber, sizeof(hdinfo.info.sSerialNumber));//转换格式

	::CloseHandle(hDevice);

	return string(hdinfo.info.sSerialNumber);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功