2

私は先週からこれについて検索しています。DriveLetterxDevicePath/Volume / DeviceID/何でも私にとって紫​​色に関するほとんどすべてのリンク。

これらのGUIDでSetupApi関数を使用していくつかのストレージデバイスとHDI/WPDデバイスを一覧表示するアプリケーションを開発していますGUID_DEVINTERFACE_USB_DEVICE"A5DCBF10-6530-11D2-901F-00C04FB951ED"、GUID_DEVINTERFACE_VOLUME "53F5630D-B6BF-11D0-94F2-00A0C91

だから...私はすでにドライブ文字でデバイスをマッピングすることができました。どのように?SetupApiの結果で、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;
}

私が持っているすべてのCDROMドライブに対して、IncorrectFunctionがスローされます。

FileHandleを取得するには、ドライブ文字("\。\D:"など)とデバイスパスの両方を使用します。そして、両方とも失敗します。

私が何か間違ったことをしているのかどうかわかりません。これはUSBマスストレージとハードディスクで機能するからです。

ありがとう。

4

1 に答える 1

1

現在、DiskNumber と PartitionNumber の代わりに、DevicePath の VolumeName を使用しています。「\.\C:」と DevicePath から VolumeName を取得します。

于 2012-01-25T10:30:17.043 に答える