16,548
社区成员




#include <windows.h>
enum
{
MODELNUMBER_LEN = 39,
SERIALNUMBER_LEN = 20,
FIRMWAREREV_LEN = 8,
};
struct SIDSECTOR
{
WORD wGenConfig;
WORD wNumCyls;
WORD wReserved;
WORD wNumHeads;
WORD wBytesPerTrack;
WORD wBytesPerSector;
WORD wSectorsPerTrack;
WORD wVendorUnique[3];
BYTE sSerialNumber[SERIALNUMBER_LEN];
WORD wBufferType;
WORD wBufferSize;
WORD wECCSize;
BYTE sFirmwareRev[FIRMWAREREV_LEN];
BYTE sModelNumber[MODELNUMBER_LEN];
WORD wMoreVendorUnique;
WORD wDoubleWordIO;
WORD wCapabilities;
WORD wReserved1;
WORD wPIOTiming;
WORD wDMATiming;
WORD wBS;
WORD wNumCurrentCyls;
WORD wNumCurrentHeads;
WORD wNumCurrentSectorsPerTrack;
WORD ulCurrentSectorCapacity;
WORD wMultSectorStuff;
DWORD ulTotalAddressableSectors;
WORD wSingleWordDMA;
WORD wMultiWordDMA;
BYTE bReserved[127];
};
//------------------------------------------------------------------------------
// 获取硬盘物理信息
//
// szOutModelNumber :输出型号
// szOutSerialNumber:输出序列号
// szOutFirmwareRev :输出固件版本
// driverIndex :硬盘序号
//------------------------------------------------------------------------------
bool GetDriverPhysicalInfo(char szOutModelNumber[MODELNUMBER_LEN], char szOutSerialNumber[SERIALNUMBER_LEN], char szOutFirmwareRev[FIRMWAREREV_LEN], int driverIndex=0)
{
char szFile[MAX_PATH] = { 0 };
wsprintfA(szFile, "\\\\.\\PhysicalDrive%d", driverIndex);
HANDLE hDevice = CreateFileA(szFile, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
if (hDevice == INVALID_HANDLE_VALUE) return false;
SENDCMDINPARAMS inParam = { 0 };
char szOutput[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1] = { 0 };
DWORD dwRet = 0;
inParam.cBufferSize = IDENTIFY_BUFFER_SIZE;
inParam.bDriveNumber = driverIndex;
inParam.irDriveRegs.bFeaturesReg = 0;
inParam.irDriveRegs.bSectorCountReg = 1;
inParam.irDriveRegs.bSectorNumberReg = 1;
inParam.irDriveRegs.bCylLowReg = 0;
inParam.irDriveRegs.bCylHighReg = 0;
inParam.irDriveRegs.bDriveHeadReg = (driverIndex & 1) ? 0xB0 : 0xA0; // 主盘和从盘所对应的值是不一样的
inParam.irDriveRegs.bCommandReg = ID_CMD;
if (::DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, &inParam, sizeof(inParam)-1, szOutput, sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1, &dwRet, NULL))
{
SIDSECTOR drivesInfo;
memset(&drivesInfo, 0, sizeof(drivesInfo));
memcpy(&drivesInfo, ((SENDCMDOUTPARAMS*)szOutput)->bBuffer, sizeof(drivesInfo));
// 保存信息
{
char szModelNumber[MODELNUMBER_LEN] = { 0 }; // 型号
char szSerialNumber[SERIALNUMBER_LEN] = { 0 }; // 序列号
char szFirmwareRev[FIRMWAREREV_LEN] = { 0 }; // 固件版本
// 型号
{
char szTemp[MODELNUMBER_LEN] = { 0 };
for (int i=0, len=MODELNUMBER_LEN-1; i<len; i+=2)
{
szTemp[i+1] = drivesInfo.sModelNumber[i];
szTemp[i] = drivesInfo.sModelNumber[i+1];
}
for (int i=0, i_Dst=0; i<MODELNUMBER_LEN; i++)
{
if (szTemp[i]>32 && szTemp[i]<127)
szModelNumber[i_Dst++] = szTemp[i];
}
}
// 序列号
{
char szTemp[SERIALNUMBER_LEN] = { 0 };
for (int i=0, len=SERIALNUMBER_LEN-1; i<len; i+=2)
{
szTemp[i+1] = drivesInfo.sSerialNumber[i];
szTemp[i] = drivesInfo.sSerialNumber[i+1];
}
for (int i=0, i_Dst=0; i<SERIALNUMBER_LEN; i++)
{
if (szTemp[i]>32 && szTemp[i]<127)
szSerialNumber[i_Dst++] = szTemp[i];
}
}
// 固件版本
{
char szTemp[FIRMWAREREV_LEN] = { 0 };
for (int i=0, len=FIRMWAREREV_LEN-1; i<len; i+=2)
{
szTemp[i+1] = drivesInfo.sFirmwareRev[i];
szTemp[i] = drivesInfo.sFirmwareRev[i+1];
}
for (int i=0, i_Dst=0; i<FIRMWAREREV_LEN; i++)
{
if (szTemp[i]>32 && szTemp[i]<127)
szFirmwareRev[i_Dst++] = szTemp[i];
}
}
if (szOutModelNumber != NULL)
strcpy(szOutModelNumber, szModelNumber);
if (szOutSerialNumber != NULL)
strcpy(szOutSerialNumber, szSerialNumber);
if (szOutFirmwareRev != NULL)
strcpy(szOutFirmwareRev, szFirmwareRev);
}
}
CloseHandle(hDevice);
return true;
}
int main()
{
char szModelNumber[MODELNUMBER_LEN] = { 0 }; // 型号
char szSerialNumber[SERIALNUMBER_LEN] = { 0 }; // 序列号
char szFirmwareRev[FIRMWAREREV_LEN] = { 0 }; // 固件版本
GetDriverPhysicalInfo(szModelNumber, szSerialNumber, szFirmwareRev);
return 0;
}