獲取系統中存在的 優盤設備

CHAR* lpdrives = new CHAR[MAX_PATH];

// 獲取盤符,返回字符串的長度。(我理解的格式應該是 {c:\\\0d:\\\0......},所以一個盤符佔據 4 個字符)

     DWORD _count = GetLogicalDriveStringsA(MAX_PATH, lpdrives);

std::string sDrives[26]={""}; //設備盤符路徑集

HANDLE hDeviceHandle[26]; //設備句柄集

DWORD hDevice_Num = 0;

for(size_t i = 0; i < _count/4; ++i)
{

// 獲取磁盤的類型 DRIVE_FIXED 固定磁盤, DRIVE_REMOVABLE 可移動磁盤

if(GetDriveTypeA(lpdrives + 4*i) == DRIVE_FIXED || 

GetDriveTypeA(lpdrives + 4*i) == DRIVE_REMOVABLE)

{

sDrives[i] = lpdrives + 4*i;

std::string temp = "\\\\?\\";

sDrives[i] = temp + (sDrives[i].substr(0, 2));

char ch = sDrives[i][4];

printf("%c  ", ch);

hDeviceHandle[hDevice_Num] = CreateFileA(sDrives[i].c_str(), GENERIC_READ | GENERIC_WRITE, 

FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 

if(hDeviceHandle[hDevice_Num] == INVALID_HANDLE_VALUE)

printf("failed reason is %lu\n", GetLastError());

hDevice_Num ++;
}
}

STORAGE_DEVICE_NUMBER stn;

  DWORD lpbuffer;

for(size_t i = 0; i < hDevice_Num; ++i)

{

//檢索設備類型、設備數量,可分區的設備,設備的分區號

DeviceIoControl(hDeviceHandle[i], IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &stn, sizeof(stn), &lpbuffer, NULL);

CloseHandle(hDeviceHandle[i]);

printf("%d ,%d  ", stn.DeviceNumber, stn.DeviceType);
}

 

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章