예제 #1
0
        public static bool TryGetSerialPortName(HDEVINFO deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, out string portName)
        {
            portName = null;

            IntPtr hkey = NativeMethods.SetupDiOpenDevRegKey(deviceInfoSet, ref deviceInfoData);

            if (hkey != (IntPtr)(-1))
            {
                try
                {
                    char[] portNameChars = new char[64]; int portNameLength = 63 * 2;
                    if (0 == NativeMethods.RegQueryValueEx(hkey, "PortName", 0, IntPtr.Zero, portNameChars, ref portNameLength))
                    {
                        Array.Resize(ref portNameChars, portNameLength / 2);

                        string newPortName = NativeMethods.NTString(portNameChars);
                        if (newPortName.Length >= 4 && newPortName.StartsWith("COM"))
                        {
                            portName = newPortName;
                        }
                    }
                }
                finally
                {
                    NativeMethods.RegCloseKey(hkey);
                }
            }

            return(portName != null);
        }
예제 #2
0
 public static extern Boolean SetupDiGetDeviceInterfaceDetail(
     HDEVINFO DeviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
     IntPtr DeviceInterfaceDetailData,  //ref SP_DEVICE_INTERFACE_DETAIL_DATA
     DWORD DeviceInterfaceDetailDataSize,
     ref WORD RequiredSize,
     IntPtr DeviceInfoData                     //ref SP_DEVINFO_DATA
     );
예제 #3
0
        public static bool TryGetDeviceRegistryProperty(HDEVINFO deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property, out string value)
        {
            value = null;

            uint propertyDataType; char[] propertyValueChars = new char[64]; int propertyValueLength = 63 * 2;

            if (SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref deviceInfoData, property, out propertyDataType,
                                                 propertyValueChars, propertyValueLength, IntPtr.Zero))
            {
                if (propertyDataType == REG_SZ)
                {
                    value = NativeMethods.NTString(propertyValueChars);
                }
            }

            return(value != null);
        }
예제 #4
0
        private static string[] getHIDPath()
        {
            ArrayList pathList = new ArrayList();
            Guid      guid     = new Guid();

            HidD_GetHidGuid(ref guid);

            // HIDに関する情報を持つ構造体の配列を取得する
            HDEVINFO hDevInfo = SetupDiGetClassDevs(ref guid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

            SP_DEVICE_INTERFACE_DATA spid = new SP_DEVICE_INTERFACE_DATA();

            spid.cbSize = (UInt32)Marshal.SizeOf(spid);

            int i = 0;

            // usbデバイスを列挙する。なくなったら0を返す。
            while (SetupDiEnumDeviceInterfaces(hDevInfo, 0, ref guid, i++, ref spid))
            {
                ushort size = 0;
                //デバイスインターフェース詳細情報のメモリサイズを取得する.
                SetupDiGetDeviceInterfaceDetail(hDevInfo, ref spid, IntPtr.Zero, 0, ref size, IntPtr.Zero);

                SP_DEVICE_INTERFACE_DETAIL_DATA detail = new SP_DEVICE_INTERFACE_DETAIL_DATA();
                if (IntPtr.Size == 8) // for 64 bit operating systems
                {
                    detail.cbSize = 8;
                }
                else
                {
                    detail.cbSize = 4 + (uint)Marshal.SystemDefaultCharSize; // for 32 bit systems
                }
                ushort len = 0;
                if (SetupDiGetDeviceInterfaceDetail(hDevInfo, ref spid, ref detail, size, ref len, IntPtr.Zero))
                {
                    //デバイスへアクセスするためのパスが手に入った
                    pathList.Add(detail.DevicePath);
                }
            }

            return((String[])pathList.ToArray(typeof(String)));
        }
예제 #5
0
        public static bool SetupDiGetDeviceInterfaceDetail(HDEVINFO deviceInfoSet,
                                                           ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
                                                           out SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData)
        {
            deviceInterfaceDetailData = new NativeMethods.SP_DEVICE_INTERFACE_DETAIL_DATA();

            deviceInterfaceDetailData.Size = IntPtr.Size == 8 ? 8 : (4 + Marshal.SystemDefaultCharSize);

            if (NativeMethods.SetupDiGetDeviceInterfaceDetail(deviceInfoSet,
                                                              ref deviceInterfaceData, ref deviceInterfaceDetailData,
                                                              Marshal.SizeOf(deviceInterfaceDetailData) - 4, IntPtr.Zero, IntPtr.Zero))
            {
                return(true);
            }
            else
            {
                deviceInterfaceDetailData = default(SP_DEVICE_INTERFACE_DETAIL_DATA);
                return(false);
            }
        }
예제 #6
0
 public static extern bool SetupDiGetDeviceRegistryProperty(HDEVINFO deviceInfoSet,
                                                            ref SP_DEVINFO_DATA deviceInfoData,
                                                            uint property, out uint propertyDataType,
                                                            char[] buffer, int lengthInBytes, IntPtr lengthInBytesRequired);
예제 #7
0
 public static extern bool SetupDiGetDeviceInterfaceDetail(HDEVINFO deviceInfoSet,
                                                           ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
                                                           ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
                                                           int deviceInterfaceDetailDataSize, IntPtr requiredSize, IntPtr deviceInfoData);
예제 #8
0
 public static extern bool SetupDiEnumDeviceInterfaces(HDEVINFO deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData,
                                                       [MarshalAs(UnmanagedType.LPStruct)] Guid interfaceClassGuid, int memberIndex,
                                                       ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
예제 #9
0
 public static extern bool SetupDiDestroyDeviceInfoList(HDEVINFO deviceInfoSet);
예제 #10
0
 public static extern bool SetupDiGetDeviceInterfaceDetail(HDEVINFO deviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
     ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
     int deviceInterfaceDetailDataSize, IntPtr requiredSize, IntPtr deviceInfoData);
예제 #11
0
 public static extern bool SetupDiEnumDeviceInterfaces(HDEVINFO deviceInfoSet, IntPtr deviceInfoData,
     [MarshalAs(UnmanagedType.LPStruct)] Guid interfaceClassGuid, int memberIndex,
     ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
예제 #12
0
 public static extern bool SetupDiDestroyDeviceInfoList(HDEVINFO deviceInfoSet);
예제 #13
0
 public static extern int SerialDisplayAdvancedSettings(HWND ParentHwnd, HDEVINFO DeviceInfoSet, [NativeTypeName("PSP_DEVINFO_DATA")] void *DeviceInfoData);
예제 #14
0
 public static extern IntPtr SetupDiOpenDevRegKey(HDEVINFO deviceInfoSet,
                                                  ref SP_DEVINFO_DATA deviceInfoData,
                                                  int scope          = DICS_FLAG_GLOBAL,
                                                  int profile        = 0,
                                                  int keyType        = DIREG_DEV,
                                                  uint desiredAccess = KEY_READ);
예제 #15
0
 public static extern bool SetupDiEnumDeviceInfo(HDEVINFO deviceInfoSet, int memberIndex,
                                                 ref SP_DEVINFO_DATA deviceInfoData);
예제 #16
0
 public static extern IntPtr SetupDiOpenDeviceInterfaceRegKey(HDEVINFO deviceInfoSet,
                                                              ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
                                                              uint reserved      = 0,
                                                              uint desiredAccess = KEY_READ);
예제 #17
0
 public static extern bool SetupDiEnumDeviceInterfaces(
     HDEVINFO DeviceInfoSet, int DeviceInfoData, ref Guid InterfaceClassGuid,
     int MemberIndex, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);