程式設計中經常需要排除系統磁盤,如何實作?以下是一些基本概念。
1. 磁盤序号:在磁盤管理頁面顯示的磁盤0/1/2等,0、1、2即磁盤序号。
2. 磁盤硬體ID:裝置管理器頁面某裝置右鍵->詳細資訊->硬體ID。
擷取步驟:
1. 通過GetSystemDirectory)擷取系統路徑。
2. 通過DeviceIOControl擷取磁盤序号。
3. 檢視系統資料庫HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum,查找磁盤序号對應的磁盤硬體ID。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP9cnTxMGVhlGZtJmdo1WZ1xWbZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMwcTMzEDNxEjNxITM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
詳細代碼如下:
//擷取系統磁盤資訊,包含系統磁盤序号、硬體ID。
//系統磁盤序号由函數傳回,硬體ID以參數的形式擷取。
//傳回-1,代表函數失敗。
int GetSysDiskInfo(char *pDiskHardID, int nBufLen)
{
int nDiskOrder = -1;
HANDLE hDevice = INVALID_HANDLE_VALUE;
DWORD nRealRead = 0;
STORAGE_DEVICE_NUMBER sdnDisk;
char sSystemDriveName[WIN_PATH_MAX_LEN]; //系統所在驅動器,一般為\\.\C:。
memset(&sdnDisk, 0, sizeof(STORAGE_DEVICE_NUMBER));
memset(sSystemDriveName, 0, sizeof(sSystemDriveName));
const char DiskEnumRegPath[] = "SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum\\";
HKEY DiskEnumRegKey = NULL;
if (NULL == pDiskHardID || nBufLen < 0)
{
goto END;
}
//擷取系統盤符
sprintf_s(sSystemDriveName, sizeof(sSystemDriveName), "\\\\.\\");
GetSystemDirectory(sSystemDriveName + strlen(sSystemDriveName), sizeof(sSystemDriveName) - strlen(sSystemDriveName));
if (NULL == strchr(sSystemDriveName + strlen("\\\\.\\"), '\\'))
{
goto END;
}
*(strchr(sSystemDriveName + strlen("\\\\.\\"), '\\')) = 0;
//擷取系統磁盤序号
if ((hDevice = CreateFile(sSystemDriveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE
|| 0 == DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDisk, sizeof(sdnDisk), &nRealRead, NULL))
{
goto END;
}
//磁盤序号轉換成字元串
memset(sSystemDriveName, 0, sizeof(sSystemDriveName));
itoa(sdnDisk.DeviceNumber, sSystemDriveName, 10);
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, DiskEnumRegPath, 0, KEY_READ, &DiskEnumRegKey)
|| ERROR_SUCCESS != RegQueryValueEx(DiskEnumRegKey, sSystemDriveName, NULL, NULL, (LPBYTE)pDiskHardID, (LPDWORD)&nBufLen))
{
goto END;
}
nDiskOrder = sdnDisk.DeviceNumber;
END:
if (hDevice != INVALID_HANDLE_VALUE)
{
CloseHandle(hDevice);
}
if (DiskEnumRegKey != NULL)
{
RegCloseKey(DiskEnumRegKey);
}
return nDiskOrder;
}