2010-06-09 121 views
0

要獲得卷GUID我試圖像下面GetVolumeNameForVolumeMountPoint返回false

int len = wcslen(pDetData->DevicePath); 
pDetData->DevicePath[len] = '\\'; 
pDetData->DevicePath[len+1] = 0; 
#define BUFFER_SIZE MAX_PATH 
WCHAR volume[BUFFER_SIZE]; 
BOOL bFlag; 
bFlag = GetVolumeNameForVolumeMountPoint(pDetData->DevicePath, volume, BUFFER_SIZE); 
int loginErrCode = GetLastError(); 
printf("loginErrCode: %d\n", loginErrCode); 
printf("BFLAG: %d\n", bFlag); 

的GetLastError函數()也打印它作爲1的代碼。這意味着ERROR_INVALID_FUNCTION。 bFlag總是返回零,這意味着錯誤。

我的代碼有什麼問題...

+1

假設這是您的相關問題的另一個問題,您不能使用USB設備(GUID_DEVINTERFACE_USB_DEVICE)和GetVolumeNameForVolumeMountPoint;該功能僅適用於卷設備(GUID_DEVINTERFACE_VOLUME)。 – Luke 2010-06-09 16:55:33

回答

1

這需要一些水晶球諮詢。 DevicePath字符串看起來像來自SP_DEVICE_INTERFACE_DETAIL_DATA。這是一個你不擁有的字符串,修改它會損壞內部的setupapi數據庫,最壞的情況是堆。在將其轉換爲根目錄名稱之前,必須將該字符串複製到您自己的緩衝區中。

這只是一個理論,特別是「loginErrCode」是代碼似乎做的一個很奇怪的名字。驗證您最終得到的字符串至少類似於「F:\」。

+0

SP_DEVICE_INTERFACE_DETAIL_DATA由用戶提供的緩衝區支持,因此修改它是可以的(只要它足夠大)。 – Luke 2010-06-09 16:58:41

+0

好點。好吧,然後堆腐敗。 – 2010-06-09 17:39:12