C ++ hardware information to obtain the hard disk serial number
This section describes how to obtain the serial number of a hard disk, not the serial number of a hard disk partition. The core is throughDeviceIoControlInterface to obtain the version and data information of the hard disk.
Simple.
[1] h header file
// If there is a compilation problem, add # include <afxwin. h> # if! Defined (partition _) # define partition _ # if _ MSC_VER> 1000 # pragma once # endif // _ MSC_VER> 1000 # include <iostream> # include <windows. h> # define DFP_GET_VERSION0x00074080 # define DFP_SEND_DRIVE_COMMAND0x0007c084 # define DFP_RECEIVE_DRIVE_DATA0x0007c088 typedef struct _ GETVERSIONOUTPARAMS {BYTE bVer Sion; // 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 "command S ". BYTE bsectorcounreg; // 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 stru Ct _ 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 .} 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 DRIV ERSTATUS DriverStatus; // Driver status structure. BYTE bBuffer [512]; // Buffer of arbitrary length // in which to store the data read from the drive .} optional, * optional, * optional; typedef struct _ IDSECTOR {USHORT wGenConfig; USHORT wNumCyls; USHORT wReserved; USHORT wNumHeads; USHORT failed Que [3]; CHAR sSerialNumber [20]; USHORT wBufferType; USHORT wBufferSize; USHORT wECCSize; CHAR sFirmwareRev [8]; CHAR sModelNumber [40]; USHORT limit; USHORT wDoubleWordIO; USHORT wCapabilities; USHORT wReserved1; USHORT wPIOTiming; USHORT wDMATiming; USHORT wBS; USHORT wNumCurrentCyls; USHORT future; ULONG future; SectorStuff; ULONG serial; USHORT wMultiWordDMA; BYTE bReserved [128];} IDSECTOR, * PIDSECTOR; // serial number of the hard disk // -------------------------------------------------------------- BOOL GetHDSerial (char * lpszHD, int lename = 128); # endif //! Defined (afx_hdserial_h1_1f6d2512_eba9_4443_9fef_de78d7a28afb1_included _)
[2] cpp File
# Include "stdafx. h "# include" HDSerial. h "void ChangeByteOrder (PCHAR szString, USHORT uscStrSize) {USHORT I = 0; CHARtemp = '\ 0'; for (I = 0; I <uscStrSize; I + = 2) {temp = szString [I]; szString [I] = szString [I + 1]; szString [I + 1] = temp ;}} // serial // hard drive serial number // -------------------------------------------------------------- BOOL GetHDSerial (char * lpszHD, I Nt len/* = 128 */) {BOOLbRtn = FALSE; random = 0; charszhd [80] = {0}; random; HANDLEhDrive = NULL; GETVERSIONOUTPARAMS vers; SENDCMDINPARAMSin; SENDCMDOUTPARAMSout; zeroMemory (& vers, sizeof (vers); ZeroMemory (& in, sizeof (in); ZeroMemory (& out, sizeof (out); // search for four physical hard disks, take the first physical hard disk with data for (int j = 0; j <4; j ++) {sprintf (szhd ,"\\\\. \ PhysicalDrive % d ", j); hDrive = CreateFileA (szhd, GENERIC_REA D | GENERIC_WRITE, file_cmd_read | file_cmd_write, 0, OPEN_EXISTING,); if (NULL = hDrive) {continue;} if (! DeviceIoControl (hDrive, DFP_GET_VERSION, 0, 0, & vers, sizeof (vers), & bytesRtn, 0) {goto FOREND;} // If IDE identify command not supported, fails if (! (Vers. fCapabilities & 1) {goto FOREND;} // Identify the IDE drives if (j & 1) {in. irDriveRegs. bDriveHeadReg = 0xb0;} else {in. irDriveRegs. bDriveHeadReg = 0xa0;} if (vers. fCapabilities & (16> j) {// We don't detect a ATAPI device. goto FOREND;} else {in. irDriveRegs. bCommandReg = 0xec;} in. bDriveNumber = j; in. irDriveRegs. bsectorcounreg = 1; in. irDriveRegs. bSectorNumberReg = 1; in. cBufferSize = 512; if (! DeviceIoControl (hDrive, DFP_RECEIVE_DRIVE_DATA, & in, sizeof (in), & out, sizeof (out), & bytesRtn, 0) {// "DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA "<endl; goto FOREND;} phdinfo = (PIDSECTOR) out. bBuffer; chars [21] = {0}; memcpy (s, phdinfo-> sSerialNumber, 20); s [20] = 0; ChangeByteOrder (s, 20 ); // Delete the space character int ix = 0; for (ix = 0; ix <20; ix ++) {if (s [ix] = '') {continue ;} break;} memcpy (lpszHD, s + ix, 20); bRtn = TRUE; break; FOREND: CloseHandle (hDrive); hDrive = NULL;} CloseHandle (hDrive ); hDrive = NULL; return (bRtn );}
[3] Test
char lpszMac[128] = {0};GetHDSerial(lpszMac);