ReactOS 0.4.17-dev-1190-g4c812f4
id.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/pci/id.c
5 * PURPOSE: PCI Device Identification
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <pci.h>
12#include <stdio.h>
13
14#define NDEBUG
15#include <debug.h>
16
17/* FUNCTIONS ******************************************************************/
18
23{
25 ULONG MaxCount, Count;
27 ANSI_STRING MessageString;
30
31 /* Find the message identifier in the message table */
32 MessageString.Buffer = NULL;
37 &Entry);
38 if (!NT_SUCCESS(Status)) return NULL;
39
40 /* Check if the resource data is Unicode or ANSI */
42 {
44
45 /* The entry is padded after its terminator, so measure up to the first NUL */
46 Description = (PWCHAR)Entry->Text;
47 MaxCount = (Entry->Length - FIELD_OFFSET(MESSAGE_RESOURCE_ENTRY, Text)) / sizeof(*Description);
48 Count = 0;
49 while ((Count < MaxCount) && (Description[Count] != UNICODE_NULL))
50 {
51 Count++;
52 }
53
54 /* Drop the trailing line break, where there is one */
55 while (Count && ((Description[Count - 1] == L'\n') ||
56 (Description[Count - 1] == L'\r')))
57 {
58 Count--;
59 }
60
61 /* Allocate the buffer to hold the message string */
63 (Count + 1) * sizeof(*Buffer),
64 'BicP');
65 if (!Buffer) return NULL;
66
67 /* Copy the message across and terminate it */
70
71 /* Return the length to the caller, minus the terminating NULL */
72 if (Length)
73 *Length = Count * sizeof(*Buffer);
74 }
75 else
76 {
77 /* Initialize the entry as a string */
78 RtlInitAnsiString(&MessageString, (PCHAR)Entry->Text);
79
80 /* Drop the trailing line break, where there is one */
81 while (MessageString.Length &&
82 ((MessageString.Buffer[MessageString.Length - 1] == '\n') ||
83 (MessageString.Buffer[MessageString.Length - 1] == '\r')))
84 {
85 MessageString.Length -= sizeof(*MessageString.Buffer);
86 }
87
88 /* Convert it to Unicode */
90 if (!NT_SUCCESS(Status))
91 return NULL;
92
94
95 /* Return the length to the caller */
97 }
98
99 /* Return the message buffer to the caller */
100 return Buffer;
101}
102
103PWCHAR
104NTAPI
106 IN UCHAR SubClass)
107{
110
111 /* The message identifier in the table is encoded based on the PCI class */
112 Identifier = (BaseClass << 8) | SubClass;
113
114 /* Go grab the description message for this device */
116 if (!Message)
117 {
118 /* It wasn't found, allocate a buffer for a generic description */
119 Message = ExAllocatePoolWithTag(PagedPool, sizeof(L"PCI Device"), 'bicP');
120 if (Message) RtlCopyMemory(Message, L"PCI Device", sizeof(L"PCI Device"));
121 }
122
123 /* Return the description message */
124 return Message;
125}
126
127VOID
128NTAPI
130{
131 /* Initialize the sizes to zero and the pointer to the start of the buffer */
132 IdBuffer->TotalLength = 0;
133 IdBuffer->Count = 0;
134 IdBuffer->CharBuffer = IdBuffer->BufferData;
135}
136
137ULONG
140 IN PCCH Format,
141 ...)
142{
145 va_list va;
146
147 ASSERT(IdBuffer->Count < MAX_ANSI_STRINGS);
148
149 /* Do the actual string formatting into the character buffer */
150 va_start(va, Format);
151 vsprintf(IdBuffer->CharBuffer, Format, va);
152 va_end(va);
153
154 /* Initialize the ANSI_STRING that will hold this string buffer */
155 AnsiString = &IdBuffer->Strings[IdBuffer->Count];
156 RtlInitAnsiString(AnsiString, IdBuffer->CharBuffer);
157
158 /* Calculate the final size of the string, in Unicode */
160
161 /* Update hte buffer with the size,and update the character pointer */
162 IdBuffer->StringSize[IdBuffer->Count] = Size;
163 IdBuffer->TotalLength += Size;
164 Length = AnsiString->Length + sizeof(ANSI_NULL);
165 IdBuffer->CharBuffer += Length;
166
167 /* Move to the next string for next time */
168 IdBuffer->Count++;
169
170 /* Return the length */
171 return Length;
172}
173
174ULONG
177 IN PCCH Format,
178 ...)
179{
180 ULONG NextId, Size, Length, MaxLength;
182 va_list va;
183
184 ASSERT(IdBuffer->Count);
185
186 /* Choose the next static ANSI_STRING to use */
187 NextId = IdBuffer->Count - 1;
188
189 /* Max length is from the end of the buffer up until the current pointer */
190 MaxLength = (PCHAR)(IdBuffer + 1) - IdBuffer->CharBuffer;
191
192 /* Do the actual append, and return the length this string took */
193 va_start(va, Format);
194 Length = vsprintf(IdBuffer->CharBuffer - 1, Format, va);
195 va_end(va);
196 ASSERT(Length < MaxLength);
197
198 /* Select the static ANSI_STRING, and update its length information */
199 AnsiString = &IdBuffer->Strings[NextId];
200 AnsiString->Length += Length;
201 AnsiString->MaximumLength += Length;
202
203 /* Calculate the final size of the string, in Unicode */
205
206 /* Only the growth of this string adds to the total, then move the character pointer */
207 IdBuffer->TotalLength += Size - IdBuffer->StringSize[NextId];
208 IdBuffer->StringSize[NextId] = Size;
209 IdBuffer->CharBuffer += Length;
210
211 /* Return the size */
212 return Size;
213}
214
216NTAPI
220{
221 ULONG SubsysId;
222 CHAR VendorString[22];
224 PPCI_FDO_EXTENSION ParentExtension;
226 ULONG i, Size;
228 PANSI_STRING NextString;
230 PCI_ID_BUFFER IdBuffer;
231 PAGED_CODE();
232
233 /* Assume failure */
235 *Buffer = NULL;
236
237 /* Start with the genric vendor string, which is the vendor ID + device ID */
238 sprintf(VendorString,
239 "PCI\\VEN_%04X&DEV_%04X",
240 DeviceExtension->VendorId,
241 DeviceExtension->DeviceId);
242
243 /* Initialize the PCI ID Buffer */
244 PciInitIdBuffer(&IdBuffer);
245
246 /* Build the subsystem ID as shown in PCI ID Strings */
247 SubsysId = DeviceExtension->SubsystemVendorId | (DeviceExtension->SubsystemId << 16);
248
249 /* Check what the caller is requesting */
250 switch (QueryType)
251 {
252 case BusQueryDeviceID:
253
254 /* A single ID, the vendor string + the revision ID */
255 PciIdPrintf(&IdBuffer,
256 "%s&SUBSYS_%08X&REV_%02X",
257 VendorString,
258 SubsysId,
259 DeviceExtension->RevisionId);
260 break;
261
263
264 /* First the vendor string + the subsystem ID + the revision ID */
265 PciIdPrintf(&IdBuffer,
266 "%s&SUBSYS_%08X&REV_%02X",
267 VendorString,
268 SubsysId,
269 DeviceExtension->RevisionId);
270
271 /* Next, without the revision */
272 PciIdPrintf(&IdBuffer,
273 "%s&SUBSYS_%08X",
274 VendorString,
275 SubsysId);
276
277 /* Next, the vendor string + the base class + sub class + progif */
278 PciIdPrintf(&IdBuffer,
279 "%s&CC_%02X%02X%02X",
280 VendorString,
281 DeviceExtension->BaseClass,
282 DeviceExtension->SubClass,
283 DeviceExtension->ProgIf);
284
285 /* Next, without the progif */
286 PciIdPrintf(&IdBuffer,
287 "%s&CC_%02X%02X",
288 VendorString,
289 DeviceExtension->BaseClass,
290 DeviceExtension->SubClass);
291
292 /* And finally, a terminator */
293 PciIdPrintf(&IdBuffer, "\0");
294 break;
295
297
298 /* First, the vendor + revision ID only */
299 PciIdPrintf(&IdBuffer,
300 "%s&REV_%02X",
301 VendorString,
302 DeviceExtension->RevisionId);
303
304 /* Next, the vendor string alone */
305 PciIdPrintf(&IdBuffer, "%s", VendorString);
306
307 /* Next, the vendor ID + the base class + the sub class + progif */
308 PciIdPrintf(&IdBuffer,
309 "PCI\\VEN_%04X&CC_%02X%02X%02X",
310 DeviceExtension->VendorId,
311 DeviceExtension->BaseClass,
312 DeviceExtension->SubClass,
313 DeviceExtension->ProgIf);
314
315 /* Now without the progif */
316 PciIdPrintf(&IdBuffer,
317 "PCI\\VEN_%04X&CC_%02X%02X",
318 DeviceExtension->VendorId,
319 DeviceExtension->BaseClass,
320 DeviceExtension->SubClass);
321
322 /* And then just the vendor ID itself */
323 PciIdPrintf(&IdBuffer,
324 "PCI\\VEN_%04X",
325 DeviceExtension->VendorId);
326
327 /* Then the base class + subclass + progif, without any vendor */
328 PciIdPrintf(&IdBuffer,
329 "PCI\\CC_%02X%02X%02X",
330 DeviceExtension->BaseClass,
331 DeviceExtension->SubClass,
332 DeviceExtension->ProgIf);
333
334 /* Next, without the progif */
335 PciIdPrintf(&IdBuffer,
336 "PCI\\CC_%02X%02X",
337 DeviceExtension->BaseClass,
338 DeviceExtension->SubClass);
339
340 /* And finally, a terminator */
341 PciIdPrintf(&IdBuffer, "\0");
342 break;
343
345
346 /* Start with a terminator */
347 PciIdPrintf(&IdBuffer, "\0");
348
349 /* And then encode the device and function number */
350 PciIdPrintfAppend(&IdBuffer,
351 "%02X",
352 (DeviceExtension->Slot.u.bits.DeviceNumber << 3) |
353 DeviceExtension->Slot.u.bits.FunctionNumber);
354
355 /* Loop every parent until the root */
356 ParentExtension = DeviceExtension->ParentFdoExtension;
357 while (!PCI_IS_ROOT_FDO(ParentExtension))
358 {
359 /* Two more digits and their terminator have to fit */
360 if ((IdBuffer.CharBuffer + 2) >
361 (IdBuffer.BufferData + sizeof(IdBuffer.BufferData)))
362 {
363 DPRINT1("PCIX - Bridge chain too deep for an instance ID\n");
365 }
366
367 /* And encode the parent's device and function number as well */
369 PciIdPrintfAppend(&IdBuffer,
370 "%02X",
371 (PdoExtension->Slot.u.bits.DeviceNumber << 3) |
372 PdoExtension->Slot.u.bits.FunctionNumber);
373
374 /* Move up to the next bridge */
375 ParentExtension = PdoExtension->ParentFdoExtension;
376 }
377 break;
378
379 default:
380
381 /* Unknown query type */
382 DPRINT1("PCIX - PciQueryId expected ID type = %d\n", QueryType);
384 }
385
386 /* Something should've been generated if this has been reached */
387 ASSERT(IdBuffer.Count > 0);
388
389 /* Allocate the final string buffer to hold the ID */
392
393 /* Build the UNICODE_STRING structure for it */
394 DPRINT("PCIX - PciQueryId(%d)\n", QueryType);
397
398 /* Loop every ID in the buffer */
399 for (i = 0; i < IdBuffer.Count; i++)
400 {
401 /* Select the ANSI_STRING for the ID */
402 NextString = &IdBuffer.Strings[i];
403 DPRINT(" <- \"%s\"\n", NextString->Buffer);
404
405 /* Convert it to a UNICODE_STRING */
408
409 /* Add it into the final destination buffer */
410 Size = IdBuffer.StringSize[i];
412 DestinationString.Buffer += (Size / sizeof(WCHAR));
413 }
414
415 /* Return the buffer to the caller and return status (should be success) */
417 return Status;
418}
419
421NTAPI
424 IN ULONG Locale,
426{
427 PWCHAR MessageBuffer, LocationBuffer;
430
432
433 /* Check what the caller is requesting */
434 switch (QueryType)
435 {
437
438 /* Get the message from the resource section */
439 MessageBuffer = PciGetDeviceDescriptionMessage(PdoExtension->BaseClass,
440 PdoExtension->SubClass);
441
442 /* Return it to the caller, and select proper status code */
443 *Buffer = MessageBuffer;
444 Status = MessageBuffer ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED;
445 break;
446
448
449 /* Get the message from the resource section */
450 MessageBuffer = PciGetDescriptionMessage(0x10000, &Length);
451 if (!MessageBuffer)
452 {
453 /* It should be there, but fail if it wasn't found for some reason */
455 break;
456 }
457
458 /* Add space for a null-terminator, and allocate the buffer */
459 Length += 2 * sizeof(UNICODE_NULL);
460 LocationBuffer = ExAllocatePoolWithTag(PagedPool,
461 Length * sizeof(WCHAR),
462 'BicP');
463 *Buffer = LocationBuffer;
464
465 /* Check if the allocation succeeded */
466 if (LocationBuffer)
467 {
468 /* Build the location string based on bus, function, and device */
469 _swprintf(LocationBuffer,
470 MessageBuffer,
471 PdoExtension->ParentFdoExtension->BaseBus,
472 PdoExtension->Slot.u.bits.FunctionNumber,
473 PdoExtension->Slot.u.bits.DeviceNumber);
474 }
475
476 /* Free the original string from the resource section */
477 ExFreePoolWithTag(MessageBuffer, 0);
478
479 /* Select the correct status */
481 break;
482
483 default:
484
485 /* Anything else is unsupported */
487 break;
488 }
489
490 /* Return whether or not a device text string was indeed found */
491 return Status;
492}
493
494/* EOF */
#define PAGED_CODE()
@ Identifier
Definition: asmpp.cpp:103
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
Definition: bufpool.h:45
char * Text
Definition: combotst.c:136
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define __cdecl
Definition: corecrt.h:121
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl vsprintf(char *, const char *, va_list) __WINE_CRT_PRINTF_ATTR(2
char * va_list
Definition: vadefs.h:50
static const WCHAR Message[]
Definition: register.c:74
@ AnsiString
Definition: dnslib.h:19
#define L(x)
Definition: resources.c:13
PDRIVER_OBJECT PciDriverObject
Definition: init.c:19
#define MAX_ANSI_STRINGS
Definition: pci.h:126
#define PCI_IS_ROOT_FDO(x)
Definition: pci.h:42
@ PdoExtension
Definition: precomp.h:61
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:24
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PWCHAR NTAPI PciGetDescriptionMessage(IN ULONG Identifier, OUT PULONG Length)
Definition: id.c:21
NTSTATUS NTAPI PciQueryId(IN PPCI_PDO_EXTENSION DeviceExtension, IN BUS_QUERY_ID_TYPE QueryType, OUT PWCHAR *Buffer)
Definition: id.c:217
PWCHAR NTAPI PciGetDeviceDescriptionMessage(IN UCHAR BaseClass, IN UCHAR SubClass)
Definition: id.c:105
ULONG __cdecl PciIdPrintfAppend(IN PPCI_ID_BUFFER IdBuffer, IN PCCH Format,...)
Definition: id.c:176
VOID NTAPI PciInitIdBuffer(IN PPCI_ID_BUFFER IdBuffer)
Definition: id.c:129
NTSTATUS NTAPI PciQueryDeviceText(IN PPCI_PDO_EXTENSION PdoExtension, IN DEVICE_TEXT_TYPE QueryType, IN ULONG Locale, OUT PWCHAR *Buffer)
Definition: id.c:422
ULONG __cdecl PciIdPrintf(IN PPCI_ID_BUFFER IdBuffer, IN PCCH Format,...)
Definition: id.c:139
WCHAR StringBuffer[156]
Definition: ldrinit.c:41
#define PCHAR
Definition: match.c:90
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define sprintf
Definition: sprintf.c:45
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
_Out_ _Inout_ POEM_STRING DestinationString
Definition: rtlfuncs.h:1956
NTSYSAPI NTSTATUS NTAPI RtlFindMessage(_In_ PVOID BaseAddress, _In_ ULONG Type, _In_ ULONG Language, _In_ ULONG MessageId, _Out_ PMESSAGE_RESOURCE_ENTRY *MessageResourceEntry)
#define MESSAGE_RESOURCE_UNICODE
Definition: rtltypes.h:1952
int Count
Definition: noreturn.cpp:7
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define RtlAnsiStringToUnicodeSize(STRING)
Definition: nt_native.h:404
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define ANSI_NULL
CONST CHAR * PCCH
Definition: ntbasedef.h:404
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_Must_inspect_result_ _In_ KTMOBJECT_TYPE QueryType
Definition: nttmapi.h:404
_Must_inspect_result_ _In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_opt_ LPGUID _In_opt_ HANDLE _In_opt_ ULONG _In_opt_ ULONG _In_opt_ ULONG _In_opt_ PLARGE_INTEGER _In_opt_ PUNICODE_STRING Description
Definition: nttmapi.h:425
short WCHAR
Definition: pedump.c:58
#define RT_MESSAGETABLE
Definition: pedump.c:373
char CHAR
Definition: pedump.c:57
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_NEUTRAL
Definition: nls.h:167
Entry
Definition: section.c:5216
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define DPRINT
Definition: sndvol32.h:73
PVOID DeviceExtension
Definition: env_spec_w32.h:418
PVOID DriverStart
Definition: iotypes.h:2294
Definition: rtltypes.h:1958
PDEVICE_OBJECT PhysicalDeviceObject
Definition: pci.h:249
struct _PCI_FDO_EXTENSION * ParentFdoExtension
Definition: pci.h:255
ULONG Count
Definition: pci.h:491
ULONG StringSize[MAX_ANSI_STRINGS]
Definition: pci.h:493
CHAR BufferData[256]
Definition: pci.h:496
ANSI_STRING Strings[MAX_ANSI_STRINGS]
Definition: pci.h:492
ULONG TotalLength
Definition: pci.h:494
PCHAR CharBuffer
Definition: pci.h:495
void * Buffer
Definition: sprintf.c:453
unsigned short MaximumLength
Definition: sprintf.c:452
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
Definition: wdfstring.h:64
enum _BUS_QUERY_ID_TYPE BUS_QUERY_ID_TYPE
@ DeviceTextLocationInformation
Definition: iotypes.h:2961
@ DeviceTextDescription
Definition: iotypes.h:2960
enum _DEVICE_TEXT_TYPE DEVICE_TEXT_TYPE
@ BusQueryCompatibleIDs
Definition: iotypes.h:2953
@ BusQueryInstanceID
Definition: iotypes.h:2954
@ BusQueryDeviceID
Definition: iotypes.h:2951
@ BusQueryHardwareIDs
Definition: iotypes.h:2952