21
|
1 using System; |
|
2 using System.Collections.Generic; |
|
3 using System.Runtime.InteropServices; |
|
4 using System.Text; |
|
5 using UCIS.HWLib.Windows.Devices; |
|
6 using Microsoft.Win32; |
|
7 using Microsoft.Win32.SafeHandles; |
|
8 |
|
9 namespace UCIS.USBLib.Internal.Windows { |
|
10 class SafeDeviceInfoSetHandle : SafeHandleZeroOrMinusOneIsInvalid { |
|
11 public SafeDeviceInfoSetHandle() : base(true) { } |
|
12 //public SafeDeviceInfoSetHandle(IntPtr handle) : base(true) { SetHandle(handle); } |
|
13 protected override bool ReleaseHandle() { |
|
14 if (IsInvalid) return true; |
|
15 bool bSuccess = SetupApi.SetupDiDestroyDeviceInfoList(handle); |
|
16 handle = IntPtr.Zero; |
|
17 return bSuccess; |
|
18 } |
|
19 } |
|
20 class SetupApi { |
|
21 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
22 public static extern SafeDeviceInfoSetHandle SetupDiGetClassDevs(IntPtr ClassGuid, [MarshalAs(UnmanagedType.LPTStr)] string Enumerator, IntPtr hwndParent, int Flags); |
|
23 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
24 public static extern SafeDeviceInfoSetHandle SetupDiGetClassDevsA(ref Guid ClassGuid, [MarshalAs(UnmanagedType.LPTStr)] string Enumerator, IntPtr hwndParent, DICFG Flags); |
|
25 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
26 public static extern SafeDeviceInfoSetHandle SetupDiGetClassDevsA(IntPtr ClassGuid, [MarshalAs(UnmanagedType.LPStr)] string Enumerator, IntPtr hwndParent, DICFG Flags); |
|
27 |
|
28 [DllImport("setupapi.dll", CharSet = CharSet.Auto /*, SetLastError = true*/)] |
|
29 public static extern bool SetupDiDestroyDeviceInfoList(IntPtr hDevInfo); |
|
30 |
|
31 [DllImport("setupapi.dll", SetLastError = true)] |
|
32 public static extern bool SetupDiEnumDeviceInfo(SafeDeviceInfoSetHandle DeviceInfoSet, int MemberIndex, ref SP_DEVINFO_DATA DeviceInfoData); |
|
33 [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] |
|
34 public static extern Boolean SetupDiEnumDeviceInterfaces(SafeDeviceInfoSetHandle hDevInfo, ref SP_DEVINFO_DATA devInfo, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData); |
|
35 [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] |
|
36 public static extern Boolean SetupDiEnumDeviceInterfaces(SafeDeviceInfoSetHandle hDevInfo, IntPtr devInfo, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData); |
|
37 [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] |
|
38 public static extern Boolean SetupDiGetDeviceInterfaceDetail(SafeDeviceInfoSetHandle hDevInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, out int requiredSize, ref SP_DEVINFO_DATA deviceInfoData); |
|
39 |
|
40 [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] |
|
41 public static extern bool SetupDiGetCustomDeviceProperty(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, string CustomPropertyName, DICUSTOMDEVPROP Flags, out RegistryValueKind PropertyRegDataType, Byte[] PropertyBuffer, int PropertyBufferSize, out int RequiredSize); |
|
42 [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Ansi)] |
|
43 public static extern bool SetupDiGetDeviceInstanceIdA(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, StringBuilder DeviceInstanceId, int DeviceInstanceIdSize, out int RequiredSize); |
|
44 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
45 public static extern bool SetupDiGetDeviceInterfacePropertyKeys(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, byte[] propKeyBuffer, int propKeyBufferElements, out int RequiredPropertyKeyCount, int Flags); |
|
46 [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)] |
|
47 public static extern bool SetupDiGetDeviceRegistryProperty(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, SPDRP Property, out RegistryValueKind PropertyRegDataType, byte[] PropertyBuffer, int PropertyBufferSize, out int RequiredSize); |
|
48 [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] |
|
49 public static extern bool SetupDiGetDeviceRegistryProperty(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, SPDRP iProperty, out int PropertyRegDataType, IntPtr PropertyBuffer, int PropertyBufferSize, out int RequiredSize); |
|
50 [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] |
|
51 public static extern bool SetupDiGetDeviceRegistryProperty(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, SPDRP iProperty, out int PropertyRegDataType, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder PropertyBuffer, int PropertyBufferSize, out int RequiredSize); |
|
52 |
|
53 [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] |
|
54 public static extern bool SetupDiGetDeviceInstanceId(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, StringBuilder DeviceInstanceId, int DeviceInstanceIdSize, out int RequiredSize); |
|
55 |
|
56 [DllImport("setupapi.dll")] |
|
57 public static extern bool SetupDiSetClassInstallParams(SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, ref SP_CLASSINSTALL_HEADER ClassInstallParams, int ClassInstallParamsSize); |
|
58 |
|
59 [DllImport("setupapi.dll")] |
|
60 public static extern bool SetupDiCallClassInstaller(int InstallFunction, SafeDeviceInfoSetHandle DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData); |
|
61 |
|
62 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
63 public static extern CR CM_Get_Device_ID(UInt32 dnDevInst, StringBuilder Buffer, int BufferLen, int ulFlags); |
|
64 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
65 public static extern CR CM_Get_Device_ID(UInt32 dnDevInst, IntPtr Buffer, int BufferLen, int ulFlags); |
|
66 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
67 public static extern CR CM_Get_Device_ID_Size(out UInt32 pulLen, UInt32 dnDevInst, UInt32 ulFlags); |
|
68 [DllImport("setupapi.dll")] |
|
69 public static extern CR CM_Get_Parent(out UInt32 pdnDevInst, UInt32 dnDevInst, int ulFlags); |
|
70 |
|
71 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
72 public static extern CR CM_Locate_DevNode(out UInt32 pdnDevInst, [MarshalAs(UnmanagedType.LPWStr)] String pDeviceID, UInt32 ulFlags); |
|
73 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
74 public static extern CR CM_Get_Sibling(out UInt32 pdnDevInst, UInt32 DevInst, UInt32 ulFlags); |
|
75 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
76 public static extern CR CM_Get_Child(out UInt32 pdnDevInst, UInt32 dnDevInst, UInt32 ulFlags); |
|
77 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
78 public static extern CR CM_Get_DevNode_Registry_Property(UInt32 dnDevInst, CMRDP ulProperty, out UInt32 pulRegDataType, Byte[] Buffer, ref UInt32 pulLength, UInt32 ulFlags); |
|
79 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
80 public static extern CR CM_Get_Device_Interface_List([In] ref Guid InterfaceClassGuid, [MarshalAs(UnmanagedType.LPWStr)] String pDeviceID, Byte[] Buffer, UInt32 BufferLen, UInt32 ulFlags); |
|
81 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
82 public static extern CR CM_Get_Device_Interface_List_Size(out UInt32 pulLen, [In] ref Guid InterfaceClassGuid, [MarshalAs(UnmanagedType.LPWStr)] String pDeviceID, UInt32 ulFlags); |
|
83 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
84 public static extern CR CM_Enumerate_Classes(UInt32 ulClassIndex, out Guid ClassGuid, UInt32 ulFlags); |
|
85 [DllImport("setupapi.dll", CharSet = CharSet.Auto)] |
|
86 public static extern CR CM_Get_DevNode_Status(out UInt32 pulStatus, out UInt32 pulProblemNumber, UInt32 dnDevInst, UInt32 ulFlags); |
|
87 |
|
88 |
|
89 //public const int DIGCF_DEFAULT = 0x00000001; // only valid with DIGCF_DEVICEINTERFACE |
|
90 public const int DIGCF_PRESENT = 0x00000002; |
|
91 public const int DIGCF_ALLCLASSES = 0x00000004; |
|
92 public const int DIGCF_PROFILE = 0x00000008; |
|
93 public const int DIGCF_DEVICEINTERFACE = 0x00000010; |
|
94 |
|
95 internal static Guid? GetAsGuid(byte[] buffer) { if (buffer == null) return null; else return GetAsGuid(buffer, buffer.Length); } |
|
96 internal static Guid GetAsGuid(byte[] buffer, int len) { |
|
97 if (len != 16) return Guid.Empty; |
|
98 byte[] guidBytes = new byte[len]; |
|
99 Array.Copy(buffer, guidBytes, guidBytes.Length); |
|
100 return new Guid(guidBytes); |
|
101 } |
|
102 internal static string GetAsString(byte[] buffer) { return GetAsString(buffer, buffer.Length); } |
|
103 internal static string GetAsString(byte[] buffer, int len) { |
|
104 if (len <= 2) return String.Empty; |
|
105 return Encoding.Unicode.GetString(buffer, 0, len).TrimEnd('\0'); |
|
106 } |
|
107 internal static string[] GetAsStringArray(byte[] buffer) { return GetAsStringArray(buffer, buffer.Length); } |
|
108 internal static string[] GetAsStringArray(byte[] buffer, int len) { |
|
109 return GetAsString(buffer, len).Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); |
|
110 } |
|
111 internal static Int32? GetAsInt32(byte[] buffer) { if (buffer == null) return null; else return GetAsInt32(buffer, buffer.Length); } |
|
112 internal static Int32 GetAsInt32(byte[] buffer, int len) { |
|
113 if (len != 4) return 0; |
|
114 return buffer[0] | ((buffer[1]) << 8) | ((buffer[2]) << 16) | ((buffer[3]) << 24); |
|
115 } |
|
116 |
|
117 public static IDictionary<String, Object> GetSPDRPProperties(DeviceNode device) { |
|
118 Dictionary<string, object> deviceProperties = new Dictionary<string, object>(); |
|
119 foreach (SPDRP prop in Enum.GetValues(typeof(SPDRP))) { |
|
120 Byte[] propBuffer = device.GetProperty(prop); |
|
121 if (propBuffer == null) continue; |
|
122 int iReturnBytes = propBuffer.Length; |
|
123 object oValue = null; |
|
124 switch (prop) { |
|
125 case SPDRP.PhysicalDeviceObjectName: |
|
126 case SPDRP.LocationInformation: |
|
127 case SPDRP.Class: |
|
128 case SPDRP.Mfg: |
|
129 case SPDRP.DeviceDesc: |
|
130 case SPDRP.Driver: |
|
131 case SPDRP.EnumeratorName: |
|
132 case SPDRP.FriendlyName: |
|
133 case SPDRP.ClassGuid: |
|
134 case SPDRP.Service: |
|
135 oValue = GetAsString(propBuffer, iReturnBytes); |
|
136 break; |
|
137 case SPDRP.HardwareId: |
|
138 case SPDRP.CompatibleIds: |
|
139 case SPDRP.LocationPaths: |
|
140 oValue = GetAsStringArray(propBuffer, iReturnBytes); |
|
141 break; |
|
142 case SPDRP.BusNumber: |
|
143 case SPDRP.InstallState: |
|
144 case SPDRP.LegacyBusType: |
|
145 case SPDRP.RemovalPolicy: |
|
146 case SPDRP.UiNumber: |
|
147 case SPDRP.Address: |
|
148 oValue = GetAsInt32(propBuffer, iReturnBytes); |
|
149 break; |
|
150 case SPDRP.BusTypeGuid: |
|
151 oValue = GetAsGuid(propBuffer, iReturnBytes); |
|
152 break; |
|
153 default: |
|
154 oValue = propBuffer; |
|
155 break; |
|
156 } |
|
157 deviceProperties.Add(prop.ToString(), oValue); |
|
158 } |
|
159 return deviceProperties; |
|
160 } |
|
161 } |
|
162 |
|
163 [StructLayout(LayoutKind.Sequential)] |
|
164 struct SP_DEVICE_INTERFACE_DATA { |
|
165 public UInt32 cbSize; |
|
166 public Guid interfaceClassGuid; |
|
167 public UInt32 flags; |
|
168 private UIntPtr reserved; |
|
169 public SP_DEVICE_INTERFACE_DATA(Boolean b) : this() { |
|
170 cbSize = (uint)Marshal.SizeOf(typeof(SP_DEVICE_INTERFACE_DATA)); |
|
171 } |
|
172 } |
|
173 [StructLayout(LayoutKind.Sequential)] |
|
174 struct SP_DEVINFO_DATA { |
|
175 public UInt32 cbSize; |
|
176 public Guid ClassGuid; |
|
177 public UInt32 DevInst; |
|
178 public IntPtr Reserved; |
|
179 public SP_DEVINFO_DATA(Boolean b) |
|
180 : this() { |
|
181 cbSize = (uint)Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); |
|
182 } |
|
183 } |
|
184 [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)] |
|
185 struct SP_DEVICE_INTERFACE_DETAIL_DATA { |
|
186 public uint cbSize; //<summary>The size, in bytes, of the fixed portion of the SP_DEVICE_INTERFACE_DETAIL_DATA structure.</summary> |
|
187 //Byte[1] DevicePath |
|
188 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] |
|
189 public String DevicePath; //<summary>A NULL-terminated string that contains the device interface path. This path can be passed to Win32 functions such as CreateFile.</summary> |
|
190 public SP_DEVICE_INTERFACE_DETAIL_DATA(Boolean b) |
|
191 : this() { |
|
192 //cbSize should be sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) which is the same as the following |
|
193 //if DevicePath is a 1-byte array and the structure is properly padded... is it really? |
|
194 if (IntPtr.Size == 8) cbSize = 8; //Workaround for x64 |
|
195 else cbSize = 4 + (uint)Marshal.SystemDefaultCharSize; |
|
196 } |
|
197 } |
|
198 |
|
199 enum CR { |
|
200 SUCCESS = (0x00000000), |
|
201 DEFAULT = (0x00000001), |
|
202 OUT_OF_MEMORY = (0x00000002), |
|
203 INVALID_POINTER = (0x00000003), |
|
204 INVALID_FLAG = (0x00000004), |
|
205 INVALID_DEVNODE = (0x00000005), |
|
206 INVALID_DEVINST = INVALID_DEVNODE, |
|
207 INVALID_RES_DES = (0x00000006), |
|
208 INVALID_LOG_CONF = (0x00000007), |
|
209 INVALID_ARBITRATOR = (0x00000008), |
|
210 INVALID_NODELIST = (0x00000009), |
|
211 DEVNODE_HAS_REQS = (0x0000000A), |
|
212 DEVINST_HAS_REQS = DEVNODE_HAS_REQS, |
|
213 INVALID_RESOURCEID = (0x0000000B), |
|
214 DLVXD_NOT_FOUND = (0x0000000C), // WIN 95 ONLY |
|
215 NO_SUCH_DEVNODE = (0x0000000D), |
|
216 NO_SUCH_DEVINST = NO_SUCH_DEVNODE, |
|
217 NO_MORE_LOG_CONF = (0x0000000E), |
|
218 NO_MORE_RES_DES = (0x0000000F), |
|
219 ALREADY_SUCH_DEVNODE = (0x00000010), |
|
220 ALREADY_SUCH_DEVINST = ALREADY_SUCH_DEVNODE, |
|
221 INVALID_RANGE_LIST = (0x00000011), |
|
222 INVALID_RANGE = (0x00000012), |
|
223 FAILURE = (0x00000013), |
|
224 NO_SUCH_LOGICAL_DEV = (0x00000014), |
|
225 CREATE_BLOCKED = (0x00000015), |
|
226 NOT_SYSTEM_VM = (0x00000016), // WIN 95 ONLY |
|
227 REMOVE_VETOED = (0x00000017), |
|
228 APM_VETOED = (0x00000018), |
|
229 INVALID_LOAD_TYPE = (0x00000019), |
|
230 BUFFER_SMALL = (0x0000001A), |
|
231 NO_ARBITRATOR = (0x0000001B), |
|
232 NO_REGISTRY_HANDLE = (0x0000001C), |
|
233 REGISTRY_ERROR = (0x0000001D), |
|
234 INVALID_DEVICE_ID = (0x0000001E), |
|
235 INVALID_DATA = (0x0000001F), |
|
236 INVALID_API = (0x00000020), |
|
237 DEVLOADER_NOT_READY = (0x00000021), |
|
238 NEED_RESTART = (0x00000022), |
|
239 NO_MORE_HW_PROFILES = (0x00000023), |
|
240 DEVICE_NOT_THERE = (0x00000024), |
|
241 NO_SUCH_VALUE = (0x00000025), |
|
242 WRONG_TYPE = (0x00000026), |
|
243 INVALID_PRIORITY = (0x00000027), |
|
244 NOT_DISABLEABLE = (0x00000028), |
|
245 FREE_RESOURCES = (0x00000029), |
|
246 QUERY_VETOED = (0x0000002A), |
|
247 CANT_SHARE_IRQ = (0x0000002B), |
|
248 NO_DEPENDENT = (0x0000002C), |
|
249 SAME_RESOURCES = (0x0000002D), |
|
250 NO_SUCH_REGISTRY_KEY = (0x0000002E), |
|
251 INVALID_MACHINENAME = (0x0000002F), // NT ONLY |
|
252 REMOTE_COMM_FAILURE = (0x00000030), // NT ONLY |
|
253 MACHINE_UNAVAILABLE = (0x00000031), // NT ONLY |
|
254 NO_CM_SERVICES = (0x00000032), // NT ONLY |
|
255 ACCESS_DENIED = (0x00000033), // NT ONLY |
|
256 CALL_NOT_IMPLEMENTED = (0x00000034), |
|
257 INVALID_PROPERTY = (0x00000035), |
|
258 DEVICE_INTERFACE_ACTIVE = (0x00000036), |
|
259 NO_SUCH_DEVICE_INTERFACE = (0x00000037), |
|
260 INVALID_REFERENCE_STRING = (0x00000038), |
|
261 INVALID_CONFLICT_LIST = (0x00000039), |
|
262 INVALID_INDEX = (0x0000003A), |
|
263 INVALID_STRUCTURE_SIZE = (0x0000003B), |
|
264 NUM_CR_RESULTS = (0x0000003C) |
|
265 } |
|
266 [Flags] |
|
267 enum DICFG { |
|
268 /// <summary> |
|
269 /// Return only the device that is associated with the system default device interface, if one is set, for the specified device interface classes. |
|
270 /// only valid with <see cref="DEVICEINTERFACE"/>. |
|
271 /// </summary> |
|
272 DEFAULT = 0x00000001, |
|
273 /// <summary> |
|
274 /// Return only devices that are currently present in a system. |
|
275 /// </summary> |
|
276 PRESENT = 0x00000002, |
|
277 /// <summary> |
|
278 /// Return a list of installed devices for all device setup classes or all device interface classes. |
|
279 /// </summary> |
|
280 ALLCLASSES = 0x00000004, |
|
281 /// <summary> |
|
282 /// Return only devices that are a part of the current hardware profile. |
|
283 /// </summary> |
|
284 PROFILE = 0x00000008, |
|
285 /// <summary> |
|
286 /// Return devices that support device interfaces for the specified device interface classes. |
|
287 /// </summary> |
|
288 DEVICEINTERFACE = 0x00000010, |
|
289 } |
|
290 enum DICUSTOMDEVPROP { |
|
291 NONE = 0, |
|
292 MERGE_MULTISZ = 0x00000001, |
|
293 } |
|
294 public enum SPDRP { |
|
295 /// <summary> |
|
296 /// Requests a string describing the device, such as "Microsoft PS/2 Port Mouse", typically defined by the manufacturer. |
|
297 /// </summary> |
|
298 DeviceDesc = (0x00000000), |
|
299 /// <summary> |
|
300 /// Requests the hardware IDs provided by the device that identify the device. |
|
301 /// </summary> |
|
302 HardwareId = (0x00000001), |
|
303 /// <summary> |
|
304 /// Requests the compatible IDs reported by the device. |
|
305 /// </summary> |
|
306 CompatibleIds = (0x00000002), |
|
307 Service = 0x00000004, |
|
308 /// <summary> |
|
309 /// Requests the name of the device's setup class, in text format. |
|
310 /// </summary> |
|
311 Class = (0x00000007), |
|
312 /// <summary> |
|
313 /// Requests the GUID for the device's setup class. |
|
314 /// </summary> |
|
315 ClassGuid = (0x00000008), |
|
316 /// <summary> |
|
317 /// Requests the name of the driver-specific registry key. |
|
318 /// </summary> |
|
319 Driver = (0x00000009), |
|
320 ConfigFlags = 0x0000000A, |
|
321 /// <summary> |
|
322 /// Requests a string identifying the manufacturer of the device. |
|
323 /// </summary> |
|
324 Mfg = (0x0000000B), |
|
325 /// <summary> |
|
326 /// Requests a string that can be used to distinguish between two similar devices, typically defined by the class installer. |
|
327 /// </summary> |
|
328 FriendlyName = (0x0000000C), |
|
329 /// <summary> |
|
330 /// Requests information about the device's location on the bus; the interpretation of this information is bus-specific. |
|
331 /// </summary> |
|
332 LocationInformation = (0x0000000D), |
|
333 /// <summary> |
|
334 /// Requests the name of the PDO for this device. |
|
335 /// </summary> |
|
336 PhysicalDeviceObjectName = (0x0000000E), |
|
337 Capabilities = 0x0000000F, |
|
338 /// <summary> |
|
339 /// Requests a number associated with the device that can be displayed in the user interface. |
|
340 /// </summary> |
|
341 UiNumber = (0x00000010), |
|
342 UpperFilters = 0x00000011, |
|
343 LowerFilters = 0x00000012, |
|
344 /// <summary> |
|
345 /// Requests the GUID for the bus that the device is connected to. |
|
346 /// </summary> |
|
347 BusTypeGuid = (0x00000013), |
|
348 /// <summary> |
|
349 /// Requests the bus type, such as PCIBus or PCMCIABus. |
|
350 /// </summary> |
|
351 LegacyBusType = (0x00000014), |
|
352 /// <summary> |
|
353 /// Requests the legacy bus number of the bus the device is connected to. |
|
354 /// </summary> |
|
355 BusNumber = (0x00000015), |
|
356 /// <summary> |
|
357 /// Requests the name of the enumerator for the device, such as "USB". |
|
358 /// </summary> |
|
359 EnumeratorName = (0x00000016), |
|
360 DevType = 0x00000019, |
|
361 Exclusive = 0x0000001A, |
|
362 Characteristics = 0x0000001B, |
|
363 /// <summary> |
|
364 /// Requests the address of the device on the bus. |
|
365 /// </summary> |
|
366 Address = (0x0000001C), |
|
367 /// <summary> |
|
368 /// (Windows XP and later.) Requests the device's current removal policy. The operating system uses this value as a hint to determine how the device is normally removed. |
|
369 /// </summary> |
|
370 RemovalPolicy = (0x0000001F), |
|
371 /// <summary> |
|
372 /// Windows XP and later.) Requests the device's installation state. |
|
373 /// </summary> |
|
374 InstallState = (0x00000022), |
|
375 /// <summary> |
|
376 /// Device Location Paths (R) |
|
377 /// </summary> |
|
378 LocationPaths = (0x00000023), |
|
379 } |
|
380 public enum CMRDP : uint { |
|
381 DEVICEDESC = 0x00000001, |
|
382 HARDWAREID = 0x00000002, |
|
383 COMPATIBLEIDS = 0x00000003, |
|
384 SERVICE = 0x00000005, |
|
385 CLASS = 0x00000008, |
|
386 CLASSGUID = 0x00000009, |
|
387 DRIVER = 0x0000000A, |
|
388 CONFIGFLAGS = 0x0000000B, |
|
389 MFG = 0x0000000C, |
|
390 FRIENDLYNAME = 0x0000000D, |
|
391 LOCATION_INFORMATION = 0x0000000E, |
|
392 PHYSICAL_DEVICE_OBJECT_NAME = 0x0000000F, |
|
393 CAPABILITIES = 0x00000010, |
|
394 UI_NUMBER = 0x00000011, |
|
395 UPPERFILTERS = 0x00000012, |
|
396 LOWERFILTERS = 0x00000013, |
|
397 BUSTYPEGUID = 0x00000014, |
|
398 LEGACYBUSTYPE = 0x00000015, |
|
399 BUSNUMBER = 0x00000016, |
|
400 ENUMERATOR_NAME = 0x00000017, |
|
401 } |
|
402 } |