public static extern bool SetupDiGetDeviceInterfaceDetail(SafeFileHandle hDevInfo, ref DeviceInterfaceData deviceInterfaceData, IntPtr deviceInterfaceDetailData, uint deviceInterfaceDetailDataSize, ref uint requiredSize, IntPtr deviceInfoData);
/// <summary> /// Gets the internal device path for a specified handle /// </summary> /// <param name="fd">Device handle</param> /// <returns>Device path</returns> internal static string GetDevicePath(SafeFileHandle fd) { uint devNumber = GetDeviceNumber(fd); if (devNumber == uint.MaxValue) { return(null); } SafeFileHandle hDevInfo = Extern.SetupDiGetClassDevs(ref Consts.GuidDevinterfaceDisk, IntPtr.Zero, IntPtr.Zero, DeviceGetClassFlags.Present | DeviceGetClassFlags.DeviceInterface); if (hDevInfo.IsInvalid) { return(null); } uint index = 0; DeviceInterfaceData spdid = new DeviceInterfaceData(); spdid.cbSize = Marshal.SizeOf(spdid); while (true) { byte[] buffer = new byte[2048]; if (!Extern.SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref Consts.GuidDevinterfaceDisk, index, ref spdid)) { break; } uint size = 0; Extern.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref spdid, IntPtr.Zero, 0, ref size, IntPtr.Zero); if (size > 0 && size < buffer.Length) { buffer[0] = (byte)(IntPtr.Size == 8 ? IntPtr.Size : IntPtr.Size + Marshal.SystemDefaultCharSize); // Funny... IntPtr pspdidd = Marshal.AllocHGlobal(buffer.Length); Marshal.Copy(buffer, 0, pspdidd, buffer.Length); bool result = Extern.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref spdid, pspdidd, size, ref size, IntPtr.Zero); buffer = new byte[size]; Marshal.Copy(pspdidd, buffer, 0, buffer.Length); Marshal.FreeHGlobal(pspdidd); if (result) { string devicePath = Encoding.Unicode.GetString(buffer, 4, (int)size - 4); SafeFileHandle hDrive = Extern.CreateFile(devicePath, 0, FileShare.Read | FileShare.Write, IntPtr.Zero, FileMode.OpenExisting, 0, IntPtr.Zero); if (!hDrive.IsInvalid) { uint newDeviceNumber = GetDeviceNumber(hDrive); if (newDeviceNumber == devNumber) { Extern.CloseHandle(hDrive); return(devicePath); } } Extern.CloseHandle(hDrive); } } index++; } Extern.SetupDiDestroyDeviceInfoList(hDevInfo); return(null); }
public static extern bool SetupDiEnumDeviceInterfaces(SafeFileHandle hDevInfo, IntPtr devInfo, ref Guid interfaceClassGuid, uint memberIndex, ref DeviceInterfaceData deviceInterfaceData);