c/c++获取windows磁盘序列号
最早用ReadDriverInfoNT,发现在特殊的笔记本上获取不到数据,一下的方法能解决这个问题。
试了很多台电脑,总是有一种方法是能获取到数据的
主函数部分:
unsigned char hdsn[41];
OSVERSIONINFO version;
memset(&version,0,sizeof(OSVERSIONINFO));
version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&version);
if(version.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
int ret= ReadDriverInfoNT(hdsn);
if (ret ==FALSE)
{
ret =ReadPhysicalDriveInNTWithAdminRights(hdsn);
}
if (ret ==FALSE)
{
ret =ReadIdeDriveAsScsiDriveInNT(hdsn);
}
if (ret ==FALSE)
{
ReadPhysicalDriveInNTWithZeroRights(hdsn);
}
}
else
{
MessageBox(NULL,"ReadDriverInfoNT Failure!","LicenseApp",NULL);
return 0;
}
ReadDriverInfoNT
int ReadDriverInfoNT(unsigned char *hdsn)
{
int iDone = FALSE;
HANDLE hPhysicalDriverIOCTL = 0;
char drivename[256];
sprintf(drivename,"\\\\.\\PHYSICALDRIVE%d",0);
hPhysicalDriverIOCTL = CreateFile(drivename,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING, 0, NULL);
if(hPhysicalDriverIOCTL != INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned = 0;
memset(&VersionParams,0,sizeof(GETVERSIONOUTPARAMS));
DeviceIoControl(hPhysicalDriverIOCTL,DFP_GET_VERSION,NULL,0,&VersionParams,sizeof(VersionParams),&cbBytesReturned,NULL);
//printf(("\n44444 %d \n"),(int)VersionParams.bIDEDeviceMap);//
//printf(("\n44444 %d \n"),(int)VersionParams.bVersion);//
if(VersionParams.bIDEDeviceMap > 0)
{
BYTE bIDCmd = 0;
SENDCMDINPARAMS scip;
BYTE IdOutCmd[sizeof(SENDCMDINPARAMS)+IDENTIFY_BUFFER_SIZE-1];
bIDCmd = (VersionParams.bIDEDeviceMap >> 0 & 0x10) ?
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset(&scip,0,sizeof(scip));
memset(IdOutCmd,0,sizeof(IdOutCmd));
if(DoIDENTIFY(hPhysicalDriverIOCTL, &scip, (PSENDCMDOUTPARAMS)&IdOutCmd,
bIDCmd, (BYTE)0, &cbBytesReturned))
{
//printf(("\n 55555%d \n"),5555555555);//
DWORD diskdata[256];
USHORT *pIdSector = (USHORT *)((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;
for(int m=0;m<256;m++)
{
diskdata[m] = pIdSector[m];
}
// ConvertToString(diskdata, 27, 46,hdsn);
unsigned char cszSerialNumber [1024];
ConvertToString (diskdata, 10, 19, cszSerialNumber);//这个参数可以
printf(("\n ReadDriverInfoNT %s \n"),cszSerialNumber);//z6emwars
iDone=true;
}
}
}
CloseHandle(hPhysicalDriverIOCTL);
return iDone;
}
ReadPhysicalDriveInNTWithAdminRights
int ReadPhysicalDriveInNTWithAdminRights (unsigned char *hdsn)
{
char m_cszErrorMessage[256];
BYTE byIdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
int iDone = FALSE;
int iDrive = 0;
for (iDrive = 0; iDrive < 1; iDrive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName [256];
sprintf_s(cszDriveName, 256, "\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, must have admin rights
hPhysicalDriveIOCTL = CreateFileA (cszDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE , NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,"%d ReadPhysicalDriveInNTWithAdminRights ERROR ,CreateFileA(%s) returned INVALID_HANDLE_VALUE",__LINE__, cszDriveName);
}
else
{
GETVERSIONOUTPARAMS VersionParams;
DWORD dwBytesReturned = 0;
// Get the version, etc of PhysicalDrive IOCTL
memset ((void*) &VersionParams, 0, sizeof(VersionParams));
if ( ! DeviceIoControl (hPhysicalDriveIOCTL, DFP_GET_VERSION,
NULL,
0,
&VersionParams,
sizeof(VersionParams),
&dwBytesReturned, NULL) )
{
DWORD dwErr = GetLastError ();
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,"%d ReadPhysicalDriveInNTWithAdminRights ERROR DeviceIoControl() %d, DFP_GET_VERSION) returned 0, error is %d\n",__LINE__, (int) hPhysicalDriveIOCTL, (int) dwErr);
}
// If there is a IDE device at number "iI" issue commands
// to the device
if (VersionParams.bIDEDeviceMap <= 0)
{
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,"%d ReadPhysicalDriveInNTWithAdminRights ERROR No device found at iPosition %d (%d)",__LINE__, (int) iDrive, (int) VersionParams.bIDEDeviceMap);
}
else
{
BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmd
SENDCMDINPARAMS scip;
//SENDCMDOUTPARAMS OutCmd;
// Now, get the ID sector for all IDE devices in the system.
// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
// otherwise use the IDE_ATA_IDENTIFY command
bIDCmd = (VersionParams.bIDEDeviceMap >> iDrive & 0x10) ? \
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset (&scip, 0, sizeof(scip));
memset (byIdOutCmd, 0, sizeof(byIdOutCmd));
if ( DoIDENTIFY (hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&byIdOutCmd,
(BYTE) bIDCmd,
(BYTE) iDrive,
&dwBytesReturned))
{
DWORD dwDiskData [256];
int iIjk = 0;
USHORT *punIdSector = (USHORT *)
((PSENDCMDOUTPARAMS) byIdOutCmd) -> bBuffer;
for (iIjk = 0; iIjk < 256; iIjk++)
dwDiskData [iIjk] = punIdSector [iIjk];
//PrintIdeInfo (iDrive, dwDiskData);
unsigned char cszSerialNumber [1024];
ConvertToString (dwDiskData, 10, 19, cszSerialNumber);
printf(("\n ReadPhysicalDriveInNTWithAdminRights %s \n"),cszSerialNumber);//
iDone = TRUE;
}
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return iDone;
}
ReadIdeDriveAsScsiDriveInNT
int ReadIdeDriveAsScsiDriveInNT (unsigned char *hdsn)
{
int iDone = FALSE;
int iController = 0;
for (iController = 0; iController < 1; iController++)
{
HANDLE hScsiDriveIOCTL = 0;
char cszDriveName [256];
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
sprintf_s (cszDriveName, "\\\\.\\Scsi%d:", iController);
// Windows NT, Windows 2000, any rights should do
hScsiDriveIOCTL = CreateFileA (cszDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
{
int iDrive = 0;
for (iDrive = 0; iDrive < 2; iDrive++)
{
char cszBuffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
SRB_IO_CONTROL *cP = (SRB_IO_CONTROL *) cszBuffer;
SENDCMDINPARAMS *pin =
(SENDCMDINPARAMS *) (cszBuffer + sizeof (SRB_IO_CONTROL));
DWORD dwDummy;
memset (cszBuffer, 0, sizeof (cszBuffer));
cP -> HeaderLength = sizeof (SRB_IO_CONTROL);
cP -> Timeout = 10000;
cP -> Length = SENDIDLENGTH;
cP -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy ((char *) cP -> Signature, "SCSIDISK", 8);
pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
pin -> bDriveNumber = iDrive;
if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
cszBuffer,
sizeof (SRB_IO_CONTROL) +
sizeof (SENDCMDINPARAMS) - 1,
cszBuffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
&dwDummy, NULL))
{
SENDCMDOUTPARAMS *pOut =
(SENDCMDOUTPARAMS *) (cszBuffer + sizeof (SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
if (pId -> sModelNumber [0])
{
DWORD dwDiskData [256];
int iIjk = 0;
USHORT *punIdSector = (USHORT *) pId;
for (iIjk = 0; iIjk < 256; iIjk++)
dwDiskData [iIjk] = punIdSector [iIjk];
//PrintIdeInfo (iController * 2 + iDrive, dwDiskData);
unsigned char cszSerialNumber [1024];
ConvertToString (dwDiskData, 10, 19, cszSerialNumber);
printf(("\n ReadIdeDriveAsScsiDriveInNT %s \n"),cszSerialNumber);//
iDone = TRUE;
}
}
}
CloseHandle (hScsiDriveIOCTL);
}
}
return iDone;
}
ReadPhysicalDriveInNTWithZeroRights
int ReadPhysicalDriveInNTWithZeroRights (unsigned char *hdsn)
{
int iDone = FALSE;
int iDrive = 0;
char m_cszErrorMessage[256];
char HDSN_len = 0;
for (iDrive = 0; iDrive < 1; iDrive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName [256];
sprintf_s(cszDriveName,256,"\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFileA (cszDriveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,256,"%d ReadPhysicalDriveInNTWithZeroRights ERROR CreateFileA(%s) returned INVALID_HANDLE_VALUE",__LINE__, cszDriveName);
}
else
{
STORAGE_PROPERTY_QUERY query;
DWORD dwBytesReturned = 0;
char cszBuffer [10000];
memset ((void *) & query, 0, sizeof (query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset (cszBuffer, 0, sizeof (cszBuffer));
if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof (query),
& cszBuffer,
sizeof (cszBuffer),
& dwBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & cszBuffer;
char cszSerialNumber [1000];
flipAndCodeBytes ( descrip -> SerialNumberOffset,
1,cszBuffer, cszSerialNumber );
//printf(("\n ReadPhysicalDriveInNTWithZeroRights SerialNumber \n"));//
printf(("\n ReadPhysicalDriveInNTWithZeroRights %s \n"),cszSerialNumber);
//printf("\n");
HDSN_len = strlen(cszSerialNumber);
HDInfoArray[139] = HDSN_len;
if(HDSN_len > 0)
{
MainKeyMode = MainKeyMode ^ 0X04;
}
memcpy(&HDInfoArray[140],cszSerialNumber,HDSN_len);
//ConvertToString (dwDiskData, 10, 19, cszSerialNumber);
iDone = TRUE;
// Get the disk iDrive geometry.
memset (cszBuffer, 0, sizeof(cszBuffer));
if ( ! DeviceIoControl (hPhysicalDriveIOCTL,
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL,
0,
&cszBuffer,
sizeof(cszBuffer),
&dwBytesReturned,
NULL))
{
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage,"%s ReadPhysicalDriveInNTWithZeroRights ERROR DeviceIoControl(), IOCTL_DISK_GET_DRIVE_GEOMETRY_EX) returned 0", cszDriveName);
}
else
{
DISK_GEOMETRY_EX* geom = (DISK_GEOMETRY_EX*) &cszBuffer;
int iFixed = (geom->Geometry.MediaType == FixedMedia);
__int64 i64Size = geom->DiskSize.QuadPart;
}
}
else
{
DWORD dwErr = GetLastError ();
SecureZeroMemory(m_cszErrorMessage,sizeof(m_cszErrorMessage));
sprintf_s (m_cszErrorMessage,"DeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error = %d\n", dwErr);
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return iDone;
}
自己的两个资源,做个记录
vs2010,c++,license制作gatmacAndgetSerialNum.rar-桌面系统文档类资源-CSDN下载
获取计算机硬件信息的资源代码,GetHDSerialNumber_by_Michael_Haephrati.zip-桌面系统文档类资源-CSDN下载