コード例 #1
0
ファイル: SetupApi.cs プロジェクト: simineh/pine-radio
 public static extern Boolean SetupDiEnumDeviceInterfaces(
     IntPtr hDevInfo,
     IntPtr devInfo,
     ref Guid interfaceClassGuid,
     int memberIndex,
     ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
     );
コード例 #2
0
ファイル: SetupApi.cs プロジェクト: simineh/pine-radio
 public static extern bool SetupDiGetDeviceInterfaceDetail(
     IntPtr hDevInfo,
     ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
     IntPtr deviceInterfaceDetailData,
     int deviceInterfaceDetailDataSize,
     out int requiredSize,
     ref SP_DEVINFO_DATA deviceInfoData
     );
コード例 #3
0
ファイル: DeviceFinder.cs プロジェクト: simineh/pine-radio
        public IList<string> FindDevices()
        {
            IList<string> deviceNames = new List<string>();

            Guid hidGuid = new Guid();

            Hid.HidD_GetHidGuid(ref hidGuid);

            uint flags = (uint) (DiGetClassFlags.DIGCF_PRESENT | DiGetClassFlags.DIGCF_DEVICEINTERFACE);
            IntPtr pnpHandle = IntPtr.Zero;
            try
            {
                pnpHandle = SetupApi.SetupDiGetClassDevs(ref hidGuid, IntPtr.Zero, IntPtr.Zero, flags);

                SP_DEVICE_INTERFACE_DATA data = new SP_DEVICE_INTERFACE_DATA();
                data.cbSize = Marshal.SizeOf(data);
                int devIndex = 0;
                bool success = false;
                do
                {
                    success = SetupApi.SetupDiEnumDeviceInterfaces(pnpHandle, IntPtr.Zero, ref hidGuid, devIndex,
                                                                   ref data);
                    if (success)
                    {
                        SP_DEVINFO_DATA devData = new SP_DEVINFO_DATA();
                        devData.cbSize = Marshal.SizeOf(devData);

                        int bytesReturned;

                        SetupApi.SetupDiGetDeviceInterfaceDetail(pnpHandle, ref data, IntPtr.Zero, 0, out bytesReturned,
                                                                 ref devData);

                        if (bytesReturned != 0 && Marshal.GetLastWin32Error() == ErrorCodes.ERROR_INSUFFICIENT_BUFFER)
                        {
                            unsafe
                            {
                                IntPtr deviceInterfaceDetailData = Marshal.AllocHGlobal(bytesReturned);
                                SP_DEVICE_INTERFACE_DETAIL_DATA* interfaceData =
                                    (SP_DEVICE_INTERFACE_DETAIL_DATA*) deviceInterfaceDetailData.ToPointer();
                                interfaceData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);

                                if (SetupApi.SetupDiGetDeviceInterfaceDetail(pnpHandle, ref data,
                                                                             deviceInterfaceDetailData,
                                                                             bytesReturned,
                                                                             out bytesReturned, ref devData))
                                {
                                    IntPtr devicePathTchar = IntPtr.Add(deviceInterfaceDetailData, sizeof (int));
                                    string devicePath = Marshal.PtrToStringAuto(devicePathTchar);
                                    deviceNames.Add(devicePath);
                                }

                                Marshal.FreeHGlobal(deviceInterfaceDetailData);
                            }
                        }
                    }
                    ++devIndex;
                } while (success);

                return deviceNames;
            }
            finally
            {
                if (pnpHandle != IntPtr.Zero)
                {
                    SetupApi.SetupDiDestroyDeviceInfoList(pnpHandle);
                }
            }
        }