2012-01-24 88 views
2

我從上週開始搜索,幾乎所有關於DriveLetter x DevicePath/Volume/Device ID /的鏈接都是紫色的。驅動器號與DevicePath

我正在開發該列表中的一些sotorage設備和使用SETUPAPI功能與這些GUID GUID_DEVINTERFACE_USB_DEVICE 「A5DCBF10-6530-11D2-901F-00C04FB951ED」 也HDI/WPD設備的應用,GUID_DEVINTERFACE_VOLUME「53F5630D-B6BF-11D0-94F2- 00A0C91EFB8B」。

所以...我已經能夠映射設備與驅動器號。怎麼樣? 使用DeviceApi結果,使用DevicePath通過DeviceIOControl獲取DiskNumber和PartitionNumber。沒關係!其實並非全部。 其實到CDROM驅動器我無法得到它。

這是我的代碼。

int bytesReturned = 0; 
IOCTL.DiskExtents de1 = new IOCTL.DiskExtents(); 
int numDiskExtents = 0; 
IntPtr ptrDe1 = Marshal.AllocHGlobal(Marshal.SizeOf(de1)); 
bool result = IOCTL.DeviceIoControl(FileHandle, IOCTL.IOControlCodes.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, IntPtr.Zero, 0, ptrDe1, Marshal.SizeOf(de1), bytesReturned, null); 
if ((!result)) { 
    Marshal.FreeHGlobal(ptrDe1); 
    //libera a memória alocada. 
    throw new System.ComponentModel.Win32Exception(); //is thrown here 
} else { 
    de1 = Marshal.PtrToStructure(ptrDe1, typeof(IOCTL.DiskExtents)); 
    Marshal.FreeHGlobal(ptrDe1); 
    return de1.first.DiskNumber; 
} 

對於所有的光盤驅動器我有,一個IncorrectFunction被拋出。

爲了得到FileHandle,我同時使用Drive Letter(如「\。\ D:」)和Device Path。兩者都失敗。

我不知道我是否做錯了什麼,因爲這項工作適用於USB Mass Storage和硬盤。

謝謝。

+0

我做到了! 我們走吧。 現在我使用DevicePath中的VolumeName而不是DiskNumber和PartitionNumber。 我們從「\\。\ C:」和DevicePath中獲取一個VolumeName。 太棒了! 有一個星期! – lcssanches

+0

回答你自己的問題是可以的。既然這現在對你有用,你應該考慮寫下你如何解決它作爲答案,而不僅僅是評論。 – Yuck

+0

對不起,但我無法回答我自己的問題。因爲我的聲譽太低。是我嘗試的第一件事。 – lcssanches

回答

1

現在我使用DevicePath中的VolumeName而不是DiskNumber和PartitionNumber。 我們從「\。\ C:」和DevicePath中獲取VolumeName。