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下载