转载: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\n"), szModelNo);
91 TrimStart(szSerialNo);
92 _tprintf(_T("Serial No: %s\n"), szSerialNo);
93 }
94 else
95 {
96 _tprintf(_T("Failed.\n"));
97 }
98 system("pause");
99 return 0;
100 }
原文链接: https://www.cnblogs.com/Toya/p/12361935.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/193565
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!