2011-09-28 64 views
1

我想獲取物理存儲設備的列表。
我已經看到了一些代碼,但實際上循環和做像蠻力。
我想知道獲取物理存儲磁盤列表的一般方式是什麼。我找到了CreateFile()。但我不明白如何正確使用它。我需要一個非wmi解決方案。如果它不查詢註冊表,它會更好。如何獲取物理存儲設備的列表?

回答

3

我用下面的代碼,枚舉所有的卷,然後查找其相應的物理驅動器:

#include <windows.h> 
#include <commctrl.h> 
#include <winioctl.h> 

typedef struct _STORAGE_DEVICE_NUMBER { 
    DEVICE_TYPE DeviceType; 
    ULONG DeviceNumber; 
    ULONG PartitionNumber; 
} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; 

void PrintVolumes() 
{ 
    char volName[MAX_PATH]; 
    HANDLE hFVol; 
    DWORD bytes; 

    hFVol = FindFirstVolume(volName, sizeof(volName)); 
    if (!hFVol) 
    { 
     printf("error...\n"); 
     return; 
    } 
    do 
    { 
     size_t len = strlen(volName); 
     if (volName[len-1] == '\\') 
     { 
      volName[len-1] = 0; 
      --len; 
     } 

     /* printf("OpenVol %s\n", volName); */ 
     HANDLE hVol = CreateFile(volName, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
     if (hVol == INVALID_HANDLE_VALUE) 
      continue; 

     STORAGE_DEVICE_NUMBER sdn = {0}; 
     if (!DeviceIoControl(hVol, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 
        0, &sdn, sizeof(sdn), &bytes, NULL)) 
     { 
      printf("error...\n"); 
      continue; 
     } 
     CloseHandle(hVol); 

     printf("Volume Type:%d, Device:%d, Partition:%d\n", (int)sdn.DeviceType, (int)sdn.DeviceNumber, (int)sdn.PartitionNumber); 
     /* if (sdn.DeviceType == FILE_DEVICE_DISK) 
      printf("\tIs a disk\n"); 
      */ 
    } while (FindNextVolume(hFVol, volName, sizeof(volName))); 
    FindVolumeClose(hFVol); 
} 
+0

但是,這仍然給我的邏輯磁盤'\設備\ HarddiskVolume2'和'\設備\ HarddiskVolume3'但他們都屬於同一個物理設備..我想獲得物理設備信息。 –

+0

IOCTL_STORAGE_GET_DEVICE_NUMBER爲您提供物理設備號,位於'sdn.DeviceNumber'字段中。只需使用'sprintf(名稱,「\ Device \ PhysicalDrive \%d」,(int)sdn.DeviceNumber)'或類似的。是的,你會多次使用相同的設備,每卷一個,但這不是什麼大不了的事。 – rodrigo