转载:https://www.cnblogs.com/qq76211822/p/4712033.html
1 #include<iostream> 2 #include <windows.h> 3 #include <winioctl.h> 4 #include<tchar.h> 5 6 using namespace std; 7 8 // 9 BOOL GetPhyDriveSerial(LPTSTR pModelNo, LPTSTR pSerialNo); 10 void ToLittleEndian(PUSHORT pWords, int nFirstIndex, int nLastIndex, LPTSTR pBuf); 11 void TrimStart(LPTSTR pBuf); 12 13 //把WORD数组调整字节序为little-endian,并滤除字符串结尾的空格。 14 void ToLittleEndian(PUSHORT pWords, int nFirstIndex, int nLastIndex, LPTSTR pBuf) 15 { 16 int index; 17 LPTSTR pDest = pBuf; 18 for (index = nFirstIndex; index <= nLastIndex; ++index) 19 { 20 pDest[0] = pWords[index] >> 8; 21 pDest[1] = pWords[index] & 0xFF; 22 pDest += 2; 23 } 24 *pDest = 0; 25 26 //trim space at the endof string; 0x20: _T(' ') 27 --pDest; 28 while (*pDest == 0x20) 29 { 30 *pDest = 0; 31 --pDest; 32 } 33 } 34 35 BOOL GetPhyDriveSerial(LPTSTR pModelNo, LPTSTR pSerialNo) 36 { 37 //-1是因为 SENDCMDOUTPARAMS 的结尾是 BYTE bBuffer[1]; 38 BYTE IdentifyResult[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE - 1]; 39 DWORD dwBytesReturned; 40 GETVERSIONINPARAMS get_version; 41 SENDCMDINPARAMS send_cmd = { 0 }; 42 43 HANDLE hFile = CreateFile(_T("\\.\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE, 44 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 45 if (hFile == INVALID_HANDLE_VALUE) 46 return FALSE; 47 48 //get version 49 DeviceIoControl(hFile, SMART_GET_VERSION, NULL, 0, 50 &get_version, sizeof(get_version), &dwBytesReturned, NULL); 51 52 //identify device 53 send_cmd.irDriveRegs.bCommandReg = (get_version.bIDEDeviceMap & 0x10) ? ATAPI_ID_CMD : ID_CMD; 54 DeviceIoControl(hFile, SMART_RCV_DRIVE_DATA, &send_cmd, sizeof(SENDCMDINPARAMS)-1, 55 IdentifyResult, sizeof(IdentifyResult), &dwBytesReturned, NULL); 56 CloseHandle(hFile); 57 58 //adjust the byte order 59 PUSHORT pWords = (USHORT*)(((SENDCMDOUTPARAMS*)IdentifyResult)->bBuffer); 60 ToLittleEndian(pWords, 27, 46, pModelNo); 61 ToLittleEndian(pWords, 10, 19, pSerialNo); 62 return TRUE; 63 } 64 65 //滤除字符串起始位置的空格 66 void TrimStart(LPTSTR pBuf) 67 { 68 if (*pBuf != 0x20) 69 return; 70 71 LPTSTR pDest = pBuf; 72 LPTSTR pSrc = pBuf + 1; 73 while (*pSrc == 0x20) 74 ++pSrc; 75 76 while (*pSrc) 77 { 78 *pDest = *pSrc; 79 ++pDest; 80 ++pSrc; 81 } 82 *pDest = 0; 83 } 84 85 int main() 86 { 87 TCHAR szModelNo[48], szSerialNo[24]; 88 if (GetPhyDriveSerial(szModelNo, szSerialNo)) 89 { 90 _tprintf(_T("Model No: %s "), szModelNo); 91 TrimStart(szSerialNo); 92 _tprintf(_T("Serial No: %s "), szSerialNo); 93 } 94 else 95 { 96 _tprintf(_T("Failed. ")); 97 } 98 system("pause"); 99 return 0; 100 }