Esempio n. 1
0
 public static extern bool SetupDiGetDeviceInterfaceDetail(SafeFileHandle hDevInfo,
                                                           ref DeviceInterfaceData deviceInterfaceData,
                                                           IntPtr deviceInterfaceDetailData,
                                                           uint deviceInterfaceDetailDataSize,
                                                           ref uint requiredSize,
                                                           IntPtr deviceInfoData);
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
 public static extern bool SetupDiEnumDeviceInterfaces(SafeFileHandle hDevInfo,
                                                       IntPtr devInfo,
                                                       ref Guid interfaceClassGuid,
                                                       uint memberIndex,
                                                       ref DeviceInterfaceData deviceInterfaceData);