diff options
| author | ruki <[email protected]> | 2018-05-19 00:52:48 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-05-18 23:16:54 +0800 |
| commit | ccbd73d46319fb9f71eae878aa7ca3845747e1e5 (patch) | |
| tree | ada04b7bde67f7a4faba20394cbfe1dd5e8359f4 /tests/projects | |
| parent | 90008609b8044bd4f600c9cc11e792b1eb4c03e5 (diff) | |
add win.sdk rules
Diffstat (limited to 'tests/projects')
31 files changed, 42950 insertions, 0 deletions
diff --git a/tests/projects/winsdk/usbview/app.config b/tests/projects/winsdk/usbview/app.config new file mode 100644 index 000000000..fe947d6fd --- /dev/null +++ b/tests/projects/winsdk/usbview/app.config @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- This config file is needed for Usbview to run on machines without .net3.5 installed --> +<configuration> +<startup useLegacyV2RuntimeActivationPolicy="true"> + <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0,Profile=Full"/> + <supportedRuntime version="v4.0.30319"/> + <supportedRuntime version="v4.0"/> + <supportedRuntime version="v3.5"/> + <supportedRuntime version="v3.0"/> + <supportedRuntime version="v2.0.50727"/> +</startup> +</configuration> diff --git a/tests/projects/winsdk/usbview/bang.ico b/tests/projects/winsdk/usbview/bang.ico Binary files differnew file mode 100644 index 000000000..90fe0f220 --- /dev/null +++ b/tests/projects/winsdk/usbview/bang.ico diff --git a/tests/projects/winsdk/usbview/codeanalysis.h b/tests/projects/winsdk/usbview/codeanalysis.h new file mode 100644 index 000000000..56fa54a1a --- /dev/null +++ b/tests/projects/winsdk/usbview/codeanalysis.h @@ -0,0 +1,133 @@ +/*++
+
+Copyright (c) 1997-2011 Microsoft Corporation
+
+Module Name:
+
+ CODEANALYSIS.H
+
+Abstract:
+
+ This header file is used for supressing fxcop errors which are not applicable
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 08-11-11 : created
+
+--*/
+
+#pragma once
+
+#if CODE_ANALYSIS
+
+/*****************************************************************************
+ C O D E A N A L Y S I S S U P P R E S S I O N S
+ *****************************************************************************/
+
+using namespace System::Diagnostics::CodeAnalysis;
+
+namespace Microsoft
+{
+ namespace Kits
+ {
+ namespace Samples
+ {
+ namespace Usb
+ {
+ // Justification : C++ Compiler cannot enforce ClsCompliant
+ [module: SuppressMessage("Microsoft.Design", "CA1014:MarkAssembliesWithClsCompliant")]
+
+ // Justification : The naming of the following types are based on native USB types
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType", MessageId="Bos")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.Hub30DescriptorType.#HubHdrDecLat", MessageId="Hdr")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.MachineInfoType.#UvcMajorSpecVersion", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.MachineInfoType.#UvcMinorSpecVersion", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.MachineInfoType.#UvcMinorVersion", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.MachineInfoType.#UvcMajorVersion", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceClassDetailsType.#UvcVersion", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#BNumDeviceCaps", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#UsbDispContIdCapExtDescriptor", MessageId="Disp")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#BosDescriptor", MessageId="Bos")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.NodeConnectionInfoExType.#IProductStringDescEn", MessageId="Desc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceConfigurationType.#OtgDescriptor", MessageId="Otg")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceConfigurationType.#OtgError", MessageId="Otg")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceConfigurationType.#IadError", MessageId="Iad")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceConfigurationType.#IadDescriptor", MessageId="Iad")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceIADDescriptorType.#StringDesc", MessageId="Desc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceInterfaceDescriptorType.#BNumEndpoints", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceInterfaceDescriptorType.#StringDesc", MessageId="Desc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceInterfaceDescriptorType.#WNumClasses", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.NodeConnectionInfoExStructType.#NumOfOpenPipes", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.NodeConnectionInfoExStructType.#SpeedStr", MessageId="Str")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConfigurationDescriptorType.#ConfStringDesc", MessageId="Desc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConfigurationDescriptorType.#AttributesStr", MessageId="Str")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConfigurationDescriptorType.#ConfigDescError", MessageId="Desc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConfigurationDescriptorType.#BNumInterfaces", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UvcViewAll", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UvcViewAll.#UvcView", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UsbDispContIdCapExtDescriptorType", MessageId="Disp")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDispContIdCapExtDescriptorType.#ContainerIdStr", MessageId="Str")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConnectionStatusType.#DeviceCausedOvercurrent", MessageId="Overcurrent")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceQualifierDescriptorType.#NumConfigurations", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceQualifierDescriptorType.#DeviceNumConfigError", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceDescriptorType.#NumConfigurations", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceType.#BosDescriptor", MessageId="Bos")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UvcViewType", MessageId="Uvc")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceHidDescriptorType.#BNumDescriptors", MessageId="Num")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#HubInformationEx")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#HubInformationEx")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceConfigurationType.#PreReleaseError", MessageId="PreRelease")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbHCPowerStateType.#CanWakeUp", MessageId="WakeUp")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbSuperSpeedExtensionDescriptorType.#BmAttributes", MessageId="Bm")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbUsb20ExtensionDescriptorType.#BmAttributes", MessageId="Bm")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.HubNodeType.#UsbMiParent", MessageId="Mi")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#HwId", MessageId="Hw")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.HostControllerType.#HwId", MessageId="Hw")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UsbDeviceOTGDescriptorType", MessageId="OTG")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceOTGDescriptorType.#BmAttributes", MessageId="Bm")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.HubNodeInformationType.#MiParentNumberOfInterfaces", MessageId="Mi")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.NodeConnectionInfoExType.#IProductStringDescEn", MessageId="En")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="type", Target="Microsoft.Kits.Samples.Usb.UsbDeviceIADDescriptorType", MessageId="IAD")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbConfigurationDescriptorType.#BmAttributes", MessageId="Bm")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#HwId", MessageId="Hw")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceQualifierDescriptorType.#BcdUSB", MessageId="USB")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceDescriptorType.#CdDevice", MessageId="Cd")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceDescriptorType.#CdUSB", MessageId="USB")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceDescriptorType.#CdUSB", MessageId="Cd")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceType.#HwId", MessageId="Hw")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceHidDescriptorType.#BcdHID", MessageId="HID")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#HubCapabilityEx")]
+ [module: SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#HubCapabilityEx")]
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.HubCapabilitiesExType.#HubIsMultiTt", MessageId="Multi")]
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", Scope="member", Target="Microsoft.Kits.Samples.Usb.HubCapabilitiesExType.#HubIsMultiTtCapable", MessageId="Multi")]
+
+ [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId="usbview")];
+ [module: SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId="usbview")];
+
+ // Justification: The version of XSD which is used to generate the objects does not support Collections.
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#UsbSuperSpeedExtensionDescriptor")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#UsbUsb20ExtensionDescriptor")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#UnknownDescriptor")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbBosDescriptorType.#UsbDispContIdCapExtDescriptor")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#UsbDevice")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#DeviceConfiguration")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#NoDevice")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.ExternalHubType.#ExternalHub")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.NodeConnectionInfoExStructType.#Pipe")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbHCPowerStateMappingType.#PowerMap")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#NoDevice")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#ExternalHub")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.RootHubType.#UsbDevice")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceType.#DeviceConfiguration")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UvcViewType.#UsbTree")];
+ [module: SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Scope="member", Target="Microsoft.Kits.Samples.Usb.UsbDeviceHidDescriptorType.#OptionalDescriptor")];
+ };
+ };
+ };
+};
+
+#endif
diff --git a/tests/projects/winsdk/usbview/debug.c b/tests/projects/winsdk/usbview/debug.c new file mode 100644 index 000000000..b73d727d5 --- /dev/null +++ b/tests/projects/winsdk/usbview/debug.c @@ -0,0 +1,210 @@ +/*++
+
+Copyright (c) 1997-2008 Microsoft Corporation
+
+Module Name:
+
+ DEBUG.C
+
+Abstract:
+
+ This source file contains debug routines.
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 07-08-97 : created
+
+--*/
+
+/*****************************************************************************
+ I N C L U D E S
+*****************************************************************************/
+
+#include "uvcview.h"
+
+#if DBG
+
+/*****************************************************************************
+ T Y P E D E F S
+*****************************************************************************/
+
+typedef struct _ALLOCHEADER
+{
+ LIST_ENTRY ListEntry;
+
+ PCHAR File;
+
+ ULONG Line;
+
+} ALLOCHEADER, *PALLOCHEADER;
+
+
+/*****************************************************************************
+ G L O B A L S
+*****************************************************************************/
+
+LIST_ENTRY AllocListHead =
+{
+ &AllocListHead,
+ &AllocListHead
+};
+
+
+/*****************************************************************************
+
+ MyAlloc()
+
+*****************************************************************************/
+_Success_(return != NULL)
+_Post_writable_byte_size_(dwBytes)
+HGLOBAL
+MyAlloc (
+ _In_ PCHAR File,
+ ULONG Line,
+ DWORD dwBytes
+)
+{
+ PALLOCHEADER header;
+ DWORD dwRequest = dwBytes;
+
+ if (0 == dwBytes)
+ {
+ return NULL;
+ }
+
+ dwBytes += sizeof(ALLOCHEADER);
+ // check for integer overflow
+ if (dwBytes > dwRequest)
+ {
+ header = (PALLOCHEADER)GlobalAlloc(GPTR, dwBytes);
+
+ if (header != NULL)
+ {
+ InsertTailList(&AllocListHead, &header->ListEntry);
+
+ header->File = File;
+ header->Line = Line;
+
+ return (HGLOBAL)(header + 1);
+ }
+ }
+ return NULL;
+}
+
+/*****************************************************************************
+
+ MyReAlloc()
+
+*****************************************************************************/
+
+_Success_(return != NULL)
+_Post_writable_byte_size_(dwBytes)
+HGLOBAL
+MyReAlloc (
+ HGLOBAL hMem,
+ DWORD dwBytes
+)
+{
+ PALLOCHEADER header;
+ PALLOCHEADER headerNew;
+
+ if ((NULL == hMem) || (0 == dwBytes))
+ {
+ return NULL;
+ }
+
+ header = (PALLOCHEADER)hMem;
+ header--;
+
+ // Remove the old address from the allocation list
+ //
+ RemoveEntryList(&header->ListEntry);
+
+ if (dwBytes < (dwBytes + (DWORD) sizeof(ALLOCHEADER)))
+ {
+ dwBytes += sizeof(ALLOCHEADER);
+ headerNew = GlobalReAlloc((HGLOBAL)header, dwBytes, GMEM_MOVEABLE|GMEM_ZEROINIT);
+
+ if (NULL == headerNew)
+ {
+ // If GlobalReAlloc fails, the original memory is not freed,
+ // and the original handle and pointer are still valid.
+ // Add the old address back to the allocation list.
+ //
+ #pragma prefast(suppress:__WARNING_USING_UNINIT_VAR, "SAL noise")
+ InsertTailList(&AllocListHead, &header->ListEntry);
+ }
+ else
+ {
+ // Add the new address to the allocation list
+ //
+ InsertTailList(&AllocListHead, &headerNew->ListEntry);
+
+ return (HGLOBAL)(headerNew + 1);
+ }
+ }
+ return NULL;
+}
+
+
+/*****************************************************************************
+
+ MyFree()
+
+*****************************************************************************/
+
+HGLOBAL
+MyFree (
+ HGLOBAL hMem
+)
+{
+ PALLOCHEADER header;
+
+ if (hMem)
+ {
+ header = (PALLOCHEADER)hMem;
+
+ header--;
+
+ RemoveEntryList(&header->ListEntry);
+
+ return GlobalFree((HGLOBAL)header);
+ }
+
+ return GlobalFree(hMem);
+}
+
+/*****************************************************************************
+
+ MyCheckForLeaks()
+
+*****************************************************************************/
+
+VOID
+MyCheckForLeaks (
+ VOID
+)
+{
+ PALLOCHEADER header;
+ CHAR buf[128];
+
+ memset(buf, 0, sizeof(buf));
+
+ while (!IsListEmpty(&AllocListHead))
+ {
+ header = (PALLOCHEADER)RemoveHeadList(&AllocListHead);
+
+ StringCbPrintf(buf, sizeof(buf),
+ "File: %s, Line: %d\r\n",
+ header->File,
+ header->Line);
+
+ OutputDebugString(buf);
+ }
+}
+
+#endif
diff --git a/tests/projects/winsdk/usbview/devnode.c b/tests/projects/winsdk/usbview/devnode.c new file mode 100644 index 000000000..d9a3b8ecc --- /dev/null +++ b/tests/projects/winsdk/usbview/devnode.c @@ -0,0 +1,336 @@ +/*++
+
+ Copyright (c) 1998-2011 Microsoft Corporation
+
+ Module Name:
+
+ DEVNODE.C
+
+ --*/
+
+/*****************************************************************************
+ I N C L U D E S
+ *****************************************************************************/
+
+#include "uvcview.h"
+
+/*****************************************************************************
+
+ DriverNameToDeviceInst()
+
+ Finds the Device instance of the DevNode with the matching DriverName.
+ Returns FALSE if the matching DevNode is not found and TRUE if found
+
+ *****************************************************************************/
+BOOL
+DriverNameToDeviceInst(
+ _In_reads_bytes_(cbDriverName) PCHAR DriverName,
+ _In_ size_t cbDriverName,
+ _Out_ HDEVINFO *pDevInfo,
+ _Out_writes_bytes_(sizeof(SP_DEVINFO_DATA)) PSP_DEVINFO_DATA pDevInfoData
+ )
+{
+ HDEVINFO deviceInfo = INVALID_HANDLE_VALUE;
+ BOOL status = TRUE;
+ ULONG deviceIndex;
+ SP_DEVINFO_DATA deviceInfoData;
+ BOOL bResult = FALSE;
+ PCHAR pDriverName = NULL;
+ PSTR buf = NULL;
+ BOOL done = FALSE;
+
+ if (pDevInfo == NULL)
+ {
+ return FALSE;
+ }
+
+ if (pDevInfoData == NULL)
+ {
+ return FALSE;
+ }
+
+ memset(pDevInfoData, 0, sizeof(SP_DEVINFO_DATA));
+
+ *pDevInfo = INVALID_HANDLE_VALUE;
+
+ // Use local string to guarantee zero termination
+ pDriverName = (PCHAR) ALLOC((DWORD) cbDriverName + 1);
+ if (NULL == pDriverName)
+ {
+ status = FALSE;
+ goto Done;
+ }
+ StringCbCopyN(pDriverName, cbDriverName + 1, DriverName, cbDriverName);
+
+ //
+ // We cannot walk the device tree with CM_Get_Sibling etc. unless we assume
+ // the device tree will stabilize. Any devnode removal (even outside of USB)
+ // would force us to retry. Instead we use Setup API to snapshot all
+ // devices.
+ //
+
+ // Examine all present devices to see if any match the given DriverName
+ //
+ deviceInfo = SetupDiGetClassDevs(NULL,
+ NULL,
+ NULL,
+ DIGCF_ALLCLASSES | DIGCF_PRESENT);
+
+ if (deviceInfo == INVALID_HANDLE_VALUE)
+ {
+ status = FALSE;
+ goto Done;
+ }
+
+ deviceIndex = 0;
+ deviceInfoData.cbSize = sizeof(deviceInfoData);
+
+ while (done == FALSE)
+ {
+ //
+ // Get devinst of the next device
+ //
+
+ status = SetupDiEnumDeviceInfo(deviceInfo,
+ deviceIndex,
+ &deviceInfoData);
+
+ deviceIndex++;
+
+ if (!status)
+ {
+ //
+ // This could be an error, or indication that all devices have been
+ // processed. Either way the desired device was not found.
+ //
+
+ done = TRUE;
+ break;
+ }
+
+ //
+ // Get the DriverName value
+ //
+
+ bResult = GetDeviceProperty(deviceInfo,
+ &deviceInfoData,
+ SPDRP_DRIVER,
+ &buf);
+
+ // If the DriverName value matches, return the DeviceInstance
+ //
+ if (bResult == TRUE && buf != NULL && _stricmp(pDriverName, buf) == 0)
+ {
+ done = TRUE;
+ *pDevInfo = deviceInfo;
+ CopyMemory(pDevInfoData, &deviceInfoData, sizeof(deviceInfoData));
+ FREE(buf);
+ break;
+ }
+
+ if(buf != NULL)
+ {
+ FREE(buf);
+ buf = NULL;
+ }
+ }
+
+Done:
+
+ if (bResult == FALSE)
+ {
+ if (deviceInfo != INVALID_HANDLE_VALUE)
+ {
+ SetupDiDestroyDeviceInfoList(deviceInfo);
+ }
+ }
+
+ if (pDriverName != NULL)
+ {
+ FREE(pDriverName);
+ }
+
+ return status;
+}
+
+/*****************************************************************************
+
+ DriverNameToDeviceProperties()
+
+ Returns the Device properties of the DevNode with the matching DriverName.
+ Returns NULL if the matching DevNode is not found.
+
+ The caller should free the returned structure using FREE() macro
+
+ *****************************************************************************/
+PUSB_DEVICE_PNP_STRINGS
+DriverNameToDeviceProperties(
+ _In_reads_bytes_(cbDriverName) PCHAR DriverName,
+ _In_ size_t cbDriverName
+ )
+{
+ HDEVINFO deviceInfo = INVALID_HANDLE_VALUE;
+ SP_DEVINFO_DATA deviceInfoData = {0};
+ ULONG len;
+ BOOL status;
+ PUSB_DEVICE_PNP_STRINGS DevProps = NULL;
+ DWORD lastError;
+
+ // Allocate device propeties structure
+ DevProps = (PUSB_DEVICE_PNP_STRINGS) ALLOC(sizeof(USB_DEVICE_PNP_STRINGS));
+
+ if(NULL == DevProps)
+ {
+ status = FALSE;
+ goto Done;
+ }
+
+ // Get device instance
+ status = DriverNameToDeviceInst(DriverName, cbDriverName, &deviceInfo, &deviceInfoData);
+ if (status == FALSE)
+ {
+ goto Done;
+ }
+
+ len = 0;
+ status = SetupDiGetDeviceInstanceId(deviceInfo,
+ &deviceInfoData,
+ NULL,
+ 0,
+ &len);
+ lastError = GetLastError();
+
+
+ if (status != FALSE && lastError != ERROR_INSUFFICIENT_BUFFER)
+ {
+ status = FALSE;
+ goto Done;
+ }
+
+ //
+ // An extra byte is required for the terminating character
+ //
+
+ len++;
+ DevProps->DeviceId = ALLOC(len);
+
+ if (DevProps->DeviceId == NULL)
+ {
+ status = FALSE;
+ goto Done;
+ }
+
+ status = SetupDiGetDeviceInstanceId(deviceInfo,
+ &deviceInfoData,
+ DevProps->DeviceId,
+ len,
+ &len);
+ if (status == FALSE)
+ {
+ goto Done;
+ }
+
+ status = GetDeviceProperty(deviceInfo,
+ &deviceInfoData,
+ SPDRP_DEVICEDESC,
+ &DevProps->DeviceDesc);
+
+ if (status == FALSE)
+ {
+ goto Done;
+ }
+
+
+ //
+ // We don't fail if the following registry query fails as these fields are additional information only
+ //
+
+ GetDeviceProperty(deviceInfo,
+ &deviceInfoData,
+ SPDRP_HARDWAREID,
+ &DevProps->HwId);
+
+ GetDeviceProperty(deviceInfo,
+ &deviceInfoData,
+ SPDRP_SERVICE,
+ &DevProps->Service);
+
+ GetDeviceProperty(deviceInfo,
+ &deviceInfoData,
+ SPDRP_CLASS,
+ &DevProps->DeviceClass);
+Done:
+
+ if (deviceInfo != INVALID_HANDLE_VALUE)
+ {
+ SetupDiDestroyDeviceInfoList(deviceInfo);
+ }
+
+ if (status == FALSE)
+ {
+ if (DevProps != NULL)
+ {
+ FreeDeviceProperties(&DevProps);
+ }
+ }
+ return DevProps;
+}
+
+/*****************************************************************************
+
+ FreeDeviceProperties()
+
+ Free the device properties structure
+
+ *****************************************************************************/
+VOID FreeDeviceProperties(_In_ PUSB_DEVICE_PNP_STRINGS *ppDevProps)
+{
+ if(ppDevProps == NULL)
+ {
+ return;
+ }
+
+ if(*ppDevProps == NULL)
+ {
+ return;
+ }
+
+ if ((*ppDevProps)->DeviceId != NULL)
+ {
+ FREE((*ppDevProps)->DeviceId);
+ }
+
+ if ((*ppDevProps)->DeviceDesc != NULL)
+ {
+ FREE((*ppDevProps)->DeviceDesc);
+ }
+
+ //
+ // The following are not necessary, but left in case
+ // in the future there is a later failure where these
+ // pointer fields would be allocated.
+ //
+
+ if ((*ppDevProps)->HwId != NULL)
+ {
+ FREE((*ppDevProps)->HwId);
+ }
+
+ if ((*ppDevProps)->Service != NULL)
+ {
+ FREE((*ppDevProps)->Service);
+ }
+
+ if ((*ppDevProps)->DeviceClass != NULL)
+ {
+ FREE((*ppDevProps)->DeviceClass);
+ }
+
+ if ((*ppDevProps)->PowerState != NULL)
+ {
+ FREE((*ppDevProps)->PowerState);
+ }
+
+ FREE(*ppDevProps);
+ *ppDevProps = NULL;
+}
diff --git a/tests/projects/winsdk/usbview/dispaud.c b/tests/projects/winsdk/usbview/dispaud.c new file mode 100644 index 000000000..bbc16a912 --- /dev/null +++ b/tests/projects/winsdk/usbview/dispaud.c @@ -0,0 +1,1164 @@ +/*++
+
+Copyright (c) 1997-2008 Microsoft Corporation
+
+Module Name:
+
+DISPAUD.C
+
+Abstract:
+
+This source file contains routines which update the edit control
+to display information about USB Audio descriptors.
+
+Environment:
+
+user mode
+
+Revision History:
+
+03-07-1998 : created
+
+--*/
+
+/*****************************************************************************
+ I N C L U D E S
+*****************************************************************************/
+
+#include "uvcview.h"
+
+/*****************************************************************************
+ G L O B A L S P R I V A T E T O T H I S F I L E
+*****************************************************************************/
+
+//
+// USB Device Class Definition for Terminal Types 0.9 Draft Revision
+//
+STRINGLIST slAudioTerminalTypes [] =
+{
+ //
+ // 2.1 USB Terminal Types
+ //
+ {0x0100, "USB Undefined", ""},
+ {0x0101, "USB streaming", ""},
+ {0x01FF, "USB vendor specific", ""},
+ //
+ // 2.2 Input Terminal Types
+ //
+ {0x0200, "Input Undefined", ""},
+ {0x0201, "Microphone", ""},
+ {0x0202, "Desktop microphone", ""},
+ {0x0203, "Personal microphone", ""},
+ {0x0204, "Omni-directional microphone", ""},
+ {0x0205, "Microphone array", ""},
+ {0x0206, "Processing microphone array", ""},
+ //
+ // 2.3 Output Terminal Types
+ //
+ {0x0300, "Output Undefined", ""},
+ {0x0301, "Speaker", ""},
+ {0x0302, "Headphones", ""},
+ {0x0303, "Head Mounted Display Audio", ""},
+ {0x0304, "Desktop speaker", ""},
+ {0x0305, "Room speaker", ""},
+ {0x0306, "Communication speaker", ""},
+ {0x0307, "Low frequency effects speaker", ""},
+ //
+ // 2.4 Bi-directional Terminal Types
+ //
+ {0x0400, "Bi-directional Undefined", ""},
+ {0x0401, "Handset", ""},
+ {0x0402, "Headset", ""},
+ {0x0403, "Speakerphone, no echo reduction", ""},
+ {0x0404, "Echo-suppressing speakerphone", ""},
+ {0x0405, "Echo-canceling speakerphone", ""},
+ //
+ // 2.5 Telephony Terminal Types
+ //
+ {0x0500, "Telephony Undefined", ""},
+ {0x0501, "Phone line", ""},
+ {0x0502, "Telephone", ""},
+ {0x0503, "Down Line Phone", ""},
+ //
+ // 2.6 External Terminal Types
+ //
+ {0x0600, "External Undefined", ""},
+ {0x0601, "Analog connector", ""},
+ {0x0602, "Digital audio interface", ""},
+ {0x0603, "Line connector", ""},
+ {0x0604, "Legacy audio connector", ""},
+ {0x0605, "S/PDIF interface", ""},
+ {0x0606, "1394 DA stream", ""},
+ {0x0607, "1394 DV stream soundtrack", ""},
+ //
+ // Embedded Function Terminal Types
+ //
+ {0x0700, "Embedded Undefined", ""},
+ {0x0701, "Level Calibration Noise Source", ""},
+ {0x0702, "Equalization Noise", ""},
+ {0x0703, "CD player", ""},
+ {0x0704, "DAT", ""},
+ {0x0705, "DCC", ""},
+ {0x0706, "MiniDisk", ""},
+ {0x0707, "Analog Tape", ""},
+ {0x0708, "Phonograph", ""},
+ {0x0709, "VCR Audio", ""},
+ {0x070A, "Video Disc Audio", ""},
+ {0x070B, "DVD Audio", ""},
+ {0x070C, "TV Tuner Audio", ""},
+ {0x070D, "Satellite Receiver Audio", ""},
+ {0x070E, "Cable Tuner Audio", ""},
+ {0x070F, "DSS Audio", ""},
+ {0x0710, "Radio Receiver", ""},
+ {0x0711, "Radio Transmitter", ""},
+ {0x0712, "Multi-track Recorder", ""},
+ {0x0713, "Synthesizer", ""},
+};
+STRINGLIST slAudioFormatTypes [] =
+{
+ //
+ // A.1.1 Audio Data Format Type I Codes
+ //
+ {0x0000, "TYPE_I_UNDEFINED", ""},
+ {0x0001, "PCM", ""},
+ {0x0002, "PCM8", ""},
+ {0x0003, "IEEE_FLOAT", ""},
+ {0x0004, "ALAW", ""},
+ {0x0005, "MULAW", ""},
+ //
+ // A.1.2 Audio Data Format Type II Codes
+ //
+ {0x1000, "TYPE_II_UNDEFINED", ""},
+ {0x1001, "MPEG", ""},
+ {0x1002, "AC-3", ""},
+ //
+ // A.1.3 Audio Data Format Type III Codes
+ //
+ {0x2000, "TYPE_III_UNDEFINED", ""},
+ {0x2001, "IEC1937_AC-3", ""},
+ {0x2002, "IEC1937_MPEG-1_Layer1", ""},
+ {0x2003, "IEC1937_MPEG-1_Layer2/3 or IEC1937_MPEG-2_NOEXT", ""},
+ {0x2004, "IEC1937_MPEG-2_EXT", ""},
+ {0x2005, "IEC1937_MPEG-2_Layer1_LS", ""},
+ {0x2006, "IEC1937_MPEG-2_Layer2/3_LS", ""},
+};
+
+
+
+/*****************************************************************************
+ L O C A L F U N C T I O N P R O T O T Y P E S
+*****************************************************************************/
+
+BOOL
+DisplayACHeader (
+ PUSB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR HeaderDesc
+);
+
+BOOL
+DisplayACInputTerminal (
+ PUSB_AUDIO_INPUT_TERMINAL_DESCRIPTOR ITDesc
+);
+
+BOOL
+DisplayACOutputTerminal (
+ PUSB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR OTDesc
+);
+
+BOOL
+DisplayACMixerUnit (
+ PUSB_AUDIO_MIXER_UNIT_DESCRIPTOR MixerDesc
+);
+
+BOOL
+DisplayACSelectorUnit (
+ PUSB_AUDIO_SELECTOR_UNIT_DESCRIPTOR SelectorDesc
+);
+
+BOOL
+DisplayACFeatureUnit (
+ PUSB_AUDIO_FEATURE_UNIT_DESCRIPTOR FeatureDesc
+);
+
+BOOL
+DisplayACProcessingUnit (
+ PUSB_AUDIO_PROCESSING_UNIT_DESCRIPTOR ProcessingDesc
+);
+
+BOOL
+DisplayACExtensionUnit (
+ PUSB_AUDIO_EXTENSION_UNIT_DESCRIPTOR ExtensionDesc
+);
+
+BOOL
+DisplayASGeneral (
+ PUSB_AUDIO_GENERAL_DESCRIPTOR GeneralDesc
+);
+
+BOOL
+DisplayCSEndpoint (
+ PUSB_AUDIO_ENDPOINT_DESCRIPTOR EndpointDesc
+);
+
+BOOL
+DisplayASFormatType (
+ PUSB_AUDIO_COMMON_FORMAT_DESCRIPTOR FormatDesc
+);
+
+BOOL
+DisplayASFormatSpecific (
+ PUSB_AUDIO_COMMON_DESCRIPTOR CommonDesc
+);
+
+VOID
+DisplayBytes (
+ PUCHAR Data,
+ USHORT Len
+);
+
+/*****************************************************************************
+ L O C A L F U N C T I O N S
+*****************************************************************************/
+
+/*****************************************************************************
+
+ DisplayAudioDescriptor()
+
+ CommonDesc - An Audio Class Descriptor
+
+ bInterfaceSubClass - The SubClass of the Interface containing the descriptor
+
+*****************************************************************************/
+
+BOOL
+DisplayAudioDescriptor (
+ PUSB_AUDIO_COMMON_DESCRIPTOR CommonDesc,
+ UCHAR bInterfaceSubClass
+)
+{
+ switch (CommonDesc->bDescriptorType)
+ {
+ case USB_AUDIO_CS_INTERFACE:
+ switch (bInterfaceSubClass)
+ {
+ case USB_AUDIO_SUBCLASS_AUDIOCONTROL:
+ switch (CommonDesc->bDescriptorSubtype)
+ {
+ case USB_AUDIO_AC_HEADER:
+ return DisplayACHeader((PUSB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_INPUT_TERMINAL:
+ return DisplayACInputTerminal((PUSB_AUDIO_INPUT_TERMINAL_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_OUTPUT_TERMINAL:
+ return DisplayACOutputTerminal((PUSB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_MIXER_UNIT:
+ return DisplayACMixerUnit((PUSB_AUDIO_MIXER_UNIT_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_SELECTOR_UNIT:
+ return DisplayACSelectorUnit((PUSB_AUDIO_SELECTOR_UNIT_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_FEATURE_UNIT:
+ return DisplayACFeatureUnit((PUSB_AUDIO_FEATURE_UNIT_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_PROCESSING_UNIT:
+ return DisplayACProcessingUnit((PUSB_AUDIO_PROCESSING_UNIT_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AC_EXTENSION_UNIT:
+ return DisplayACExtensionUnit((PUSB_AUDIO_EXTENSION_UNIT_DESCRIPTOR)CommonDesc);
+
+ default:
+ break;
+ }
+ break;
+
+ case USB_AUDIO_SUBCLASS_AUDIOSTREAMING:
+ switch (CommonDesc->bDescriptorSubtype)
+ {
+ case USB_AUDIO_AS_GENERAL:
+ return DisplayASGeneral((PUSB_AUDIO_GENERAL_DESCRIPTOR)CommonDesc);
+
+ case USB_AUDIO_AS_FORMAT_TYPE:
+ return DisplayASFormatType((PUSB_AUDIO_COMMON_FORMAT_DESCRIPTOR)CommonDesc);
+ break;
+
+ case USB_AUDIO_AS_FORMAT_SPECIFIC:
+ return DisplayASFormatSpecific(CommonDesc);
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case USB_AUDIO_CS_ENDPOINT:
+ return DisplayCSEndpoint((PUSB_AUDIO_ENDPOINT_DESCRIPTOR)CommonDesc);
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACHeader()
+
+*****************************************************************************/
+
+BOOL
+DisplayACHeader (
+ PUSB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR HeaderDesc
+)
+{
+ UINT i = 0;
+
+ if (HeaderDesc->bLength < sizeof(USB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Interface Header Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ HeaderDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ HeaderDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ HeaderDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bcdADC: 0x%04X\r\n",
+ HeaderDesc->bcdADC);
+
+ AppendTextBuffer("wTotalLength: 0x%04X\r\n",
+ HeaderDesc->wTotalLength);
+
+ AppendTextBuffer("bInCollection: 0x%02X\r\n",
+ HeaderDesc->bInCollection);
+
+ for (i=0; i<HeaderDesc->bInCollection; i++)
+ {
+ AppendTextBuffer("baInterfaceNr[%d]: 0x%02X\r\n",
+ i+1,
+ HeaderDesc->baInterfaceNr[i]);
+ }
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACInputTerminal()
+
+*****************************************************************************/
+
+BOOL
+DisplayACInputTerminal (
+ PUSB_AUDIO_INPUT_TERMINAL_DESCRIPTOR ITDesc
+)
+{
+ PCHAR pStr = NULL;
+
+ if (ITDesc->bLength != sizeof(USB_AUDIO_INPUT_TERMINAL_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Input Terminal Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ITDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ITDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ ITDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bTerminalID: 0x%02X\r\n",
+ ITDesc->bTerminalID);
+
+ AppendTextBuffer("wTerminalType: 0x%04X",
+ ITDesc->wTerminalType);
+ pStr = GetStringFromList(slAudioTerminalTypes,
+ sizeof(slAudioTerminalTypes) / sizeof(STRINGLIST),
+ ITDesc->wTerminalType,
+ "Invalid AC Input Terminal Type");
+ AppendTextBuffer(" (%s)\r\n", pStr);
+
+ AppendTextBuffer("bAssocTerminal: 0x%02X\r\n",
+ ITDesc->bAssocTerminal);
+
+ AppendTextBuffer("bNrChannels: 0x%02X\r\n",
+ ITDesc->bNrChannels);
+
+ AppendTextBuffer("wChannelConfig: 0x%04X\r\n",
+ ITDesc->wChannelConfig);
+
+ AppendTextBuffer("iChannelNames: 0x%02X\r\n",
+ ITDesc->iChannelNames);
+
+ AppendTextBuffer("iTerminal: 0x%02X\r\n",
+ ITDesc->iTerminal);
+
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACOutputTerminal()
+
+*****************************************************************************/
+
+BOOL
+DisplayACOutputTerminal (
+ PUSB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR OTDesc
+)
+{
+ PCHAR pStr = NULL;
+
+ if (OTDesc->bLength != sizeof(USB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Output Terminal Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ OTDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ OTDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ OTDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bTerminalID: 0x%02X\r\n",
+ OTDesc->bTerminalID);
+
+ AppendTextBuffer("wTerminalType: 0x%04X",
+ OTDesc->wTerminalType);
+
+ pStr = GetStringFromList(slAudioTerminalTypes,
+ sizeof(slAudioTerminalTypes) / sizeof(STRINGLIST),
+ OTDesc->wTerminalType,
+ "Invalid AC Output Terminal Type");
+ AppendTextBuffer(" (%s)\r\n", pStr);
+
+ AppendTextBuffer("bAssocTerminal: 0x%02X\r\n",
+ OTDesc->bAssocTerminal);
+
+ AppendTextBuffer("bSourceID: 0x%02X\r\n",
+ OTDesc->bSourceID);
+
+ AppendTextBuffer("iTerminal: 0x%02X\r\n",
+ OTDesc->iTerminal);
+
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACMixerUnit()
+
+*****************************************************************************/
+
+BOOL
+DisplayACMixerUnit (
+ PUSB_AUDIO_MIXER_UNIT_DESCRIPTOR MixerDesc
+)
+{
+ UCHAR i = 0;
+ PUCHAR data = NULL;
+
+ if (MixerDesc->bLength < 10)
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Mixer Unit Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ MixerDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ MixerDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ MixerDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bUnitID: 0x%02X\r\n",
+ MixerDesc->bUnitID);
+
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n",
+ MixerDesc->bNrInPins);
+
+ for (i=0; i<MixerDesc->bNrInPins; i++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i+1,
+ MixerDesc->baSourceID[i]);
+ }
+
+ data = &MixerDesc->baSourceID[MixerDesc->bNrInPins];
+
+ AppendTextBuffer("bNrChannels: 0x%02X\r\n",
+ *data++);
+
+ AppendTextBuffer("wChannelConfig: 0x%04X\r\n",
+ *(PUSHORT)data);
+
+ data = (PUCHAR) ((PUSHORT) data + 1);
+
+ AppendTextBuffer("iChannelNames: 0x%02X\r\n",
+ *data++);
+
+ AppendTextBuffer("bmControls:\r\n");
+
+ i = MixerDesc->bLength - 10 - MixerDesc->bNrInPins;
+
+ DisplayBytes(data, i);
+
+ data += i;
+
+ AppendTextBuffer("iMixer: 0x%02X\r\n",
+ *data);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACSelectorUnit()
+
+*****************************************************************************/
+
+BOOL
+DisplayACSelectorUnit (
+ PUSB_AUDIO_SELECTOR_UNIT_DESCRIPTOR SelectorDesc
+)
+{
+ UCHAR i = 0;
+ PUCHAR data = NULL;
+
+ if (SelectorDesc->bLength < 6)
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Selector Unit Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ SelectorDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ SelectorDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ SelectorDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bUnitID: 0x%02X\r\n",
+ SelectorDesc->bUnitID);
+
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n",
+ SelectorDesc->bNrInPins);
+
+ for (i=0; i<SelectorDesc->bNrInPins; i++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i+1,
+ SelectorDesc->baSourceID[i]);
+ }
+
+ data = &SelectorDesc->baSourceID[SelectorDesc->bNrInPins];
+
+ AppendTextBuffer("iSelector: 0x%02X\r\n",
+ *data);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACFeatureUnit()
+
+*****************************************************************************/
+
+BOOL
+DisplayACFeatureUnit (
+ PUSB_AUDIO_FEATURE_UNIT_DESCRIPTOR FeatureDesc
+)
+{
+ UCHAR i = 0;
+ UCHAR n = 0;
+ UCHAR ch = 0;
+ PUCHAR data = NULL;
+
+ AppendTextBuffer("\r\n ===>Audio Control Feature Unit Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ FeatureDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ FeatureDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ FeatureDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bUnitID: 0x%02X\r\n",
+ FeatureDesc->bUnitID);
+
+ AppendTextBuffer("bSourceID: 0x%02X\r\n",
+ FeatureDesc->bSourceID);
+
+ AppendTextBuffer("bControlSize: 0x%02X\r\n",
+ FeatureDesc->bControlSize);
+
+
+ if (FeatureDesc->bLength < 7)
+ {
+ AppendTextBuffer("*!*WARNING: bLength is invalid (< 7)\r\n");
+ OOPS();
+ return FALSE;
+ }
+ else if(FeatureDesc->bLength == 7)
+ {
+ AppendTextBuffer("Audio controls are not available (bLength = 7)\r\n");
+ return TRUE;
+ }
+
+ n = FeatureDesc->bControlSize;
+
+ if(n == 0)
+ {
+ AppendTextBuffer("Audio controls are not available (bControlSize = 0)\r\n");
+ return TRUE;
+ }
+
+ ch = ((FeatureDesc->bLength - 7) / n) - 1;
+
+ // Check if there are extra bytes in descriptor based on formula in Spec
+ if (FeatureDesc->bLength != (7 + (ch + 1) * n))
+ {
+ // The descriptor length is greater than number of bmaControls
+ AppendTextBuffer("*!*WARNING: bLength is greater than number of bmaControls (bLength > ( 7 + (ch + 1) * n)\r\n");
+ }
+
+ data = &FeatureDesc->bmaControls[0];
+
+ if (ch == (UCHAR) -1)
+ {
+ // This should not happen, but this check is put in place so we don't loop for a long time below
+ AppendTextBuffer("*!*WARNING: Either bLength or bControlSize are invalid. The calculated logical channel count is -1. ((bLength - 7)/ n) - 1\r\n");
+ OOPS();
+ return FALSE;
+ }
+
+ for (i=0; i<=ch; i++)
+ {
+ AppendTextBuffer("bmaControls[%d]: ", i);
+ DisplayBytes(data, n);
+
+ data += n;
+ }
+
+
+ AppendTextBuffer("iFeature: 0x%02X\r\n",
+ *data);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACProcessingUnit()
+
+*****************************************************************************/
+
+BOOL
+DisplayACProcessingUnit (
+ PUSB_AUDIO_PROCESSING_UNIT_DESCRIPTOR ProcessingDesc
+)
+{
+ UCHAR i = 0;
+ PUCHAR data = NULL;
+
+ if (ProcessingDesc->bLength < sizeof(USB_AUDIO_PROCESSING_UNIT_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Processing Unit Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ProcessingDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ProcessingDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ ProcessingDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bUnitID: 0x%02X\r\n",
+ ProcessingDesc->bUnitID);
+
+ AppendTextBuffer("wProcessType: 0x%04X",
+ ProcessingDesc->wProcessType);
+
+ switch (ProcessingDesc->wProcessType)
+ {
+ case USB_AUDIO_PROCESS_UNDEFINED:
+ AppendTextBuffer("(Undefined Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_UPDOWNMIX:
+ AppendTextBuffer("(Up / Down Mix Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_DOLBYPROLOGIC:
+ AppendTextBuffer("(Dolby Prologic Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_3DSTEREOEXTENDER:
+ AppendTextBuffer("(3D-Stereo Extender Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_REVERBERATION:
+ AppendTextBuffer("(Reverberation Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_CHORUS:
+ AppendTextBuffer("(Chorus Process)\r\n");
+ break;
+
+ case USB_AUDIO_PROCESS_DYNRANGECOMP:
+ AppendTextBuffer("(Dynamic Range Compressor Process)\r\n");
+ break;
+
+ default:
+ AppendTextBuffer("\r\n");
+ break;
+ }
+
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n",
+ ProcessingDesc->bNrInPins);
+
+ for (i=0; i<ProcessingDesc->bNrInPins; i++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i+1,
+ ProcessingDesc->baSourceID[i]);
+ }
+
+ data = &ProcessingDesc->baSourceID[ProcessingDesc->bNrInPins];
+
+ AppendTextBuffer("bNrChannels: 0x%02X\r\n",
+ *data++);
+
+ AppendTextBuffer("wChannelConfig: 0x%04X\r\n",
+ *(PUSHORT)data);
+
+ data = (PUCHAR) ((PUSHORT) data + 1);
+
+ AppendTextBuffer("iChannelNames: 0x%02X\r\n",
+ *data++);
+
+ i = *data++;
+
+ AppendTextBuffer("bControlSize: 0x%02X\r\n",
+ i);
+
+ AppendTextBuffer("bmControls:\r\n");
+
+ DisplayBytes(data, i);
+
+ data += i;
+
+ AppendTextBuffer("iProcessing: 0x%02X\r\n",
+ *data++);
+
+
+ i = ProcessingDesc->bLength - 13 - ProcessingDesc->bNrInPins - i;
+
+ if (i)
+ {
+ AppendTextBuffer("Process Specific:\r\n");
+
+ DisplayBytes(data, i);
+ }
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayACExtensionUnit()
+
+*****************************************************************************/
+
+BOOL
+DisplayACExtensionUnit (
+ PUSB_AUDIO_EXTENSION_UNIT_DESCRIPTOR ExtensionDesc
+)
+{
+ UCHAR i = 0;
+ PUCHAR data = NULL;
+
+ if (ExtensionDesc->bLength < 13)
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Control Extension Unit Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ExtensionDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ExtensionDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ ExtensionDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bUnitID: 0x%02X\r\n",
+ ExtensionDesc->bUnitID);
+
+ AppendTextBuffer("wExtensionCode: 0x%04X\r\n",
+ ExtensionDesc->wExtensionCode);
+
+
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n",
+ ExtensionDesc->bNrInPins);
+
+ for (i=0; i<ExtensionDesc->bNrInPins; i++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i+1,
+ ExtensionDesc->baSourceID[i]);
+ }
+
+ data = &ExtensionDesc->baSourceID[ExtensionDesc->bNrInPins];
+
+ AppendTextBuffer("bNrChannels: 0x%02X\r\n",
+ *data++);
+
+ AppendTextBuffer("wChannelConfig: 0x%04X\r\n",
+ *(PUSHORT)data);
+
+ data = (PUCHAR) ((PUSHORT) data + 1);
+
+ AppendTextBuffer("iChannelNames: 0x%02X\r\n",
+ *data++);
+
+ i = *data++;
+
+ AppendTextBuffer("bControlSize: 0x%02X\r\n",
+ i);
+
+ AppendTextBuffer("bmControls:\r\n");
+
+ DisplayBytes(data, i);
+
+ data += i;
+
+ AppendTextBuffer("iExtension: 0x%02X\r\n",
+ *data);
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayASGeneral()
+
+*****************************************************************************/
+
+BOOL
+DisplayASGeneral (
+ PUSB_AUDIO_GENERAL_DESCRIPTOR GeneralDesc
+)
+{
+ PCHAR pStr = NULL;
+
+ if (GeneralDesc->bLength != sizeof(USB_AUDIO_GENERAL_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Streaming Class Specific Interface Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ GeneralDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ GeneralDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ GeneralDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bTerminalLink: 0x%02X\r\n",
+ GeneralDesc->bTerminalLink);
+
+ AppendTextBuffer("bDelay: 0x%02X\r\n",
+ GeneralDesc->bDelay);
+
+ AppendTextBuffer("wFormatTag: 0x%04X",
+ GeneralDesc->wFormatTag);
+
+ pStr = GetStringFromList(slAudioFormatTypes,
+ sizeof(slAudioFormatTypes) / sizeof(STRINGLIST),
+ GeneralDesc->wFormatTag,
+ "Invalid AC Format Type");
+ AppendTextBuffer(" (%s)\r\n", pStr);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayCSEndpoint()
+
+*****************************************************************************/
+
+BOOL
+DisplayCSEndpoint (
+ PUSB_AUDIO_ENDPOINT_DESCRIPTOR EndpointDesc
+)
+{
+ if (EndpointDesc->bLength != sizeof(USB_AUDIO_ENDPOINT_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Streaming Class Specific Audio Data Endpoint Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ EndpointDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ EndpointDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ EndpointDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bmAttributes: 0x%02X\r\n",
+ EndpointDesc->bmAttributes);
+
+ AppendTextBuffer("bLockDelayUnits: 0x%02X\r\n",
+ EndpointDesc->bLockDelayUnits);
+
+ AppendTextBuffer("wLockDelay: 0x%04X\r\n",
+ EndpointDesc->wLockDelay);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayASFormatType()
+
+*****************************************************************************/
+
+BOOL
+DisplayASFormatType (
+ PUSB_AUDIO_COMMON_FORMAT_DESCRIPTOR FormatDesc
+)
+{
+ UCHAR i = 0;
+ UCHAR n = 0;
+ ULONG freq = 0;
+ PUCHAR data = NULL;
+
+ if (FormatDesc->bLength < sizeof(USB_AUDIO_COMMON_FORMAT_DESCRIPTOR))
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ AppendTextBuffer("\r\n ===>Audio Streaming Format Type Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ FormatDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ FormatDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ FormatDesc->bDescriptorSubtype);
+
+ AppendTextBuffer("bFormatType: 0x%02X\r\n",
+ FormatDesc->bFormatType);
+
+
+ if (FormatDesc->bFormatType == 0x01 ||
+ FormatDesc->bFormatType == 0x03)
+ {
+ PUSB_AUDIO_TYPE_I_OR_III_FORMAT_DESCRIPTOR FormatI_IIIDesc;
+
+ FormatI_IIIDesc = (PUSB_AUDIO_TYPE_I_OR_III_FORMAT_DESCRIPTOR)FormatDesc;
+
+ AppendTextBuffer("bNrChannels: 0x%02X\r\n",
+ FormatI_IIIDesc->bNrChannels);
+
+ AppendTextBuffer("bSubframeSize: 0x%02X\r\n",
+ FormatI_IIIDesc->bSubframeSize);
+
+ AppendTextBuffer("bBitResolution: 0x%02X\r\n",
+ FormatI_IIIDesc->bBitResolution);
+
+ AppendTextBuffer("bSamFreqType: 0x%02X\r\n",
+ FormatI_IIIDesc->bSamFreqType);
+
+ data = (PUCHAR)(FormatI_IIIDesc + 1);
+
+ n = FormatI_IIIDesc->bSamFreqType;
+
+ }
+ else if (FormatDesc->bFormatType == 0x02)
+ {
+ PUSB_AUDIO_TYPE_II_FORMAT_DESCRIPTOR FormatIIDesc;
+
+ FormatIIDesc = (PUSB_AUDIO_TYPE_II_FORMAT_DESCRIPTOR)FormatDesc;
+
+ AppendTextBuffer("wMaxBitRate: 0x%04X\r\n",
+ FormatIIDesc->wMaxBitRate);
+
+ AppendTextBuffer("wSamplesPerFrame: 0x%04X\r\n",
+ FormatIIDesc->wSamplesPerFrame);
+
+ AppendTextBuffer("bSamFreqType: 0x%02X\r\n",
+ FormatIIDesc->bSamFreqType);
+
+ data = (PUCHAR)(FormatIIDesc + 1);
+
+ n = FormatIIDesc->bSamFreqType;
+ }
+ else
+ {
+ data = NULL;
+ }
+
+ if (data != NULL)
+ {
+ if (n == 0)
+ {
+ freq = (data[0]) + (data[1] << 8) + (data[2] << 16);
+ data += 3;
+
+ AppendTextBuffer("tLowerSamFreq: 0x%06X (%d Hz)\r\n",
+ freq,
+ freq);
+
+ freq = (data[0]) + (data[1] << 8) + (data[2] << 16);
+ data += 3;
+
+ AppendTextBuffer("tUpperSamFreq: 0x%06X (%d Hz)\r\n",
+ freq,
+ freq);
+ }
+ else
+ {
+ for (i=0; i<n; i++)
+ {
+ freq = (data[0]) + (data[1] << 8) + (data[2] << 16);
+ data += 3;
+
+ AppendTextBuffer("tSamFreq[%d]: 0x%06X (%d Hz)\r\n",
+ i+1,
+ freq,
+ freq);
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ DisplayASFormatSpecific()
+
+*****************************************************************************/
+
+BOOL
+DisplayASFormatSpecific (
+ PUSB_AUDIO_COMMON_DESCRIPTOR CommonDesc
+)
+{
+ AppendTextBuffer("\r\n ===>Audio Streaming Format Specific Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ CommonDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ CommonDesc->bDescriptorType);
+
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n",
+ CommonDesc->bDescriptorSubtype);
+
+ DisplayBytes((PUCHAR)(CommonDesc + 1),
+ CommonDesc->bLength);
+
+ return TRUE;
+}
+
+/*****************************************************************************
+
+ DisplayBytes()
+
+*****************************************************************************/
+
+VOID
+DisplayBytes (
+ PUCHAR Data,
+ USHORT Len
+)
+{
+ USHORT i;
+
+ for (i = 0; i < Len; i++)
+ {
+ AppendTextBuffer("%02X ", Data[i]);
+
+ if (i % 16 == 15)
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+
+ if (i % 16 != 0)
+ {
+ AppendTextBuffer("\r\n");
+ }
+}
+
+
diff --git a/tests/projects/winsdk/usbview/display.c b/tests/projects/winsdk/usbview/display.c new file mode 100644 index 000000000..beead6d93 --- /dev/null +++ b/tests/projects/winsdk/usbview/display.c @@ -0,0 +1,5242 @@ +/*++
+
+Copyright (c) 1997-2011 Microsoft Corporation
+
+Module Name:
+
+DISPLAY.C
+
+Abstract:
+
+This source file contains the routines which update the edit control
+to display information about the selected USB device.
+
+Environment:
+
+user mode
+
+Revision History:
+
+04-25-97 : created
+03-28-03 : extensive changes to support new USBVCD
+03-28-08 : extensive changes to support new USB Video Class 1.1
+
+--*/
+
+/*****************************************************************************
+I N C L U D E S
+*****************************************************************************/
+
+#include "uvcview.h"
+#include "h264.h"
+#include <usb200.h>
+
+#include "vndrlist.h"
+#include "langidlist.h"
+
+/*****************************************************************************
+D E F I N E S
+*****************************************************************************/
+
+#define BUFFERALLOCINCREMENT 0x10000
+#define BUFFERMINFREESPACE 0x1000
+
+/*****************************************************************************
+T Y P E D E F S
+*****************************************************************************/
+
+//
+// Hardcoded information about specific EHCI controllers
+//
+typedef struct _EHCI_CONTROLLER_DATA
+{
+ USHORT VendorID;
+ USHORT DeviceID;
+ UCHAR DebugPortNumber;
+} EHCI_CONTROLLER_DATA, *PEHCI_CONTROLLER_DATA;
+
+
+/*****************************************************************************
+G L O B A L S P R I V A T E T O T H I S F I L E
+*****************************************************************************/
+
+// Workspace for text info which is used to update the edit control
+//
+CHAR *TextBuffer = NULL;
+UINT TextBufferLen = 0;
+UINT TextBufferPos = 0;
+
+STRINGLIST slPowerState [] =
+{
+ {WdmUsbPowerNotMapped, "S? (unmapped) ", ""},
+
+ {WdmUsbPowerSystemUnspecified, "S? (unspecified)", ""},
+ {WdmUsbPowerSystemWorking, "S0 (working) ", ""},
+ {WdmUsbPowerSystemSleeping1, "S1 (sleep) ", ""},
+ {WdmUsbPowerSystemSleeping2, "S2 (sleep) ", ""},
+ {WdmUsbPowerSystemSleeping3, "S3 (sleep) ", ""},
+ {WdmUsbPowerSystemHibernate, "S4 (Hibernate) ", ""},
+ {WdmUsbPowerSystemShutdown, "S5 (shutdown) ", ""},
+
+ {WdmUsbPowerDeviceUnspecified, "D? (unspecified)", ""},
+ {WdmUsbPowerDeviceD0, "D0 ", ""},
+ {WdmUsbPowerDeviceD1, "D1 ", ""},
+ {WdmUsbPowerDeviceD2, "D2 ", ""},
+ {WdmUsbPowerDeviceD3, "D3 ", ""},
+};
+
+STRINGLIST slControllerFlavor[] =
+{
+ { USB_HcGeneric, "USB_HcGeneric", "" },
+ { OHCI_Generic, "OHCI_Generic", "" },
+ { OHCI_Hydra, "OHCI_Hydra", "" },
+ { OHCI_NEC, "OHCI_NEC", "" },
+ { UHCI_Generic, "UHCI_Generic", "" },
+ { UHCI_Piix4, "UHCI_Piix4", "" },
+ { UHCI_Piix3, "UHCI_Piix3", "" },
+ { UHCI_Ich2, "UHCI_Ich2", "" },
+ { UHCI_Reserved204, "UHCI_Reserved204", "" },
+ { UHCI_Ich1, "UHCI_Ich1", "" },
+ { UHCI_Ich3m, "UHCI_Ich3m", "" },
+ { UHCI_Ich4, "UHCI_Ich4", "" },
+ { UHCI_Ich5, "UHCI_Ich5", "" },
+ { UHCI_Ich6, "UHCI_Ich6", "" },
+ { UHCI_Intel, "UHCI_Intel", "" },
+ { UHCI_VIA, "UHCI_VIA", "" },
+ { UHCI_VIA_x01, "UHCI_VIA_x01", "" },
+ { UHCI_VIA_x02, "UHCI_VIA_x02", "" },
+ { UHCI_VIA_x03, "UHCI_VIA_x03", "" },
+ { UHCI_VIA_x04, "UHCI_VIA_x04", "" },
+ { UHCI_VIA_x0E_FIFO, "UHCI_VIA_x0E_FIFO", "" },
+ { EHCI_Generic, "EHCI_Generic", "" },
+ { EHCI_NEC, "EHCI_NEC", "" },
+ { EHCI_Lucent, "EHCI_Lucent", "" },
+ { EHCI_NVIDIA_Tegra2, "EHCI_NVIDIA_Tegra2", "" },
+ { EHCI_NVIDIA_Tegra3, "EHCI_NVIDIA_Tegra3", "" },
+ { EHCI_Intel_Medfield, "EHCI_Intel_Medfield", "" }
+};
+
+//
+// For supporting pre Win8 versions of Windows, a hardcoded list is maintained for determining
+// debug port numbers. As usbport.inf is augmented with new host controllers, this list should
+// be updated.
+//
+// The following entries do not have a debug port:
+// PCI\VEN_8086&DEV_0806 - "Intel(R) SM35 Express Chipset USB2 Enhanced Host Controller MPH - 0806"
+// PCI\VEN_8086&DEV_0811 - "Intel(R) SM35 Express Chipset USB2 Enhanced Host Controller SPM - 0811"
+//
+
+EHCI_CONTROLLER_DATA EhciControllerData[] =
+{
+ {0x8086, 0x24CD, 1}, // ICH4 - Intel(R) 82801DB/DBM USB 2.0 Enhanced Host Controller - 24CD
+ {0x8086, 0x24DD, 1}, // ICH5 - Intel(R) 82801EB USB2 Enhanced Host Controller - 24DD
+ {0x8086, 0x25AD, 1}, // ICH5 - Intel(R) 6300ESB USB2 Enhanced Host Controller - 25AD
+ {0x8086, 0x265C, 1}, // ICH6 - Intel(R) 82801FB/FBM USB2 Enhanced Host Controller - 265C
+ {0x8086, 0x268C, 1}, // Intel(R) 631xESB/6321ESB/3100 Chipset USB2 Enhanced Host Controller - 268C
+ {0x8086, 0x27CC, 1}, // ICH7 - Intel(R) 82801G (ICH7 Family) USB2 Enhanced Host Controller - 27CC
+ {0x8086, 0x2836, 1}, // ICH8 - Intel(R) ICH8 Family USB2 Enhanced Host Controller - 2836
+ {0x8086, 0x283A, 1}, // ICH8 - Intel(R) ICH8 Family USB2 Enhanced Host Controller - 283A
+ {0x8086, 0x293A, 1}, // ICH9 - Intel(R) ICH9 Family USB2 Enhanced Host Controller - 293A
+ {0x8086, 0x293C, 1}, // ICH9 - Intel(R) ICH9 Family USB2 Enhanced Host Controller - 293C
+ {0x8086, 0x3A3A, 1}, // ICH10 - Intel(R) ICH10 Family USB Enhanced Host Controller - 3A3A
+ {0x8086, 0x3A3C, 1}, // ICH10 - Intel(R) ICH10 Family USB Enhanced Host Controller - 3A3C
+ {0x8086, 0x3A6A, 1}, // ICH10 - Intel(R) ICH10 Family USB Enhanced Host Controller - 3A6A
+ {0x8086, 0x3A6C, 1}, // ICH10 - Intel(R) ICH10 Family USB Enhanced Host Controller - 3A6C
+ {0x8086, 0x3B34, 2}, // 5 series - Intel(R) 5 Series/3400 Series Chipset Family USB Enhanced Host Controller - 3B34
+ {0x8086, 0x3B36, 2}, // 5 series - Intel(R) 5 Series/3400 Series Chipset Family USB Universal Host Controller - 3B36
+ {0x8086, 0x1C26, 2}, // 6 series - Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller - 1C26
+ {0x8086, 0x1C2D, 2}, // 6 series - Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller - 1C2D
+ {0x8086, 0x1D26, 2}, // Intel(R) C600/X79 series chipset USB2 Enhanced Host Controller #1 - 1D26
+ {0x8086, 0x1D2D, 2}, // Intel(R) C600/X79 series chipset USB2 Enhanced Host Controller #2 - 1D2D
+ {0x8086, 0x268C, 1}, // Intel(R) 631xESB/6321ESB/3100 Chipset USB2 Enhanced Host Controller - 268C
+ {0x10DE, 0x00D8, 1},
+ {0,0,0},
+};
+
+
+/*****************************************************************************
+L O C A L F U N C T I O N P R O T O T Y P E S
+*****************************************************************************/
+
+VOID
+DisplayPortConnectorProperties (
+ _In_ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2
+ );
+
+void
+DisplayDevicePowerState (
+ _In_ PDEVICE_INFO_NODE DeviceInfoNode
+ );
+
+VOID
+DisplayHubInfo (
+ PUSB_HUB_INFORMATION HubInfo,
+ BOOL DisplayDescriptor
+ );
+
+VOID
+DisplayHubInfoEx (
+ PUSB_HUB_INFORMATION_EX HubInfoEx
+ );
+
+VOID
+DisplayHubCapabilityEx (
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx
+ );
+
+VOID
+DisplayPowerState(
+ PUSB_POWER_INFO pUPI
+ );
+
+VOID
+DisplayConnectionInfo (
+ _In_ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectInfo,
+ _In_ PUSBDEVICEINFO info,
+ _In_ PSTRING_DESCRIPTOR_NODE StringDescs,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2
+ );
+
+VOID
+DisplayPipeInfo (
+ ULONG NumPipes,
+ USB_PIPE_INFO *PipeInfo
+ );
+
+VOID
+DisplayConfigDesc (
+ PUSBDEVICEINFO info,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ );
+
+VOID
+DisplayBosDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_BOS_DESCRIPTOR BosDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ );
+
+VOID
+DisplayBillboardCapabilityDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR billboardCapDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+);
+
+VOID
+DisplayDeviceQualifierDescriptor (
+ PUSB_DEVICE_QUALIFIER_DESCRIPTOR DevQualDesc
+ );
+
+VOID
+DisplayConfigurationDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ );
+
+VOID
+DisplayInterfaceDescriptor (
+ PUSB_INTERFACE_DESCRIPTOR InterfaceDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+VOID
+DisplayEndpointDescriptor (
+ _In_ PUSB_ENDPOINT_DESCRIPTOR
+ EndpointDesc,
+ _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR
+ EpCompDesc,
+ _In_opt_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
+ SspIsochCompDesc,
+ _In_ UCHAR InterfaceClass,
+ _In_ BOOLEAN EpCompDescAvail
+ );
+
+VOID
+DisplaySuperSpeedPlusIsochEndpointCompanionDescriptor(
+ _In_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR SspIsochEpCompDesc
+ );
+
+VOID
+DisplayEndointCompanionDescriptor (
+ _In_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR EpCompDesc,
+ _In_opt_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
+ SspIsochEpCompDesc,
+ _In_ UCHAR DescType
+ );
+
+
+VOID
+DisplayHidDescriptor (
+ PUSB_HID_DESCRIPTOR HidDesc
+ );
+
+VOID
+DisplayOTGDescriptor (
+ PUSB_OTG_DESCRIPTOR OTGDesc
+ );
+
+void
+InitializePerDeviceSettings (
+ PUSBDEVICEINFO info
+ );
+
+UINT
+IsUVCDevice (
+ PUSBDEVICEINFO info
+ );
+
+VOID
+DisplayIADDescriptor (
+ PUSB_IAD_DESCRIPTOR IADDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ int nInterfaces,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+VOID
+DisplayUSEnglishStringDescriptor (
+ UCHAR Index,
+ PSTRING_DESCRIPTOR_NODE USStringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+VOID
+DisplayUnknownDescriptor (
+ PUSB_COMMON_DESCRIPTOR CommonDesc
+ );
+
+VOID
+DisplayRemainingUnknownDescriptor(
+ PUCHAR DescriptorData,
+ ULONG Start,
+ ULONG Stop
+ );
+
+PCHAR
+GetVendorString (
+ USHORT idVendor
+ );
+
+PCHAR
+GetLangIDString (
+ USHORT idLang
+ );
+
+UINT
+GetConfigurationSize (
+ PUSBDEVICEINFO info
+ );
+
+UINT
+GetInterfaceCount (
+ PUSBDEVICEINFO info
+ );
+
+
+/*****************************************************************************
+L O C A L F U N C T I O N S
+*****************************************************************************/
+
+/*****************************************************************************
+
+NextDescriptor()
+
+*****************************************************************************/
+//__forceinline
+PUSB_COMMON_DESCRIPTOR
+NextDescriptor(
+ _In_ PUSB_COMMON_DESCRIPTOR Descriptor
+ )
+{
+ if (Descriptor->bLength == 0)
+ {
+ return NULL;
+ }
+ return (PUSB_COMMON_DESCRIPTOR)((PUCHAR)Descriptor + Descriptor->bLength);
+}
+
+/*****************************************************************************
+
+GetNextDescriptor()
+
+*****************************************************************************/
+PUSB_COMMON_DESCRIPTOR
+GetNextDescriptor(
+ _In_reads_bytes_(TotalLength)
+ PUSB_COMMON_DESCRIPTOR FirstDescriptor,
+ _In_
+ ULONG TotalLength,
+ _In_
+ PUSB_COMMON_DESCRIPTOR StartDescriptor,
+ _In_ long
+ DescriptorType
+ )
+{
+ PUSB_COMMON_DESCRIPTOR currentDescriptor = NULL;
+ PUSB_COMMON_DESCRIPTOR endDescriptor = NULL;
+
+ endDescriptor = (PUSB_COMMON_DESCRIPTOR)((PUCHAR)FirstDescriptor + TotalLength);
+
+ if (StartDescriptor >= endDescriptor ||
+ NextDescriptor(StartDescriptor)>= endDescriptor)
+ {
+ return NULL;
+ }
+
+ if (DescriptorType == -1) // -1 means any type
+ {
+ return NextDescriptor(StartDescriptor);
+ }
+
+ currentDescriptor = StartDescriptor;
+
+ while (((currentDescriptor = NextDescriptor(currentDescriptor)) < endDescriptor)
+ && currentDescriptor != NULL)
+ {
+ if (currentDescriptor->bDescriptorType == (UCHAR)DescriptorType)
+ {
+ return currentDescriptor;
+ }
+ }
+ return NULL;
+}
+
+
+
+/*****************************************************************************
+
+CreateTextBuffer()
+
+*****************************************************************************/
+
+BOOL
+CreateTextBuffer (
+ )
+{
+ // Allocate the buffer
+ //
+ TextBuffer = ALLOC(BUFFERALLOCINCREMENT);
+
+ if (TextBuffer == NULL)
+ {
+ OOPS();
+
+ return FALSE;
+ }
+
+ TextBufferLen = BUFFERALLOCINCREMENT;
+
+ // Reset the buffer position and terminate the buffer
+ //
+ memset(TextBuffer, 0, BUFFERALLOCINCREMENT);
+ TextBufferPos = 0;
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+DestroyTextBuffer()
+
+*****************************************************************************/
+
+VOID
+DestroyTextBuffer (
+ )
+{
+ if (TextBuffer != NULL)
+ {
+ FREE(TextBuffer);
+
+ TextBuffer = NULL;
+ }
+}
+
+
+/*****************************************************************************
+
+ResetTextBuffer()
+
+*****************************************************************************/
+
+BOOL
+ResetTextBuffer (
+ )
+{
+ // Fail if the text buffer has not been allocated
+ //
+ if (TextBuffer == NULL)
+ {
+ OOPS();
+
+ return FALSE;
+ }
+
+ // Reset the buffer position and terminate the buffer
+ //
+ *TextBuffer = 0;
+ TextBufferPos = 0;
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+GetTextBufferPos()
+
+*****************************************************************************/
+
+UINT
+GetTextBufferPos (
+ )
+{
+ return TextBufferPos;
+}
+
+
+/*****************************************************************************
+
+AppendTextBuffer()
+
+*****************************************************************************/
+
+VOID __cdecl
+AppendTextBuffer (
+ LPCTSTR lpFormat,
+ ...
+ )
+{
+ va_list arglist;
+ HRESULT hr = S_OK;
+ int nPos = TextBufferPos;
+ char LocalTextBuffer[512];
+
+ va_start(arglist, lpFormat);
+
+ // Make sure we have a healthy amount of space free in the buffer,
+ // reallocating the buffer if necessary.
+ //
+
+ if (TextBufferLen - TextBufferPos < BUFFERMINFREESPACE)
+ {
+ CHAR *TextBufferTmp;
+ UINT uNewTextBufferLen = 0;
+ hr = UIntAdd(TextBufferLen, BUFFERALLOCINCREMENT, &uNewTextBufferLen);
+
+ if (hr != S_OK)
+ {
+ // we've exceeded DWORD length of (2^32)-1 for buffer
+ OOPS();
+
+ return;
+ }
+
+ TextBufferTmp = REALLOC(TextBuffer, uNewTextBufferLen);
+
+ if (TextBufferTmp != NULL)
+ {
+ TextBuffer = TextBufferTmp;
+ TextBufferLen += BUFFERALLOCINCREMENT; // update TextBufferLen to reflect the new, bigger size of the text buffer
+ }
+ else
+ {
+ // If GlobalReAlloc fails, the original memory is not freed,
+ // and the original handle and pointer are still valid.
+ //
+
+ OOPS();
+
+ return;
+ }
+ }
+
+ // Add the text to the end of the buffer
+ //
+ hr = StringCchVPrintf(LocalTextBuffer, sizeof(LocalTextBuffer), lpFormat, arglist);
+ if (SUCCEEDED(hr))
+ {
+ size_t cbMax = 512;
+ size_t pcb = 0;
+
+ // Ensure TextBuffer is zero terminated
+ // The text buffer size is specified by TextBufferLen.
+ // the text buffer size will be bigger than BUFFERALLOCINCREMENT if the buffer has been reallocated more than
+ // once (which would happen if it had to be made bigger to hold more text)
+ hr = StringCbLength((LPCTSTR) TextBuffer,
+ TextBufferLen, // the maximum number of bytes allowed in TextBuffer.
+ &pcb);
+
+ if (FAILED(hr)) // buffer is not null-terminated, go ahead and do that
+ {
+ TextBuffer[TextBufferLen-1] = 0;
+ }
+ hr = StringCbLength((LPCTSTR) LocalTextBuffer, cbMax, &pcb);
+ if (SUCCEEDED(hr))
+ {
+ StringCbCatN(TextBuffer, TextBufferLen, LocalTextBuffer, pcb);
+
+ // Increment the text position by the number of charcters we just added to it.
+ TextBufferPos += (UINT) pcb;
+ }
+
+ // If DebugLog flag set, send output to the debugger
+ //
+ if (gLogDebug)
+ {
+ OutputDebugString(TextBuffer + nPos); // print the string just added to the text buffer
+ }
+ }
+}
+
+//*****************************************************************************
+//
+// GetTextBuffer
+//
+// Returns the display text buffer
+//
+//*****************************************************************************
+PCHAR GetTextBuffer(void)
+{
+ return (TextBuffer);
+}
+
+
+//*****************************************************************************
+//
+// GetEhciDebugPort
+//
+// Returns debug port value if present for EHCI controller. 0 if its not present
+//
+//*****************************************************************************
+ULONG GetEhciDebugPort(ULONG vendorId, ULONG deviceId)
+{
+ int i = 0;
+ ULONG debugPort = 0;
+
+ for (i = 0; EhciControllerData[i].VendorID != 0; i++)
+ {
+ if (vendorId == EhciControllerData[i].VendorID &&
+ deviceId == EhciControllerData[i].DeviceID)
+ {
+ debugPort = EhciControllerData[i].DebugPortNumber;
+ break;
+ }
+ }
+
+ return debugPort;
+}
+
+//*****************************************************************************
+//
+// UpdateTreeItemDeviceInfo
+//
+// hTreeItem - Handle of selected TreeView item for which information should
+// be added to the TextBuffer global
+//
+// The functions returns error status if AppendTextBuffer() used in Display*() functions
+// fails. The display text would be missing or truncated in such cases.
+//*****************************************************************************
+HRESULT
+UpdateTreeItemDeviceInfo(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem
+ )
+{
+ TV_ITEM tvi;
+ PVOID info;
+ ULONG i;
+ HRESULT hr = S_OK;
+ PCHAR tviName = NULL;
+
+ SetLastError(0);
+
+#ifndef H264_SUPPORT
+ UNREFERENCED_PARAMETER(bShowVersion)
+#endif
+
+#ifdef H264_SUPPORT
+ ResetErrorCounts();
+#endif
+
+ tviName = ALLOC(256);
+
+ if(NULL == tviName)
+ {
+ OOPS();
+ hr = E_OUTOFMEMORY;
+ return hr;
+ }
+
+ //
+ // Get the name of the TreeView item, along with the a pointer to the
+ // info we stored about the item in the item's lParam.
+ //
+
+ tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
+ tvi.hItem = hTreeItem;
+ tvi.pszText = (LPSTR) tviName;
+ tvi.cchTextMax = 256;
+
+ TreeView_GetItem(hTreeWnd,
+ &tvi);
+
+ info = (PVOID)tvi.lParam;
+
+ AppendTextBuffer(tviName);
+ AppendTextBuffer("\r\n");
+
+ //
+ // If we didn't store any info for the item, just display the item's
+ // name, else display the info we stored for the item.
+ //
+ if (NULL != info)
+ {
+ PUSB_NODE_INFORMATION HubInfo = NULL;
+ PCHAR HubName = NULL;
+ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo = NULL;
+ PUSB_DESCRIPTOR_REQUEST ConfigDesc = NULL;
+ PSTRING_DESCRIPTOR_NODE StringDescs = NULL;
+ PUSB_HUB_INFORMATION_EX HubInfoEx = NULL;
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx = NULL;
+ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps = NULL;
+ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2 = NULL;
+ PUSB_DESCRIPTOR_REQUEST BosDesc = NULL;
+ PDEVICE_INFO_NODE DeviceInfoNode = NULL;
+
+ // The TextBuffer has the TreeView name; add 2 lines for display
+ AppendTextBuffer("\r\n\r\n");
+
+ switch (*(PUSBDEVICEINFOTYPE)info)
+ {
+ case HostControllerInfo:
+ {
+ HTREEITEM rootHubItem = NULL;
+ BOOL dbgPortFound = FALSE;
+
+ AppendTextBuffer("DriverKey: %s\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->DriverKey);
+
+ AppendTextBuffer("VendorID: %04X\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->VendorID);
+
+ AppendTextBuffer("DeviceID: %04X\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->DeviceID);
+
+ AppendTextBuffer("SubSysID: %08X\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->SubSysID);
+
+ AppendTextBuffer("Revision: %02X\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->Revision);
+
+ //
+ // Search for the debug port number. If running on Win8 or later,
+ // the USB_PORT_CONNECTOR_PROPERTIES structure will contain the
+ // port number. If that fails, the list of known host controllers
+ // with debug ports will be searched.
+ //
+
+ AppendTextBuffer("\r\nDebug Port Number: ");
+
+ rootHubItem = TreeView_GetChild(hTreeWnd, hTreeItem);
+
+ if (rootHubItem != NULL)
+ {
+ HTREEITEM portItem = NULL;
+ PVOID portInfo;
+
+ portItem = TreeView_GetChild(hTreeWnd, rootHubItem);
+
+ while (portItem != NULL)
+ {
+ tvi.mask = TVIF_PARAM;
+ tvi.hItem = portItem;
+ tvi.pszText = NULL;
+ tvi.cchTextMax = 0;
+
+ TreeView_GetItem(hTreeWnd, &tvi);
+
+ portInfo = (PVOID)tvi.lParam;
+
+ //
+ // Note that an empty port is a port without a device attached
+ // is still a DeviceInfo instance.
+ //
+
+ if ((*(PUSBDEVICEINFOTYPE)portInfo) == DeviceInfo)
+ {
+ ConnectionInfo = ((PUSBDEVICEINFO)portInfo)->ConnectionInfo;
+ PortConnectorProps = ((PUSBDEVICEINFO)portInfo)->PortConnectorProps;
+ }
+ else if ((*(PUSBDEVICEINFOTYPE)portInfo) == ExternalHubInfo)
+ {
+ ConnectionInfo = ((PUSBEXTERNALHUBINFO)portInfo)->ConnectionInfo;
+ PortConnectorProps = ((PUSBEXTERNALHUBINFO)portInfo)->PortConnectorProps;
+
+ }
+
+ if (ConnectionInfo != NULL &&
+ PortConnectorProps != NULL &&
+ PortConnectorProps->UsbPortProperties.PortIsDebugCapable)
+ {
+ dbgPortFound = TRUE;
+ AppendTextBuffer("%d\r\n", ((PUSBDEVICEINFO)portInfo)->ConnectionInfo->ConnectionIndex);
+ break;
+ }
+ portItem = TreeView_GetNextSibling(hTreeWnd, portItem);
+ }
+
+ //
+ // Resetting ConnectionInfo and PortConnectorProps to NULL so that they won't be erroneously
+ // be displayed below.
+ //
+
+ ConnectionInfo = NULL;
+ PortConnectorProps = NULL;
+ }
+ if (dbgPortFound == FALSE)
+ {
+ for (i = 0; EhciControllerData[i].VendorID; i++)
+ {
+ if (((PUSBHOSTCONTROLLERINFO)info)->VendorID ==
+ EhciControllerData[i].VendorID &&
+ ((PUSBHOSTCONTROLLERINFO)info)->DeviceID ==
+ EhciControllerData[i].DeviceID)
+ {
+ dbgPortFound = TRUE;
+ AppendTextBuffer("%d\r\n", EhciControllerData[i].DebugPortNumber);
+ break;
+ }
+ }
+ }
+ if (dbgPortFound == FALSE)
+ {
+ AppendTextBuffer("None\r\n");
+ }
+
+ //
+ // Display bus/device/function to help with setting debug
+ // settings.
+ //
+ if (((PUSBHOSTCONTROLLERINFO)info)->BusDeviceFunctionValid)
+ {
+ AppendTextBuffer("Bus.Device.Function (in decimal): %d.%d.%d\r\n",
+ ((PUSBHOSTCONTROLLERINFO)info)->BusNumber,
+ ((PUSBHOSTCONTROLLERINFO)info)->BusDevice,
+ ((PUSBHOSTCONTROLLERINFO)info)->BusFunction);
+ }
+
+ // Display the USB Host Controller Power State Info
+ {
+ PUSB_POWER_INFO pUPI = (PUSB_POWER_INFO) &((PUSBHOSTCONTROLLERINFO)info)->USBPowerInfo[0];
+ int nIndex = 0;
+ int nPowerState = WdmUsbPowerSystemWorking;
+
+ AppendTextBuffer("\r\nHost Controller Power State Mappings\r\n");
+ AppendTextBuffer("System State\t\tHost Controller\t\tRoot Hub\tUSB wakeup\tPowered\r\n");
+ for ( ; nPowerState < WdmUsbPowerSystemShutdown; nIndex++, nPowerState++, pUPI++)
+ {
+ DisplayPowerState(pUPI);
+ }
+
+ AppendTextBuffer("%s\t%s\r\n",
+ "Last Sleep State",
+ GetPowerStateString(pUPI->LastSystemSleepState)
+ );
+ }
+
+ break;
+ }
+
+ case RootHubInfo:
+ HubInfo = ((PUSBROOTHUBINFO)info)->HubInfo;
+ HubName = ((PUSBROOTHUBINFO)info)->HubName;
+ HubCapabilityEx = ((PUSBROOTHUBINFO)info)->HubCapabilityEx;
+
+ AppendTextBuffer("Root Hub: %s\r\n",
+ HubName);
+
+ break;
+
+ case ExternalHubInfo:
+ HubInfo = ((PUSBEXTERNALHUBINFO)info)->HubInfo;
+ HubName = ((PUSBEXTERNALHUBINFO)info)->HubName;
+ HubInfoEx = ((PUSBEXTERNALHUBINFO)info)->HubInfoEx;
+ HubCapabilityEx = ((PUSBEXTERNALHUBINFO)info)->HubCapabilityEx;
+ ConnectionInfo = ((PUSBEXTERNALHUBINFO)info)->ConnectionInfo;
+ ConnectionInfoV2 = ((PUSBEXTERNALHUBINFO)info)->ConnectionInfoV2;
+ PortConnectorProps = ((PUSBEXTERNALHUBINFO)info)->PortConnectorProps;
+ ConfigDesc = ((PUSBEXTERNALHUBINFO)info)->ConfigDesc;
+ StringDescs = ((PUSBEXTERNALHUBINFO)info)->StringDescs;
+ BosDesc = ((PUSBEXTERNALHUBINFO)info)->BosDesc;
+ DeviceInfoNode = ((PUSBEXTERNALHUBINFO)info)->DeviceInfoNode;
+
+ AppendTextBuffer("External Hub: %s\r\n",
+ HubName);
+ break;
+
+ case DeviceInfo:
+ ConnectionInfo = ((PUSBDEVICEINFO)info)->ConnectionInfo;
+ ConnectionInfoV2 = ((PUSBDEVICEINFO)info)->ConnectionInfoV2;
+ PortConnectorProps = ((PUSBDEVICEINFO)info)->PortConnectorProps;
+ ConfigDesc = ((PUSBDEVICEINFO)info)->ConfigDesc;
+ StringDescs = ((PUSBDEVICEINFO)info)->StringDescs;
+ BosDesc = ((PUSBDEVICEINFO)info)->BosDesc;
+ DeviceInfoNode = ((PUSBDEVICEINFO)info)->DeviceInfoNode;
+ break;
+ }
+
+ if (PortConnectorProps)
+ {
+ DisplayPortConnectorProperties(PortConnectorProps, ConnectionInfoV2);
+ }
+
+ if (DeviceInfoNode)
+ {
+ DisplayDevicePowerState(DeviceInfoNode);
+ }
+
+ if (HubInfo)
+ {
+ DisplayHubInfo(&HubInfo->u.HubInformation,
+ (HubInfoEx == NULL));
+ }
+
+ if (HubInfoEx)
+ {
+ DisplayHubInfoEx(HubInfoEx);
+ }
+
+ if(HubCapabilityEx)
+ {
+ DisplayHubCapabilityEx(HubCapabilityEx);
+ }
+
+ if (ConnectionInfo)
+ {
+ DisplayConnectionInfo(ConnectionInfo,
+ (PUSBDEVICEINFO)info,
+ StringDescs,
+ ConnectionInfoV2);
+ }
+
+ if (ConfigDesc)
+ {
+ DisplayConfigDesc((PUSBDEVICEINFO)info,
+ (PUSB_CONFIGURATION_DESCRIPTOR)(ConfigDesc + 1),
+ StringDescs);
+ }
+
+ if (BosDesc)
+ {
+ DisplayBosDescriptor((PUSBDEVICEINFO) info,
+ (PUSB_BOS_DESCRIPTOR) (BosDesc + 1),
+ StringDescs);
+ }
+ }
+
+ if(tviName != NULL)
+ {
+ FREE(tviName);
+ }
+
+ // AppendTextBuffer() which is used in Display*() functions uses GlobalRealloc() which can fail if realloc fails.
+ // Obtain last error code from GetLastError() and propagate the error to caller.
+ hr = HRESULT_FROM_WIN32(GetLastError());
+
+ return hr;
+}
+
+//*****************************************************************************
+//
+// UpdateEditControl()
+//
+// hTreeItem - Handle of selected TreeView item for which information should
+// be displayed in the edit control.
+//
+//*****************************************************************************
+
+VOID
+UpdateEditControl (
+ HWND hEditWnd,
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem
+)
+{
+ HRESULT hr = S_OK;
+
+ // Start with an empty text buffer.
+ //
+ if (!ResetTextBuffer())
+ {
+ return;
+ }
+
+ // Get the item information in global TextBuffer
+ hr = UpdateTreeItemDeviceInfo(hTreeWnd, hTreeItem);
+
+ if(FAILED(hr))
+ {
+ OOPS();
+ }
+
+ // All done formatting text buffer with info, now update the edit
+ // control with the contents of the text buffer
+ //
+ SetWindowText(hEditWnd, TextBuffer);
+
+}
+
+/*****************************************************************************
+
+DisplayPortConnectorProperties()
+
+PortConnectorProps - Info about the port connector properties.
+
+*****************************************************************************/
+
+void
+DisplayPortConnectorProperties (
+ _In_ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2
+ )
+{
+ AppendTextBuffer("Is Port User Connectable: %s\r\n",
+ PortConnectorProps->UsbPortProperties.PortIsUserConnectable
+ ? "yes" : "no");
+
+ AppendTextBuffer("Is Port Debug Capable: %s\r\n",
+ PortConnectorProps->UsbPortProperties.PortIsDebugCapable
+ ? "yes" : "no");
+ AppendTextBuffer("Companion Port Number: %d\r\n",
+ PortConnectorProps->CompanionPortNumber);
+ AppendTextBuffer("Companion Hub Symbolic Link Name: %ws\r\n",
+ PortConnectorProps->CompanionHubSymbolicLinkName);
+ if (ConnectionInfoV2 != NULL)
+ {
+ AppendTextBuffer("Protocols Supported:\r\n");
+ AppendTextBuffer(" USB 1.1: %s\r\n",
+ ConnectionInfoV2->SupportedUsbProtocols.Usb110
+ ? "yes" : "no");
+ AppendTextBuffer(" USB 2.0: %s\r\n",
+ ConnectionInfoV2->SupportedUsbProtocols.Usb200
+ ? "yes" : "no");
+ AppendTextBuffer(" USB 3.0: %s\r\n",
+ ConnectionInfoV2->SupportedUsbProtocols.Usb300
+ ? "yes" : "no");
+ }
+
+ AppendTextBuffer("\r\n");
+}
+
+/*****************************************************************************
+
+DisplayDevicePowerState()
+
+DeviceInfoNode - Structure containing info used to acquire device state
+
+*****************************************************************************/
+
+void
+DisplayDevicePowerState (
+ _In_ PDEVICE_INFO_NODE DeviceInfoNode
+ )
+{
+
+ DEVICE_POWER_STATE powerState;
+
+ powerState = AcquireDevicePowerState(DeviceInfoNode);
+
+ AppendTextBuffer("Device Power State: ");
+ if (powerState >= PowerDeviceD0 && powerState <= PowerDeviceD3)
+ {
+ AppendTextBuffer("PowerDeviceD%d\r\n", powerState-1);
+ }
+ else
+ {
+ AppendTextBuffer("Invalid Device Power State Value %d\r\n", powerState);
+ }
+
+ AppendTextBuffer("\r\n");
+}
+
+
+/*****************************************************************************
+
+DisplayHubDescriptorBase()
+
+HubDescriptor - hub descriptor, could also be PUSB_30_HUB_DESCRIPTOR which has
+ these field in common at the beginning of the data structure:
+
+ - UCHAR bLength;
+ - UCHAR bDescriptorType;
+ - UCHAR bNumberOfPorts;
+ - USHORT wHubCharacteristics;
+ - UCHAR bPowerOnToPowerGood;
+ - UCHAR bHubControlCurrent;
+
+*****************************************************************************/
+VOID
+DisplayHubDescriptorBase(
+ PUSB_HUB_DESCRIPTOR HubDescriptor
+ )
+{
+ USHORT wHubChar = 0;
+
+ AppendTextBuffer("Number of Ports: %d\r\n",
+ HubDescriptor->bNumberOfPorts);
+
+ wHubChar = HubDescriptor->wHubCharacteristics;
+
+ switch (wHubChar & 0x0003)
+ {
+ case 0x0000:
+ AppendTextBuffer("Power switching: Ganged\r\n");
+ break;
+
+ case 0x0001:
+ AppendTextBuffer("Power switching: Individual\r\n");
+ break;
+
+ case 0x0002:
+ case 0x0003:
+ AppendTextBuffer("Power switching: None\r\n");
+ break;
+ }
+
+ switch (wHubChar & 0x0004)
+ {
+ case 0x0000:
+ AppendTextBuffer("Compound device: No\r\n");
+ break;
+
+ case 0x0004:
+ AppendTextBuffer("Compound device: Yes\r\n");
+ break;
+ }
+
+ switch (wHubChar & 0x0018)
+ {
+ case 0x0000:
+ AppendTextBuffer("Over-current Protection: Global\r\n");
+ break;
+
+ case 0x0008:
+ AppendTextBuffer("Over-current Protection: Individual\r\n");
+ break;
+
+ case 0x0010:
+ case 0x0018:
+ AppendTextBuffer("No Over-current Protection (Bus Power Only)\r\n");
+ break;
+ }
+}
+
+
+
+/*****************************************************************************
+
+DisplayHubInfo()
+
+HubInfo - Info about the hub.
+
+*****************************************************************************/
+
+VOID
+DisplayHubInfo (
+ PUSB_HUB_INFORMATION HubInfo,
+ BOOL DisplayDescriptor
+ )
+{
+ AppendTextBuffer("Hub Power: %s\r\n",
+ HubInfo->HubIsBusPowered ?
+ "Bus Power" : "Self Power");
+
+ if (DisplayDescriptor == TRUE)
+ {
+ DisplayHubDescriptorBase(&HubInfo->HubDescriptor);
+ }
+}
+
+/*****************************************************************************
+
+DisplayHubInfoEx()
+
+HubInfo - Extended info about the hub.
+
+*****************************************************************************/
+
+
+VOID
+DisplayHubInfoEx (
+ PUSB_HUB_INFORMATION_EX HubInfoEx
+ )
+{
+ AppendTextBuffer("Hub type: ");
+
+ switch (HubInfoEx->HubType) {
+
+ case UsbRootHub:
+ AppendTextBuffer("USB Root Hub\r\n");
+ break;
+
+ case Usb20Hub:
+ AppendTextBuffer("USB 2.0 Hub\r\n");
+ DisplayHubDescriptorBase((PUSB_HUB_DESCRIPTOR)&HubInfoEx->u.UsbHubDescriptor);
+ break;
+
+ case Usb30Hub:
+ AppendTextBuffer("USB 3.0 Hub\r\n");
+
+ //
+ // Note that the DisplayHubDescriptorBase will display the fields of either
+ // the legacy hub descriptor and the USB 3.0 descriptor which have the same
+ // offset
+ //
+
+ DisplayHubDescriptorBase((PUSB_HUB_DESCRIPTOR)&HubInfoEx->u.UsbHubDescriptor);
+ AppendTextBuffer("Packet Header Decode Latency: 0x%x\r\n", HubInfoEx->u.Usb30HubDescriptor.bHubHdrDecLat);
+ AppendTextBuffer("Delay: 0x%x ns\r\n", HubInfoEx->u.Usb30HubDescriptor.wHubDelay);
+
+ break;
+
+ default:
+ AppendTextBuffer("ERROR: Unknown hub type %d\r\n", HubInfoEx->HubType);
+ break;
+ }
+
+ AppendTextBuffer("\r\n");
+}
+
+
+
+/*****************************************************************************
+
+DisplayHubCapabilityEx()
+
+HubCapabilityInfo - Hub capability information
+
+*****************************************************************************/
+
+VOID
+DisplayHubCapabilityEx (
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx
+ )
+{
+ if(HubCapabilityEx != NULL)
+ {
+ AppendTextBuffer("High speed capable: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsHighSpeedCapable
+ ? "Yes" : "No");
+ AppendTextBuffer("High speed: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsHighSpeed
+ ? "Yes" : "No");
+ AppendTextBuffer("Multiple transaction translations capable: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsMultiTtCapable
+ ? "Yes" : "No");
+ AppendTextBuffer("Performs multiple transaction translations simultaneously: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsMultiTt
+ ? "Yes" : "No");
+ AppendTextBuffer("Hub wakes when device is connected: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsArmedWakeOnConnect
+ ? "Yes" : "No");
+ AppendTextBuffer("Hub is bus powered: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsBusPowered
+ ? "Yes" : "No");
+ AppendTextBuffer("Hub is root: %s\r\n",
+ HubCapabilityEx->CapabilityFlags.HubIsRoot
+ ? "Yes" : "No");
+ }
+}
+
+/*****************************************************************************
+
+DisplayConnectionInfo()
+
+ConnectInfo - Info about the connection.
+
+PUSB_NODE_CONNECTION_INFORMATION_EX ConnectInfo,
+PSTRING_DESCRIPTOR_NODE StringDescs
+
+DisplayConnectionInfo(info->ConnectionInfo,
+info->StringDescs);
+
+DisplayConnectionInfo (
+PUSB_NODE_CONNECTION_INFORMATION_EX ConnectInfo,
+PSTRING_DESCRIPTOR_NODE StringDescs
+)
+
+*****************************************************************************/
+
+VOID
+DisplayConnectionInfo (
+ _In_ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectInfo,
+ _In_ PUSBDEVICEINFO info,
+ _In_ PSTRING_DESCRIPTOR_NODE StringDescs,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2
+)
+{
+
+ //@@DisplayConnectionInfo - Device Information
+ PCHAR VendorString = NULL;
+ UINT tog = 1;
+ UINT uIADcount = 0;
+
+ // No device connected
+ if (ConnectInfo->ConnectionStatus == NoDeviceConnected)
+ {
+ AppendTextBuffer("ConnectionStatus: NoDeviceConnected\r\n");
+ return;
+ }
+
+ // This is the entry point to the device display functions.
+ // First, save this device's PUSBDEVICEINFO address
+ // In a future version of this test, we will keep track of the the
+ // descriptor that we're parsing (# of bytes from beginning of info->configuration descriptor)
+ // Then we can linked descriptors by reading forward through the remaining descriptors
+ // while still keeping our place in this main DisplayConnectionInfo() and called
+ // functions.
+ //
+ // We also initialize some global flags in uvcview.h that are used to
+ // verify items in MJPEG, Uncompressed and Vendor Frame descriptors
+ //
+ InitializePerDeviceSettings(info);
+
+ if(gDoAnnotation)
+ {
+
+ AppendTextBuffer(" ---===>Device Information<===---\r\n");
+
+ if (ConnectInfo->DeviceDescriptor.iProduct)
+ {
+ DisplayUSEnglishStringDescriptor(ConnectInfo->DeviceDescriptor.iProduct,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ }
+
+ AppendTextBuffer("\r\nConnectionStatus: %s\r\n",
+ ConnectionStatuses[ConnectInfo->ConnectionStatus]);
+
+ AppendTextBuffer("Current Config Value: 0x%02X",
+ ConnectInfo->CurrentConfigurationValue);
+ }
+
+ switch (ConnectInfo->Speed){
+ case UsbLowSpeed:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Device Bus Speed: Low\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ gDeviceSpeed = UsbLowSpeed;
+ break;
+
+ case UsbFullSpeed:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Device Bus Speed: Full");
+ if (ConnectionInfoV2 != NULL)
+ {
+ if (ConnectionInfoV2->Flags.DeviceIsSuperSpeedPlusCapableOrHigher)
+ {
+ AppendTextBuffer(" (is SuperSpeedPlus or higher capable)\r\n");
+ }
+ else if (ConnectionInfoV2->Flags.DeviceIsSuperSpeedCapableOrHigher)
+ {
+ AppendTextBuffer(" (is SuperSpeed or higher capable)\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" (is not SuperSpeed or higher capable)\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ gDeviceSpeed = UsbFullSpeed;
+ break;
+ case UsbHighSpeed:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Device Bus Speed: High");
+ if (ConnectionInfoV2 != NULL)
+ {
+ if (ConnectionInfoV2->Flags.DeviceIsSuperSpeedPlusCapableOrHigher)
+ {
+ AppendTextBuffer(" (is SuperSpeedPlus or higher capable)\r\n");
+ }
+ else if (ConnectionInfoV2->Flags.DeviceIsSuperSpeedCapableOrHigher)
+ {
+ AppendTextBuffer(" (is SuperSpeed or higher capable)\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" (is not SuperSpeed or higher capable)\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ gDeviceSpeed = UsbHighSpeed;
+ break;
+
+ case UsbSuperSpeed:
+ if(gDoAnnotation)
+ {
+ if (ConnectionInfoV2 != NULL)
+ {
+ AppendTextBuffer(" -> Device Bus Speed: Super%s\r\n",
+ ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedPlusOrHigher
+ ? "SpeedPlus"
+ : "Speed");
+ }
+ else
+ {
+ AppendTextBuffer(" -> Device Bus Speed: Super Speed\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ gDeviceSpeed = UsbSuperSpeed;
+ break;
+
+ default:
+ if(gDoAnnotation){AppendTextBuffer(" -> Device Bus Speed: Unknown\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ }
+
+ if(gDoAnnotation){
+ AppendTextBuffer("Device Address: 0x%02X\r\n",
+ ConnectInfo->DeviceAddress);
+
+ AppendTextBuffer("Open Pipes: %2d\r\n",
+ ConnectInfo->NumberOfOpenPipes);
+ }
+
+ // No open pipes means the USB stack has not loaded the device
+ if (ConnectInfo->NumberOfOpenPipes == 0)
+ {
+ AppendTextBuffer("*!*ERROR: No open pipes!\r\n");
+ }
+
+ AppendTextBuffer("\r\n ===>Device Descriptor<===\r\n");
+ //@@DisplayConnectionInfo - Device Descriptor
+
+ if (ConnectInfo->DeviceDescriptor.bLength != 18)
+ {
+ //@@TestCase A1.1
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ ConnectInfo->DeviceDescriptor.bLength,
+ 18);
+ OOPS();
+ }
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.bDescriptorType);
+
+ //@@TestCase A1.2
+ //@@Not implemented - Priority 1
+ //@@Descriptor Field - bcdUSB
+ //@@Need to check that any UVC device is set to 0x0200 or later.
+ AppendTextBuffer("bcdUSB: 0x%04X\r\n",
+ ConnectInfo->DeviceDescriptor.bcdUSB);
+
+ AppendTextBuffer("bDeviceClass: 0x%02X",
+ ConnectInfo->DeviceDescriptor.bDeviceClass);
+
+ // Quit on these device failures
+ if ((ConnectInfo->ConnectionStatus == DeviceFailedEnumeration) ||
+ (ConnectInfo->ConnectionStatus == DeviceGeneralFailure))
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Device enumeration failure\r\n");
+ return;
+ }
+
+ // Is this an IAD device?
+ uIADcount = IsIADDevice((PUSBDEVICEINFO) info);
+
+ if (uIADcount)
+ {
+ // this device configuration has 1 or more IAD descriptors
+ if (ConnectInfo->DeviceDescriptor.bDeviceClass == USB_MISCELLANEOUS_DEVICE)
+ {
+ tog = 0;
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a Multi-interface Function Code Device\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ } else {
+ AppendTextBuffer("\r\n*!*ERROR: device class should be Multi-interface Function 0x%02X\r\n"\
+ " When IAD descriptor is used\r\n",
+ USB_MISCELLANEOUS_DEVICE);
+ }
+ // Is this a UVC device?
+ g_chUVCversion = IsUVCDevice((PUSBDEVICEINFO) info);
+ }
+ else
+ {
+ // this is not an IAD device
+ switch (ConnectInfo->DeviceDescriptor.bDeviceClass)
+ {
+ case USB_INTERFACE_CLASS_DEVICE:
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is an Interface Class Defined Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_COMMUNICATION_DEVICE:
+ tog = 0;
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is a Communication Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_HUB_DEVICE:
+ tog = 0;
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is a HUB Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE:
+ tog = 0;
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is a Diagnostic Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_WIRELESS_CONTROLLER_DEVICE:
+ tog = 0;
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is a Wireless Controller(Bluetooth) Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_VENDOR_SPECIFIC_DEVICE:
+ tog = 0;
+ if(gDoAnnotation)
+ {AppendTextBuffer(" -> This is a Vendor Specific Device\r\n");}
+ else {AppendTextBuffer("\r\n");}
+ break;
+
+ case USB_DEVICE_CLASS_BILLBOARD:
+ tog = 0;
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a billboard class device\r\n");
+ }
+ else { AppendTextBuffer("\r\n"); }
+ break;
+
+ case USB_MISCELLANEOUS_DEVICE:
+ tog = 0;
+ //@@TestCase A1.3
+ //@@ERROR
+ //@@Descriptor Field - bDeviceClass
+ //@@Multi-interface Function code used for non-IAD device
+ AppendTextBuffer("\r\n*!*ERROR: Multi-interface Function code %d used for "\
+ "device with no IAD descriptors\r\n",
+ ConnectInfo->DeviceDescriptor.bDeviceClass);
+ break;
+
+ default:
+ //@@TestCase A1.4
+ //@@ERROR
+ //@@Descriptor Field - bDeviceClass
+ //@@An unknown device class has been defined
+ AppendTextBuffer("\r\n*!*ERROR: unknown bDeviceClass %d\r\n",
+ ConnectInfo->DeviceDescriptor.bDeviceClass);
+ OOPS();
+ break;
+ }
+ }
+
+ AppendTextBuffer("bDeviceSubClass: 0x%02X",
+ ConnectInfo->DeviceDescriptor.bDeviceSubClass);
+
+ // check the subclass
+ if (uIADcount)
+ {
+ // this device configuration has 1 or more IAD descriptors
+ if (ConnectInfo->DeviceDescriptor.bDeviceSubClass == USB_COMMON_SUB_CLASS)
+ {
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is the Common Class Sub Class\r\n");
+ } else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ //@@TestCase A1.5
+ //@@ERROR
+ //@@Descriptor Field - bDeviceSubClass
+ //@@An invalid device sub class used for Multi-interface Function (IAD) device
+ AppendTextBuffer("\r\n*!*ERROR: device SubClass should be USB Common Sub Class %d\r\n"\
+ " When IAD descriptor is used\r\n",
+ USB_COMMON_SUB_CLASS);
+ OOPS();
+ }
+ }
+ else
+ {
+ // Not an IAD device, so all subclass values are invalid
+ if(ConnectInfo->DeviceDescriptor.bDeviceSubClass > 0x00 &&
+ ConnectInfo->DeviceDescriptor.bDeviceSubClass < 0xFF)
+ {
+ //@@TestCase A1.6
+ //@@ERROR
+ //@@Descriptor Field - bDeviceSubClass
+ //@@An invalid device sub class has been defined
+ AppendTextBuffer("\r\n*!*ERROR: bDeviceSubClass of %d is invalid\r\n",
+ ConnectInfo->DeviceDescriptor.bDeviceSubClass);
+ OOPS();
+ } else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+
+ AppendTextBuffer("bDeviceProtocol: 0x%02X",
+ ConnectInfo->DeviceDescriptor.bDeviceProtocol);
+
+ // check the protocol
+ if (uIADcount)
+ {
+ // this device configuration has 1 or more IAD descriptors
+ if (ConnectInfo->DeviceDescriptor.bDeviceProtocol == USB_IAD_PROTOCOL)
+ {
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is the Interface Association Descriptor protocol\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ //@@TestCase A1.7
+ //@@ERROR
+ //@@Descriptor Field - bDeviceSubClass
+ //@@An invalid device sub class used for Multi-interface Function (IAD) device
+ AppendTextBuffer("\r\n*!*ERROR: device Protocol should be USB IAD Protocol %d\r\n"\
+ " When IAD descriptor is used\r\n",
+ USB_IAD_PROTOCOL);
+ OOPS();
+ }
+ }
+ else
+ {
+ // Not an IAD device, so all subclass values are invalid
+ if(ConnectInfo->DeviceDescriptor.bDeviceProtocol > 0x00 &&
+ ConnectInfo->DeviceDescriptor.bDeviceProtocol < 0xFF && tog==1)
+ {
+ //@@TestCase A1.8
+ //@@ERROR
+ //@@Descriptor Field - bDeviceProtocol
+ //@@An invalid device protocol has been defined
+ AppendTextBuffer("\r\n*!*ERROR: bDeviceProtocol of %d is invalid\r\n",
+ ConnectInfo->DeviceDescriptor.bDeviceProtocol);
+ OOPS();
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+
+ AppendTextBuffer("bMaxPacketSize0: 0x%02X",
+ ConnectInfo->DeviceDescriptor.bMaxPacketSize0);
+
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" = (%d) Bytes\r\n",
+ ConnectInfo->DeviceDescriptor.bMaxPacketSize0);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+
+ switch (gDeviceSpeed){
+ case UsbLowSpeed:
+ if(ConnectInfo->DeviceDescriptor.bMaxPacketSize0 != 8)
+ {
+ //@@TestCase A1.9
+ //@@ERROR
+ //@@Descriptor Field - bMaxPacketSize0
+ //@@An invalid bMaxPacketSize0 has been defined for a low speed device
+ AppendTextBuffer("*!*ERROR: Low Speed Devices require bMaxPacketSize0 = 8\r\n");
+ OOPS();
+ }
+ break;
+ case UsbFullSpeed:
+ if(!(ConnectInfo->DeviceDescriptor.bMaxPacketSize0 == 8 ||
+ ConnectInfo->DeviceDescriptor.bMaxPacketSize0 == 16 ||
+ ConnectInfo->DeviceDescriptor.bMaxPacketSize0 == 32 ||
+ ConnectInfo->DeviceDescriptor.bMaxPacketSize0 == 64))
+ {
+ //@@TestCase A1.10
+ //@@ERROR
+ //@@Descriptor Field - bMaxPacketSize0
+ //@@An invalid bMaxPacketSize0 has been defined for a full speed device
+ AppendTextBuffer("*!*ERROR: Full Speed Devices require bMaxPacketSize0 = 8, 16, 32, or 64\r\n");
+ OOPS();
+ }
+ break;
+ case UsbHighSpeed:
+ if(ConnectInfo->DeviceDescriptor.bMaxPacketSize0 != 64)
+ {
+ //@@TestCase A1.11
+ //@@ERROR
+ //@@Descriptor Field - bMaxPacketSize0
+ //@@An invalid bMaxPacketSize0 has been defined for a high speed device
+ AppendTextBuffer("*!*ERROR: High Speed Devices require bMaxPacketSize0 = 64\r\n");
+ OOPS();
+ }
+ break;
+ case UsbSuperSpeed:
+ if(ConnectInfo->DeviceDescriptor.bMaxPacketSize0 != 9)
+ {
+ AppendTextBuffer("*!*ERROR: SuperSpeed Devices require bMaxPacketSize0 = 9 (512)\r\n");
+ OOPS();
+ }
+ break;
+ }
+
+ AppendTextBuffer("idVendor: 0x%04X",
+ ConnectInfo->DeviceDescriptor.idVendor);
+
+ if (gDoAnnotation)
+ {
+ VendorString = GetVendorString(ConnectInfo->DeviceDescriptor.idVendor);
+ if (VendorString != NULL)
+ {
+ AppendTextBuffer(" = %s\r\n",
+ VendorString);
+ }
+ }
+ else {AppendTextBuffer("\r\n");}
+
+ AppendTextBuffer("idProduct: 0x%04X\r\n",
+ ConnectInfo->DeviceDescriptor.idProduct);
+
+ AppendTextBuffer("bcdDevice: 0x%04X\r\n",
+ ConnectInfo->DeviceDescriptor.bcdDevice);
+
+ AppendTextBuffer("iManufacturer: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.iManufacturer);
+
+ if (ConnectInfo->DeviceDescriptor.iManufacturer && gDoAnnotation)
+ {
+ DisplayStringDescriptor(ConnectInfo->DeviceDescriptor.iManufacturer,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ }
+
+ AppendTextBuffer("iProduct: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.iProduct);
+
+ if (ConnectInfo->DeviceDescriptor.iProduct && gDoAnnotation)
+ {
+ DisplayStringDescriptor(ConnectInfo->DeviceDescriptor.iProduct,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ }
+
+ AppendTextBuffer("iSerialNumber: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.iSerialNumber);
+
+ if (ConnectInfo->DeviceDescriptor.iSerialNumber && gDoAnnotation)
+ {
+ DisplayStringDescriptor(ConnectInfo->DeviceDescriptor.iSerialNumber,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ }
+
+ AppendTextBuffer("bNumConfigurations: 0x%02X\r\n",
+ ConnectInfo->DeviceDescriptor.bNumConfigurations);
+
+ if(ConnectInfo->DeviceDescriptor.bNumConfigurations != 1)
+ {
+ //@@TestCase A1.12
+ //@@CAUTION
+ //@@Descriptor Field - bNumConfigurations
+ //@@Most host controllers do not handle more than one configuration
+ AppendTextBuffer("*!*CAUTION: Most host controllers will only work with "\
+ "one configuration per speed\r\n");
+ OOPS();
+ }
+
+ if (ConnectInfo->NumberOfOpenPipes)
+ {
+ AppendTextBuffer("\r\n ---===>Open Pipes<===---\r\n");
+ DisplayPipeInfo(ConnectInfo->NumberOfOpenPipes,
+ ConnectInfo->PipeList);
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+DisplayPipeInfo()
+
+NumPipes - Number of pipe for we info should be displayed.
+
+PipeInfo - Info about the pipes.
+
+*****************************************************************************/
+
+VOID
+DisplayPipeInfo (
+ ULONG NumPipes,
+ USB_PIPE_INFO *PipeInfo
+ )
+{
+ ULONG i = 0;
+
+ for (i = 0; i < NumPipes; i++)
+ {
+ DisplayEndpointDescriptor(&PipeInfo[i].EndpointDescriptor, NULL, NULL, 0, FALSE);
+ }
+
+}
+
+/*****************************************************************************
+
+GetControllerFlavorString()
+
+Returns the text for given controller flavor
+
+*****************************************************************************/
+PCHAR GetControllerFlavorString(USB_CONTROLLER_FLAVOR flavor)
+{
+ return(GetStringFromList(slControllerFlavor,
+ sizeof(slControllerFlavor) / sizeof(STRINGLIST),
+ flavor,
+ STR_UNKNOWN_CONTROLLER_FLAVOR));
+}
+
+
+
+/*****************************************************************************
+
+GetPowerStateString()
+
+Returns the descriptive string for given power state
+
+*****************************************************************************/
+PCHAR GetPowerStateString(WDMUSB_POWER_STATE powerState)
+{
+ return(GetStringFromList(slPowerState,
+ sizeof(slPowerState) / sizeof(STRINGLIST),
+ powerState,
+ STR_INVALID_POWER_STATE));
+}
+
+/*****************************************************************************
+
+DisplayPowerState()
+
+PUSB_POWER_INFO pUPI - USBUSER.H USB_Power_Info data
+
+*****************************************************************************/
+
+VOID
+DisplayPowerState(
+ PUSB_POWER_INFO pUPI
+ )
+{
+ AppendTextBuffer("%s\t%s\t%s%s\t\t%s\r\n",
+ GetPowerStateString(pUPI->SystemState),
+ GetPowerStateString(pUPI->HcDevicePowerState),
+ GetPowerStateString(pUPI->RhDevicePowerState),
+ pUPI->CanWakeup ? "Yes" : "",
+ pUPI->IsPowered ? "Yes" : ""
+ );
+ return;
+}
+
+
+
+/*****************************************************************************
+
+ValidateDescAddress()
+
+Given a descriptor address and the Configuration Descriptor length
+ (saved in DisplayConfigDesc(), and initialized for each new device)
+return TRUE if the descriptor is within the Configuration length
+else FALSE
+
+*****************************************************************************/
+
+BOOL
+ValidateDescAddress (
+ PUSB_COMMON_DESCRIPTOR commonDesc
+ )
+{
+ if ((PUCHAR) commonDesc + commonDesc->bLength <= g_descEnd)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************
+
+DisplayConfigDesc()
+
+ConfigDesc - The Configuration Descriptor, and associated Interface and
+Endpoint Descriptors
+
+*****************************************************************************/
+
+VOID
+DisplayConfigDesc (
+ PUSBDEVICEINFO info,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ UCHAR bInterfaceClass = 0;
+ UCHAR bInterfaceSubClass = 0;
+ UCHAR bInterfaceProtocol = 0;
+ BOOL displayUnknown = FALSE;
+
+ BOOL isSS;
+
+ isSS = info->ConnectionInfoV2
+ && info->ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedOrHigher
+ ? TRUE
+ : FALSE;
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+
+ // initialize global Configuration start/end address and string desc address
+ g_pConfigDesc = ConfigDesc;
+ g_pStringDescs = StringDescs;
+ g_descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+
+ AppendTextBuffer("\r\n ---===>Full Configuration Descriptor<===---\r\n");
+
+ do
+ {
+ displayUnknown = FALSE;
+
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE:
+ //@@DisplayConfigDesc - Device Qualifier Descriptor
+ if (commonDesc->bLength != sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR))
+ {
+ //@@TestCase A2.1
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d for Device Qualifier incorrect, "\
+ "should be %d\r\n",
+ commonDesc->bLength,
+ sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR));
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ DisplayDeviceQualifierDescriptor((PUSB_DEVICE_QUALIFIER_DESCRIPTOR)commonDesc);
+ break;
+
+ case USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE:
+ //@@DisplayConfigDesc - Other Speed Configuration Descriptor
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ //@@TestCase A2.2
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d for Other Speed Configuration "\
+ "incorrect, should be %d\r\n",
+ commonDesc->bLength,
+ sizeof(USB_CONFIGURATION_DESCRIPTOR));
+ OOPS();
+ displayUnknown = TRUE;
+ }
+ DisplayConfigurationDescriptor(
+ (PUSBDEVICEINFO) info,
+ (PUSB_CONFIGURATION_DESCRIPTOR)commonDesc,
+ StringDescs);
+ break;
+
+ case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+ //@@DisplayConfigDesc - Configuration Descriptor
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ //@@TestCase A2.3
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d for Configuration incorrect, "\
+ "should be %d\r\n",
+ commonDesc->bLength,
+ sizeof(USB_CONFIGURATION_DESCRIPTOR));
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ DisplayConfigurationDescriptor((PUSBDEVICEINFO)info,
+ (PUSB_CONFIGURATION_DESCRIPTOR)commonDesc,
+ StringDescs);
+ break;
+
+ case USB_INTERFACE_DESCRIPTOR_TYPE:
+ //@@DisplayConfigDesc - Interface Descriptor
+ if ((commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR)) &&
+ (commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR2)))
+ {
+ //@@TestCase A2.4
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d for Interface incorrect, "\
+ "should be %d or %d\r\n",
+ commonDesc->bLength,
+ sizeof(USB_INTERFACE_DESCRIPTOR),
+ sizeof(USB_INTERFACE_DESCRIPTOR2));
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ bInterfaceClass = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceClass;
+ bInterfaceSubClass = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceSubClass;
+ bInterfaceProtocol = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceProtocol;
+
+ DisplayInterfaceDescriptor(
+ (PUSB_INTERFACE_DESCRIPTOR)commonDesc,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+
+ break;
+
+ case USB_ENDPOINT_DESCRIPTOR_TYPE:
+ {
+ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR epCompDesc = NULL;
+ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
+ sspIsochCompDesc = NULL;
+
+
+ //@@DisplayConfigDesc - Endpoint Descriptor
+ if ((commonDesc->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR)) &&
+ (commonDesc->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR2)))
+ {
+ //@@TestCase A2.5
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to
+ //@@ the required length in the USB Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d for Endpoint incorrect, "\
+ "should be %d or %d\r\n",
+ commonDesc->bLength,
+ sizeof(USB_ENDPOINT_DESCRIPTOR),
+ sizeof(USB_ENDPOINT_DESCRIPTOR2));
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+
+ if (isSS)
+ {
+ epCompDesc = (PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)
+ GetNextDescriptor((PUSB_COMMON_DESCRIPTOR)ConfigDesc, ConfigDesc->wTotalLength, commonDesc, -1);
+ }
+
+ if (epCompDesc != NULL &&
+ epCompDesc->bmAttributes.Isochronous.SspCompanion == 1)
+ {
+ sspIsochCompDesc = (PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR)
+ GetNextDescriptor((PUSB_COMMON_DESCRIPTOR)ConfigDesc,
+ ConfigDesc->wTotalLength,
+ (PUSB_COMMON_DESCRIPTOR)epCompDesc,
+ -1);
+ }
+
+ DisplayEndpointDescriptor((PUSB_ENDPOINT_DESCRIPTOR)commonDesc,
+ epCompDesc,
+ sspIsochCompDesc,
+ bInterfaceClass,
+ TRUE);
+
+ if (sspIsochCompDesc != NULL)
+ {
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)sspIsochCompDesc;
+ }
+ else if (epCompDesc != NULL)
+ {
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)epCompDesc;
+ }
+ }
+
+ break;
+
+ case USB_HID_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_HID_DESCRIPTOR))
+ {
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ DisplayHidDescriptor((PUSB_HID_DESCRIPTOR)commonDesc);
+ break;
+
+ case USB_OTG_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_OTG_DESCRIPTOR))
+ {
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ DisplayOTGDescriptor((PUSB_OTG_DESCRIPTOR)commonDesc);
+ break;
+
+ case USB_IAD_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_IAD_DESCRIPTOR))
+ {
+ OOPS();
+ displayUnknown = TRUE;
+ break;
+ }
+ DisplayIADDescriptor((PUSB_IAD_DESCRIPTOR)commonDesc, StringDescs,
+ ConfigDesc->bNumInterfaces,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ break;
+
+ default:
+ //@@DisplayConfigDesc - Interface Class Device
+ // TODO: BUG: bInterfaceClass is initialized before this code
+ switch (bInterfaceClass)
+ {
+ case USB_DEVICE_CLASS_AUDIO:
+ displayUnknown = ! DisplayAudioDescriptor(
+ (PUSB_AUDIO_COMMON_DESCRIPTOR)commonDesc,
+ bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_VIDEO:
+ displayUnknown = ! DisplayVideoDescriptor(
+ (PVIDEO_SPECIFIC)commonDesc,
+ bInterfaceSubClass,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ break;
+
+ case USB_DEVICE_CLASS_RESERVED:
+ //@@TestCase A2.6
+ //@@ERROR
+ //@@Descriptor Field - bInterfaceClass
+ //@@An unknown interface class has been defined
+ AppendTextBuffer("*!*ERROR: %d is a Reserved USB Device Interface Class\r\n",
+ USB_DEVICE_CLASS_RESERVED);
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_COMMUNICATIONS:
+ AppendTextBuffer(" -> This is a Communications (CDC Control) USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+ AppendTextBuffer(" -> This is a HID USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_MONITOR:
+ AppendTextBuffer(" -> This is a Monitor USB Device Interface Class (This may be obsolete)\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+ AppendTextBuffer(" -> This is a Physical Interface USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_POWER:
+ if(bInterfaceSubClass == 1 && bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is an Image USB Device Interface Class\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" -> This is a Power USB Device Interface Class (This may be obsolete)\r\n");
+ }
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_PRINTER:
+ AppendTextBuffer(" -> This is a Printer USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_STORAGE:
+ AppendTextBuffer(" -> This is a Mass Storage USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DEVICE_CLASS_HUB:
+ AppendTextBuffer(" -> This is a HUB USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_CDC_DATA_INTERFACE:
+ AppendTextBuffer(" -> This is a CDC Data USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_CHIP_SMART_CARD_INTERFACE:
+ AppendTextBuffer(" -> This is a Chip/Smart Card USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_CONTENT_SECURITY_INTERFACE:
+ AppendTextBuffer(" -> This is a Content Security USB Device Interface Class\r\n");
+ displayUnknown = TRUE;
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE_INTERFACE:
+ if(bInterfaceSubClass == 1 && bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Reprogrammable USB2 Compliance Diagnostic Device USB Device\r\n");
+ }
+ else
+ {
+ //@@TestCase A2.7
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@An unknown diagnostic interface class device has been defined
+ AppendTextBuffer("*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ displayUnknown = TRUE;
+ break;
+
+ case USB_WIRELESS_CONTROLLER_INTERFACE:
+ if(bInterfaceSubClass == 1 && bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Wireless RF Controller USB Device Interface Class with Bluetooth Programming Interface\r\n");
+ }
+ else
+ {
+ //@@TestCase A2.8
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@An unknown wireless controller interface class device has been defined
+ AppendTextBuffer("*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ displayUnknown = TRUE;
+ break;
+
+ case USB_APPLICATION_SPECIFIC_INTERFACE:
+ AppendTextBuffer(" -> This is an Application Specific USB Device Interface Class\r\n");
+
+ switch(bInterfaceSubClass)
+ {
+ case 1:
+ AppendTextBuffer(" -> This is a Device Firmware Application Specific USB Device Interface Class\r\n");
+ break;
+ case 2:
+ AppendTextBuffer(" -> This is an IrDA Bridge Application Specific USB Device Interface Class\r\n");
+ break;
+ case 3:
+ AppendTextBuffer(" -> This is a Test & Measurement Class (USBTMC) Application Specific USB Device Interface Class\r\n");
+ break;
+ default:
+ //@@TestCase A2.9
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@A possibly invalid interface class has been defined
+ AppendTextBuffer("*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ displayUnknown = TRUE;
+ break;
+
+ default:
+ if (bInterfaceClass == USB_DEVICE_CLASS_VENDOR_SPECIFIC)
+ {
+ AppendTextBuffer(" -> This is a Vendor Specific USB Device Interface Class\r\n");
+ }
+ else
+ {
+ //@@TestCase A2.10
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@An unknown interface class has been defined
+ AppendTextBuffer("*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ displayUnknown = TRUE;
+ break;
+ }
+ break;
+ }
+
+ if (displayUnknown)
+ {
+ DisplayUnknownDescriptor(commonDesc);
+ }
+ } while ((commonDesc = GetNextDescriptor((PUSB_COMMON_DESCRIPTOR)ConfigDesc,
+ ConfigDesc->wTotalLength,
+ commonDesc,
+ -1)) != NULL);
+
+#ifdef H264_SUPPORT
+ DoAdditionalErrorChecks();
+#endif
+}
+
+
+/*****************************************************************************
+
+DisplayDeviceQualifierDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayDeviceQualifierDescriptor (
+ PUSB_DEVICE_QUALIFIER_DESCRIPTOR DevQualDesc
+ )
+{
+ //@@DisplayDeviceQualifierDescriptor - Device Qualifier Descriptor
+
+ AppendTextBuffer("\r\n ===>Device Qualifier Descriptor<===\r\n");
+
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ DevQualDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ DevQualDesc->bDescriptorType);
+
+ AppendTextBuffer("bcdUSB: 0x%04X\r\n",
+ DevQualDesc->bcdUSB);
+
+ AppendTextBuffer("bDeviceClass: 0x%02X",
+ DevQualDesc->bDeviceClass);
+
+ switch (DevQualDesc->bDeviceClass)
+ {
+ case USB_INTERFACE_CLASS_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is an Interface Class Defined Device\r\n");
+ }
+ break;
+
+ case USB_COMMUNICATION_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a Communication Device\r\n");
+ }
+ break;
+
+ case USB_HUB_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a HUB Device\r\n");
+ }
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a Diagnostic Device\r\n");
+ }
+ break;
+
+ case USB_WIRELESS_CONTROLLER_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a Wireless Controller(Bluetooth) Device\r\n");
+ }
+ break;
+
+ case USB_VENDOR_SPECIFIC_DEVICE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a Vendor Specific Device\r\n");
+ }
+ break;
+ case USB_DEVICE_CLASS_BILLBOARD:
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> This is a billboard class device\r\n");
+ }
+ break;
+ default:
+ //@@TestCase A3.1
+ //@@ERROR
+ //@@Descriptor Field - bDeviceClass
+ //@@An unknown device class has been defined
+ AppendTextBuffer("*!*ERROR: bDeviceClass of %d is invalid\r\n",
+ DevQualDesc->bDeviceClass);
+ OOPS();
+ break;
+ }
+
+ AppendTextBuffer("bDeviceSubClass: 0x%02X\r\n",
+ DevQualDesc->bDeviceSubClass);
+
+ if(DevQualDesc->bDeviceSubClass > 0x00 && DevQualDesc->bDeviceSubClass < 0xFF)
+ {
+ //@@TestCase A3.2
+ //@@ERROR
+ //@@Descriptor Field - bDeviceSubClass
+ //@@An unknown device sub class has been defined
+ AppendTextBuffer("*!*ERROR: bDeviceSubClass of %d is invalid\r\n",
+ DevQualDesc->bDeviceSubClass);
+ OOPS();
+ }
+
+ AppendTextBuffer("bDeviceProtocol: 0x%02X\r\n",
+ DevQualDesc->bDeviceProtocol);
+
+ if(DevQualDesc->bDeviceProtocol > 0x00 && DevQualDesc->bDeviceProtocol < 0xFF)
+ {
+ //@@TestCase A3.4
+ //@@ERROR
+ //@@Descriptor Field - bDeviceProtocol
+ //@@An invalid device protocol has been defined
+ AppendTextBuffer("*!*ERROR: bDeviceProtocol of %d is invalid",
+ DevQualDesc->bDeviceProtocol);
+ OOPS();
+ }
+
+ //@@TestCase A3.5
+ //@@Priority 1
+ //@@Descriptor Field - bcdDevice
+ //@@We should test to verify a valid bMaxPacketSize0 based on speed
+ AppendTextBuffer("bMaxPacketSize0: 0x%02X",
+ DevQualDesc->bMaxPacketSize0);
+
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" = (%d) Bytes\r\n",
+ DevQualDesc->bMaxPacketSize0);
+ }
+ else {AppendTextBuffer("\r\n");}
+
+ AppendTextBuffer("bNumConfigurations: 0x%02X\r\n",
+ DevQualDesc->bNumConfigurations);
+
+ if(DevQualDesc->bNumConfigurations != 1)
+ {
+ //@@TestCase A3.6
+ //@@CAUTION
+ //@@Descriptor Field - bNumConfigurations
+ //@@Most host controllers do not handle more than one configuration
+ AppendTextBuffer("*!*CAUTION: Most host controllers will only work with one configuration per speed\r\n");
+ OOPS();
+ }
+
+ AppendTextBuffer("bReserved: 0x%02X\r\n",
+ DevQualDesc->bReserved);
+
+ if(DevQualDesc->bReserved != 0)
+ {
+ AppendTextBuffer("*!*WARNING: bReserved needs to be set to 0 to be valid\r\n");
+ OOPS();
+ }
+
+
+}
+
+VOID
+DisplayUsb20ExtensionCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR extCapDesc
+ )
+{
+ AppendTextBuffer("\r\n ===>USB 2.0 Extension Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ extCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ extCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ extCapDesc->bDevCapabilityType);
+ AppendTextBuffer("bmAttributes: 0x%08X",
+ extCapDesc->bmAttributes);
+ if (extCapDesc->bmAttributes.AsUlong & USB_DEVICE_CAPABILITY_USB20_EXTENSION_BMATTRIBUTES_RESERVED_MASK)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: bits 31..2 and bit 0 are reserved and must be 0\r\n");
+ }
+ }
+ if (extCapDesc->bmAttributes.LPMCapable == 1)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Supports Link Power Management protocol\r\n");
+ }
+ }
+ if (extCapDesc->bmAttributes.AsUlong == 0)
+ {
+ AppendTextBuffer("\r\n");
+ }
+}
+
+VOID
+DisplaySuperSpeedCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR ssCapDesc
+ )
+{
+ AppendTextBuffer("\r\n ===>SuperSpeed USB Device Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ssCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ssCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ ssCapDesc->bDevCapabilityType);
+ AppendTextBuffer("bmAttributes: 0x%02X\r\n",
+ ssCapDesc->bmAttributes);
+ if (ssCapDesc->bmAttributes & USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_RESERVED_MASK)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: bits 7:2 and bit 0 are reserved\r\n");
+ }
+ }
+ if (ssCapDesc->bmAttributes & USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_LTM_CAPABLE)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> capable of generating Latency Tolerance Messages\r\n");
+ }
+ }
+ AppendTextBuffer("wSpeedsSupported: 0x%02X\r\n",
+ ssCapDesc->wSpeedsSupported);
+
+ if (ssCapDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_LOW)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Supports low-speed operation\r\n");
+ }
+ }
+ if (ssCapDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_FULL)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Supports full-speed operation\r\n");
+ }
+ }
+ if (ssCapDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_HIGH)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Supports high-speed operation\r\n");
+ }
+ }
+ if (ssCapDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_SUPER)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Supports SuperSpeed operation\r\n");
+ }
+ }
+ if (ssCapDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_RESERVED_MASK)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: bits 15:4 are reserved\r\n");
+ }
+ }
+ if (!gDoAnnotation)
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer("bFunctionalitySupport: 0x%02X",
+ ssCapDesc->bFunctionalitySupport);
+ if(gDoAnnotation)
+ {
+ switch (ssCapDesc->bFunctionalitySupport)
+ {
+ case UsbLowSpeed:
+ AppendTextBuffer(" -> lowest speed = low-speed\r\n");
+ break;
+ case UsbFullSpeed:
+ AppendTextBuffer(" -> lowest speed = full-speed\r\n");
+ break;
+ case UsbHighSpeed:
+ AppendTextBuffer(" -> lowest speed = high-speed\r\n");
+ break;
+ case UsbSuperSpeed:
+ AppendTextBuffer(" -> lowest speed = SuperSpeed\r\n");
+ break;
+ default:
+ AppendTextBuffer("\r\n*!*ERROR: Invalid value\r\n");
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+
+ AppendTextBuffer("bU1DevExitLat: 0x%02X",
+ ssCapDesc->bU1DevExitLat);
+ if(gDoAnnotation)
+ {
+ if (ssCapDesc->bU1DevExitLat <= USB_DEVICE_CAPABILITY_SUPERSPEED_U1_DEVICE_EXIT_MAX_VALUE)
+ {
+ AppendTextBuffer(" -> less than %d micro-seconds\r\n",
+ ssCapDesc->bU1DevExitLat);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid value\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+
+ AppendTextBuffer("wU2DevExitLat: 0x%04X",
+ ssCapDesc->wU2DevExitLat);
+ if(gDoAnnotation)
+ {
+ if (ssCapDesc->wU2DevExitLat <= USB_DEVICE_CAPABILITY_SUPERSPEED_U2_DEVICE_EXIT_MAX_VALUE)
+ {
+ AppendTextBuffer(" -> less than %d micro-seconds\r\n",
+ ssCapDesc->wU2DevExitLat);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid value\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+}
+
+
+VOID
+DisplaySuperSpeedPlusCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR sspCapDesc
+ )
+{
+ UCHAR i;
+
+ AppendTextBuffer("\r\n ===>SuperSpeed USB Device Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ sspCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ sspCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ sspCapDesc->bDevCapabilityType);
+ AppendTextBuffer("bReserved: 0x%02X\r\n",
+ sspCapDesc->bReserved);
+ if (sspCapDesc->bReserved != 0)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+
+ AppendTextBuffer("bmAttributes: 0x%08X\r\n",
+ sspCapDesc->bmAttributes.AsUlong);
+ AppendTextBuffer(" SublinkSpeedAttrCount: 0x%02X\r\n",
+ sspCapDesc->bmAttributes.SublinkSpeedAttrCount);
+ AppendTextBuffer(" SublinkSpeedIDCount: 0x%02X\r\n",
+ sspCapDesc->bmAttributes.SublinkSpeedIDCount);
+
+ AppendTextBuffer("wFunctionalitySupport: 0x%04X\r\n",
+ sspCapDesc->wFunctionalitySupport.AsUshort);
+ AppendTextBuffer(" SublinkSpeedAttrID: 0x%02X\r\n",
+ sspCapDesc->wFunctionalitySupport.SublinkSpeedAttrID);
+ AppendTextBuffer(" Reserved: 0x%02X\r\n",
+ sspCapDesc->wFunctionalitySupport.Reserved);
+ if (sspCapDesc->wFunctionalitySupport.Reserved != 0)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+ AppendTextBuffer(" MinRxLaneCount: 0x%02X\r\n",
+ sspCapDesc->wFunctionalitySupport.MinRxLaneCount);
+ AppendTextBuffer(" MinTxLaneCount: 0x%02X\r\n",
+ sspCapDesc->wFunctionalitySupport.MinTxLaneCount);
+
+ AppendTextBuffer("wReserved: 0x%04X\r\n",
+ sspCapDesc->wReserved);
+ if (sspCapDesc->wReserved != 0)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+
+ // The array size = SublinkSpeedAttrCount + 1
+ for (i = 0; i <= sspCapDesc->bmAttributes.SublinkSpeedAttrCount; i++)
+ {
+ PUSB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED speed = &sspCapDesc->bmSublinkSpeedAttr[i];
+
+ AppendTextBuffer("bmSublinkSpeedAttr #: 0x%02X\r\n",
+ i);
+ AppendTextBuffer(" SublinkSpeedAttrID: 0x%02X\r\n",
+ speed->SublinkSpeedAttrID);
+ AppendTextBuffer(" LaneSpeedExponent: 0x%02X",
+ speed->LaneSpeedExponent);
+ if(gDoAnnotation)
+ {
+ switch (speed->LaneSpeedExponent)
+ {
+ case 0:
+ AppendTextBuffer(" -> Bits per second\r\n");
+ break;
+ case 1:
+ AppendTextBuffer(" -> Kb/s\r\n");
+ break;
+ case 2:
+ AppendTextBuffer(" -> Mb/s\r\n");
+ break;
+ case 3:
+ AppendTextBuffer(" -> Gb/s\r\n");
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer(" SublinkTypeMode: 0x%02X",
+ speed->SublinkTypeMode);
+ if(gDoAnnotation)
+ {
+ switch (speed->SublinkTypeMode)
+ {
+ case 0:
+ AppendTextBuffer(" -> Symmetric\r\n");
+ break;
+ case 1:
+ AppendTextBuffer(" -> Asymmetric\r\n");
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer(" SublinkTypeDir: 0x%02X",
+ speed->SublinkTypeDir);
+ if(gDoAnnotation)
+ {
+ switch (speed->SublinkTypeDir)
+ {
+ case 0:
+ AppendTextBuffer(" -> Receive mode\r\n");
+ break;
+ case 1:
+ AppendTextBuffer(" -> Transmit mode\r\n");
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer(" Reserved: 0x%02X\r\n",
+ speed->Reserved);
+ AppendTextBuffer(" LinkProtocol: 0x%02X",
+ speed->LinkProtocol);
+ if(gDoAnnotation)
+ {
+ switch (speed->LinkProtocol)
+ {
+ case 0:
+ AppendTextBuffer(" -> SuperSpeed\r\n");
+ break;
+ case 1:
+ AppendTextBuffer(" -> SuperSpeedPlus\r\n");
+ break;
+ default:
+ AppendTextBuffer(" -> Reserved\r\n");
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer(" LaneSpeedMantissa: 0x%04X\r\n",
+ speed->LaneSpeedMantissa);
+ }
+}
+
+
+VOID
+DisplayPlatformCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR platformCapDesc
+ )
+{
+ LPGUID pGuid;
+
+ AppendTextBuffer("\r\n ===>Platform Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ platformCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ platformCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ platformCapDesc->bDevCapabilityType);
+
+ AppendTextBuffer("bReserved: 0x%02X\r\n",
+ platformCapDesc->bReserved);
+ if (platformCapDesc->bReserved != 0)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+
+ pGuid = (LPGUID)&platformCapDesc->PlatformCapabilityUuid;
+ AppendTextBuffer("Platform Capability UUID: ");
+ AppendTextBuffer("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\r\n",
+ pGuid->Data1,
+ pGuid->Data2,
+ pGuid->Data3,
+ pGuid->Data4[0],
+ pGuid->Data4[1],
+ pGuid->Data4[2],
+ pGuid->Data4[3],
+ pGuid->Data4[4],
+ pGuid->Data4[5],
+ pGuid->Data4[6],
+ pGuid->Data4[7]);
+
+ DisplayRemainingUnknownDescriptor((PUCHAR)platformCapDesc,
+ (ULONG)offsetof(USB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR, CapabililityData),
+ platformCapDesc->bLength);
+}
+
+
+VOID
+DisplayContainerIdCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR containerIdCapDesc
+ )
+{
+ LPGUID pGuid;
+
+ AppendTextBuffer("\r\n ===>Container ID Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ containerIdCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ containerIdCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ containerIdCapDesc->bDevCapabilityType);
+ AppendTextBuffer("bReserved: 0x%02X\r\n",
+ containerIdCapDesc->bReserved);
+ if (containerIdCapDesc->bReserved != 0)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+
+ pGuid = (LPGUID)containerIdCapDesc->ContainerID;
+ AppendTextBuffer("Container ID: ");
+ AppendTextBuffer("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\r\n",
+ pGuid->Data1,
+ pGuid->Data2,
+ pGuid->Data3,
+ pGuid->Data4[0],
+ pGuid->Data4[1],
+ pGuid->Data4[2],
+ pGuid->Data4[3],
+ pGuid->Data4[4],
+ pGuid->Data4[5],
+ pGuid->Data4[6],
+ pGuid->Data4[7]);
+}
+
+VOID
+DisplayBillboardCapabilityDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR billboardCapDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ )
+{
+ UCHAR i = 0;
+ UCHAR bNumAlternateModes = 0;
+ UCHAR alternateModeConfiguration = 0;
+ UCHAR adjustedBLength = 0;
+
+ AppendTextBuffer("\r\n ===>Billboard Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X",
+ billboardCapDesc->bLength);
+
+ adjustedBLength = sizeof(USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR) +
+ sizeof(billboardCapDesc->AlternateMode[0]) * (billboardCapDesc->bNumberOfAlternateModes - 1);
+ AppendTextBuffer(" -> Actual Length: 0x%02X\r\n", adjustedBLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ billboardCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X -> Billboard capability\r\n",
+ billboardCapDesc->bDevCapabilityType);
+ AppendTextBuffer("iAdditionalInfoURL: 0x%02X ->",
+ billboardCapDesc->iAddtionalInfoURL);
+ if (billboardCapDesc->iAddtionalInfoURL && gDoAnnotation) {
+ DisplayStringDescriptor(billboardCapDesc->iAddtionalInfoURL,
+ StringDescs,
+ info->DeviceInfoNode != NULL ? info->DeviceInfoNode->LatestDevicePowerState : PowerDeviceUnspecified);
+ }
+ AppendTextBuffer("bNumberOfAlternateModes: 0x%02X\r\n",
+ billboardCapDesc->bNumberOfAlternateModes);
+
+ if (billboardCapDesc->bNumberOfAlternateModes > BILLBOARD_MAX_NUM_ALT_MODE)
+ {
+ AppendTextBuffer("*!*ERROR: Invalid bNumberofAlternateModes\r\n");
+ }
+ AppendTextBuffer("bPreferredAlternateMode: 0x%02X\r\n",
+ billboardCapDesc->bPreferredAlternateMode);
+
+ AppendTextBuffer("VCONN Power: 0x%04X",
+ billboardCapDesc->VconnPower);
+
+ if (billboardCapDesc->VconnPower.NoVconnPowerRequired)
+ {
+ AppendTextBuffer(" -> The adapter does not require Vconn Power. Bits 2..0 ignored\r\n");
+ }
+ else
+ {
+ switch (billboardCapDesc->VconnPower.VConnPowerNeededForFullFunctionality)
+ {
+ case 0:
+ AppendTextBuffer(" -> 1W needed by adapter for full functionality\r\n");
+ break;
+ case 1:
+ AppendTextBuffer(" -> 1.5W needed by adapter for full functionality\r\n");
+ break;
+ case 7:
+ AppendTextBuffer(" -> *!*ERROR: VConnPowerNeededForFullFunctionality - Reserved value being used\r\n");
+ break;
+ default:
+ AppendTextBuffer(" -> %2XW needed by adapter for full functionality\r\n", billboardCapDesc->VconnPower.VConnPowerNeededForFullFunctionality);
+ }
+ }
+
+ if (billboardCapDesc->VconnPower.Reserved)
+ {
+ AppendTextBuffer("*!*ERROR: Reserved bits in VCONN Power being used\r\n");
+ }
+ if (billboardCapDesc->bReserved)
+ {
+ AppendTextBuffer("*!*ERROR: bReserved being used\r\n");
+ }
+
+
+ bNumAlternateModes = billboardCapDesc->bNumberOfAlternateModes;
+ if (bNumAlternateModes > BILLBOARD_MAX_NUM_ALT_MODE)
+ {
+ bNumAlternateModes = BILLBOARD_MAX_NUM_ALT_MODE;
+ }
+ if (bNumAlternateModes > 0)
+ {
+ AppendTextBuffer("\r\nAlternate Modes Identified:\r\n");
+ }
+ for (i = 0; i < bNumAlternateModes; i++)
+ {
+ alternateModeConfiguration = ((billboardCapDesc->bmConfigured[i / 4]) >> ((i % 4) * 2)) & 0x3;
+ AppendTextBuffer("wSVID - 0x%04X bAlternateMode - 0x%02X ->",
+ billboardCapDesc->AlternateMode[i].wSVID,
+ billboardCapDesc->AlternateMode[i].bAlternateMode,
+ billboardCapDesc->AlternateMode[i].iAlternateModeSetting);
+
+ switch (alternateModeConfiguration)
+ {
+ case 0:
+ AppendTextBuffer("Unspecified Error\r\n");
+ break;
+ case 1:
+ AppendTextBuffer("Alternate Mode configuration not attempted\r\n");
+ break;
+ case 2:
+ AppendTextBuffer("Alternate Mode configuration attempted but unsuccessful\r\n");
+ break;
+ case 3:
+ AppendTextBuffer("Alternate Mode configuration successful\r\n");
+ break;
+ }
+ AppendTextBuffer("iAlternateModeString - 0x%02X ", billboardCapDesc->AlternateMode[i].iAlternateModeSetting);
+ if (billboardCapDesc->AlternateMode[i].iAlternateModeSetting && gDoAnnotation)
+ {
+ DisplayStringDescriptor(billboardCapDesc->AlternateMode[i].iAlternateModeSetting,
+ StringDescs,
+ info->DeviceInfoNode != NULL ? info->DeviceInfoNode->LatestDevicePowerState : PowerDeviceUnspecified);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer("\r\n");
+ }
+}
+
+
+#ifdef USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY
+
+VOID
+DisplayConfigurationSummaryCapabilityDescriptor (
+ PUSB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR configSummaryCapDesc
+ )
+{
+ UCHAR i;
+ AppendTextBuffer("\r\n ===>Configuration Summary Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ configSummaryCapDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ configSummaryCapDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ configSummaryCapDesc->bDevCapabilityType);
+
+ AppendTextBuffer("bcdVersion: 0x%04X\r\n",
+ configSummaryCapDesc->bcdVersion);
+ AppendTextBuffer("bConfigurationValue: 0x%02X\r\n",
+ configSummaryCapDesc->bConfigurationValue);
+ AppendTextBuffer("bMaxPower: 0x%02X\r\n",
+ configSummaryCapDesc->bMaxPower);
+ AppendTextBuffer("bNumFunctions: 0x%02X\r\n",
+ configSummaryCapDesc->bNumFunctions);
+
+ for (i = 0; i < configSummaryCapDesc->bNumFunctions; i++)
+ {
+ AppendTextBuffer("Function #: 0x%02X\r\n",
+ i);
+ AppendTextBuffer(" bClass: 0x%02X\r\n",
+ configSummaryCapDesc->Function[i].bClass);
+ AppendTextBuffer(" bSubClass: 0x%02X\r\n",
+ configSummaryCapDesc->Function[i].bSubClass);
+ AppendTextBuffer(" bProtocol: 0x%02X\r\n",
+ configSummaryCapDesc->Function[i].bProtocol);
+ }
+}
+
+#endif
+
+/*****************************************************************************
+
+DisplayBosDescriptor()
+
+BosDesc - The Binary Object Store (BOS) Descriptor, and associated Descriptors
+
+*****************************************************************************/
+
+VOID
+DisplayBosDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_BOS_DESCRIPTOR BosDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ PUSB_DEVICE_CAPABILITY_DESCRIPTOR capDesc = NULL;
+
+ AppendTextBuffer("\r\n ===>BOS Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ BosDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ BosDesc->bDescriptorType);
+ AppendTextBuffer("wTotalLength: 0x%04X\r\n",
+ BosDesc->wTotalLength);
+ AppendTextBuffer("bNumDeviceCaps: 0x%02X\r\n",
+ BosDesc->bNumDeviceCaps);
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)BosDesc;
+
+ while ((commonDesc = GetNextDescriptor((PUSB_COMMON_DESCRIPTOR)BosDesc,
+ BosDesc->wTotalLength,
+ commonDesc,
+ -1)) != NULL)
+ {
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE:
+
+ capDesc = (PUSB_DEVICE_CAPABILITY_DESCRIPTOR)commonDesc;
+
+ switch (capDesc->bDevCapabilityType)
+ {
+ case USB_DEVICE_CAPABILITY_USB20_EXTENSION:
+ DisplayUsb20ExtensionCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR)capDesc);
+ break;
+ case USB_DEVICE_CAPABILITY_SUPERSPEED_USB:
+ DisplaySuperSpeedCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR)capDesc);
+ break;
+ case USB_DEVICE_CAPABILITY_CONTAINER_ID:
+ DisplayContainerIdCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR)capDesc);
+ break;
+ case USB_DEVICE_CAPABILITY_PLATFORM:
+ DisplayPlatformCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR)capDesc);
+ break;
+ case USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB:
+ DisplaySuperSpeedPlusCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR)capDesc);
+ break;
+ case USB_DEVICE_CAPABILITY_BILLBOARD:
+ DisplayBillboardCapabilityDescriptor((PUSBDEVICEINFO) info, (PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR) capDesc, StringDescs);
+ break;
+#ifdef USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY
+ case USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY:
+ DisplayConfigurationSummaryCapabilityDescriptor((PUSB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR)capDesc);
+ break;
+#endif
+ default:
+ AppendTextBuffer("\r\n ===>Unknown Capability Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ capDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ capDesc->bDescriptorType);
+ AppendTextBuffer("bDevCapabilityType: 0x%02X\r\n",
+ capDesc->bDevCapabilityType);
+
+ DisplayRemainingUnknownDescriptor((PUCHAR)commonDesc,
+ (ULONG)sizeof(USB_DEVICE_CAPABILITY_DESCRIPTOR),
+ commonDesc->bLength);
+ break;
+ }
+ break;
+
+ default:
+ DisplayUnknownDescriptor(commonDesc);
+ break;
+ }
+ }
+}
+
+
+/*****************************************************************************
+
+DisplayConfigurationDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayConfigurationDescriptor (
+ PUSBDEVICEINFO info,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs
+ )
+{
+ UINT uCount = 0;
+ BOOL isSS;
+
+
+ isSS = info->ConnectionInfoV2
+ && (info->ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedOrHigher ||
+ info->ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedPlusOrHigher)
+ ? TRUE
+ : FALSE;
+
+ AppendTextBuffer("\r\n ===>Configuration Descriptor<===\r\n");
+ //@@DisplayConfigurationDescriptor - Configuration Descriptor
+
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ ConfigDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ ConfigDesc->bDescriptorType);
+
+ //@@TestCase A4.1
+ //@@Priority 1
+ //@@Descriptor Field - wTotalLength
+ //@@Verify Configuration length is valid
+ AppendTextBuffer("wTotalLength: 0x%04X",
+ ConfigDesc->wTotalLength);
+ uCount = GetConfigurationSize(info);
+ if (uCount != ConfigDesc->wTotalLength) {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid total configuration size 0x%02X, should be 0x%02X\r\n",
+ ConfigDesc->wTotalLength, uCount);
+ } else {
+ AppendTextBuffer(" -> Validated\r\n");
+ }
+
+ //@@TestCase A4.2
+ //@@Priority 1
+ //@@Descriptor Field - bNumInterfaces
+ //@@Verify the number of interfaces is valid
+ AppendTextBuffer("bNumInterfaces: 0x%02X\r\n",
+ ConfigDesc->bNumInterfaces);
+
+/* Need to check spec vs composite devices
+ uCount = GetInterfaceCount(info);
+ if (uCount != ConfigDesc->bNumInterfaces) {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid total Interfaces %d, should be %d\r\n",
+ ConfigDesc->bNumInterfaces, uCount);
+ } else {
+ AppendTextBuffer(" -> Validated\r\n");
+ }
+*/
+
+ AppendTextBuffer("bConfigurationValue: 0x%02X\r\n",
+ ConfigDesc->bConfigurationValue);
+
+ if(ConfigDesc->bConfigurationValue != 1)
+ {
+ //@@TestCase A4.3
+ //@@CAUTION
+ //@@Descriptor Field - bConfigurationValue
+ //@@Most host controllers do not handle more than one configuration
+ AppendTextBuffer("*!*CAUTION: Most host controllers will only work with one configuration per speed\r\n");
+ OOPS();
+ }
+
+ AppendTextBuffer("iConfiguration: 0x%02X\r\n",
+ ConfigDesc->iConfiguration);
+
+ if (ConfigDesc->iConfiguration && gDoAnnotation)
+ {
+ DisplayStringDescriptor(ConfigDesc->iConfiguration,
+ StringDescs,
+ info->DeviceInfoNode != NULL? info->DeviceInfoNode->LatestDevicePowerState: PowerDeviceUnspecified);
+ }
+
+ AppendTextBuffer("bmAttributes: 0x%02X",
+ ConfigDesc->bmAttributes);
+
+ if (info->ConnectionInfo->DeviceDescriptor.bcdUSB == 0x0100)
+ {
+ if (ConfigDesc->bmAttributes & USB_CONFIG_SELF_POWERED)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Self Powered\r\n");
+ }
+ }
+ if (ConfigDesc->bmAttributes & USB_CONFIG_BUS_POWERED)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Bus Powered\r\n");
+ }
+ }
+ }
+ else
+ {
+ if (ConfigDesc->bmAttributes & USB_CONFIG_SELF_POWERED)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Self Powered\r\n");
+ }
+ }
+ else
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Bus Powered\r\n");
+ }
+ }
+ if ((ConfigDesc->bmAttributes & USB_CONFIG_BUS_POWERED) == 0)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bit 7 is reserved and must be set\r\n");
+ OOPS();
+ }
+ }
+
+ if (ConfigDesc->bmAttributes & USB_CONFIG_REMOTE_WAKEUP)
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Remote Wakeup\r\n");
+ }
+ }
+
+ if (ConfigDesc->bmAttributes & USB_CONFIG_RESERVED)
+ {
+ //@@TestCase A4.4
+ //@@WARNING
+ //@@Descriptor Field - bmAttributes
+ //@@A bit has been set in reserved space
+ AppendTextBuffer("\r\n*!*ERROR: Bits 4...0 are reserved\r\n");
+ OOPS();
+ }
+
+ AppendTextBuffer("MaxPower: 0x%02X",
+ ConfigDesc->MaxPower);
+
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" = %3d mA\r\n",
+ isSS ? ConfigDesc->MaxPower * 8 : ConfigDesc->MaxPower * 2);
+ }
+ else {AppendTextBuffer("\r\n");}
+
+}
+
+/*****************************************************************************
+
+DisplayInterfaceDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayInterfaceDescriptor (
+ PUSB_INTERFACE_DESCRIPTOR InterfaceDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayInterfaceDescriptor - Interface Descriptor
+ AppendTextBuffer("\r\n ===>Interface Descriptor<===\r\n");
+
+ //length checked in DisplayConfigDesc()
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ InterfaceDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ InterfaceDesc->bDescriptorType);
+
+ //@@TestCase A5.1
+ //@@Priority 1
+ //@@Descriptor Field - bInterfaceNumber
+ //@@Question - Should we test to verify bInterfaceNumber is valid?
+ AppendTextBuffer("bInterfaceNumber: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceNumber);
+
+ //@@TestCase A5.2
+ //@@Priority 1
+ //@@Descriptor Field - bAlternateSetting
+ //@@Question - Should we test to verify bAlternateSetting is valid?
+ AppendTextBuffer("bAlternateSetting: 0x%02X\r\n",
+ InterfaceDesc->bAlternateSetting);
+
+ //@@TestCase A5.3
+ //@@Priority 1
+ //@@Descriptor Field - bNumEndpoints
+ //@@Question - Should we test to verify bNumEndpoints is valid?
+ AppendTextBuffer("bNumEndpoints: 0x%02X\r\n",
+ InterfaceDesc->bNumEndpoints);
+
+ AppendTextBuffer("bInterfaceClass: 0x%02X",
+ InterfaceDesc->bInterfaceClass);
+
+ switch (InterfaceDesc->bInterfaceClass)
+ {
+ case USB_DEVICE_CLASS_AUDIO:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Audio Interface Class\r\n");
+ }
+
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X",
+ InterfaceDesc->bInterfaceSubClass);
+
+ if(gDoAnnotation)
+ {
+ switch (InterfaceDesc->bInterfaceSubClass)
+ {
+ case USB_AUDIO_SUBCLASS_AUDIOCONTROL:
+ AppendTextBuffer(" -> Audio Control Interface SubClass\r\n");
+ break;
+
+ case USB_AUDIO_SUBCLASS_AUDIOSTREAMING:
+ AppendTextBuffer(" -> Audio Streaming Interface SubClass\r\n");
+ break;
+
+ case USB_AUDIO_SUBCLASS_MIDISTREAMING:
+ AppendTextBuffer(" -> MIDI Streaming Interface SubClass\r\n");
+ break;
+
+ default:
+ //@@TestCase A5.4
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceSubClass
+ //@@Invalid bInterfaceSubClass
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid bInterfaceSubClass\r\n");
+ OOPS();
+ break;
+ }
+ }
+ break;
+
+ case USB_DEVICE_CLASS_VIDEO:
+ if(gDoAnnotation)
+ AppendTextBuffer(" -> Video Interface Class\r\n");
+
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X",
+ InterfaceDesc->bInterfaceSubClass);
+
+ switch(InterfaceDesc->bInterfaceSubClass)
+ {
+ case VIDEO_SUBCLASS_CONTROL:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Video Control Interface SubClass\r\n");
+ }
+ break;
+
+ case VIDEO_SUBCLASS_STREAMING:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Video Streaming Interface SubClass\r\n");
+ }
+ break;
+
+ default:
+ //@@TestCase A5.5
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceSubClass
+ //@@Invalid bInterfaceSubClass
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid bInterfaceSubClass\r\n");
+ OOPS();
+ break;
+ }
+ break;
+
+ case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> HID Interface Class\r\n");
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_HUB:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> HUB Interface Class\r\n");
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_RESERVED:
+ //@@TestCase A5.6
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@A reserved USB Device Interface Class has been defined
+ AppendTextBuffer("\r\n*!*CAUTION: %d is a Reserved USB Device Interface Class\r\n",
+ USB_DEVICE_CLASS_RESERVED);
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_COMMUNICATIONS:
+ AppendTextBuffer(" -> This is Communications (CDC Control) USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_MONITOR:
+ AppendTextBuffer(" -> This is a Monitor USB Device Interface Class*** (This may be obsolete)\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+ AppendTextBuffer(" -> This is a Physical Interface USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_POWER:
+ if(InterfaceDesc->bInterfaceSubClass == 1 && InterfaceDesc->bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is an Image USB Device Interface Class\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" -> This is a Power USB Device Interface Class (This may be obsolete)\r\n");
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_PRINTER:
+ AppendTextBuffer(" -> This is a Printer USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_STORAGE:
+ AppendTextBuffer(" -> This is a Mass Storage USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_CDC_DATA_INTERFACE:
+ AppendTextBuffer(" -> This is a CDC Data USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_CHIP_SMART_CARD_INTERFACE:
+ AppendTextBuffer(" -> This is a Chip/Smart Card USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_CONTENT_SECURITY_INTERFACE:
+ AppendTextBuffer(" -> This is a Content Security USB Device Interface Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE_INTERFACE:
+ if(InterfaceDesc->bInterfaceSubClass == 1 && InterfaceDesc->bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Reprogrammable USB2 Compliance Diagnostic Device USB Device\r\n");
+ }
+ else
+ {
+ //@@TestCase A5.7
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_WIRELESS_CONTROLLER_INTERFACE:
+ if(InterfaceDesc->bInterfaceSubClass == 1 && InterfaceDesc->bInterfaceProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Wireless RF Controller USB Device Interface Class with Bluetooth Programming Interface\r\n");
+ }
+ else
+ {
+ //@@TestCase A5.8
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+
+ case USB_APPLICATION_SPECIFIC_INTERFACE:
+ AppendTextBuffer(" -> This is an Application Specific USB Device Interface Class\r\n");
+
+ switch(InterfaceDesc->bInterfaceSubClass)
+ {
+ case 1:
+ AppendTextBuffer(" -> This is a Device Firmware Application Specific USB Device Interface Class\r\n");
+ break;
+ case 2:
+ AppendTextBuffer(" -> This is an IrDA Bridge Application Specific USB Device Interface Class\r\n");
+ break;
+ case 3:
+ AppendTextBuffer(" -> This is a Test & Measurement Class (USBTMC) Application Specific USB Device Interface Class\r\n");
+ break;
+ default:
+ //@@TestCase A5.9
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+ case USB_DEVICE_CLASS_BILLBOARD:
+ AppendTextBuffer(" -> Billboard Class\r\n");
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X", InterfaceDesc->bInterfaceSubClass);
+ switch (InterfaceDesc->bInterfaceSubClass)
+ {
+ case 0:
+ AppendTextBuffer(" -> Billboard Subclass\r\n");
+ break;
+ default:
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid bInterfaceSubClass\r\n");
+ break;
+ }
+ break;
+
+ default:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Interface Class Unknown to USBView\r\n");
+ }
+ AppendTextBuffer("bInterfaceSubClass: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceSubClass);
+ break;
+ }
+
+ AppendTextBuffer("bInterfaceProtocol: 0x%02X\r\n",
+ InterfaceDesc->bInterfaceProtocol);
+
+ //This is basically the check for PC_PROTOCOL_UNDEFINED
+ if ((InterfaceDesc->bInterfaceClass == USB_DEVICE_CLASS_VIDEO) ||
+ (InterfaceDesc->bInterfaceClass == USB_DEVICE_CLASS_AUDIO))
+ {
+ if(InterfaceDesc->bInterfaceProtocol != PC_PROTOCOL_UNDEFINED)
+ {
+ //@@TestCase A5.10
+ //@@WARNING
+ //@@Descriptor Field - iInterface
+ //@@bInterfaceProtocol must be set to PC_PROTOCOL_UNDEFINED
+ AppendTextBuffer("*!*WARNING: must be set to PC_PROTOCOL_UNDEFINED %d for this class\r\n",
+ PC_PROTOCOL_UNDEFINED);
+ OOPS();
+ }
+ }
+
+ AppendTextBuffer("iInterface: 0x%02X\r\n",
+ InterfaceDesc->iInterface);
+
+ if(gDoAnnotation)
+ {
+ if (InterfaceDesc->iInterface)
+ {
+ DisplayStringDescriptor(InterfaceDesc->iInterface,
+ StringDescs,
+ LatestDevicePowerState);
+ }
+ }
+
+ if (InterfaceDesc->bLength == sizeof(USB_INTERFACE_DESCRIPTOR2))
+ {
+ PUSB_INTERFACE_DESCRIPTOR2 interfaceDesc2;
+
+ interfaceDesc2 = (PUSB_INTERFACE_DESCRIPTOR2)InterfaceDesc;
+
+ AppendTextBuffer("wNumClasses: 0x%04X\r\n",
+ interfaceDesc2->wNumClasses);
+ }
+
+}
+
+/*****************************************************************************
+
+DisplayEndpointDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayEndpointDescriptor (
+ _In_ PUSB_ENDPOINT_DESCRIPTOR
+ EndpointDesc,
+ _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR
+ EpCompDesc,
+ _In_opt_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
+ SspIsochEpCompDesc,
+ _In_ UCHAR InterfaceClass,
+ _In_ BOOLEAN EpCompDescAvail
+ )
+{
+ UCHAR epType = EndpointDesc->bmAttributes & USB_ENDPOINT_TYPE_MASK;
+ PUSB_HIGH_SPEED_MAXPACKET hsMaxPacket;
+
+ AppendTextBuffer("\r\n ===>Endpoint Descriptor<===\r\n");
+ //@@DisplayEndpointDescriptor - Endpoint Descriptor
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ EndpointDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ EndpointDesc->bDescriptorType);
+
+ AppendTextBuffer("bEndpointAddress: 0x%02X",
+ EndpointDesc->bEndpointAddress);
+
+ if(gDoAnnotation)
+ {
+ if(USB_ENDPOINT_DIRECTION_OUT(EndpointDesc->bEndpointAddress))
+ {
+ AppendTextBuffer(" -> Direction: OUT - EndpointID: %d\r\n",
+ (EndpointDesc->bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK));
+ }
+ else if(USB_ENDPOINT_DIRECTION_IN(EndpointDesc->bEndpointAddress))
+ {
+ AppendTextBuffer(" -> Direction: IN - EndpointID: %d\r\n",
+ (EndpointDesc->bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK));
+ }
+ else
+ {
+ //@@TestCase A6.1
+ //@@ERROR
+ //@@Descriptor Field - bEndpointAddress
+ //@@An invalid endpoint addressl has been defined
+ AppendTextBuffer("\r\n*!*ERROR: This appears to be an invalid bEndpointAddress\r\n");
+ OOPS();
+ }
+ }
+ else {AppendTextBuffer("\r\n");}
+
+ AppendTextBuffer("bmAttributes: 0x%02X",
+ EndpointDesc->bmAttributes);
+
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> ");
+
+ switch (epType)
+ {
+ case USB_ENDPOINT_TYPE_CONTROL:
+ AppendTextBuffer("Control Transfer Type\r\n");
+ if (EndpointDesc->bmAttributes & USB_ENDPOINT_TYPE_CONTROL_RESERVED_MASK)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bits 7..2 are reserved and must be set to 0\r\n");
+ OOPS();
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ AppendTextBuffer("Isochronous Transfer Type, Synchronization Type = ");
+
+ switch (USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION(EndpointDesc->bmAttributes))
+ {
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_NO_SYNCHRONIZATION:
+ AppendTextBuffer("No Synchronization");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_ASYNCHRONOUS:
+ AppendTextBuffer("Asynchronous");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_ADAPTIVE:
+ AppendTextBuffer("Adaptive");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_SYNCHRONOUS:
+ AppendTextBuffer("Synchronous");
+ break;
+ }
+ AppendTextBuffer(", Usage Type = ");
+
+ switch (USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE(EndpointDesc->bmAttributes))
+ {
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_DATA_ENDOINT:
+ AppendTextBuffer("Data Endpoint\r\n");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_FEEDBACK_ENDPOINT:
+ AppendTextBuffer("Feedback Endpoint\r\n");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_IMPLICIT_FEEDBACK_DATA_ENDPOINT:
+ AppendTextBuffer("Implicit Feedback Data Endpoint\r\n");
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_RESERVED:
+ //@@TestCase A6.2
+ //@@ERROR
+ //@@Descriptor Field - bmAttributes
+ //@@A reserved bit has a value
+ AppendTextBuffer("\r\n*!*ERROR: This value is Reserved\r\n");
+ OOPS();
+ break;
+ }
+ if (EndpointDesc->bmAttributes & USB_ENDPOINT_TYPE_ISOCHRONOUS_RESERVED_MASK)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bits 7..6 are reserved and must be set to 0\r\n");
+ OOPS();
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_BULK:
+ AppendTextBuffer("Bulk Transfer Type\r\n");
+ if (EndpointDesc->bmAttributes & USB_ENDPOINT_TYPE_BULK_RESERVED_MASK)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bits 7..2 are reserved and must be set to 0\r\n");
+ OOPS();
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+
+ if (gDeviceSpeed != UsbSuperSpeed)
+ {
+ AppendTextBuffer("Interrupt Transfer Type\r\n");
+ if (EndpointDesc->bmAttributes & USB_20_ENDPOINT_TYPE_INTERRUPT_RESERVED_MASK)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bits 7..2 are reserved and must be set to 0\r\n");
+ OOPS();
+ }
+ }
+ else
+ {
+ AppendTextBuffer("Interrupt Transfer Type, Usage Type = ");
+
+ switch (USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE(EndpointDesc->bmAttributes))
+ {
+ case USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_PERIODIC:
+ AppendTextBuffer("Periodic\r\n");
+ break;
+
+ case USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_NOTIFICATION:
+ AppendTextBuffer("Notification\r\n");
+ break;
+
+ case USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_RESERVED10:
+ case USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_RESERVED11:
+ AppendTextBuffer("\r\n*!*ERROR: This value is Reserved\r\n");
+ OOPS();
+ break;
+ }
+
+ if (EndpointDesc->bmAttributes & USB_30_ENDPOINT_TYPE_INTERRUPT_RESERVED_MASK)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Bits 7..6 and 3..2 are reserved and must be set to 0\r\n");
+ OOPS();
+ }
+
+ if (EpCompDescAvail)
+ {
+ if (EpCompDesc == NULL)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Endpoint Companion Descriptor missing\r\n");
+ OOPS();
+ }
+ else if (EpCompDesc->bmAttributes.Isochronous.SspCompanion == 1 &&
+ SspIsochEpCompDesc == NULL)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: SuperSpeedPlus Isoch Endpoint Companion Descriptor missing\r\n");
+ OOPS();
+ }
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+
+ //@@TestCase A6.3
+ //@@Priority 1
+ //@@Descriptor Field - bInterfaceNumber
+ //@@Question - Should we test to verify bInterfaceNumber is valid?
+ AppendTextBuffer("wMaxPacketSize: 0x%04X",
+ EndpointDesc->wMaxPacketSize);
+ if(gDoAnnotation)
+ {
+ switch (gDeviceSpeed)
+ {
+ case UsbSuperSpeed:
+ switch (epType)
+ {
+ case USB_ENDPOINT_TYPE_BULK:
+ if (EndpointDesc->wMaxPacketSize != USB_ENDPOINT_SUPERSPEED_BULK_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: SuperSpeed Bulk endpoints must be %d bytes\r\n",
+ USB_ENDPOINT_SUPERSPEED_BULK_MAX_PACKET_SIZE);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_CONTROL:
+ if (EndpointDesc->wMaxPacketSize != USB_ENDPOINT_SUPERSPEED_CONTROL_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: SuperSpeed Control endpoints must be %d bytes\r\n",
+ USB_ENDPOINT_SUPERSPEED_CONTROL_MAX_PACKET_SIZE);
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+
+ if (EpCompDesc != NULL)
+ {
+ if (EpCompDesc->bMaxBurst > 0)
+ {
+ if (EndpointDesc->wMaxPacketSize != USB_ENDPOINT_SUPERSPEED_ISO_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: SuperSpeed isochronous endpoints must have wMaxPacketSize value of %d bytes\r\n",
+ USB_ENDPOINT_SUPERSPEED_ISO_MAX_PACKET_SIZE);
+ AppendTextBuffer(" when the SuperSpeed endpoint companion descriptor bMaxBurst value is greater than 0\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else if (EndpointDesc->wMaxPacketSize > USB_ENDPOINT_SUPERSPEED_ISO_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid SuperSpeed isochronous maximum packet size\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+
+ if (EpCompDesc != NULL)
+ {
+ if (EpCompDesc->bMaxBurst > 0)
+ {
+ if (EndpointDesc->wMaxPacketSize != USB_ENDPOINT_SUPERSPEED_INTERRUPT_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: SuperSpeed interrupt endpoints must have wMaxPacketSize value of %d bytes\r\n",
+ USB_ENDPOINT_SUPERSPEED_INTERRUPT_MAX_PACKET_SIZE);
+ AppendTextBuffer(" when the SuperSpeed endpoint companion descriptor bMaxBurst value is greater than 0\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else if (EndpointDesc->wMaxPacketSize > USB_ENDPOINT_SUPERSPEED_INTERRUPT_MAX_PACKET_SIZE)
+ {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid SuperSpeed interrupt maximum packet size\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+ }
+ break;
+
+ case UsbHighSpeed:
+ hsMaxPacket = (PUSB_HIGH_SPEED_MAXPACKET)&EndpointDesc->wMaxPacketSize;
+
+ switch (epType)
+ {
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+ switch (hsMaxPacket->HSmux) {
+ case 0:
+ if ((hsMaxPacket->MaxPacket < 1) || (hsMaxPacket->MaxPacket >1024))
+ {
+ AppendTextBuffer("*!*ERROR: Invalid maximum packet size, should be between 1 and 1024\r\n");
+ }
+ break;
+
+ case 1:
+ if ((hsMaxPacket->MaxPacket < 513) || (hsMaxPacket->MaxPacket >1024))
+ {
+ AppendTextBuffer("*!*ERROR: Invalid maximum packet size, should be between 513 and 1024\r\n");
+ }
+ break;
+
+ case 2:
+ if ((hsMaxPacket->MaxPacket < 683) || (hsMaxPacket->MaxPacket >1024))
+ {
+ AppendTextBuffer("*!*ERROR: Invalid maximum packet size, should be between 683 and 1024\r\n");
+ }
+ break;
+
+ case 3:
+ AppendTextBuffer("*!*ERROR: Bits 12-11 set to Reserved value in wMaxPacketSize\r\n");
+ break;
+ }
+
+ AppendTextBuffer(" = %d transactions per microframe, 0x%02X max bytes\r\n", hsMaxPacket->HSmux + 1, hsMaxPacket->MaxPacket);
+ break;
+
+ case USB_ENDPOINT_TYPE_BULK:
+ case USB_ENDPOINT_TYPE_CONTROL:
+ AppendTextBuffer(" = 0x%02X max bytes\r\n", hsMaxPacket->MaxPacket);
+ break;
+ }
+ break;
+
+ case UsbFullSpeed:
+ // full speed
+ AppendTextBuffer(" = 0x%02X bytes\r\n",
+ EndpointDesc->wMaxPacketSize & 0x7FF);
+ break;
+ default:
+ // low or invalid speed
+ if (InterfaceClass == USB_DEVICE_CLASS_VIDEO)
+ {
+ AppendTextBuffer(" = Invalid bus speed for USB Video Class\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+ }
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+
+ if (EndpointDesc->wMaxPacketSize & 0xE000)
+ {
+ //@@TestCase A6.4
+ //@@Priority 1
+ //@@OTG Descriptor Field - wMaxPacketSize
+ //@@Attribute bits D7-2 reserved (reset to 0)
+ AppendTextBuffer("*!*ERROR: wMaxPacketSize bits 15-13 should be 0\r\n");
+ }
+
+ if (EndpointDesc->bLength == sizeof(USB_ENDPOINT_DESCRIPTOR))
+ {
+ //@@TestCase A6.5
+ //@@Priority 1
+ //@@Descriptor Field - bInterfaceNumber
+ //@@Question - Should we test to verify bInterfaceNumber is valid?
+ AppendTextBuffer("bInterval: 0x%02X\r\n",
+ EndpointDesc->bInterval);
+ }
+ else
+ {
+ PUSB_ENDPOINT_DESCRIPTOR2 endpointDesc2;
+
+ endpointDesc2 = (PUSB_ENDPOINT_DESCRIPTOR2)EndpointDesc;
+
+ AppendTextBuffer("wInterval: 0x%04X\r\n",
+ endpointDesc2->wInterval);
+
+ AppendTextBuffer("bSyncAddress: 0x%02X\r\n",
+ endpointDesc2->bSyncAddress);
+ }
+
+ if (EpCompDesc != NULL)
+ {
+ DisplayEndointCompanionDescriptor(EpCompDesc, SspIsochEpCompDesc, epType);
+ }
+ if (SspIsochEpCompDesc != NULL)
+ {
+ DisplaySuperSpeedPlusIsochEndpointCompanionDescriptor(SspIsochEpCompDesc);
+ }
+
+}
+
+/*****************************************************************************
+
+DisplaySuperSpeedPlusIsochEndpointCompanionDescriptor()
+
+*****************************************************************************/
+VOID
+DisplaySuperSpeedPlusIsochEndpointCompanionDescriptor(
+ _In_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR SspIsochEpCompDesc
+ )
+ {
+ AppendTextBuffer("\r\n ===>SuperSpeedPlus Isochronous Endpoint Companion Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ SspIsochEpCompDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ SspIsochEpCompDesc->bDescriptorType);
+
+ AppendTextBuffer("wReserved: 0x%02X\r\n",
+ SspIsochEpCompDesc->wReserved);
+
+ if (gDoAnnotation)
+ {
+ if (SspIsochEpCompDesc->wReserved != 0)
+ {
+ AppendTextBuffer("*!*ERROR: field is reserved\r\n");
+ }
+ }
+
+ AppendTextBuffer("dwBytesPerInterval: 0x%04X\r\n",
+ SspIsochEpCompDesc->dwBytesPerInterval);
+}
+
+/*****************************************************************************
+
+DisplayEndointCompanionDescriptor()
+
+*****************************************************************************/
+VOID
+DisplayEndointCompanionDescriptor (
+ _In_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR EpCompDesc,
+ _In_opt_ PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR SspIsochEpCompDesc,
+ _In_ UCHAR DescType
+ )
+{
+ AppendTextBuffer("\r\n ===>SuperSpeed Endpoint Companion Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ EpCompDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ EpCompDesc->bDescriptorType);
+
+ AppendTextBuffer("bMaxBurst: 0x%02X\r\n",
+ EpCompDesc->bMaxBurst);
+
+ AppendTextBuffer("bmAttributes: 0x%02X",
+ EpCompDesc->bmAttributes.AsUchar);
+ if(gDoAnnotation)
+ {
+ switch (DescType)
+ {
+ case USB_ENDPOINT_TYPE_CONTROL:
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+ if (EpCompDesc->bmAttributes.AsUchar != 0)
+ {
+ AppendTextBuffer("*!*ERROR: Control/Interrupt SuperSpeed endpoints do not support streams\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+ case USB_ENDPOINT_TYPE_BULK:
+ if(EpCompDesc->bmAttributes.Bulk.MaxStreams == 0)
+ {
+ AppendTextBuffer("The bulk endpoint does not define streams (MaxStreams == 0)\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" = %d streams supported\r\n", 1 << EpCompDesc->bmAttributes.Bulk.MaxStreams);
+ }
+
+ if (EpCompDesc->bmAttributes.Bulk.Reserved1 != 0)
+ {
+ AppendTextBuffer("*!*ERROR: bmAttributes bits 7-5 should be 0\r\n");
+ }
+ break;
+
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ if (EpCompDesc->bmAttributes.Isochronous.SspCompanion == 0)
+ {
+ if (EpCompDesc->bMaxBurst == 0 &&
+ EpCompDesc->bmAttributes.Isochronous.Mult != 0)
+ {
+ AppendTextBuffer("*!*ERROR: SuperSpeed isochronous endpoint multiplier value should be zero if bMaxBurst is zero\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" = %d maximum number of packets within a service interval\r\n",
+ (EpCompDesc->bmAttributes.Isochronous.Mult + 1)*(EpCompDesc->bMaxBurst + 1));
+
+ if (EpCompDesc->bmAttributes.Isochronous.Mult > USB_SUPERSPEED_ISOCHRONOUS_MAX_MULTIPLIER)
+ {
+ AppendTextBuffer("*!*ERROR: Maximum SuperSpeed isochronous endpoint multiplier value exceeded\r\n");
+ }
+ }
+ }
+ else
+ {
+ if (EpCompDesc->bMaxBurst != 0 && SspIsochEpCompDesc != NULL)
+ {
+ AppendTextBuffer(" = %d maximum number of packets within a service interval\r\n",
+ (SspIsochEpCompDesc->dwBytesPerInterval*USB_ENDPOINT_SUPERSPEED_ISO_MAX_PACKET_SIZE) /
+ EpCompDesc->bMaxBurst);
+ }
+ }
+
+ if (EpCompDesc->bmAttributes.Isochronous.Reserved2 != 0)
+ {
+ AppendTextBuffer("*!*ERROR: bmAttributes bits 7-2 should be 0\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n");
+ }
+ break;
+ }
+ }
+ AppendTextBuffer("wBytesPerInterval: 0x%04X\r\n",
+ EpCompDesc->wBytesPerInterval);
+
+ if (EpCompDesc->bmAttributes.Isochronous.SspCompanion == 1 &&
+ EpCompDesc->wBytesPerInterval != 0x1)
+ {
+ AppendTextBuffer("*!*ERROR: SuperSpeed endpoint wBytesPerInterval value should be 1 if \
+ SuperSpeedPlus Isoch companion descriptor is present\r\n");
+ }
+}
+
+
+/*****************************************************************************
+
+DisplayHidDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayHidDescriptor (
+ PUSB_HID_DESCRIPTOR HidDesc
+ )
+{
+ UCHAR i = 0;
+
+ AppendTextBuffer("\r\n ===>HID Descriptor<===\r\n");
+
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ HidDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ HidDesc->bDescriptorType);
+ AppendTextBuffer("bcdHID: 0x%04X\r\n",
+ HidDesc->bcdHID);
+ AppendTextBuffer("bCountryCode: 0x%02X\r\n",
+ HidDesc->bCountryCode);
+ AppendTextBuffer("bNumDescriptors: 0x%02X\r\n",
+ HidDesc->bNumDescriptors);
+
+ for (i=0; i<HidDesc->bNumDescriptors; i++)
+ {
+ if (HidDesc->OptionalDescriptors[i].bDescriptorType == 0x22) {
+ AppendTextBuffer("bDescriptorType: 0x%02X (Report Descriptor)\r\n",
+ HidDesc->OptionalDescriptors[i].bDescriptorType);
+ }
+ else {
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ HidDesc->OptionalDescriptors[i].bDescriptorType);
+ }
+
+ AppendTextBuffer("wDescriptorLength: 0x%04X\r\n",
+ HidDesc->OptionalDescriptors[i].wDescriptorLength);
+ }
+}
+
+/*****************************************************************************
+
+DisplayOTGDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayOTGDescriptor (
+ PUSB_OTG_DESCRIPTOR OTGDesc
+ )
+{
+ AppendTextBuffer("\r\n ===>OTG Descriptor<===\r\n");
+
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ OTGDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ OTGDesc->bDescriptorType);
+ AppendTextBuffer("bmAttributes: 0x%02X",
+ OTGDesc->bmAttributes);
+
+ switch (OTGDesc->bmAttributes)
+ {
+ case 0:
+ break;
+ case 1:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> SRP support\r\n");
+ }
+ break;
+ case 2:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> HNP support\r\n");
+ }
+ break;
+ case 3:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> SRP and HNP support\r\n");
+ }
+ break;
+ default:
+ //@@TestCase A6.5
+ //@@Priority 1
+ //@@OTG Descriptor Field - bmAttributes
+ //@@Attribute bits D7-2 reserved (reset to 0)
+ AppendTextBuffer("*!*ERROR: bmAttributes bits 2-7 are reserved "\
+ "(should be 0)\r\n");
+ OOPS();
+ break;
+ }
+}
+
+/*****************************************************************************
+
+InitializeGlobalFlags ()
+
+Initialize the global device flags in UVCView.h
+
+*****************************************************************************/
+
+void
+InitializePerDeviceSettings (
+ PUSBDEVICEINFO info
+ )
+{
+ // Save base address for this current device's info (including Configuration descriptor)
+ CurrentUSBDeviceInfo = info;
+
+ // Initialize Configuration descriptor length
+ dwConfigLength = 0;
+
+ // Save # of bytes from start of Configuration descriptor
+ // (Update this in the descriptor parsing routines)
+ dwConfigIndex = 0;
+
+ // Flags used in dispvid.c to display default Frame descriptor for MJPEG,
+ // Uncompressed, Vendor and FrameBased Formats
+ g_chMJPEGFrameDefault = 0;
+ g_chUNCFrameDefault = 0;
+ g_chVendorFrameDefault = 0;
+ g_chFrameBasedFrameDefault = 0;
+
+ // Spec version of UVC device
+ g_chUVCversion = 0;
+
+ // Start and end address of the configuration descriptor and start of the string descriptors
+ g_pConfigDesc = NULL;
+ g_pStringDescs = NULL;
+ g_descEnd = NULL;
+
+ //
+ // The GetConfigDescriptor() function in enum.c does not always work
+ // If that fails, the Configuration descriptor will be NULL
+ // and we can only display the device descriptor
+ //
+ CurrentConfigDesc = NULL;
+ if (NULL != info)
+ {
+ if (NULL != info->ConfigDesc)
+ {
+ CurrentConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1);
+
+ // Save the LENGTH of the Config descriptor
+ // Note that IsIADDevice() saves the ADDRESS of the END of the Config desc
+ // Be aware of the difference
+ dwConfigLength = CurrentConfigDesc->wTotalLength;
+ }
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+IsUVCDevice()
+
+Return Spec version of UVC device
+ 0x0 = Not a UVC device
+ 0x10 = UVC 1.0
+ 0x11 = UVC 1.1
+
+ *****************************************************************************/
+
+UINT
+IsUVCDevice (
+ PUSBDEVICEINFO info
+ )
+{
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc = NULL;
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ PUCHAR descEnd = NULL;
+ UINT uUVCversion = 0;
+
+ //
+ // The GetConfigDescriptor() function in enum.c does not always work
+ // If that fails, the Configuration descriptor will be NULL
+ // and we can only display the device descriptor
+ //
+ if (NULL == info)
+ {
+ return 0;
+ }
+ if (NULL == info->ConfigDesc)
+ {
+ return 0;
+ }
+ ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1);
+ if (NULL == ConfigDesc)
+ {
+ return 0;
+ }
+
+ // We've got a good Configuration Descriptor
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+
+ // walk through all the descriptors looking for the VIDEO_CONTROL_HEADER_UNIT
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ if ((commonDesc->bDescriptorType == CS_INTERFACE) &&
+ (commonDesc->bLength > sizeof(VIDEO_CONTROL_HEADER_UNIT)))
+ {
+ // Right type, size. Now check subtype
+ PVIDEO_CONTROL_HEADER_UNIT pCSVC = NULL;
+ pCSVC = (PVIDEO_CONTROL_HEADER_UNIT) commonDesc;
+ if (VC_HEADER == pCSVC->bDescriptorSubtype)
+ {
+ // found the Class-specific VC Interface Header descriptor
+ uUVCversion = pCSVC->bcdVideoSpec;
+ // Save the version to global
+ g_chUVCversion = uUVCversion;
+ // We're done
+ break;
+ }
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uUVCversion);
+}
+
+/*****************************************************************************
+
+IsIADDevice()
+
+*****************************************************************************/
+
+UINT
+IsIADDevice (
+ PUSBDEVICEINFO info
+ )
+{
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc = NULL;
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ PUCHAR descEnd = NULL;
+ UINT uIADcount = 0;
+
+ //
+ // The GetConfigDescriptor() function in enum.c does not always work
+ // If that fails, the Configuration descriptor will be NULL
+ // and we can only display the device descriptor
+ //
+ if (NULL == info)
+ {
+ return 0;
+ }
+ if (NULL == info->ConfigDesc)
+ {
+ return 0;
+ }
+
+ ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1);
+ if (NULL != ConfigDesc)
+ {
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+ }
+
+ // return total number of IAD descriptors in this device configuration
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ if (commonDesc->bDescriptorType == USB_IAD_DESCRIPTOR_TYPE)
+ {
+ uIADcount++;
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uIADcount);
+}
+
+/*****************************************************************************
+
+DisplayIADDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayIADDescriptor (
+ PUSB_IAD_DESCRIPTOR IADDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ int nInterfaces,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ AppendTextBuffer("\r\n ===>IAD Descriptor<===\r\n");
+
+ //length checked in DisplayConfigDesc()
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ IADDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ IADDesc->bDescriptorType);
+ AppendTextBuffer("bFirstInterface: 0x%02X\r\n",
+ IADDesc->bFirstInterface);
+ AppendTextBuffer("bInterfaceCount: 0x%02X\r\n",
+ IADDesc->bInterfaceCount);
+ if (IADDesc->bInterfaceCount == 1)
+ {
+ //@@TestCase A7.1
+ //@@Priority 1
+ //@@Standard IAD Descriptor Field - bInterfaceCount
+ //@@The number of interfaces must be greater than 1
+ AppendTextBuffer("*!*ERROR: bInterfaceCount must be greater than 1 \r\n");
+ OOPS();
+ }
+ if (nInterfaces < IADDesc->bFirstInterface + IADDesc->bInterfaceCount)
+ {
+ //@@TestCase A7.2
+ //@@Priority 1
+ //@@Standard IAD Descriptor Field - bInterfaceCount
+ //@@The total number of interfaces must be greater than or equal to
+ //@@ the highest linked interface number (base interface number plus count)
+ AppendTextBuffer("*!*ERROR: The total number of interfaces (%d) must be greater "\
+ "than or equal to\r\n",
+ nInterfaces);
+ AppendTextBuffer(" the highest linked interface number (base %d + "\
+ "count %d = %d)\r\n",
+ IADDesc->bFirstInterface, IADDesc->bInterfaceCount,
+ (IADDesc->bFirstInterface + IADDesc->bInterfaceCount));
+ OOPS();
+ }
+ AppendTextBuffer("bFunctionClass: 0x%02X",
+ IADDesc->bFunctionClass);
+ if (IADDesc->bFunctionClass == 0)
+ {
+ //@@TestCase A7.3
+ //@@Priority 1
+ //@@Standard IAD Descriptor Field - bFunctionClass
+ //@@"A value of zero is not allowed in this descriptor"
+ AppendTextBuffer("\r\n*!*ERROR: bFunctionClass contains an illegal value 0 \r\n");
+ OOPS();
+ }
+
+ switch (IADDesc->bFunctionClass)
+ {
+ case USB_DEVICE_CLASS_AUDIO:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Audio Interface Class\r\n");
+ }
+
+ AppendTextBuffer("bFunctionSubClass: 0x%02X",
+ IADDesc->bFunctionSubClass);
+
+ if(gDoAnnotation)
+ {
+ switch (IADDesc->bFunctionSubClass)
+ {
+ case USB_AUDIO_SUBCLASS_AUDIOCONTROL:
+ AppendTextBuffer(" -> Audio Control Interface SubClass\r\n");
+ break;
+
+ case USB_AUDIO_SUBCLASS_AUDIOSTREAMING:
+ AppendTextBuffer(" -> Audio Streaming Interface SubClass\r\n");
+ break;
+
+ case USB_AUDIO_SUBCLASS_MIDISTREAMING:
+ AppendTextBuffer(" -> MIDI Streaming Interface SubClass\r\n");
+ break;
+
+ default:
+ //@@TestCase A7.4
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionSubClass
+ //@@Invalid bFunctionSubClass
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid bFunctionSubClass\r\n");
+ OOPS();
+ break;
+ }
+ }
+ break;
+
+ case USB_DEVICE_CLASS_VIDEO:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Video Interface Class\r\n");
+ }
+
+ AppendTextBuffer("bFunctionSubClass: 0x%02X",
+ IADDesc->bFunctionSubClass);
+
+ switch(IADDesc->bFunctionSubClass)
+ {
+ case SC_VIDEO_INTERFACE_COLLECTION:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Video Interface Collection\r\n");
+ }
+ break;
+
+ default:
+ //@@TestCase A7.5
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionSubClass
+ //@@Invalid bFunctionSubClass
+ AppendTextBuffer("\r\n*!*ERROR: This should be USB_VIDEO_SC_VIDEO_INTERFACE_COLLECTION %d\r\n",
+ SC_VIDEO_INTERFACE_COLLECTION);
+ OOPS();
+ break;
+ }
+ break;
+
+ case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> HID Interface Class\r\n");
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_HUB:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> HUB Interface Class\r\n");
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_RESERVED:
+ //@@TestCase A7.6
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionClass
+ //@@A reserved USB Device Interface Class has been defined
+ AppendTextBuffer("\r\n*!*CAUTION: %d is a Reserved USB Device Interface Class\r\n",
+ USB_DEVICE_CLASS_RESERVED);
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_COMMUNICATIONS:
+ AppendTextBuffer(" -> This is Communications (CDC Control) USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_MONITOR:
+ AppendTextBuffer(" -> This is a Monitor USB Device Interface Class*** (This may be obsolete)\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+ AppendTextBuffer(" -> This is a Physical Interface USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_POWER:
+ if(IADDesc->bFunctionSubClass == 1 && IADDesc->bFunctionProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is an Image USB Device Interface Class\r\n");
+ }
+ else
+ {
+ AppendTextBuffer(" -> This is a Power USB Device Interface Class (This may be obsolete)\r\n");
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_PRINTER:
+ AppendTextBuffer(" -> This is a Printer USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DEVICE_CLASS_STORAGE:
+ AppendTextBuffer(" -> This is a Mass Storage USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_CDC_DATA_INTERFACE:
+ AppendTextBuffer(" -> This is a CDC Data USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_CHIP_SMART_CARD_INTERFACE:
+ AppendTextBuffer(" -> This is a Chip/Smart Card USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_CONTENT_SECURITY_INTERFACE:
+ AppendTextBuffer(" -> This is a Content Security USB Device Interface Class\r\n");
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE_INTERFACE:
+ if(IADDesc->bFunctionSubClass == 1 && IADDesc->bFunctionProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Reprogrammable USB2 Compliance Diagnostic Device USB Device\r\n");
+ }
+ else
+ {
+ //@@TestCase A7.7
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_WIRELESS_CONTROLLER_INTERFACE:
+ if(IADDesc->bFunctionSubClass == 1 && IADDesc->bFunctionProtocol == 1)
+ {
+ AppendTextBuffer(" -> This is a Wireless RF Controller USB Device Interface Class with Bluetooth Programming Interface\r\n");
+ }
+ else
+ {
+ //@@TestCase A7.8
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ case USB_APPLICATION_SPECIFIC_INTERFACE:
+ AppendTextBuffer(" -> This is an Application Specific USB Device Interface Class\r\n");
+
+ switch(IADDesc->bFunctionSubClass)
+ {
+ case 1:
+ AppendTextBuffer(" -> This is a Device Firmware Application Specific USB Device Interface Class\r\n");
+ break;
+ case 2:
+ AppendTextBuffer(" -> This is an IrDA Bridge Application Specific USB Device Interface Class\r\n");
+ break;
+ case 3:
+ AppendTextBuffer(" -> This is a Test & Measurement Class (USBTMC) Application Specific USB Device Interface Class\r\n");
+ break;
+ default:
+ //@@TestCase A7.9
+ //@@CAUTION
+ //@@Descriptor Field - bFunctionClass
+ //@@Invalid Interface Class
+ AppendTextBuffer("\r\n*!*CAUTION: This appears to be an invalid Interface Class\r\n");
+ OOPS();
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+
+ default:
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Interface Class Unknown to USBView\r\n");
+ }
+ AppendTextBuffer("bFunctionSubClass: 0x%02X\r\n",
+ IADDesc->bFunctionSubClass);
+ break;
+ }
+
+ AppendTextBuffer("bFunctionProtocol: 0x%02X",
+ IADDesc->bFunctionProtocol);
+
+ // check protocol for our class
+ if ((IADDesc->bFunctionClass == USB_DEVICE_CLASS_VIDEO))
+ {
+ // USB Video Class
+ if(IADDesc->bFunctionProtocol == PC_PROTOCOL_UNDEFINED)
+ {
+ // correct protocol for UVC
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> PC_PROTOCOL_UNDEFINED protocol\r\n");
+ } else {
+ AppendTextBuffer("\r\n");
+ }
+ } else {
+ // incorrect protocol for UVC
+ //@@TestCase A7.10
+ //@@WARNING
+ //@@Descriptor Field - iInterface
+ //@@bFunctionProtocol must be set to PC_PROTOCOL_UNDEFINED
+ AppendTextBuffer("*!*WARNING: must be set to PC_PROTOCOL_UNDEFINED %d for this class\r\n",
+ PC_PROTOCOL_UNDEFINED);
+ OOPS();
+ }
+ } else {
+ AppendTextBuffer("\r\n");
+ }
+
+ AppendTextBuffer("iFunction: 0x%02X\r\n",
+ IADDesc->iFunction);
+
+ if(gDoAnnotation)
+ {
+ if (IADDesc->iFunction)
+ {
+ DisplayStringDescriptor(IADDesc->iFunction,
+ StringDescs,
+ LatestDevicePowerState);
+ }
+ }
+}
+
+/*****************************************************************************
+
+GetConfigurationSize()
+
+*****************************************************************************/
+
+UINT
+GetConfigurationSize (
+ PUSBDEVICEINFO info
+ )
+{
+ PUSB_CONFIGURATION_DESCRIPTOR
+ ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1);
+ PUSB_COMMON_DESCRIPTOR
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+ PUCHAR
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+ UINT uCount = 0;
+
+ // return this device configuration's total sum of descriptor lengths
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ uCount += commonDesc->bLength;
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uCount);
+}
+
+/*****************************************************************************
+
+GetInterfaceCount()
+
+*****************************************************************************/
+
+UINT
+GetInterfaceCount (
+ PUSBDEVICEINFO info
+ )
+{
+ // how do we handle composite devices?
+ PUSB_CONFIGURATION_DESCRIPTOR
+ ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1);
+ PUSB_COMMON_DESCRIPTOR
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+ PUCHAR
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+ UINT uCount = 0;
+
+ // return this device configuration's total number of interface descriptors
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ if (commonDesc->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE)
+ {
+ uCount++;
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uCount);
+}
+
+
+/*****************************************************************************
+
+DisplayUSEnglishStringDescriptor()
+
+*****************************************************************************/
+
+VOID
+DisplayUSEnglishStringDescriptor (
+ UCHAR Index,
+ PSTRING_DESCRIPTOR_NODE USStringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ ULONG nBytes = 0;
+ BOOLEAN FoundMatchingString = FALSE;
+ CHAR pString[512];
+
+ //@@DisplayUSEnglishStringDescriptor - String Descriptor
+ for (; USStringDescs; USStringDescs = USStringDescs->Next)
+ {
+ if (USStringDescs->DescriptorIndex == Index && USStringDescs->LanguageID == 0x0409)
+ {
+ FoundMatchingString = TRUE;
+
+ AppendTextBuffer("English product name: \"");
+ memset(pString, 0, 512);
+ nBytes = WideCharToMultiByte(
+ CP_ACP, // CodePage
+ WC_NO_BEST_FIT_CHARS,
+ USStringDescs->StringDescriptor->bString,
+ (USStringDescs->StringDescriptor->bLength - 2) / 2,
+ pString,
+ 512,
+ NULL, // lpDefaultChar
+ NULL); // pUsedDefaultChar
+ if (nBytes)
+ AppendTextBuffer("%s\"\r\n", pString);
+ else
+ AppendTextBuffer("\"\r\n", pString);
+ return;
+ }
+ }
+
+ //@@TestCase A8.1
+ //@@WARNING
+ //@@Descriptor Field - string index
+ //@@No support for english
+ if (!FoundMatchingString)
+ {
+ if (LatestDevicePowerState == PowerDeviceD0)
+ {
+ AppendTextBuffer("*!*ERROR: No String Descriptor for index %d!\r\n", Index);
+ OOPS();
+ }
+ else
+ {
+ AppendTextBuffer("String Descriptor for index %d not available while device is in low power state.\r\n", Index);
+ }
+ }
+ else
+ {
+ AppendTextBuffer("*!*ERROR: The index selected does not support English(US)\r\n");
+ OOPS();
+ }
+ return;
+
+}
+
+
+/*****************************************************************************
+
+DisplayStringDescriptor()
+
+*****************************************************************************/
+VOID
+DisplayStringDescriptor (
+ UCHAR Index,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ ULONG nBytes = 0;
+ BOOLEAN FoundMatchingString = FALSE;
+ PCHAR pStr = NULL;
+ CHAR pString[512];
+
+ //@@DisplayStringDescriptor - String Descriptor
+
+ while (StringDescs)
+ {
+ if (StringDescs->DescriptorIndex == Index)
+ {
+ FoundMatchingString = TRUE;
+ if(gDoAnnotation)
+ {
+ pStr= GetLangIDString(StringDescs->LanguageID);
+ if(pStr)
+ {
+ AppendTextBuffer(" %s \"",
+ pStr);
+ }
+ else
+ {
+ //@@TestCase A9.1
+ //@@WARNING
+ //@@Descriptor Field - string index
+ //@@The Language ID does not match any known languages supported by USB ORG
+ AppendTextBuffer("*!*WARNING: %d is an invalid Language ID\r\n",
+ Index);
+ OOPS();
+ }
+ }
+ else
+ {
+ AppendTextBuffer(" 0x%04X: \"", StringDescs->LanguageID);
+ }
+ memset(pString, 0, 512);
+
+ if (StringDescs->StringDescriptor->bLength > sizeof(USHORT))
+ {
+ nBytes = WideCharToMultiByte(
+ CP_ACP, // CodePage
+ WC_NO_BEST_FIT_CHARS,
+ StringDescs->StringDescriptor->bString,
+ (StringDescs->StringDescriptor->bLength - 2) / 2,
+ pString,
+ 512,
+ NULL, // lpDefaultChar
+ NULL); // pUsedDefaultChar
+ if (nBytes)
+ {
+ AppendTextBuffer("%s\"\r\n", pString);
+ }
+ else
+ {
+ AppendTextBuffer("\"\r\n");
+ }
+ }
+ else
+ {
+ //
+ // This is NULL string which is invalid
+ //
+ AppendTextBuffer("\"\r\n");
+ }
+ }
+ StringDescs = StringDescs->Next;
+ }
+
+ if (!FoundMatchingString)
+ {
+ if (LatestDevicePowerState == PowerDeviceD0)
+ {
+ AppendTextBuffer("*!*ERROR: No String Descriptor for index %d!\r\n", Index);
+ OOPS();
+ }
+ else
+ {
+ AppendTextBuffer("String Descriptor for index %d not available while device is in low power state.\r\n", Index);
+ }
+ }
+}
+
+/*****************************************************************************
+
+DisplayUnknownDescriptor()
+
+*****************************************************************************/
+VOID
+DisplayUnknownDescriptor (
+ PUSB_COMMON_DESCRIPTOR CommonDesc
+ )
+{
+ AppendTextBuffer("\r\n ===>Descriptor Hex Dump<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n",
+ CommonDesc->bLength);
+
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n",
+ CommonDesc->bDescriptorType);
+
+ DisplayRemainingUnknownDescriptor((PUCHAR)CommonDesc, 0, CommonDesc->bLength);
+}
+
+VOID
+DisplayRemainingUnknownDescriptor(
+ PUCHAR DescriptorData,
+ ULONG Start,
+ ULONG Stop
+ )
+{
+ ULONG i;
+
+ for (i = Start; i < Stop; i++)
+ {
+ AppendTextBuffer("%02X ",
+ DescriptorData[i]);
+
+ if (i % 16 == 15)
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+
+ if (i % 16 != 0)
+ {
+ AppendTextBuffer("\r\n");
+ }
+}
+
+
+
+/*****************************************************************************
+
+GetVendorString()
+
+idVendor - USB Vendor ID
+
+Return Value - Vendor name string associated with idVendor, or NULL if
+no vendor name string is found which is associated with idVendor.
+
+*****************************************************************************/
+
+PCHAR
+GetVendorString (
+ USHORT idVendor
+ )
+{
+ PVENDOR_ID vendorID = NULL;
+
+ if (idVendor == 0x0000)
+ {
+ return NULL;
+ }
+
+ vendorID = USBVendorIDs;
+
+ while (vendorID->usVendorID != 0x0000)
+ {
+ if (vendorID->usVendorID == idVendor)
+ {
+ break;
+ }
+ vendorID++;
+ }
+
+ return (vendorID->szVendor);
+}
+
+/*****************************************************************************
+
+GetLangIDString()
+
+idVendor - USB Vendor ID
+
+Return Value - Vendor name string associated with idVendor, or NULL if
+no vendor name string is found which is associated with idVendor.
+
+*****************************************************************************/
+
+PCHAR
+GetLangIDString (
+ USHORT idLang
+ )
+{
+ PUSBLANGID langID = NULL;
+
+ if (idLang != 0x0000)
+ {
+ langID = USBLangIDs;
+
+ while (langID->usLangID != 0x0000)
+ {
+ if (langID->usLangID == idLang)
+ {
+ return (langID->szLanguage);
+ }
+ langID++;
+ }
+ }
+
+ return NULL;
+}
+
+/*****************************************************************************
+
+GetStringFromList()
+
+PSTRINGLIST slList, - pointer to STRINGLIST used
+
+ULONG ulNumElements, -
+ number of elements in that STRINGLIST calc before call with sizeof(slList) / sizeof(STRINGLIST),
+ULONG or ULONGLONG (if H264_SUPPORT is defined)ulFlag - - flag to look for
+PCHAR szDefault - string to return if no match
+
+Return a string associated with a value from a stringtable.
+
+example:
+ GetStringFromList(slPowerState,
+ sizeof(slPowerState) / sizeof(STRINGLIST),
+ pUPI->SystemState,
+ "Invalid Power State")
+
+*****************************************************************************/
+
+PCHAR
+GetStringFromList(
+ PSTRINGLIST slList,
+ ULONG ulNumElements,
+#ifdef H264_SUPPORT
+ ULONGLONG ulFlag,
+#else
+ ULONG ulFlag,
+#endif
+ _In_ PCHAR szDefault
+ )
+{
+ // ulIndex is zero based, but ulNumElements is 1 based
+ // subtract 1 from ulNumElements so that are same base
+#ifdef H264_SUPPORT
+ ULONGLONG ulIndex = 0;
+#else
+ ULONG ulIndex = 0;
+#endif
+ ulNumElements--;
+
+
+ for ( ; ulIndex <= ulNumElements; ulIndex++)
+ {
+ if (ulFlag == slList[ulIndex].ulFlag)
+ {
+ return (slList[ulIndex].pszString);
+ }
+ }
+
+ return szDefault;
+}
+
diff --git a/tests/projects/winsdk/usbview/dispvid.c b/tests/projects/winsdk/usbview/dispvid.c new file mode 100644 index 000000000..537309721 --- /dev/null +++ b/tests/projects/winsdk/usbview/dispvid.c @@ -0,0 +1,5649 @@ +/*++
+
+Copyright (c) 2002-2008 Microsoft Corporation
+
+Module Name:
+
+DISPVID.C
+
+Abstract:
+
+This source file contains routines which update the edit control
+to display information about USB Video descriptors.
+
+Environment:
+
+user mode
+
+Revision History:
+
+11-22-2002 : created
+03-28-2003 : major revisions from latest specs.
+03-28-2008 : include USB Video Class 1.1
+
+--*/
+
+//*****************************************************************************
+// I N C L U D E S
+//*****************************************************************************
+
+#include "uvcview.h"
+#include "h264.h"
+
+//*****************************************************************************
+// G L O B A L S P R I V A T E T O T H I S F I L E
+//*****************************************************************************
+
+int StillMethod = 0;
+
+//
+// USB Device Class Definition for Video Devices 0.8b version
+//
+// 3.6.2.3 Camera Terminal Descriptor
+//
+STRINGLIST slCameraControl1 [] =
+{
+ {1, "Scanning Mode", ""},
+ {2, "Auto-Exposure Mode", ""},
+ {4, "Auto-Exposure Priority", ""},
+ {8, "Exposure Time (Absolute)", ""},
+ {0x10, "Exposure Time (Relative)", ""},
+ {0x20, "Focus (Absolute)", ""},
+ {0x40, "Focus (Relative)", ""},
+ {0x80, "Iris (Absolute)", ""},
+};
+STRINGLIST slCameraControl2 [] =
+{
+ {1, "Iris (Relative)", ""},
+ {2, "Zoom (Absolute)", ""},
+ {4, "Zoom (Relative)", ""},
+ {8, "PanTilt (Absolute)", ""},
+ {0x10, "PanTilt (Relative)", ""},
+ {0x20, "Roll (Absolute)", ""},
+ {0x40, "Roll (Relative)", ""},
+ {0x80, "Reserved", ""},
+};
+STRINGLIST slCameraControl3 [] =
+{
+ {1, "Reserved", ""},
+ {2, "Focus, Auto", ""},
+ {4, "Privacy", ""},
+ {8, "Focus, Simple", ""},
+ {0x10, "Window", ""},
+ {0x20, "Region of Interest", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+// 3.6.2.5 Processing Unit Descriptor
+//
+STRINGLIST slProcessorControls1 [] =
+{
+ {1, "Brightness", ""},
+ {2, "Contrast", ""},
+ {4, "Hue", ""},
+ {8, "Saturation", ""},
+ {0x10, "Sharpness", ""},
+ {0x20, "Gamma", ""},
+ {0x40, "White Balance Temperature", ""},
+ {0x80, "White Balance Component", ""},
+};
+STRINGLIST slProcessorControls2 [] =
+{
+ {1, "Backlight Compensation", ""},
+ {2, "Gain", ""},
+ {4, "Power Line Frequency", ""},
+ {8, "Hue, Auto", ""},
+ {0x10, "White Balance Temperature, Auto", ""},
+ {0x20, "White Balance Component, Auto", ""},
+ {0x40, "Digital Multiplier", ""},
+ {0x80, "Digital Multiplier Limit", ""},
+};
+STRINGLIST slProcessorControls3 [] =
+{
+ {1, "Analog Video Standard", ""},
+ {2, "Analog Video Lock Status", ""},
+ {4, "Contrast, Auto", ""},
+ {8, "Reserved", ""},
+ {0x10, "Reserved", ""},
+ {0x20, "Reserved", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+
+STRINGLIST slProcessorVideoStandards [] =
+{
+ {1, "None", ""},
+ {2, "NTSC - 525/60", ""},
+ {4, "PAL - 625/50", ""},
+ {8, "SECAM - 625/50", ""},
+ {0x10, "NTSC - 625/50", ""},
+ {0x20, "PAL - 525/60", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+// 3.8.2.1 Input Header Descriptor
+//
+STRINGLIST slInputHeaderControls[]=
+{
+ {1, "Key Frame Rate" , ""},
+ {2, "P Frame Rate" , ""},
+ {4, "Compression Quality" , ""},
+ {8, "Compression Window Size", ""},
+ {0x10, "Generate Key Frame" , ""},
+ {0x20, "Update Frame Segment" , ""},
+ {0x40, "Reserved" , ""},
+ {0x80, "Reserved" , ""},
+};
+
+STRINGLIST slOutputHeaderControls[]=
+{
+ {1, "Key Frame Rate" , ""},
+ {2, "P Frame Rate" , ""},
+ {4, "Compression Quality" , ""},
+ {8, "Compression Window Size", ""},
+ {0x10, "Reserved" , ""},
+ {0x20, "Reserved" , ""},
+ {0x40, "Reserved" , ""},
+ {0x80, "Reserved" , ""},
+};
+
+STRINGLIST slMediaTransportControls[]=
+{
+ {1, "Transport Control" , ""},
+ {2, "Absolute Track Number Control", ""},
+ {4, "Media Information" , ""},
+ {8, "Time Code Information" , ""},
+ {0x10, "Reserved" , ""},
+ {0x20, "Reserved" , ""},
+ {0x40, "Reserved" , ""},
+ {0x80, "Reserved" , ""},
+};
+
+STRINGLIST slMediaTransportModes1[]=
+{
+ {1, "Play Forward", ""},
+ {2, "Pause", ""},
+ {4, "Rewind", ""},
+ {8, "Fast Forward", ""},
+ {0x10, "High Speed Rewind", ""},
+ {0x20, "Stop", ""},
+ {0x40, "Eject", ""},
+ {0x80, "Play Next Frame", ""},
+};
+
+STRINGLIST slMediaTransportModes2[]=
+{
+ {1, "Play Slowest Forward", ""},
+ {2, "Play Slow Forward 4", ""},
+ {4, "Play Slow Forward 3", ""},
+ {8, "Play Slow Forward 2", ""},
+ {0x10, "Play Slow Forward 1", ""},
+ {0x20, "Play X1", ""},
+ {0x40, "Play Fast Forward 1", ""},
+ {0x80, "Play Fast Forward 2", ""},
+};
+
+STRINGLIST slMediaTransportModes3[]=
+{
+ {1, "Play Fast Forward 3", ""},
+ {2, "Play Fast Forward 4", ""},
+ {4, "Play Fastest Forward", ""},
+ {8, "Play Previous Frame", ""},
+ {0x10, "Play Slowest Reverse", ""},
+ {0x20, "Play Slow Reverse 4", ""},
+ {0x40, "Play Slow Reverse 3", ""},
+ {0x80, "Play Slow Reverse 2", ""},
+};
+
+STRINGLIST slMediaTransportModes4[]=
+{
+ {1, "Play Slow Reverse 1", ""},
+ {2, "Play X1 Reverse", ""},
+ {4, "Play Fast Reverse 1", ""},
+ {8, "Play Fast Reverse 2", ""},
+ {0x10, "Play Fast Reverse 3", ""},
+ {0x20, "Play Fast Reverse 4", ""},
+ {0x40, "Play Fastest Reverse", ""},
+ {0x80, "Record StateStart", ""},
+};
+
+STRINGLIST slMediaTransportModes5[]=
+{
+ {1, "Record Pause", ""},
+ {2, "Reserved", ""},
+ {4, "Reserved", ""},
+ {8, "Reserved", ""},
+ {0x10, "Reserved", ""},
+ {0x20, "Reserved", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+STRINGLIST slInputTermTypes[]=
+{
+ {0x0100, "TT_VENDOR_SPECIFIC", "I//O"},
+ {0x0101, "TT_STREAMING", "I//O"},
+ {0x0400, "EXTERNAL_VENDOR_SPECIFIC", "I//O"},
+ {0x0401, "COMPOSITE_CONNECTOR", "I//O"},
+ {0x0402, "SVIDEO_CONNECTOR", "I//O"},
+ {0x0403, "COMPONENT_CONNECTOR", "I//O"},
+ {0x0200, "ITT_VENDOR_SPECIFIC", "I"},
+ {0x0201, "ITT_CAMERA", "I"},
+ {0x0202, "ITT_MEDIA_TRANSPORT_INPUT", "I"},
+};
+STRINGLIST slOutputTermTypes[]=
+{
+ {0x0100, "TT_VENDOR_SPECIFIC", "I//O"},
+ {0x0101, "TT_STREAMING", "I//O"},
+ {0x0400, "EXTERNAL_VENDOR_SPECIFIC", "I//O"},
+ {0x0401, "COMPOSITE_CONNECTOR", "I//O"},
+ {0x0402, "SVIDEO_CONNECTOR", "I//O"},
+ {0x0403, "COMPONENT_CONNECTOR", "I//O"},
+ {0x0300, "OTT_VENDOR_SPECIFIC", "O"},
+ {0x0301, "OTT_DISPLAY", "O"},
+ {0x0302, "OTT_MEDIA_TRANSPORT_OUTPUT", "O"},
+};
+
+//*****************************************************************************
+// L O C A L F U N C T I O N P R O T O T Y P E S
+//*****************************************************************************
+
+BOOL
+DisplayVCHeader (
+ PVIDEO_CONTROL_HEADER_UNIT VCInterfaceDesc
+ );
+BOOL
+DisplayVCInputTerminal (
+ PVIDEO_INPUT_TERMINAL VidITDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+BOOL
+DisplayVCOutputTerminal (
+ PVIDEO_OUTPUT_TERMINAL VidOTDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+BOOL
+DisplayVCCameraTerminal (
+ PVIDEO_CAMERA_TERMINAL CameraDesc
+ );
+BOOL
+DisplayVCMediaTransInputTerminal (
+ PVIDEO_INPUT_MTT VCMedTransInDesc
+ );
+BOOL
+DisplayVCMediaTransOutputTerminal (
+ PVIDEO_OUTPUT_MTT VCMedTransOutDesc
+ );
+BOOL
+DisplayVCSelectorUnit (
+ PVIDEO_SELECTOR_UNIT VidSelectorDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+BOOL
+DisplayVCProcessingUnit (
+ PVIDEO_PROCESSING_UNIT VidProcessingDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+BOOL
+DisplayVCExtensionUnit (
+ PVIDEO_EXTENSION_UNIT VidExtensionDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+BOOL
+DisplayVidInHeader (
+ PVIDEO_STREAMING_INPUT_HEADER VidInHeaderDesc
+ );
+BOOL
+DisplayVidOutHeader (
+ PVIDEO_STREAMING_OUTPUT_HEADER VidOutHeaderDesc
+ );
+BOOL
+DisplayStillImageFrame (
+ PVIDEO_STILL_IMAGE_FRAME StillFrameDesc
+ );
+BOOL
+DisplayColorMatching (
+ PVIDEO_COLORFORMAT ColorMatchDesc
+ );
+BOOL
+DisplayUncompressedFormat (
+ PVIDEO_FORMAT_UNCOMPRESSED UnCompFormatDesc
+ );
+BOOL
+DisplayUncompressedFrameType (
+ PVIDEO_FRAME_UNCOMPRESSED UnCompFrameDesc
+ );
+BOOL
+DisplayUnComContinuousFrameType(
+ PVIDEO_FRAME_UNCOMPRESSED UContinuousDesc
+ );
+BOOL
+DisplayUnComDiscreteFrameType(
+ PVIDEO_FRAME_UNCOMPRESSED UDiscreteDesc
+ );
+BOOL
+DisplayMJPEGFormat (
+ PVIDEO_FORMAT_MJPEG MJPEGFormatDesc
+ );
+BOOL
+DisplayMJPEGFrameType (
+ PVIDEO_FRAME_MJPEG MJPEGFrameDesc
+ );
+BOOL
+DisplayMJPEGContinuousFrameType(
+ PVIDEO_FRAME_MJPEG MContinuousDesc
+ );
+BOOL
+DisplayMJPEGDiscreteFrameType(
+ PVIDEO_FRAME_MJPEG MDiscreteDesc
+ );
+BOOL
+DisplayMPEG1SSFormat (
+ PVIDEO_FORMAT_MPEG1SS MPEG1SSFormatDesc
+ );
+BOOL
+DisplayMPEG2PSFormat (
+ PVIDEO_FORMAT_MPEG2PS MPEG2PSFormatDesc
+ );
+BOOL
+DisplayMPEG2TSFormat (
+ PVIDEO_FORMAT_MPEG2TS MPEG2TSFormatDesc
+ );
+BOOL
+DisplayMPEG4SLFormat (
+ PVIDEO_FORMAT_MPEG4SL MPEG4SLFormatDesc
+ );
+BOOL
+DisplayDVFormat (
+ PVIDEO_FORMAT_DV DVFormatDesc
+ );
+BOOL
+DisplayVendorVidFormat (
+ PVIDEO_FORMAT_VENDOR VendorVidFormatDesc
+ );
+BOOL
+DisplayVendorVidFrameType (
+ PVIDEO_FRAME_VENDOR VendorVidFrameDesc
+ );
+BOOL
+DisplayVendorVidContinuousFrameType(
+ PVIDEO_FRAME_VENDOR VContinuousDesc
+ );
+BOOL
+DisplayVendorVidDiscreteFrameType(
+ PVIDEO_FRAME_VENDOR VDiscreteDesc
+ );
+BOOL
+DisplayFramePayloadFormat(
+ PVIDEO_FORMAT_FRAME FramePayloadFormatDesc
+ );
+BOOL
+DisplayFramePayloadFrame(
+ PVIDEO_FRAME_FRAME FramePayloadFrameDesc
+ );
+BOOL
+DisplayFramePayloadContinuousFrameType(
+ PVIDEO_FRAME_FRAME FContinuousDesc
+ );
+BOOL
+DisplayFramePayloadDiscreteFrameType(
+ PVIDEO_FRAME_FRAME FDiscreteDesc
+ );
+BOOL
+DisplayStreamPayload(
+ PVIDEO_FORMAT_STREAM StreamPayloadDesc
+ );
+BOOL
+DisplayVSEndpoint (
+ PVIDEO_CS_INTERRUPT VidEndpointDesc
+ );
+VOID
+VDisplayBytes (
+ PUCHAR Data,
+ USHORT Len
+ );
+PCHAR
+VidFormatGUIDCodeToName (
+ REFGUID VidFormatGUIDCode
+ );
+UINT
+GetVCInterfaceSize (
+ PVIDEO_CONTROL_HEADER_UNIT VCInterfaceDesc
+ );
+UINT
+CheckForColorMatchingDesc (
+ PVIDEO_SPECIFIC FormatDesc,
+ UCHAR bNumFrameDescriptors,
+ UCHAR bDescriptorSubtype
+ );
+UINT
+GetVSInterfaceSize (
+ PUSB_COMMON_DESCRIPTOR VidInHeaderDesc,
+ USHORT wTotalLength
+ );
+BOOL
+ValidateTerminalID(
+ UINT uTerminalID
+ );
+VOID
+VDisplayDescString (
+ UINT uControlSize,
+ PUCHAR pControl ,
+ PSTRINGLIST pslControl
+ );
+
+//*****************************************************************************
+// L O C A L F U N C T I O N S
+//*****************************************************************************
+
+//*****************************************************************************
+//
+// DisplayVideoDescriptor() UPDATED
+//
+// VidCommonDesc - An Video Class Descriptor
+//
+// bInterfaceSubClass - The SubClass of the Interface containing the descriptor
+//
+//*****************************************************************************
+
+BOOL
+DisplayVideoDescriptor (
+ PVIDEO_SPECIFIC VidCommonDesc,
+ UCHAR bInterfaceSubClass,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVideoDescriptor -Class-Specific Video Descriptor
+ switch (VidCommonDesc->bDescriptorType)
+ {
+ case CS_INTERFACE:
+ //@@DisplayVideoDescriptor -Class-Specific Video Interface Descriptor
+ switch (bInterfaceSubClass)
+ {
+ case VIDEO_SUBCLASS_CONTROL:
+ //@@DisplayVideoDescriptor -Class-Specific Video Control Interface Descriptor
+ switch (VidCommonDesc->bDescriptorSubtype)
+ {
+ case VC_HEADER:
+ return DisplayVCHeader(
+ (PVIDEO_CONTROL_HEADER_UNIT)VidCommonDesc);
+
+ case INPUT_TERMINAL:
+ return DisplayVCInputTerminal(
+ (PVIDEO_INPUT_TERMINAL)VidCommonDesc,
+ StringDescs,
+ LatestDevicePowerState);
+
+ case OUTPUT_TERMINAL:
+ return DisplayVCOutputTerminal(
+ (PVIDEO_OUTPUT_TERMINAL)VidCommonDesc,
+ StringDescs,
+ LatestDevicePowerState);
+
+ case SELECTOR_UNIT:
+ return DisplayVCSelectorUnit(
+ (PVIDEO_SELECTOR_UNIT)VidCommonDesc,
+ StringDescs,
+ LatestDevicePowerState);
+
+ case PROCESSING_UNIT:
+ return DisplayVCProcessingUnit(
+ (PVIDEO_PROCESSING_UNIT)VidCommonDesc,
+ StringDescs,
+ LatestDevicePowerState);
+
+ case EXTENSION_UNIT:
+ return DisplayVCExtensionUnit(
+ (PVIDEO_EXTENSION_UNIT)VidCommonDesc,
+ StringDescs,
+ LatestDevicePowerState);
+
+#ifdef H264_SUPPORT
+ case H264_ENCODING_UNIT:
+ return DisplayVCH264EncodingUnit(
+ (PVIDEO_ENCODING_UNIT)VidCommonDesc
+ );
+
+#endif
+
+#ifdef H264_SUPPORT
+ case MAX_TYPE_UNIT+1:
+ // for H.264, the bDescriptorSubtype = 7, which is equal to MAX_TYPE_UNIT
+ // so now MAX_TYPE_UNIT needs to be set to 8
+ //(TODO: need to change nt\sdpublic\internal\drivers\inc\uvcdesc.h's define
+ // of MAX_TYPE_UNIT from7 to 8, and ad the type for H.264 = 8)
+#else
+ case MAX_TYPE_UNIT:
+#endif
+ //@@TestCase B1.1
+ //@@CAUTION
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@An undefined descriptor subtype has been defined
+ AppendTextBuffer("*!*CAUTION: This is an undefined class specific "\
+ "Video Control bDescriptorSubtype\r\n");
+ break;
+
+ default:
+ //@@TestCase B1.2
+ //@@ERROR
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@An unknown descriptor subtype has been defined
+ AppendTextBuffer("*!*ERROR: unknown bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ break;
+
+ case VIDEO_SUBCLASS_STREAMING:
+ //@@DisplayVideoDescriptor -Class-Specific Video Streaming Interface Descriptor
+ switch (VidCommonDesc->bDescriptorSubtype)
+ {
+ case VS_INPUT_HEADER:
+ return DisplayVidInHeader(
+ (PVIDEO_STREAMING_INPUT_HEADER)VidCommonDesc);
+
+ case VS_OUTPUT_HEADER:
+ return DisplayVidOutHeader(
+ (PVIDEO_STREAMING_OUTPUT_HEADER)VidCommonDesc);
+
+ case VS_STILL_IMAGE_FRAME:
+ return DisplayStillImageFrame(
+ (PVIDEO_STILL_IMAGE_FRAME)VidCommonDesc);
+
+ case VS_FORMAT_UNCOMPRESSED:
+#ifdef H264_SUPPORT
+ {
+ BOOL retCode = DisplayUncompressedFormat( (PVIDEO_FORMAT_UNCOMPRESSED)VidCommonDesc );
+ g_expectedNumberOfUncompressedFrameFrameDescriptors += ((PVIDEO_FORMAT_UNCOMPRESSED)VidCommonDesc)->bNumFrameDescriptors;
+ return retCode;
+ }
+#else
+ return DisplayUncompressedFormat(
+ (PVIDEO_FORMAT_UNCOMPRESSED)VidCommonDesc);
+#endif
+
+ case VS_FRAME_UNCOMPRESSED:
+#ifdef H264_SUPPORT
+ {
+ BOOL retCode = DisplayUncompressedFrameType( (PVIDEO_FRAME_UNCOMPRESSED)VidCommonDesc );
+ g_numberOfUncompressedFrameFrameDescriptors++;
+ return retCode;
+ }
+#else
+ return DisplayUncompressedFrameType(
+ (PVIDEO_FRAME_UNCOMPRESSED)VidCommonDesc);
+#endif
+
+#ifdef H264_SUPPORT
+ case VS_FORMAT_H264:
+ {
+ BOOL retCode = DisplayVCH264Format( (PVIDEO_FORMAT_H264)VidCommonDesc );
+ g_expectedNumberOfH264FrameDescriptors += ((PVIDEO_FORMAT_H264)VidCommonDesc)->bNumFrameDescriptors;
+ return retCode;
+ }
+
+ case VS_FRAME_H264:
+ {
+ BOOL retCode = DisplayVCH264FrameType( (PVIDEO_FRAME_H264)VidCommonDesc );
+ g_numberOfH264FrameDescriptors++;
+ return retCode;
+ }
+#endif
+
+ case VS_FORMAT_MJPEG:
+#ifdef H264_SUPPORT // additional checks
+ {
+ BOOL retCode = DisplayMJPEGFormat( (PVIDEO_FORMAT_MJPEG)VidCommonDesc );
+ g_expectedNumberOfMJPEGFrameDescriptors += ((PVIDEO_FORMAT_MJPEG)VidCommonDesc)->bNumFrameDescriptors;
+ return retCode;
+ }
+#else
+ return DisplayMJPEGFormat(
+ (PVIDEO_FORMAT_MJPEG)VidCommonDesc);
+#endif
+
+ case VS_FRAME_MJPEG:
+#ifdef H264_SUPPORT
+ {
+ BOOL retCode = DisplayMJPEGFrameType( (PVIDEO_FRAME_MJPEG)VidCommonDesc );
+ g_numberOfMJPEGFrameDescriptors++;
+ return retCode;
+ }
+
+#else
+ return DisplayMJPEGFrameType(
+ (PVIDEO_FRAME_MJPEG)VidCommonDesc);
+#endif
+
+
+
+ case VS_FORMAT_MPEG1:
+ {
+ if (UVC10 == g_chUVCversion)
+ {
+ return DisplayMPEG1SSFormat(
+ (PVIDEO_FORMAT_MPEG1SS)VidCommonDesc);
+ }
+ else // this format is obsoleted in UVC version >= 1.1
+ {
+ AppendTextBuffer("*!*ERROR: obsoleted bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FORMAT_MPEG2PS:
+ {
+ if (UVC10 == g_chUVCversion)
+ {
+ return DisplayMPEG2PSFormat(
+ (PVIDEO_FORMAT_MPEG2PS)VidCommonDesc);
+ }
+ else // this format is obsoleted in UVC version >= 1.1
+ {
+ AppendTextBuffer("*!*ERROR: obsoleted bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FORMAT_MPEG2TS:
+ return DisplayMPEG2TSFormat(
+ (PVIDEO_FORMAT_MPEG2TS)VidCommonDesc);
+
+ case VS_FORMAT_MPEG4SL:
+ {
+ if (UVC10 == g_chUVCversion)
+ {
+ return DisplayMPEG4SLFormat(
+ (PVIDEO_FORMAT_MPEG4SL)VidCommonDesc);
+ }
+ else // this format is obsoleted in UVC version >= 1.1
+ {
+ AppendTextBuffer("*!*ERROR: obsoleted bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FORMAT_DV:
+ return DisplayDVFormat(
+ (PVIDEO_FORMAT_DV)VidCommonDesc);
+
+ case VS_COLORFORMAT:
+ return DisplayColorMatching(
+ (PVIDEO_COLORFORMAT)VidCommonDesc);
+
+ case VS_FORMAT_VENDOR:
+ {
+ if (UVC10 == g_chUVCversion)
+ {
+ return DisplayVendorVidFormat(
+ (PVIDEO_FORMAT_VENDOR)VidCommonDesc);
+ }
+ else // this format is obsoleted in UVC version >= 1.1
+ {
+ AppendTextBuffer("*!*ERROR: obsoleted bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FRAME_VENDOR:
+ {
+ if (UVC10 == g_chUVCversion)
+ {
+ return DisplayVendorVidFrameType(
+ (PVIDEO_FRAME_VENDOR)VidCommonDesc);
+ }
+ else // this format is obsoleted in UVC version >= 1.1
+ {
+ AppendTextBuffer("*!*ERROR: obsoleted bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FORMAT_FRAME_BASED:
+ {
+ if (UVC10 != g_chUVCversion)
+ {
+ return DisplayFramePayloadFormat(
+ (PVIDEO_FORMAT_FRAME)VidCommonDesc);
+ }
+ else // this format did not exist in UVC 1.0
+ {
+ AppendTextBuffer("*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FRAME_FRAME_BASED:
+ {
+ if (UVC10 != g_chUVCversion)
+ {
+ return DisplayFramePayloadFrame(
+ (PVIDEO_FRAME_FRAME)VidCommonDesc);
+ }
+ else // this format did not exist in UVC 1.0
+ {
+ AppendTextBuffer("*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_FORMAT_STREAM_BASED:
+ {
+ if (UVC10 != g_chUVCversion)
+ {
+ return DisplayStreamPayload(
+ (PVIDEO_FORMAT_STREAM)VidCommonDesc);
+ }
+ else // this format did not exist in UVC 1.0
+ {
+ AppendTextBuffer("*!*ERROR: bDescriptorSubtype did not exist in UVC 1.0\r\n");
+ OOPS();
+ break;
+ }
+ }
+
+ case VS_DESCRIPTOR_UNDEFINED:
+ //@@TestCase B1.3
+ //@@CAUTION
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@An undefined descriptor subtype has been defined
+ AppendTextBuffer("*!*CAUTION: This is an undefined class specific Video "\
+ "Streaming bDescriptorSubtype\r\n");
+ break;
+
+ default:
+ //@@TestCase B1.4
+ //@@ERROR
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@An unknown descriptor subtype has been defined
+ AppendTextBuffer("*!*ERROR: unknown bDescriptorSubtype\r\n");
+ OOPS();
+ break;
+ }
+ break;
+
+ default:
+ //@@TestCase B1.6
+ //@@ERROR
+ //@@Descriptor Field - bInterfaceSubClass
+ //@@An unknown interface sub-class has been defined
+ AppendTextBuffer("*!*ERROR: unknown bInterfaceSubClass\r\n");
+ OOPS();
+ break;
+ }
+ break;
+
+ case CS_ENDPOINT:
+ //@@DisplayVideoDescriptor -Class-Specific Video Endpoint Descriptor
+ switch (VidCommonDesc->bDescriptorSubtype)
+ {
+ //@@TestCase B1.7
+ //@@CAUTION
+ //@@Descriptor Field - bInterfaceSubtype
+ //@@An undefined descriptor subtype has been defined
+ case EP_UNDEFINED:
+ AppendTextBuffer("*!*CAUTION: This is an undefined bDescriptorSubtype\r\n");
+ break;
+ //@@TestCase B1.8
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@Question: How valid are VIDEO_EP_GENERAL and VIDEO_EP_ENDPOINT? Should we test?
+ case EP_GENERAL:
+ break;
+ case EP_ENDPOINT:
+ break;
+ case EP_INTERRUPT:
+ return DisplayVSEndpoint(
+ (PVIDEO_CS_INTERRUPT)VidCommonDesc);
+ break;
+ default:
+ //@@TestCase B1.9
+ //@@ERROR
+ //@@Descriptor Field - bDescriptorSubtype
+ //@@An unknown descriptor subtype has been defined
+ AppendTextBuffer("*!*CAUTION: Unknown bDescriptorSubtype");
+ break;
+ }
+ break;
+ //@@DisplayVideoDescriptor -Class-Specific Video Device Descriptor
+ //@@DisplayVideoDescriptor -Class-Specific Video Configuration Descriptor
+ //@@DisplayVideoDescriptor -Class-Specific Video String Descriptor
+ //@@DisplayVideoDescriptor -Class-Specific Video Undefined Descriptor
+ //@@TestCase B1.10
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor -Class-Specific Device, Configuration, String, Undefined
+ //@@Descriptor Field - bDescriptorType
+ //@@Question: How valid are these Descriptor Types? Should we test?
+
+ /* case USB_VIDEO_CS_DEVICE:
+ AppendTextBuffer("USB_VIDEO_CS_DEVICE bDescriptorType\r\n");
+ break;
+
+ case USB_VIDEO_CS_CONFIGURATION:
+ AppendTextBuffer("USB_VIDEO_CS_CONFIGURATION bDescriptorType\r\n");
+ break;
+
+ case USB_VIDEO_CS_STRING:
+ AppendTextBuffer("USB_VIDEO_CS_STRING bDescriptorType\r\n");
+ break;
+
+ case USB_VIDEO_CS_UNDEFINED:
+ AppendTextBuffer("USB_VIDEO_CS_UNDEFINED bDescriptorType\r\n");
+ break;
+ */
+ default:
+ //@@TestCase B1.11
+ //@@ERROR
+ //@@Descriptor Field - bDescriptorType
+ //@@An unknown descriptor type has been defined
+ AppendTextBuffer("*!*CAUTION: Unknown bDescriptorSubtype");
+ OOPS();
+ break;
+ }
+
+ return FALSE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCHeader()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCHeader (
+ PVIDEO_CONTROL_HEADER_UNIT VCInterfaceDesc
+ )
+{
+ //@@DisplayVCHeader -Video Control Interface Header
+ UINT i = 0;
+ UINT uSize = 0;
+ PUCHAR pData = NULL;
+
+ AppendTextBuffer("\r\n ===>Class-Specific Video Control Interface Header "\
+ "Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VCInterfaceDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VCInterfaceDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VCInterfaceDesc->bDescriptorSubtype);
+ if ( UVC10 == g_chUVCversion )
+ {
+ AppendTextBuffer("bcdVDC: 0x%04X\r\n", VCInterfaceDesc->bcdVideoSpec);
+ }
+ else
+ {
+ AppendTextBuffer("bcdUVC: 0x%04X\r\n", VCInterfaceDesc->bcdVideoSpec);
+ }
+ AppendTextBuffer("wTotalLength: 0x%04X", VCInterfaceDesc->wTotalLength);
+
+ // Verify the total interface size (size of this header and all descriptors
+ // following until and not including the first endpoint)
+ uSize = GetVCInterfaceSize(VCInterfaceDesc);
+ if (uSize != VCInterfaceDesc->wTotalLength) {
+ AppendTextBuffer("\r\n*!*ERROR: Invalid total interface size 0x%02X, should be 0x%02X\r\n",
+ VCInterfaceDesc->wTotalLength, uSize);
+ } else {
+ AppendTextBuffer(" -> Validated\r\n");
+ }
+ AppendTextBuffer("dwClockFreq: 0x%08X",
+ VCInterfaceDesc->dwClockFreq);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" = (%d) Hz", VCInterfaceDesc->dwClockFreq);
+ }
+ AppendTextBuffer("\r\nbInCollection: 0x%02X\r\n",
+ VCInterfaceDesc->bInCollection);
+
+ // baInterfaceNr is a variable length field
+ // Size is in bInCollection
+ for (i = 1, pData = (PUCHAR) &VCInterfaceDesc->bInCollection;
+ i <= VCInterfaceDesc->bInCollection; i++, pData++)
+ {
+ AppendTextBuffer("baInterfaceNr[%d]: 0x%02X\r\n",
+ i, *pData);
+ }
+
+ uSize = (sizeof(VIDEO_CONTROL_HEADER_UNIT) + VCInterfaceDesc->bInCollection);
+ if (VCInterfaceDesc->bLength != uSize)
+ {
+ //@@TestCase B2.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is less than required length in
+ //@@ the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ VCInterfaceDesc->bLength, uSize);
+ OOPS();
+ }
+
+ //@@TestCase B2.2 (also in Descript.c)
+ //@@WARNING
+ //@@Descriptor Field - bcdVDC
+ //@@The bcdVDC version of the device is not the same as the version of used by USBView
+ if(VCInterfaceDesc->bcdVideoSpec < BCDVDC)
+ {
+ AppendTextBuffer("*!*WARNING: This device is set to the old USB Video "\
+ "Class spec version 0x%04X\r\n", VCInterfaceDesc->bcdVideoSpec);
+ OOPS();
+ }
+
+ if (VCInterfaceDesc->dwClockFreq < 1)
+ {
+ //@@TestCase B2.3 (Descript.c Line 70)
+ //@@WARNING
+ //@@dwClockFrequency should be greater than 0
+ //@@Question should we check that any non-zero value is accurate
+ AppendTextBuffer("*!*ERROR: dwClockFreq must be non-zero\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B2.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - baInterfaceNr
+ //@@We should test to verify each interface number is valid?
+ // for (i=0; i<VCInterfaceDesc->bInCollection; i++)
+ // {AppendTextBuffer("baInterfaceNr[%d]: 0x%02X\r\n", i+1,
+ // VCInterfaceDesc->baInterfaceNr[i]);}
+
+
+ if (gDoAnnotation)
+ {
+ switch(g_chUVCversion)
+ {
+ case UVC10:
+ AppendTextBuffer("USB Video Class device: spec version 1.0\r\n");
+ break;
+ case UVC11:
+ AppendTextBuffer("USB Video Class device: spec version 1.1\r\n");
+ break;
+#ifdef H264_SUPPORT
+ case UVC15:
+ AppendTextBuffer("USB Video Class device: spec version 1.5\r\n");
+ break;
+#endif
+
+ default:
+ break;
+ }
+ }
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCInputTerminal()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCInputTerminal (
+ PVIDEO_INPUT_TERMINAL VidITDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVCInputTerminal -Video Control Input Terminal
+ PCHAR pStr = NULL;
+
+ AppendTextBuffer("\r\n ===>Video Control Input Terminal Descriptor<===\r\n");
+
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidITDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidITDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidITDesc->bDescriptorSubtype);
+ AppendTextBuffer("bTerminalID: 0x%02X\r\n", VidITDesc->bTerminalID);
+ AppendTextBuffer("wTerminalType: 0x%04X", VidITDesc->wTerminalType);
+ if(gDoAnnotation)
+ {
+ pStr = GetStringFromList(slInputTermTypes,
+ sizeof(slInputTermTypes) / sizeof(STRINGLIST),
+ VidITDesc->wTerminalType,
+ "Invalid Input Terminal Type");
+ AppendTextBuffer(" = (%s)", pStr);
+ }
+ AppendTextBuffer("\r\n");
+
+ AppendTextBuffer("bAssocTerminal: 0x%02X\r\n", VidITDesc->bAssocTerminal);
+ AppendTextBuffer("iTerminal: 0x%02X\r\n", VidITDesc->iTerminal);
+ if (gDoAnnotation)
+ {
+ if (VidITDesc->iTerminal)
+ {
+ // if executing this code, the configuration descriptor has been
+ // obtained. If a device is suspended, then its configuration
+ // descriptor was not obtained and we do not want errors to be
+ // displayed when string descriptors were not obtained.
+ DisplayStringDescriptor(VidITDesc->iTerminal, StringDescs, LatestDevicePowerState);
+ }
+ }
+
+ if (VidITDesc->bLength < sizeof(VIDEO_INPUT_TERMINAL))
+ {
+ //@@TestCase B3.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is less than required length in
+ //@@ the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d is too small\r\n", VidITDesc->bLength);
+ OOPS();
+ }
+
+ if (VidITDesc->bTerminalID < 1)
+ {
+ //@@TestCase B3.2 (descript.c line 133)
+ //@@ERROR
+ //@@Descriptor Field - bTerminalID
+ //@@bTerminalID should be greater than 0
+ //@@Question: Should test to verify terminal number is valid
+ AppendTextBuffer("*!*ERROR: bTerminalID of %d is too small\r\n", VidITDesc->bTerminalID);
+ OOPS();
+ }
+
+ if (!(pStr))
+ {
+ //@@TestCase B3.3
+ //@@CAUTION
+ //@@Descriptor Field - wTerminalType
+ //@@No valid Terminal Type was found
+ AppendTextBuffer("*!*CAUTION: 0x%04X is an unknown wTerminalType for an Input "\
+ "Terminal\r\n", VidITDesc->wTerminalType);
+ OOPS();
+ }
+
+ //@@TestCase B3.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bAssocTerminal
+ //@@Should test to verify terminal number is valid?
+ // AppendTextBuffer("bAssocTerminal: 0x%02X\r\n", VidITDesc->bAssocTerminal);
+
+ switch (VidITDesc->wTerminalType)
+ {
+ case 0x0100: // TT_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0101: // TT_STREAMING Terminal Type
+ break;
+ case 0x0200: // ITT_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0201: // ITT_CAMERA Terminal Type
+ return DisplayVCCameraTerminal(
+ (PVIDEO_CAMERA_TERMINAL)VidITDesc);
+ case 0x0202: // ITT_MEDIA_TRANSPORT_INPUT Terminal Type
+ return DisplayVCMediaTransInputTerminal(
+ (PVIDEO_INPUT_MTT)VidITDesc);
+ case 0x0400: // EXTERNAL_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0401: // COMPOSITE_CONNECTOR Terminal Type
+ break;
+ case 0x0402: // SVIDEO_CONNECTOR Terminal Type
+ break;
+ case 0x0403: // COMPONENT_CONNECTOR Terminal Type
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCOutputTerminal()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCOutputTerminal (
+ PVIDEO_OUTPUT_TERMINAL VidOTDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVCOutputTerminal -Video Control Output Terminal
+ PCHAR pStr = NULL;
+
+ AppendTextBuffer("\r\n ===>Video Control Output Terminal Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidOTDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidOTDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidOTDesc->bDescriptorSubtype);
+ AppendTextBuffer("bTerminalID: 0x%02X\r\n", VidOTDesc->bTerminalID);
+ AppendTextBuffer("wTerminalType: 0x%04X", VidOTDesc->wTerminalType);
+ if(gDoAnnotation)
+ {
+ pStr = GetStringFromList(slOutputTermTypes,
+ sizeof(slOutputTermTypes) / sizeof(STRINGLIST),
+ VidOTDesc->wTerminalType,
+ "Invalid Output Terminal Type");
+ AppendTextBuffer(" = (%s)", pStr);
+ }
+ AppendTextBuffer("\r\n");
+ AppendTextBuffer("bAssocTerminal: 0x%02X\r\n", VidOTDesc->bAssocTerminal);
+ AppendTextBuffer("bSourceID: 0x%02X\r\n", VidOTDesc->bSourceID);
+ AppendTextBuffer("iTerminal: 0x%02X\r\n", VidOTDesc->iTerminal);
+ if (gDoAnnotation)
+ {
+ if (VidOTDesc->iTerminal)
+ {
+ // if executing this code, the configuration descriptor has been
+ // obtained. If a device is suspended, then its configuration
+ // descriptor was not obtained and we do not want errors to be
+ // displayed when string descriptors were not obtained.
+ DisplayStringDescriptor(VidOTDesc->iTerminal, StringDescs, LatestDevicePowerState);
+ }
+ }
+
+ if (VidOTDesc->bLength < sizeof(PVIDEO_OUTPUT_TERMINAL))
+ {
+ //@@TestCase B4.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is less than required length in
+ //@@ the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d is too small\r\n", VidOTDesc->bLength);
+ OOPS();
+ }
+
+ if (VidOTDesc->bTerminalID < 1)
+ {
+ //@@TestCase B4.2 (see Descript.c line 328)
+ //@@ERROR
+ //@@Descriptor Field - bTerminalID
+ //@@bTerminalID should be greater than 0
+ //@@Question: Should test to verify terminal number is valid
+ AppendTextBuffer("*!*ERROR: bTerminalID of %d is too small\r\n", VidOTDesc->bTerminalID);
+ OOPS();
+ }
+
+
+ if (!(pStr))
+ {
+ //@@TestCase B4.3
+ //@@ERROR
+ //@@Descriptor Field - wTerminalType
+ //@@No valid Terminal Type was found
+ AppendTextBuffer("*!*ERROR: 0x%04X is an invalid wTerminalType for an Output Terminal\r\n",
+ VidOTDesc->wTerminalType);
+ OOPS();
+ }
+
+ //@@TestCase B4.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bAssocTerminal
+ //@@We should test to verify terminal number is valid
+ // AppendTextBuffer("bAssocTerminal: 0x%02X\r\n", VidOTDesc->bAssocTerminal);
+
+ if (VidOTDesc->bSourceID < 1)
+ {
+ //@@TestCase B4.5 (see Descript.c line 333)
+ //@@ERROR
+ //@@Descriptor Field - bSourceID
+ //@@bSourceID should be greater than 0
+ //@@Question: Should test to verify source number is valid
+ AppendTextBuffer("*!*ERROR: bSourceID of %d is too small\r\n", VidOTDesc->bSourceID);
+ OOPS();
+ }
+
+ switch (VidOTDesc->wTerminalType)
+ {
+ case 0x0100: // TT_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0101: // TT_STREAMING Terminal Type
+ break;
+ case 0x0300: // OTT_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0301: // OTT_DISPLAY Terminal Type
+ break;
+ case 0x0302: // OTT_MEDIA_TRANSPORT_OUTPUT Terminal Type
+ return DisplayVCMediaTransOutputTerminal(
+ (PVIDEO_OUTPUT_MTT)VidOTDesc);
+ case 0x0400: // EXTERNAL_VENDOR_SPECIFIC Terminal Type
+ break;
+ case 0x0401: // COMPOSITE_CONNECTOR Terminal Type
+ break;
+ case 0x0402: // SVIDEO_CONNECTOR Terminal Type
+ break;
+ case 0x0403: // COMPONENT_CONNECTOR Terminal Type
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCMediaTransInputTerminal()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCMediaTransInputTerminal(
+ PVIDEO_INPUT_MTT MediaTransportInDesc
+ )
+{
+ //@@DisplayVCMediaTransInputTerminal -Video Control Media Transport Input Terminal
+ UCHAR p = 0;
+ PUCHAR pData = NULL;
+ size_t bLength = 0;
+
+ bLength = SizeOfVideoInputMTT(MediaTransportInDesc);
+
+ AppendTextBuffer("===>Additional Media Transport Input Terminal Data\r\n");
+ AppendTextBuffer("bControlSize: 0x%02X\r\n",
+ MediaTransportInDesc->bControlSize);
+
+ // point to bControlSize
+ pData = & MediaTransportInDesc->bControlSize;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportControls,
+ sizeof(slMediaTransportControls) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportCtrl bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+
+ // point to bTransportModeSize
+ pData = pData + 2 ;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes1,
+ sizeof(slMediaTransportModes1) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+
+ // Is there a second control?
+ if (1 < * pData)
+ {
+ // map the second control
+ for ( uBitIndex = 8, cMask = 1; uBitIndex < 16; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 2);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes2,
+ sizeof(slMediaTransportModes2) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a third control?
+ if (2 < * pData)
+ {
+ // map the third control
+ for ( uBitIndex = 16, cMask = 1; uBitIndex < 24; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 3);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes3,
+ sizeof(slMediaTransportModes3) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a fourth control?
+ if (3 < * pData)
+ {
+ // map the fourth control
+ for ( uBitIndex = 24, cMask = 1; uBitIndex < 32; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 4);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes4,
+ sizeof(slMediaTransportModes4) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a fifth control?
+ if (4 < * pData)
+ {
+ // map the fifth control
+ for ( uBitIndex = 32, cMask = 1; uBitIndex < 40; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 5);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes5,
+ sizeof(slMediaTransportModes5) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ }
+
+ // The size of a Media Transport Descriptor is
+ // the size of the Descriptor plus
+ // (bControlSize - 1) plus
+ // IF bmControls & 1 THEN 1 (bTransportModeSize) plus
+ // bTransportModeSize
+ //
+// p = sizeof(VIDEO_INPUT_MTT) +
+// (MediaTransportInDesc->bControlSize - 1);
+// if (MediaTransportInDesc->bmControls[0] & 1)
+// p += 1 + (*pData);
+ if (MediaTransportInDesc->bLength != bLength)
+ {
+ //@@TestCase B5.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@Invalid Descriptor length
+ AppendTextBuffer("*!*ERROR: Invalid descriptor bLength 0x%02X. "\
+ "Should be 0x%02X\r\n",
+ MediaTransportInDesc->bLength, p);
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCMediaTransOutputTerminal()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCMediaTransOutputTerminal(
+ PVIDEO_OUTPUT_MTT MediaTransportOutDesc
+ )
+{
+ //@@DisplayVCMediaTransOutputTerminal -Video Control Media Transport Output Terminal
+ UCHAR p = 0;
+ PUCHAR pData = NULL;
+
+ AppendTextBuffer("===>Additional Media Transport Output Terminal Data\r\n");
+ AppendTextBuffer("bControlSize: 0x%02X\r\n",
+ MediaTransportOutDesc->bControlSize);
+
+ // point to bControlSize
+ pData = & MediaTransportOutDesc->bControlSize;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportControls,
+ sizeof(slMediaTransportControls) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportCtrl bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+
+ // point to bTransportModeSize
+ pData = pData + 2 ;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes1,
+ sizeof(slMediaTransportModes1) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+
+ // Is there a second control?
+ if (1 < * pData)
+ {
+ // map the second control
+ for ( uBitIndex = 8, cMask = 1; uBitIndex < 16; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 2);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes2,
+ sizeof(slMediaTransportModes2) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a third control?
+ if (2 < * pData)
+ {
+ // map the third control
+ for ( uBitIndex = 16, cMask = 1; uBitIndex < 24; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 3);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes3,
+ sizeof(slMediaTransportModes3) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a fourth control?
+ if (3 < * pData)
+ {
+ // map the fourth control
+ for ( uBitIndex = 24, cMask = 1; uBitIndex < 32; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 4);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes4,
+ sizeof(slMediaTransportModes4) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a fifth control?
+ if (4 < * pData)
+ {
+ // map the fourth control
+ for ( uBitIndex = 32, cMask = 1; uBitIndex < 40; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 5);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slMediaTransportModes5,
+ sizeof(slMediaTransportModes5) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid MediaTransportMode value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ }
+
+ // The size of a Media Transport Descriptor is
+ // the size of the Descriptor plus
+ // (bControlSize - 1) plus
+ // IF bmControls & 1 THEN 1 (bTransportModeSize) plus
+ // bTransportModeSize
+ //
+ p = sizeof(VIDEO_OUTPUT_MTT) +
+ (MediaTransportOutDesc->bControlSize - 1);
+ if (MediaTransportOutDesc->bmControls[0] & 1)
+ p += 1 + (*pData);
+ if (MediaTransportOutDesc->bLength != p)
+ {
+ //@@TestCase B5.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@Invalid Descriptor length
+ AppendTextBuffer("*!*ERROR: Invalid descriptor bLength 0x%02X. "\
+ "Should be 0x%02X\r\n",
+ MediaTransportOutDesc->bLength, p);
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCCameraTerminal()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCCameraTerminal(
+ PVIDEO_CAMERA_TERMINAL CameraDesc
+ )
+{
+ //@@DisplayVCCameraTerminal -Video Control Camera Terminal
+ UCHAR p = 0;
+ PUCHAR pData = NULL;
+
+ AppendTextBuffer("===>Camera Input Terminal Data\r\n");
+ AppendTextBuffer("wObjectiveFocalLengthMin: 0x%04X\r\n", CameraDesc->wObjectiveFocalLengthMin);
+ AppendTextBuffer("wObjectiveFocalLengthMax: 0x%04X\r\n", CameraDesc->wObjectiveFocalLengthMax);
+ AppendTextBuffer("wOcularFocalLength: 0x%04X\r\n", CameraDesc->wOcularFocalLength);
+ AppendTextBuffer("bControlSize: 0x%02X\r\n", CameraDesc->bControlSize);
+
+ pData = &CameraDesc->bControlSize;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slCameraControl1,
+ sizeof(slCameraControl1) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid CamCtrl bmControl value"));
+
+ cMask = cMask << 1;
+ }
+
+ // Is there a second control?
+ if (1 < * pData)
+ {
+ // map the second control
+ for ( uBitIndex = 8, cMask = 1; uBitIndex < 16; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 2);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slCameraControl2,
+ sizeof(slCameraControl2) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid CamCtrl bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ // Is there a third control?
+ if (2 < * pData)
+ {
+ // map the third control
+ for ( uBitIndex = 16, cMask = 1; uBitIndex < 24; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 3);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slCameraControl3,
+ sizeof(slCameraControl3) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid CamCtrl bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ }
+
+ p = (sizeof(VIDEO_CAMERA_TERMINAL) + CameraDesc->bControlSize);
+ if (CameraDesc->bLength != p)
+ {
+ //@@TestCase B7.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The descriptor should be the size of the descriptor structure
+ //@@ plus the number of controls
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ CameraDesc->bLength, p);
+ OOPS();
+ }
+
+ //@@TestCase B7.2
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - wObjectiveFocalLengthMin
+ //@@Question - Should we do any checking here? What are the acceptable boundaries?
+ //@@Question - Is zero an acceptable value?
+ // AppendTextBuffer("wObjectiveFocalLengthMin: 0x%04X\r\n", CameraDesc->wObjectiveFocalLengthMin);
+
+ //@@TestCase B7.3
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - wObjectiveFocalLengthMax
+ //@@Question - Should we do any checking here? What are the acceptable boundaries
+ //@@Question - Is zero an acceptable value?
+ // AppendTextBuffer("wObjectiveFocalLengthMax: 0x%04X\r\n", CameraDesc->wObjectiveFocalLengthMax);
+
+ //@@TestCase B7.4
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - wOcularFocalLength
+ //@@Question - Should we do any checking here? What are the acceptable boundaries
+ //@@Question - Is zero an acceptable value?
+ // AppendTextBuffer("wOcularFocalLength: 0x%04X\r\n", CameraDesc->wOcularFocalLength);
+
+ //@@TestCase B7.5
+ //@@ERROR
+ //@@Descriptor Field - wObjectiveFocalLengthMin and wObjectiveFocalLengthMax
+ //@@Verify that wObjectiveFocalLengthMax is greater than wObjectiveFocalLengthMin
+ if(CameraDesc->wObjectiveFocalLengthMin > CameraDesc->wObjectiveFocalLengthMax)
+ {
+ AppendTextBuffer("*!*ERROR: wObjectiveFocalLengthMin is larger than wObjectiveFocalLengthMax\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B7.6
+ //@@ERROR
+ //@@Descriptor Field - bControlSize
+ //@@Verify that wObjectiveFocalLengthMax is 3 or less
+ if(CameraDesc->bControlSize > 3)
+ {
+ AppendTextBuffer("*!*ERROR: bControlSize must be 3 or less\r\n");
+ OOPS();
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayVCSelectorUnit()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCSelectorUnit (
+ PVIDEO_SELECTOR_UNIT VidSelectorDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVCSelectorUnit -Video Control Selector Unit
+ UCHAR i = 0;
+ UCHAR p = 0;
+ PUCHAR pData = NULL;
+
+ AppendTextBuffer("\r\n ===>Video Control Selector Unit Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidSelectorDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidSelectorDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidSelectorDesc->bDescriptorSubtype);
+ AppendTextBuffer("bUnitID: 0x%02X\r\n", VidSelectorDesc->bUnitID);
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n", VidSelectorDesc->bNrInPins);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer("===>List of Connected Unit and Terminal ID's\r\n");
+ }
+ // baSourceID is a variable length field
+ // Size is in bNrInPins, must be at least 1 (so index starts at 1)
+ for (i = 1, pData = (PUCHAR) &VidSelectorDesc->baSourceID;
+ i <= VidSelectorDesc->bNrInPins; i++, pData++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i, *pData);
+ }
+
+ // get address of iSelector, the last field in this descriptor
+ pData = (PUCHAR) VidSelectorDesc + (VidSelectorDesc->bLength - 1);
+ AppendTextBuffer("iSelector: 0x%02X\r\n", *pData);
+ if (gDoAnnotation)
+ {
+ if (*pData)
+ {
+ // if executing this code, the configuration descriptor has been
+ // obtained. If a device is suspended, then its configuration
+ // descriptor was not obtained and we do not want errors to be
+ // displayed when string descriptors were not obtained.
+ DisplayStringDescriptor(*pData, StringDescs, LatestDevicePowerState);
+ }
+ }
+
+ p = (sizeof(VIDEO_SELECTOR_UNIT) + VidSelectorDesc->bNrInPins + 1);
+ if (VidSelectorDesc->bLength != p)
+ {
+ //@@TestCase B8.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The descriptor should be the size of the descriptor structure plus the number of pins
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ VidSelectorDesc->bLength, p);
+ OOPS();
+ }
+
+ if (VidSelectorDesc->bUnitID < 1)
+ {
+ //@@TestCase B8.2 (Descript.c Line 396)
+ //@@ERROR
+ //@@Descriptor Field - bUnitID
+ //@@bUnitID must be greater than 0
+ //@@Question: Should we test to verify unit number is unique?
+ AppendTextBuffer("*!*ERROR: bUnitID must be non-zero\r\n");
+ OOPS();
+ }
+
+ if (VidSelectorDesc->bNrInPins < 1)
+ {
+ //@@TestCase B8.3
+ //@@ERROR
+ //@@Descriptor Field - bNrInPins
+ //@@bNrInPins should be greater than 0
+ //@@Question: Should test to verify total in pins is valid
+ AppendTextBuffer("*!*ERROR: bNrInPins must be non-zero\r\n");
+ OOPS();
+ }
+
+ // baSourceID is a variable length field
+ // Size is in bNrInPins, must be at least 1 (so index starts at 1)
+ for (i = 1, pData = (PUCHAR) &VidSelectorDesc->baSourceID;
+ i <= VidSelectorDesc->bNrInPins; i++, pData++)
+ {
+ if (*pData < 1)
+ {
+ //@@TestCase B8.4
+ //@@ERROR
+ //@@Descriptor Field - baSourceID[]
+ //@@baSourceID should be greater than 0
+ AppendTextBuffer("*!*ERROR: baSourceID[%d] must be non-zero\r\n", i);
+ OOPS();
+ } else {
+ if (! ValidateTerminalID(*pData)) {
+ //@@TestCase B8.5
+ //@@ERROR
+ //@@Descriptor Field - baSourceID[]
+ //@@baSourceID should be a valid terminal ID
+ AppendTextBuffer("*!*ERROR: baSourceID[%d] must be non-zero\r\n", i);
+ OOPS();
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCProcessingUnit()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCProcessingUnit (
+ PVIDEO_PROCESSING_UNIT VidProcessingDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVCProcessingUnit -Video Control Processor Unit
+ PUCHAR pData = NULL;
+ UCHAR bLength = 0;
+
+ AppendTextBuffer("\r\n ===>Video Control Processing Unit Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidProcessingDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidProcessingDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidProcessingDesc->bDescriptorSubtype);
+ AppendTextBuffer("bUnitID: 0x%02X\r\n", VidProcessingDesc->bUnitID);
+ AppendTextBuffer("bSourceID: 0x%02X\r\n", VidProcessingDesc->bSourceID);
+ AppendTextBuffer("wMaxMultiplier: 0x%04X\r\n", VidProcessingDesc->wMaxMultiplier);
+ AppendTextBuffer("bControlSize: 0x%02X\r\n", VidProcessingDesc->bControlSize);
+
+ pData = &VidProcessingDesc->bControlSize;
+
+ // Are there any controls?
+ if (0 < * pData)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 1);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slProcessorControls1,
+ sizeof(slProcessorControls1) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid PU bmControl value"));
+
+ cMask = cMask << 1;
+ }
+
+ // Is there a second control?
+ if (1 < * pData)
+ {
+ // map the second control
+ for ( uBitIndex = 8, cMask = 1; uBitIndex < 16; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 2);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slProcessorControls2,
+ sizeof(slProcessorControls2) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid PU bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+
+ // Is there a third control?
+ if (2 < * pData)
+ {
+ // map the third control
+ for ( uBitIndex = 16, cMask = 1; uBitIndex < 24; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + 3);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slProcessorControls3,
+ sizeof(slProcessorControls3) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid PU bmControl value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ }
+
+ // get address of iProcessing
+ if (UVC10 != g_chUVCversion)
+ {
+ // size of descriptor is struct size plus control size plus 2 if UVC11
+ bLength = sizeof(VIDEO_PROCESSING_UNIT) + 2 + VidProcessingDesc->bControlSize;
+ pData = (PUCHAR) VidProcessingDesc + (VidProcessingDesc->bLength - 2);
+ }
+ else // UVC 1.0
+ {
+ // size of descriptor is struct size plus control size plus 1 if UVC10
+ bLength = sizeof(VIDEO_PROCESSING_UNIT) + 1 + VidProcessingDesc->bControlSize;
+ pData = (PUCHAR) VidProcessingDesc + (VidProcessingDesc->bLength - 1);
+ }
+ AppendTextBuffer("iProcessing : 0x%02X\r\n", *pData);
+ if (gDoAnnotation)
+ {
+ if (*pData)
+ {
+ // if executing this code, the configuration descriptor has been
+ // obtained. If a device is suspended, then its configuration
+ // descriptor was not obtained and we do not want errors to be
+ // displayed when string descriptors were not obtained.
+ DisplayStringDescriptor(*pData, StringDescs, LatestDevicePowerState);
+ }
+ }
+
+ // check for new UVC 1.1 bmVideoStandards fields
+ if (UVC10 != g_chUVCversion)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ pData = (PUCHAR) VidProcessingDesc + (VidProcessingDesc->bLength - 1);
+
+ AppendTextBuffer("bmVideoStandards : ");
+ VDisplayBytes(pData, 1);
+
+ // map the first control
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slProcessorVideoStandards,
+ sizeof(slProcessorVideoStandards) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid PU bmVideoStandards value"));
+
+ cMask = cMask << 1;
+ }
+ }
+
+ if (VidProcessingDesc->bLength != bLength)
+ {
+ //@@TestCase B9.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ AppendTextBuffer("*!*ERROR: bLength of 0x%02X incorrect, should be 0x%02X\r\n",
+ VidProcessingDesc->bLength, bLength);
+ OOPS();
+ }
+
+ if (VidProcessingDesc->bUnitID < 1)
+ {
+ //@@TestCase B9.2 (Descript.c Line 466)
+ //@@ERROR
+ //@@Descriptor Field - bUnitID
+ //@@bUnitID must be greater than 0
+ //@@Question: Should we test to verify unit number is unique?
+ AppendTextBuffer("*!*ERROR: bUnitID must be non-zero\r\n");
+ OOPS();
+ }
+
+ if (VidProcessingDesc->bSourceID < 1)
+ {
+ //@@TestCase B9.3 (Descript.c Line 471)
+ //@@ERROR
+ //@@Descriptor Field - bSourceID
+ //@@bSourceID must be non-zero
+ //@@Question: Should we test to verify the bSourceID is valid?
+ AppendTextBuffer("*!*ERROR: bSourceID must be non-zero\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B9.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - wMaxMultiplier
+ //@@We should test to verify multiplier is valid
+ // AppendTextBuffer("wMaxMultiplier: 0x%04X\r\n", VidProcessingDesc->wMaxMultiplier);
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCExtensionUnit()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVCExtensionUnit (
+ PVIDEO_EXTENSION_UNIT VidExtensionDesc,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ )
+{
+ //@@DisplayVCExtensionUnit -Video Control Extension Unit
+ int i = 0;
+ UCHAR p = 0;
+ UCHAR bControlSize = 0;
+ PUCHAR pData = NULL;
+ OLECHAR szGUID[256];
+ size_t bLength = 0;
+
+ bLength = SizeOfVideoExtensionUnit(VidExtensionDesc);
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) &VidExtensionDesc->guidExtensionCode, (LPOLESTR) szGUID, 255);
+ i++;
+
+ AppendTextBuffer("\r\n ===>Video Control Extension Unit Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidExtensionDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidExtensionDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidExtensionDesc->bDescriptorSubtype);
+ AppendTextBuffer("bUnitID: 0x%02X\r\n", VidExtensionDesc->bUnitID);
+ AppendTextBuffer("guidExtensionCode: %S\r\n", szGUID);
+ AppendTextBuffer("bNumControls: 0x%02X\r\n", VidExtensionDesc->bNumControls);
+ AppendTextBuffer("bNrInPins: 0x%02X\r\n", VidExtensionDesc->bNrInPins);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer("===>List of Connected Units and Terminal ID's\r\n");
+ }
+ // baSourceID is a variable length field
+ // Size is in bNrInPins, must be at least 1 (so index starts at 1)
+ for (i = 1, pData = (PUCHAR) &VidExtensionDesc->baSourceID;
+ i <= VidExtensionDesc->bNrInPins; i++, pData++)
+ {
+ AppendTextBuffer("baSourceID[%d]: 0x%02X\r\n",
+ i, *pData);
+ }
+ // point to bControlSize (address of bNrInPins plus number of fields in bNrInPins
+ // plus 1 for next field)
+ pData = &VidExtensionDesc->bNrInPins + VidExtensionDesc->bNrInPins +1;
+ bControlSize = *pData;
+ AppendTextBuffer("bControlSize: 0x%02X\r\n", bControlSize);
+
+ // Are there any controls?
+ if ( bControlSize > 0)
+ {
+ AppendTextBuffer("bmControls : ");
+ VDisplayBytes(pData + 1, *pData);
+
+ // Map one byte at a time of the bmControls field in the Video Control Extension Unit Descriptor
+ for (i = 1; i <= bControlSize; i++)
+ {
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ // map byte
+ for ( ; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData + i);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex + 8 * (i-1),
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ "Vendor-Specific (Optional)");
+
+ cMask = cMask << 1;
+ }
+ }
+ }
+
+ // get address of iExtension
+ pData = &VidExtensionDesc->bNrInPins + VidExtensionDesc->bNrInPins + bControlSize + 2;
+// pData = (PUCHAR) VidExtensionDesc + (VidExtensionDesc->bLength - 1);
+ AppendTextBuffer("iExtension: 0x%02X\r\n", *pData);
+ if (gDoAnnotation)
+ {
+ if (*pData)
+ {
+ DisplayStringDescriptor(*pData,StringDescs, LatestDevicePowerState);
+ }
+ }
+
+ // size of descriptor struct size (23) + bNrInPins + bControlSize + iExtension size
+ //
+// p = (sizeof(VIDEO_EXTENSION_UNIT)
+// + VidExtensionDesc->bNrInPins + bControlSize + 1);
+ if (VidExtensionDesc->bLength != bLength)
+ {
+ //@@TestCase B10.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of 0x%02X incorrect, should be 0x%02X\r\n",
+ VidExtensionDesc->bLength, p);
+ OOPS();
+ }
+
+ if (VidExtensionDesc->bUnitID < 1)
+ {
+ //@@TestCase B10.2 (Descript.c Line 517)
+ //@@ERROR
+ //@@Descriptor Field - bUnitID
+ //@@bUnitID must be non-zero
+ //@@Question: Should we test to verify bUnitID is valid
+ AppendTextBuffer("*!*ERROR: bUnitID must be non-zero\r\n");
+ OOPS();
+ }
+
+ //bugbug do we need two
+ if (VidExtensionDesc->bNrInPins < 1)
+ {
+ //@@TestCase B10.3 (Descript.c Line 522)
+ //@@ERROR
+ //@@Descriptor Field - bNrInPins
+ //@@bNrInPins must be non-zero
+ //@@Question: Should we test to verify bNrInPins is valid
+ AppendTextBuffer("*!*ERROR: bNrInPins must be non-zero\r\n");
+ OOPS();
+ }
+
+ for (i = 1, pData = (PUCHAR) &VidExtensionDesc->baSourceID;
+ i <= VidExtensionDesc->bNrInPins; i++, pData++)
+ {
+ if (*pData == 0)
+ {
+ //@@TestCase B10.4 (Descript.c Line 527)
+ //@@ERROR
+ //@@Descriptor Field - baSourceID[]
+ //@@baSourceID[] must be non-zero
+ //@@Question: Should we test to verify baSourceID is valid
+ AppendTextBuffer("*!*ERROR: baSourceID[%d] must be non-zero\r\n", *pData);
+ OOPS();
+ }
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayVidInHeaderl()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVidInHeader (
+ PVIDEO_STREAMING_INPUT_HEADER VidInHeaderDesc
+ )
+{
+ //@@DisplayVidInHeader -Video Streaming Video Input Header
+ UINT p = 0;
+ UINT uCount = 0;
+ PUCHAR pData = NULL;
+
+ AppendTextBuffer("\r\n ===>Video Class-Specific VS Video Input Header Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidInHeaderDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidInHeaderDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidInHeaderDesc->bDescriptorSubtype);
+ AppendTextBuffer("bNumFormats: 0x%02X\r\n", VidInHeaderDesc->bNumFormats);
+ AppendTextBuffer("wTotalLength: 0x%04X", VidInHeaderDesc->wTotalLength);
+
+ uCount = GetVSInterfaceSize((PUSB_COMMON_DESCRIPTOR) VidInHeaderDesc, VidInHeaderDesc->wTotalLength);
+ if (uCount != VidInHeaderDesc->wTotalLength) {
+ AppendTextBuffer("\r\n*!*ERROR: invalid interface size 0x%02X, should be 0x%02X\r\n",
+ VidInHeaderDesc->wTotalLength, uCount);
+ } else {
+ AppendTextBuffer(" -> Validated\r\n");
+ }
+
+ AppendTextBuffer("bEndpointAddress: 0x%02X",
+ VidInHeaderDesc->bEndpointAddress);
+ if (USB_ENDPOINT_DIRECTION_IN(VidInHeaderDesc->bEndpointAddress))
+ {
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Direction: IN - EndpointID: %d",
+ (VidInHeaderDesc->bEndpointAddress & 0x0F));
+ }
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer("bmInfo: 0x%02X", VidInHeaderDesc->bmInfo);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Dynamic Format Change %sSupported",
+ ! (VidInHeaderDesc->bmInfo & 0x01) ? "not " : " ");
+ }
+ AppendTextBuffer("\r\nbTerminalLink: 0x%02X\r\n",
+ VidInHeaderDesc->bTerminalLink);
+ AppendTextBuffer("bStillCaptureMethod: 0x%02X",
+ VidInHeaderDesc->bStillCaptureMethod);
+
+ // globally save the StillMethod, then verify value
+ StillMethod = VidInHeaderDesc->bStillCaptureMethod;
+ if (StillMethod > 3)
+ {
+ //@@TestCase B11.1 (Descript.c Line 798)
+ //@@ERROR
+ //@@Descriptor Field - bStillCaptureMethod
+ //@@bStillCaptureMethod is greater than 3
+ AppendTextBuffer("*!*ERROR: invalid bStillCaptureMethod 0x%02X\r\n",
+ VidInHeaderDesc->bStillCaptureMethod);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Invalid Still Capture Method");
+ }
+ }
+ else
+ {
+ if (0 == StillMethod)
+ {
+ AppendTextBuffer(" -> No Still Capture");
+ }
+ else
+ {
+ AppendTextBuffer(" -> Still Capture Method %d",
+ VidInHeaderDesc->bStillCaptureMethod);
+ }
+ }
+
+ AppendTextBuffer("\r\nbTriggerSupport: 0x%02X",
+ VidInHeaderDesc->bTriggerSupport);
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> ");
+ if (! VidInHeaderDesc->bTriggerSupport)
+ AppendTextBuffer("No ");
+ AppendTextBuffer("Hardware Triggering Support");
+ }
+ AppendTextBuffer("\r\n");
+
+ AppendTextBuffer("bTriggerUsage: 0x%02X",
+ VidInHeaderDesc->bTriggerUsage);
+ if (gDoAnnotation)
+ {
+ if (VidInHeaderDesc->bTriggerSupport != 0)
+ {
+ if (VidInHeaderDesc->bTriggerUsage == 0)
+ AppendTextBuffer(" -> Host will initiate still image capture");
+ if (VidInHeaderDesc->bTriggerUsage == 1)
+ AppendTextBuffer(" -> Host will notify client application of button event");
+ }
+ }
+
+ AppendTextBuffer("\r\nbControlSize: 0x%02X\r\n",
+ VidInHeaderDesc->bControlSize);
+
+ // are there formats to display?
+ if (VidInHeaderDesc->bNumFormats)
+ {
+ UINT uFormatIndex = 1;
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ // There are (bNumFormats) bmaControls fields, each with size (bControlSize)
+ pData = (PUCHAR) &(VidInHeaderDesc->bControlSize);
+
+ // VidInHeaderDesc->bNumFormats -> number of formats
+ // VidInHeaderDesc->bControlSize -> size of EACH format control
+ // ((PUCHAR) &VidInHeaderDesc->bControlSize) + 1 -> address of first format control
+ for ( pData++ ; uFormatIndex <= VidInHeaderDesc->bNumFormats; uFormatIndex++ )
+ {
+ AppendTextBuffer("Video Payload Format %d ", uFormatIndex);
+
+ // Handle case of 0 control size
+ if (! VidInHeaderDesc->bControlSize)
+ {
+ AppendTextBuffer("0x00\r\n");
+ }
+ else
+ {
+ VDisplayBytes(pData, VidInHeaderDesc->bControlSize);
+
+ // map the first control
+ for (uBitIndex = 0, cMask = 1; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pData);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slInputHeaderControls,
+ sizeof(slInputHeaderControls) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid Control value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ pData += VidInHeaderDesc->bControlSize;
+ }
+ }
+
+ p = (sizeof(VIDEO_STREAMING_INPUT_HEADER) +
+ (VidInHeaderDesc->bNumFormats * VidInHeaderDesc->bControlSize));
+ if (VidInHeaderDesc->bLength != p)
+ {
+ //@@TestCase B11.2 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The descriptor should be the size of the descriptor structure
+ //@@ plus the number of formats times the size of each format
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ VidInHeaderDesc->bLength, p);
+ OOPS();
+ }
+
+ if (VidInHeaderDesc->bNumFormats < 1)
+ {
+ //@@TestCase B11.3 (Descript.c Line778)
+ //@@ERROR
+ //@@Descriptor Field - bNumFormats
+ //@@bNumFormats must be non-zero
+ //@@Question: Should we test to verify the non-zero value for bNumFormats is valid
+ AppendTextBuffer("*!*ERROR: bNumFormats must be non-zero\r\n",
+ VidInHeaderDesc->bNumFormats);
+ OOPS();
+ }
+
+ if (VidInHeaderDesc->bEndpointAddress < 1)
+ {
+ //@@TestCase B11.4 (Descript.c Line788)
+ //@@ERROR
+ //@@Descriptor Field - bEndpointAddress
+ //@@bEndpointAddress should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bEndpointAddress is valid
+ AppendTextBuffer("*!*ERROR: bEndpointAddress of %d is too small\r\n",
+ VidInHeaderDesc->bEndpointAddress);
+ OOPS();
+ }
+
+ //@@TestCase B11.5
+ //@@ERROR
+ //@@Descriptor Field - bEndPointAddress
+ //@@The bEndPointAddress is set incorrectly according to the USB Video Device Specification
+ if (!USB_ENDPOINT_DIRECTION_IN(VidInHeaderDesc->bEndpointAddress)){
+ AppendTextBuffer("\r\n*!*ERROR: bEndPointAddress needs to have the Direction IN for this header\r\n");
+ OOPS();}
+
+ //@@TestCase B11.6
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmInfo
+ //@@We should validate that reserved bits are set to zero.
+ // AppendTextBuffer("bmInfo: 0x%02X", VidInHeaderDesc->bmInfo);
+
+ if (VidInHeaderDesc->bTerminalLink < 1)
+ {
+ //@@TestCase B11.7 (Descript.c Line 793)
+ //@@ERROR
+ //@@Descriptor Field - bTerminalLink
+ //@@bTerminalLink should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bTerminalLink is valid
+ AppendTextBuffer("*!*ERROR: bTerminalLink of %d is too small\r\n",
+ VidInHeaderDesc->bTerminalLink);
+ OOPS();
+ }
+
+ //@@TestCase B11.8
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bTriggerSupport
+ //@@We should validate that reserved bits are set to zero.
+ // AppendTextBuffer("bTriggerSupport: 0x%02X", VidInHeaderDesc->bTriggerSupport);
+
+ //@@TestCase B11.9
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bTriggerUsage
+ //@@We should validate that reserved bits are set to zero.
+ // AppendTextBuffer("bTriggerUsage: 0x%02X", VidInHeaderDesc->bTriggerUsage);
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVidOutHeader()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVidOutHeader (
+ PVIDEO_STREAMING_OUTPUT_HEADER VidOutHeaderDesc
+ )
+{
+ //@@DisplayVidOutHeader -Video Streaming Video Output Header
+ UINT uCount = 0;
+ UCHAR bLength = sizeof(VIDEO_STREAMING_OUTPUT_HEADER);
+
+ AppendTextBuffer("\r\n ===>Video Class-Specific VS Video Output Header Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VidOutHeaderDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidOutHeaderDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidOutHeaderDesc->bDescriptorSubtype);
+ AppendTextBuffer("bNumFormats: 0x%02X\r\n", VidOutHeaderDesc->bNumFormats);
+ AppendTextBuffer("wTotalLength: 0x%04X", VidOutHeaderDesc->wTotalLength);
+
+ uCount = GetVSInterfaceSize((PUSB_COMMON_DESCRIPTOR) VidOutHeaderDesc, VidOutHeaderDesc->wTotalLength);
+ if (uCount != VidOutHeaderDesc->wTotalLength) {
+ AppendTextBuffer("\r\n*!*ERROR: invalid interface size 0x%02X, should be 0x%02X\r\n",
+ VidOutHeaderDesc->wTotalLength, uCount);
+ } else {
+ AppendTextBuffer(" -> Validated\r\n");
+ }
+
+ AppendTextBuffer("bEndpointAddress: 0x%02X", VidOutHeaderDesc->bEndpointAddress);
+ if(USB_ENDPOINT_DIRECTION_OUT(VidOutHeaderDesc->bEndpointAddress)) {
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Direction: OUT - EndpointID: %d",
+ (VidOutHeaderDesc->bEndpointAddress & 0x0F));
+ }
+ AppendTextBuffer("\r\n");
+ }
+ AppendTextBuffer("bTerminalLink: 0x%02X\r\n", VidOutHeaderDesc->bTerminalLink);
+
+ // UVC11 Video Output Header has additional fields, larger size
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+#else
+ if (UVC11 == g_chUVCversion)
+#endif
+ {
+ UCHAR bControlSize = 0;
+ PUCHAR pControls = NULL;
+
+ // bControlSize field is next after bTerminalLink
+ pControls = &(VidOutHeaderDesc->bTerminalLink)+1;
+ bControlSize = *(pControls);
+ // point to first bmaControls
+ pControls++;
+
+ // Size of UVC 1.1 Video Output Header is 1.0 size
+ // plus 1 (bControlSize field) plus (number of formats * bControlSize)
+ bLength += 1 + (VidOutHeaderDesc->bNumFormats * bControlSize);
+
+ // Need new uvcdesc.h to handle new fields
+ AppendTextBuffer("bControlSize: 0x%02X\r\n", bControlSize);
+
+ // are there formats to display?
+ if (VidOutHeaderDesc->bNumFormats)
+ {
+ UINT uFormatIndex = 1;
+ UINT uBitIndex = 0;
+ BYTE cCheckBit = 0;
+ BYTE cMask = 1;
+
+ // There are (bNumFormats) bmaControls fields, each with size (bControlSize)
+ for ( ; uFormatIndex <= VidOutHeaderDesc->bNumFormats; uFormatIndex++, pControls ++)
+ {
+ AppendTextBuffer("Video Payload Format %d ", uFormatIndex);
+
+ // Handle case of 0 control size
+ if (0 == bControlSize)
+ {
+ AppendTextBuffer("0x00\r\n");
+ }
+ else
+ {
+ VDisplayBytes(pControls, bControlSize);
+
+ // map the first control
+ for (uBitIndex = 0, cMask = 1; uBitIndex < 8; uBitIndex++ )
+ {
+ cCheckBit = cMask & *(pControls);
+
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ uBitIndex,
+ cCheckBit ? 1 : 0,
+ cCheckBit ? "yes - " : " no - ",
+ GetStringFromList(slOutputHeaderControls,
+ sizeof(slOutputHeaderControls) / sizeof(STRINGLIST),
+ cMask,
+ "Invalid control value"));
+
+ cMask = cMask << 1;
+ }
+ }
+ } // for ( pData++ ; uFormatIndex <= VidOutHeaderDesc->bNumFormats; uFormatIndex++ )
+ } // if (VidOutHeaderDesc->bNumFormats)
+ } // if (UVC11 == g_chUVCversion)
+
+ if (VidOutHeaderDesc->bLength != bLength)
+ {
+ //@@TestCase B12.1 (also in Descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ VidOutHeaderDesc->bLength,
+ sizeof(VIDEO_STREAMING_OUTPUT_HEADER));
+ OOPS();
+ }
+
+ if (VidOutHeaderDesc->bNumFormats < 1)
+ {
+ //@@TestCase B12.2 (Descript.c Line 827)
+ //@@ERROR
+ //@@Descriptor Field - bNumFormats
+ //@@bNumFormats should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bNumFormats is valid
+ AppendTextBuffer("*!*ERROR: bNumFormats of %d is too small\r\n",
+ VidOutHeaderDesc->bNumFormats);
+ OOPS();
+ }
+
+ if (VidOutHeaderDesc->wTotalLength < VidOutHeaderDesc->bLength)
+ {
+ //@@TestCase B12.3 (Descript.c Line 832)
+ //@@ERROR
+ //@@Descriptor Field - wTotalLength
+ //@@wTotalLength should be greater than bLength
+ //@@Question: Should we calculate wTotalLength to verify the value is valid
+ AppendTextBuffer("*!*ERROR: wTotalLength of %d is small than the bLength of %d\r\n",
+ VidOutHeaderDesc->wTotalLength,
+ VidOutHeaderDesc->bLength);
+ OOPS();
+ }
+
+ if (VidOutHeaderDesc->bEndpointAddress < 1)
+ {
+ //@@TestCase B12.4 (Descript.c Line 837)
+ //@@ERROR
+ //@@Descriptor Field - bEndpointAddress
+ //@@bEndpointAddress should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bEndpointAddress is valid
+ AppendTextBuffer("*!*ERROR: bEndpointAddress of %d is too small\r\n",
+ VidOutHeaderDesc->bEndpointAddress);
+ OOPS();
+ }
+
+ if(!(USB_ENDPOINT_DIRECTION_OUT(VidOutHeaderDesc->bEndpointAddress))) {
+ //@@TestCase B12.5
+ //@@ERROR
+ //@@Descriptor Field - bEndPointAddress
+ //@@The bEndPointAddress is set for the wrong direction
+ AppendTextBuffer("\r\n*!*ERROR: bEndPointAddress needs to have the Direction OUT for this header\r\n");
+ OOPS();}
+
+ if (VidOutHeaderDesc->bTerminalLink < 1)
+ {
+ //@@TestCase B12.6 (Descript.c Line 842)
+ //@@ERROR
+ //@@Descriptor Field - bTerminalLink
+ //@@bTerminalLink should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bTerminalLink is valid
+ AppendTextBuffer("*!*ERROR: bTerminalLink of %d is too small\r\n",
+ VidOutHeaderDesc->bTerminalLink);
+ OOPS();
+ }
+
+ return TRUE;
+
+}
+
+
+//*****************************************************************************
+//
+// DisplayStillImageFrame()
+//
+//*****************************************************************************
+
+BOOL
+DisplayStillImageFrame (
+ PVIDEO_STILL_IMAGE_FRAME StillFrameDesc
+ )
+{
+ //@@DisplayStillImageFrame -Still Image Frame
+ VIDEO_STILL_IMAGE_RECT * pXY;
+ PUCHAR pbCurr = NULL;
+ UINT i = 0;
+ UINT uNumComp = 0;
+ UINT uSize = 0;
+ size_t bLength = 0;
+
+ bLength = SizeOfVideoStillImageFrame(StillFrameDesc);
+
+ AppendTextBuffer("\r\n ===>Still Image Frame Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", StillFrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", StillFrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", StillFrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bEndpointAddress: 0x%02X\r\n", StillFrameDesc->bEndpointAddress);
+ AppendTextBuffer("bNumImageSizePatterns: 0x%02X\r\n",
+ StillFrameDesc->bNumImageSizePatterns);
+ if (StillFrameDesc->bNumImageSizePatterns < 1)
+ {
+ //@@TestCase B13.1 (also Descript.c Line 886)
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bNumImageSizePatterns
+ //@@The bNumImageSizePatterns should be greater than 0
+ //@@Question: Should we test to verify the non-zero value for bNumImageSizePatterns is valid
+ AppendTextBuffer("*!*ERROR: bNumImageSizePatterns must be non-zero\r\n");
+ OOPS();
+ }
+
+ // point to first StillFrameDesc->dwStillImage structure
+ pXY = (VIDEO_STILL_IMAGE_RECT *) &StillFrameDesc->aStillRect[0];
+
+ for (i = 1; i <= StillFrameDesc->bNumImageSizePatterns; i++, pXY++)
+ {
+ AppendTextBuffer("wWidth[%d]: 0x%04X\r\n",
+ i, pXY->wWidth);
+ AppendTextBuffer("wHeight[%d]: 0x%04X\r\n",
+ i, pXY->wHeight);
+ }
+ // point to bNumCompressionPattern field (after variable count field dwStillImage)
+ pbCurr = (PUCHAR) pXY;
+ // get number of compression patterns
+ uNumComp = *pbCurr;
+
+ AppendTextBuffer("bNumCompressionPattern: 0x%02X\r\n", *pbCurr++);
+ for (i = 1; i <= uNumComp; i++)
+ {
+ AppendTextBuffer("bCompression[%d]: 0x%02X\r\n",
+ i, *pbCurr++);
+ }
+
+ switch(StillMethod) {
+ case 0:
+ //@@TestCase B13.2
+ //@@ERROR
+ //@@Descriptor Field - Still Image Frame Type Descriptor
+ //@@An still method type has been defined that shouldn't use a Still Image Frame
+ AppendTextBuffer("*!*ERROR: VS Video Input Header set to "\
+ "No Still Method support\r\n");
+ OOPS();
+ case 1:
+ //@@TestCase B13.3
+ //@@ERROR
+ //@@Descriptor Field - Still Image Frame Type Descriptor
+ //@@An still method type has been defined that shouldn't use a Still Image Frame
+ AppendTextBuffer("*!*ERROR: VS Video Input Header set to "\
+ "Still Method One support with a Still Image Frame descriptor\r\n");
+ OOPS();
+ default:
+ break;}
+
+ if (StillFrameDesc->bLength != bLength)
+ {
+ //@@TestCase B13.4 (Also in descript.c)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is incorrect
+ AppendTextBuffer("*!*ERROR: bLength 0x%02X incorrect, should be 0x%02X\r\n",
+ StillFrameDesc->bLength, uSize);
+ OOPS();
+ }
+
+ //@@TestCase B13.5
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bEndpointAddress
+ //@@Should test to verify endpoint validity
+ // AppendTextBuffer("bEndpointAddress: 0x%02X", StillFrameDesc->bEndpointAddress);
+
+ if(USB_ENDPOINT_DIRECTION_IN(StillFrameDesc->bEndpointAddress) && StillMethod==3){
+ if((StillFrameDesc->bEndpointAddress) == 0){
+ //@@TestCase B13.6
+ //@@ERROR
+ //@@Descriptor Field - bEndPointAddress
+ //@@bEndPointAddress should be non-zero for 0 when using StillMethod 3
+ AppendTextBuffer("\r\n*!*ERROR: bEndpointAddress is reported as %d. "\
+ "This should be non-zero when using StillMethod 3.\r\n",
+ (StillFrameDesc->bEndpointAddress));
+ OOPS(); }
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Direction: IN - EndpointID: %d",
+ (StillFrameDesc->bEndpointAddress & 0x0F));
+ }
+ AppendTextBuffer("\r\n");
+ }
+ else if(USB_ENDPOINT_DIRECTION_OUT(StillFrameDesc->bEndpointAddress) && StillMethod==2) {
+ if((StillFrameDesc->bEndpointAddress & 0x0F) != 0) {
+ //@@TestCase B13.7
+ //@@ERROR
+ //@@Descriptor Field - bEndPointAddress
+ //@@The EndpointID of bEndPointAddress should be set for 0 when using StillMethod 2
+ AppendTextBuffer("\r\n*!*ERROR: The EndpointID of the "\
+ "bEndpointAddress is reported as %d. This should be 0.\r\n",
+ (StillFrameDesc->bEndpointAddress & 0x0F));
+ OOPS(); }
+ else {AppendTextBuffer("\r\n");}}
+ else if (StillFrameDesc->bEndpointAddress != 0) {
+ //@@TestCase B13.8
+ //@@ERROR
+ //@@Descriptor Field - bEndPointAddress
+ //@@The bEndPointAddress should be set for 0 when not using StillMethod 2 or 3
+ AppendTextBuffer("\r\n*!*ERROR: bEndPointAddress should be 0.\r\n");
+ OOPS(); }
+ else {AppendTextBuffer("\r\n");}
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayColorMatching()
+//
+//*****************************************************************************
+
+BOOL
+DisplayColorMatching (
+ PVIDEO_COLORFORMAT ColorMatchDesc
+ )
+{
+ //@@DisplayColorMatching -Color Matching
+
+ AppendTextBuffer("\r\n ===>Color Matching Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", ColorMatchDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", ColorMatchDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", ColorMatchDesc->bDescriptorSubtype);
+ AppendTextBuffer("bColorPrimaries: 0x%02X\r\n", ColorMatchDesc->bColorPrimaries);
+ AppendTextBuffer("bTransferCharacteristics: 0x%02X\r\n", ColorMatchDesc->bTransferCharacteristics);
+ AppendTextBuffer("bMatrixCoefficients: 0x%02X\r\n", ColorMatchDesc->bMatrixCoefficients);
+
+ if (ColorMatchDesc->bLength != sizeof(VIDEO_COLORFORMAT))
+ {
+ //@@TestCase B14.1 (Descript.c Line 1596)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ ColorMatchDesc->bLength,
+ sizeof(VIDEO_COLORFORMAT));
+ OOPS();
+ }
+
+ //@@TestCase B14.2
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bColorPrimaries
+ //@@Question - Should we test to verify bColorPrimaries
+ // AppendTextBuffer("bColorPrimaries: 0x%02X\r\n", ColorMatchDesc->bColorPrimaries);
+
+ //@@TestCase B14.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bTransferCharacteristics
+ //@@Question - Should we test to verify bTransferCharacteristics
+ // AppendTextBuffer("bTransferCharacteristics: 0x%02X\r\n", ColorMatchDesc->bTransferCharacteristics);
+
+ //@@TestCase B14.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bMatrixCoefficients
+ //@@Question - Should we test to verify bMatrixCoefficients
+ // AppendTextBuffer("bMatrixCoefficients: 0x%02X\r\n", ColorMatchDesc->bMatrixCoefficients);
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayUncompressedFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayUncompressedFormat (
+ PVIDEO_FORMAT_UNCOMPRESSED UnCompFormatDesc
+ )
+{
+ //@@DisplayUncompressedFormat - Uncompressed Format
+ int i = 0;
+ PCHAR pStr = NULL;
+ OLECHAR szGUID[256];
+
+ // Initialize the default Frame
+ g_chUNCFrameDefault = UnCompFormatDesc->bDefaultFrameIndex;
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) &UnCompFormatDesc->guidFormat, (LPOLESTR) szGUID, 255);
+ i++;
+
+ AppendTextBuffer("\r\n ===>Video Streaming Uncompressed Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", UnCompFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", UnCompFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", UnCompFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", UnCompFormatDesc->bFormatIndex);
+ AppendTextBuffer("bNumFrameDescriptors: 0x%02X\r\n", UnCompFormatDesc->bNumFrameDescriptors);
+ AppendTextBuffer("guidFormat: %S", szGUID);
+
+ pStr = VidFormatGUIDCodeToName((REFGUID) &UnCompFormatDesc->guidFormat);
+ if ( pStr )
+ {
+ if ( gDoAnnotation )
+ {
+ AppendTextBuffer(" = %s Format", pStr);
+ }
+ }
+ AppendTextBuffer("\r\n");
+ AppendTextBuffer("bBitsPerPixel: 0x%02X\r\n", UnCompFormatDesc->bBitsPerPixel);
+ AppendTextBuffer("bDefaultFrameIndex: 0x%02X\r\n", UnCompFormatDesc->bDefaultFrameIndex);
+
+ if (UnCompFormatDesc->bLength != sizeof(VIDEO_FORMAT_UNCOMPRESSED))
+ {
+ //@@TestCase B15.1 (descript.c line 925)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required
+ //@@length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ UnCompFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_UNCOMPRESSED));
+ OOPS();
+ }
+
+ if (UnCompFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B15.2 (descript.c line 930)
+ //@@ERROR
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bFormatIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ if (UnCompFormatDesc->bNumFrameDescriptors == 0 )
+ {
+ //@@TestCase B15.3 (descript.c line 930)
+ //@@ERROR
+ //@@Descriptor Field - bNumFrameDescriptors
+ //@@bNumFrameDescriptors is set to zero which is not in accordance with the
+ //@@USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bNumFrameDescriptors = 0, must have at least 1 Frame descriptor\r\n");
+ OOPS();
+ }
+
+ if(!(pStr))
+ {
+ //@@TestCase B15.4
+ //@@WARNING
+ //@@Descriptor Field - guidFormat
+ //@@guidFormat is set to unknown or undefined format
+ AppendTextBuffer("\r\n*!*WARNING: guidFormat is an unknown format\r\n");
+ OOPS();
+ }
+
+ if (UnCompFormatDesc->bBitsPerPixel == 0 )
+ {
+ //@@TestCase B15.5 (descript.c line 940)
+ //@@ERROR
+ //@@Descriptor Field - bBitsPerPixel
+ //@@bBitsPerPixel is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bBitsPerPixel = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (UnCompFormatDesc->bDefaultFrameIndex == 0 || UnCompFormatDesc->bDefaultFrameIndex >
+ UnCompFormatDesc->bNumFrameDescriptors)
+ {
+ //@@TestCase B15.6 (desctipt.c line 945)
+ //@@ERROR
+ //@@Descriptor Field - bDefaultFrameIndex
+ //@@The value for bDefaultFrameIndex is not greater than 0 or less than or equal to bNumFrameDescriptors
+ AppendTextBuffer("*!*ERROR: The value %d for the bDefaultFrameIndex is out of range, this invalidates the descriptor\r\n*!*The proper range is 1 to %d)",
+ UnCompFormatDesc->bDefaultFrameIndex,
+ UnCompFormatDesc->bNumFrameDescriptors);
+ OOPS();
+ }
+
+ AppendTextBuffer("bAspectRatioX: 0x%02X\r\n",
+ UnCompFormatDesc->bAspectRatioX);
+ AppendTextBuffer("bAspectRatioY: 0x%02X",
+ UnCompFormatDesc->bAspectRatioY);
+
+ if (((UnCompFormatDesc->bmInterlaceFlags & 0x01) &&
+ (UnCompFormatDesc->bAspectRatioY != 0 &&
+ UnCompFormatDesc->bAspectRatioX != 0)))
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Aspect Ratio is set for a %d:%d display",
+ (UnCompFormatDesc->bAspectRatioX),(UnCompFormatDesc->bAspectRatioY));
+ }
+ else
+ {
+ if (UnCompFormatDesc->bAspectRatioY != 0 || UnCompFormatDesc->bAspectRatioX != 0)
+ {
+ //@@TestCase B15.7
+ //@@ERROR
+ //@@Descriptor Field - bAspectRatioX, bAspectRatioY
+ //@@Verify that that bAspectRatioX and bAspectRatioY are set to zero
+ //@@ if stream is non-interlaced
+ AppendTextBuffer("\r\n*!*ERROR: Both bAspectRatioX and bAspectRatioY "\
+ "must equal 0 if stream is non-interlaced");
+ OOPS();
+ }
+ }
+ }
+ AppendTextBuffer("\r\nbmInterlaceFlags: 0x%02X\r\n",
+ UnCompFormatDesc->bmInterlaceFlags);
+
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" D0 = 0x%02X Interlaced stream or variable: %s\r\n",
+ (UnCompFormatDesc->bmInterlaceFlags & 1),
+ (UnCompFormatDesc->bmInterlaceFlags & 1) ? "Yes" : "No");
+ AppendTextBuffer(" D1 = 0x%02X Fields per frame: %s\r\n",
+ ((UnCompFormatDesc->bmInterlaceFlags >> 1) & 1),
+ ((UnCompFormatDesc->bmInterlaceFlags >> 1) & 1) ? "1 field" : "2 fields");
+ AppendTextBuffer(" D2 = 0x%02X Field 1 first: %s\r\n",
+ ((UnCompFormatDesc->bmInterlaceFlags >> 2) & 1),
+ ((UnCompFormatDesc->bmInterlaceFlags >> 2) & 1) ? "Yes" : "No");
+ //@@TestCase B15.9
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Validate that reserved bits (D3) are set to zero.
+ AppendTextBuffer(" D3 = 0x%02X Reserved%s\r\n",
+ ((UnCompFormatDesc->bmInterlaceFlags >> 3) & 1),
+ ((UnCompFormatDesc->bmInterlaceFlags >> 3) & 1) ?
+ "\r\n*!*ERROR: Reserved to 0" : "" );
+ AppendTextBuffer(" D4..5 = 0x%02X Field patterns ->",
+ ((UnCompFormatDesc->bmInterlaceFlags >> 4) & 3));
+ switch(UnCompFormatDesc->bmInterlaceFlags & 0x30)
+ {
+ case 0x00:
+ AppendTextBuffer(" Field 1 only");
+ break;
+ case 0x10:
+ AppendTextBuffer(" Field 2 only");
+ break;
+ case 0x20:
+ AppendTextBuffer(" Regular Pattern of fields 1 and 2");
+ break;
+ case 0x30:
+ AppendTextBuffer(" Random Pattern of fields 1 and 2");
+ break;
+ }
+ AppendTextBuffer("\r\n D6..7 = 0x%02X Display Mode ->",
+ ((UnCompFormatDesc->bmInterlaceFlags >> 6) & 3));
+
+ switch(UnCompFormatDesc->bmInterlaceFlags & 0xC0)
+ {
+ case 0x00:
+ AppendTextBuffer(" Bob only");
+ break;
+ case 0x40:
+ AppendTextBuffer(" Weave only");
+ break;
+ case 0x80:
+ AppendTextBuffer(" Bob or weave");
+ break;
+ case 0xC0:
+ //@@TestCase B15.10
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Question - Should we validate that reserved bits are set to zero?
+ AppendTextBuffer(" Reserved");
+ break;
+ }
+ }
+
+ //@@TestCase B15.11
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bCopyProtect
+ //@@Question - Are their reserved bits and should we validate that
+ //@@ reserved bits are set to zero?
+ AppendTextBuffer("\r\nbCopyProtect: 0x%02X",
+ UnCompFormatDesc->bCopyProtect);
+ if (gDoAnnotation)
+ {
+ if (UnCompFormatDesc->bCopyProtect)
+ AppendTextBuffer(" -> Duplication Restricted");
+ else
+ AppendTextBuffer(" -> Duplication Unrestricted");
+ }
+ AppendTextBuffer("\r\n");
+
+ //@@TestCase B15.12
+ //@@We should check to make sure that a Color Matching Descriptor is included in the device
+ // Check that the correct number of Frame Descriptors and one Color Matching
+ // descriptor follow
+ CheckForColorMatchingDesc ((PVIDEO_SPECIFIC) UnCompFormatDesc,
+ UnCompFormatDesc->bNumFrameDescriptors, VS_FRAME_UNCOMPRESSED);
+
+ return TRUE;
+ }
+
+
+//*****************************************************************************
+//
+// DisplayUncompressedFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayUncompressedFrameType (
+ PVIDEO_FRAME_UNCOMPRESSED UnCompFrameDesc
+ )
+{
+ size_t bLength = 0;
+ bLength = SizeOfVideoFrameUncompressed(UnCompFrameDesc);
+
+ //@@DisplayUncompressedFrameType -Uncompressed Frame
+
+ AppendTextBuffer("\r\n ===>Video Streaming Uncompressed Frame Type Descriptor<===\r\n");
+ if (gDoAnnotation)
+ {
+ if(UnCompFrameDesc->bFrameIndex == g_chUNCFrameDefault)
+ {
+ AppendTextBuffer(" --->This is the Default (optimum) Frame index\r\n");
+ }
+ }
+ AppendTextBuffer("bLength: 0x%02X\r\n", UnCompFrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", UnCompFrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", UnCompFrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFrameIndex: 0x%02X\r\n", UnCompFrameDesc->bFrameIndex);
+ AppendTextBuffer("bmCapabilities: 0x%02X\r\n", UnCompFrameDesc->bmCapabilities);
+ AppendTextBuffer("wWidth: 0x%04X = %d\r\n", UnCompFrameDesc->wWidth, UnCompFrameDesc->wWidth);
+ AppendTextBuffer("wHeight: 0x%04X = %d\r\n", UnCompFrameDesc->wHeight, UnCompFrameDesc->wHeight);
+ AppendTextBuffer("dwMinBitRate: 0x%08X\r\n", UnCompFrameDesc->dwMinBitRate);
+ AppendTextBuffer("dwMaxBitRate: 0x%08X\r\n", UnCompFrameDesc->dwMaxBitRate);
+ AppendTextBuffer("dwMaxVideoFrameBufferSize: 0x%08X\r\n", UnCompFrameDesc->dwMaxVideoFrameBufferSize);
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+ AppendTextBuffer("dwDefaultFrameInterval: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ UnCompFrameDesc->dwDefaultFrameInterval,
+ ((double)UnCompFrameDesc->dwDefaultFrameInterval)/10000.0,
+ (10000000.0/((double)UnCompFrameDesc->dwDefaultFrameInterval))
+ );
+ AppendTextBuffer("bFrameIntervalType: 0x%02X\r\n", UnCompFrameDesc->bFrameIntervalType);
+
+ if (UnCompFrameDesc->bLength != bLength)
+ {
+ //@@TestCase B15.1 (descript.c line 925)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required
+ //@@length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ UnCompFrameDesc->bLength, bLength);
+ OOPS();
+ }
+
+ if (UnCompFrameDesc->bFrameIndex == 0 )
+ {
+ //@@TestCase B16.2 (descript.c line 991)
+ //@@ERROR
+ //@@Descriptor Field - bFrameIndex
+ //@@bFrameIndex must be nonzero
+ AppendTextBuffer("*!*ERROR: bFrameIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B16.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmCapabilities
+ //@@Question: Should we try to verify that bmCapabilities is valid?
+ // AppendTextBuffer("bmCapabilities: 0x%02X\r\n", UnCompFrameDesc->bmCapabilities);
+
+ if (UnCompFrameDesc->wWidth == 0 )
+ {
+ //@@TestCase B16.4 (descript.c line 996)
+ //@@ERROR
+ //@@Descriptor Field - wWidth
+ //@@wWidth must be nonzero
+ AppendTextBuffer("*!*ERROR: wWidth must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (UnCompFrameDesc->wHeight == 0 )
+ {
+ //@@TestCase B16.5 (descript.c line 1001)
+ //@@ERROR
+ //@@Descriptor Field - wHeight
+ //@@wHeight must be nonzero
+ AppendTextBuffer("*!*ERROR: wHeight must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (UnCompFrameDesc->dwMinBitRate == 0 )
+ {
+ //@@TestCase B16.6 (descript.c line 1006)
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate
+ //@@dwMinBitRate must be nonzero
+ AppendTextBuffer("*!*ERROR: dwMinBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (UnCompFrameDesc->dwMaxBitRate == 0 )
+ {
+ //@@TestCase B16.7 (descript.c line 1011)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxBitRate
+ //@@dwMaxBitRate must be nonzero
+ AppendTextBuffer("*!*ERROR: dwMaxBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if(UnCompFrameDesc->dwMinBitRate > UnCompFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B16.8
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is greater than dwMinBitRate
+ AppendTextBuffer("*!*ERROR: dwMinBitRate should be less than dwMaxBitRate\r\n");
+ OOPS();
+ }
+ else
+ {
+ if (UnCompFrameDesc->bFrameIntervalType == 1 &&
+ UnCompFrameDesc->dwMinBitRate != UnCompFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B16.9
+ //@@WARNING
+ //@@Descriptor Field - bFrameIntervalType, dwMinBitRate, and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is equal to dwMinBitRate if bFrameIntervalType is 1
+ AppendTextBuffer("*!*WARNING: if bFrameIntervalType is 1 then dwMinBitRate "\
+ "should equal dwMaxBitRate\r\n");
+ OOPS();
+ }
+ }
+
+ if (UnCompFrameDesc->dwMaxVideoFrameBufferSize == 0 )
+ {
+ //@@TestCase B16.10 (descript.c line 1015)
+ //@@WARNING
+ //@@Descriptor Field - bFrameIndex
+ //@@bFrameIndex must be nonzero
+ AppendTextBuffer("*!*WARNING: dwMaxVideoFrameBufferSize must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (UnCompFrameDesc->dwDefaultFrameInterval == 0 )
+ {
+ //@@TestCase B16.11 (descript.c line 1020)
+ //@@WARNING
+ //@@Descriptor Field - dwDefaultFrameInterval
+ //@@dwDefaultFrameInterval must be nonzero
+ AppendTextBuffer("*!*WARNING: dwDefaultFrameInterval must be nonzero\r\n");
+ OOPS();
+ }
+ if (0 == UnCompFrameDesc->bFrameIntervalType)
+ {
+ DisplayUnComContinuousFrameType(UnCompFrameDesc);
+ }
+ else
+ {
+ DisplayUnComDiscreteFrameType(UnCompFrameDesc);
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayUnComContinuousFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayUnComContinuousFrameType(
+ PVIDEO_FRAME_UNCOMPRESSED UContinuousDesc
+ )
+{
+ //@@DisplayUnComContinuousFrameType -Uncompressed Continuous Frame
+ ULONG dwMinFrameInterval = UContinuousDesc->adwFrameInterval[0];
+ ULONG dwMaxFrameInterval = UContinuousDesc->adwFrameInterval[1];
+ ULONG dwFrameIntervalStep = UContinuousDesc->adwFrameInterval[2];
+
+ AppendTextBuffer("===>Additional Continuous Frame Type Data\r\n");
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+
+ AppendTextBuffer("dwMinFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMinFrameInterval,
+ ((double)dwMinFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMinFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwMaxFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMaxFrameInterval,
+ ((double)dwMaxFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMaxFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwFrameIntervalStep: 0x%08X\r\n", dwFrameIntervalStep);
+
+ if (dwMinFrameInterval == 0 )
+ {
+ //@@TestCase B17.2 (descript.c line 1025)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval
+ //@@dwMinFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (dwMaxFrameInterval == 0 )
+ {
+ //@@TestCase B17.3 (descript.c line 1025)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxFrameInterval
+ //@@dwMaxFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(dwMinFrameInterval > dwMaxFrameInterval)
+ {
+ //@@TestCase B17.4 (descript.c 1043)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval is larger that dwMaxFrameInterval, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+ else if ((dwMinFrameInterval + dwFrameIntervalStep) > dwMaxFrameInterval)
+ {
+ //@@TestCase B17.5
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval combined with dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMinFrameInterval + dwFrameIntervalStep is greater than dwMaxFrameInterval, this could cause problems\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) == 0 )
+ {
+ //@@TestCase B17.6
+ //@@CAUTION
+ //@@Descriptor Field - dwFrameIntervalStep
+ //@@Suggestion to use descrite frames if dwFrameIntervalStep is zero
+ AppendTextBuffer("*!*CAUTION: dwFrameIntervalStep equals zero, consider using discrete frames\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) % dwFrameIntervalStep )
+ {
+ //@@TestCase B17.7 (descript.c 1052)
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the difference between dwMaxFrameInterval and dwMinFrameInterval is evenly divisible by dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMaxFrameInterval minus dwMinFrameInterval is not evenly divisible by dwFrameIntervalStep, this could cause problems\r\n");
+ OOPS();
+ }
+
+ if (dwFrameIntervalStep == 0 && (dwMaxFrameInterval - dwMinFrameInterval))
+ {
+ //@@TestCase B17.8 (descript.c line 1032)
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the dwFrameIntervalStep is not zero if there is a difference between dwMaxFrameInterval and dwMinFrameInterval
+ AppendTextBuffer("*!*WARNING: dwFrameIntervalStep = 0, this invalidates the descriptor when there is a difference between dwMinFrameInterval and dwMaxFrameInterval\r\n");
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayUnComDiscreteFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayUnComDiscreteFrameType(
+ PVIDEO_FRAME_UNCOMPRESSED UDiscreteDesc
+ )
+{
+ //@@DisplayUnComDiscreteFrameType -Uncompressed Discrete Frame
+ UINT iNdex = 1;
+ UINT iCurFrame = 0;
+ ULONG * ulFrameInterval = NULL;
+
+ AppendTextBuffer("===>Additional Discrete Frame Type Data\r\n");
+
+ // There are (UDiscreteDesc->bFrameIntervalType) dwFrameIntervals (1 based index)
+ for (; iNdex <= UDiscreteDesc->bFrameIntervalType; iNdex++, iCurFrame++)
+ {
+ ulFrameInterval = &UDiscreteDesc->adwFrameInterval[iCurFrame];
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+ AppendTextBuffer("dwFrameInterval[%d]: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ iNdex, *ulFrameInterval,
+ ((double)*ulFrameInterval)/10000.0,
+ (10000000.0/((double)*ulFrameInterval))
+ );
+ if (0 == *ulFrameInterval)
+ {
+ //@@TestCase B18.1 (descript.c line 1061)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[x] must be non-zero
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[%d] must be non-zero\r\n", iNdex);
+ OOPS();
+ }
+ if ((iNdex > 1)&&(*ulFrameInterval <= UDiscreteDesc->adwFrameInterval[iCurFrame - 1]))
+ {
+ //@@TestCase B18.2 (descript.c line 1067)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[n] must be greater than dwFrameInterval[n - 1]
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[0x%02X] must be "\
+ "greater than preceding dwFrameInterval[0x%02X]\r\n", iNdex, iNdex - 1);
+ OOPS();
+ }
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayMJPEGFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMJPEGFormat (
+ PVIDEO_FORMAT_MJPEG MJPEGFormatDesc
+ )
+{
+ //@@DisplayMJPEGFormat - MJPEG Format
+ // Initialize the default Frame
+ g_chMJPEGFrameDefault = MJPEGFormatDesc->bDefaultFrameIndex;
+
+ AppendTextBuffer("\r\n ===>Video Streaming MJPEG Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", MJPEGFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MJPEGFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MJPEGFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", MJPEGFormatDesc->bFormatIndex);
+ AppendTextBuffer("bNumFrameDescriptors: 0x%02X\r\n", MJPEGFormatDesc->bNumFrameDescriptors);
+
+ if (MJPEGFormatDesc->bLength != sizeof(VIDEO_FORMAT_MJPEG))
+ {
+ //@@TestCase B19.1 (descript.c line 1098)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the
+ //@@ required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ MJPEGFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_MJPEG));
+ OOPS();
+ }
+
+ if (MJPEGFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B19.2 (descript.c line 1103)
+ //@@ERROR
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with
+ //@@ the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bFormatIndex must be non-zero\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFormatDesc->bNumFrameDescriptors == 0 )
+ {
+ //@@TestCase B19.3 (descript.c line 1108)
+ //@@ERROR
+ //@@Descriptor Field - bNumFrameDescriptors
+ //@@bNumFrameDescriptors is set to zero which is not in accordance
+ //@@ with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bNumFrameDescriptors must be non-zero\r\n");
+ OOPS();
+ }
+
+ AppendTextBuffer("bmFlags: 0x%02X",
+ (MJPEGFormatDesc->bmFlags & 0x01));
+
+ //@@TestCase B19.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmFlags
+ //@@We should validate that reserved bits are set to zero.
+ if (gDoAnnotation)
+ {
+ if(MJPEGFormatDesc->bmFlags & 0x01)
+ {
+ AppendTextBuffer(" -> Sample Size is Fixed");
+ }
+ else
+ {
+ AppendTextBuffer(" -> Sample Size is Not Fixed");
+ }
+ }
+ AppendTextBuffer("\r\nbDefaultFrameIndex: 0x%02X\r\n",
+ MJPEGFormatDesc->bDefaultFrameIndex);
+
+ if (MJPEGFormatDesc->bDefaultFrameIndex == 0 ||
+ MJPEGFormatDesc->bDefaultFrameIndex >
+ MJPEGFormatDesc->bNumFrameDescriptors)
+ {
+ //@@TestCase B19.5 (descript.c line 1113)
+ //@@ERROR
+ //@@Descriptor Field - bDefaultFrameIndex
+ //@@bDefaultFrameIndex is not in the domain of constrained by
+ //@@ bNumFrameDescriptors
+ AppendTextBuffer("*!*ERROR: bDefaultFrameIndex 0x%02X invalid, should "\
+ "be between 1 and 0x%02x/r/n",
+ MJPEGFormatDesc->bDefaultFrameIndex,
+ MJPEGFormatDesc->bNumFrameDescriptors);
+ OOPS();
+ }
+
+ AppendTextBuffer("bAspectRatioX: 0x%02X\r\n",
+ MJPEGFormatDesc->bAspectRatioX);
+ AppendTextBuffer("bAspectRatioY: 0x%02X",
+ MJPEGFormatDesc->bAspectRatioY);
+
+ if(((MJPEGFormatDesc->bmInterlaceFlags & 0x01) &&
+ ((MJPEGFormatDesc->bAspectRatioY != 0) &&
+ (MJPEGFormatDesc->bAspectRatioX != 0))))
+ {
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Aspect Ratio is set for a %d:%d display",
+ (MJPEGFormatDesc->bAspectRatioX), (MJPEGFormatDesc->bAspectRatioY));
+ }
+ }
+ else
+ {
+ if (MJPEGFormatDesc->bAspectRatioY != 0 || MJPEGFormatDesc->bAspectRatioX != 0)
+ {
+ //@@TestCase B19.6
+ //@@ERROR
+ //@@Descriptor Field - bAspectRatioX and bAspectRatioY
+ //@@Verify that that bAspectRatioX and bAspectRatioY are set to zero
+ //@@ if stream is non-interlaced
+ AppendTextBuffer("\r\n*!*ERROR: bAspectRatioX and bAspectRatioY must "\
+ "be 0 if stream non-Interlaced");
+ OOPS();
+ }
+ }
+ AppendTextBuffer("\r\nbmInterlaceFlags: 0x%02X\r\n",
+ MJPEGFormatDesc->bmInterlaceFlags);
+
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" D00 = %x %sInterlaced stream or variable\r\n",
+ (MJPEGFormatDesc->bmInterlaceFlags & 1),
+ (MJPEGFormatDesc->bmInterlaceFlags & 1) ? "" : " non-");
+ AppendTextBuffer(" D01 = %x %s per frame\r\n",
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 1) & 1),
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 1) & 1) ? " 1 field" : " 2 fields");
+ AppendTextBuffer(" D02 = %x Field 1 %sfirst\r\n",
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 2) & 1),
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 2) & 1) ? "" : "not ");
+ //@@TestCase B19.7
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Validate that reserved bits (D3) are set to zero.
+ AppendTextBuffer(" D03 = %x Reserved%s\r\n",
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 3) & 1),
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 3) & 1) ?
+ "\r\n*!*ERROR: non zero" : "" );
+ AppendTextBuffer(" D4..5 = %x Field patterns ->",
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 4) & 3));
+ switch (MJPEGFormatDesc->bmInterlaceFlags & 0x30)
+ {
+ case 0x00:
+ AppendTextBuffer(" Field 1 only");
+ break;
+ case 0x10:
+ AppendTextBuffer(" Field 2 only");
+ break;
+ case 0x20:
+ AppendTextBuffer(" Regular Pattern of fields 1 and 2");
+ break;
+ case 0x30:
+ AppendTextBuffer(" Random Pattern of fields 1 and 2");
+ break;
+ }
+ AppendTextBuffer("\r\n D6..7 = %x Display Mode ->",
+ ((MJPEGFormatDesc->bmInterlaceFlags >> 6) & 3));
+ switch(MJPEGFormatDesc->bmInterlaceFlags & 0xC0)
+ {
+ case 0x00:
+ AppendTextBuffer(" Bob only");
+ break;
+ case 0x40:
+ AppendTextBuffer(" Weave only");
+ break;
+ case 0x80:
+ AppendTextBuffer(" Bob or weave");
+ break;
+ case 0xC0:
+ //@@TestCase B19.8
+ //@@Not yet implemented - Priority 3
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Question - Should we validate that reserved bits are set to zero?
+ AppendTextBuffer(" Reserved");
+ break;
+ }
+ }
+
+ //@@TestCase B19.9
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bCopyProtect
+ //@@Question - Are their reserved bits and should we validate that
+ //@@ reserved bits are set to zero?
+ AppendTextBuffer("\r\nbCopyProtect: 0x%02X",
+ MJPEGFormatDesc->bCopyProtect);
+ if (gDoAnnotation)
+ {
+ if (MJPEGFormatDesc->bCopyProtect)
+ AppendTextBuffer(" -> Duplication Restricted");
+ else
+ AppendTextBuffer(" -> Duplication Unrestricted");
+ }
+ AppendTextBuffer("\r\n");
+
+ // Check that the correct number of Frame Descriptors and one Color Matching
+ // descriptor follow
+ CheckForColorMatchingDesc ((PVIDEO_SPECIFIC) MJPEGFormatDesc,
+ MJPEGFormatDesc->bNumFrameDescriptors, VS_FRAME_MJPEG);
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayMJPEGFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMJPEGFrameType (
+ PVIDEO_FRAME_MJPEG MJPEGFrameDesc
+ )
+{
+ //@@DisplayMJPEGFrameType -MJPEG Frame
+ size_t bLength = 0;
+ bLength = SizeOfVideoFrameMjpeg(MJPEGFrameDesc);
+
+ AppendTextBuffer("\r\n ===>Video Streaming MJPEG Frame Type Descriptor<===\r\n");
+ if (gDoAnnotation)
+ {
+ if(MJPEGFrameDesc->bFrameIndex == g_chMJPEGFrameDefault)
+ {
+ AppendTextBuffer(" --->This is the Default (optimum) Frame index\r\n");
+ }
+ }
+ AppendTextBuffer("bLength: 0x%02X\r\n", MJPEGFrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MJPEGFrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MJPEGFrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFrameIndex: 0x%02X\r\n", MJPEGFrameDesc->bFrameIndex);
+ AppendTextBuffer("bmCapabilities: 0x%02X\r\n", MJPEGFrameDesc->bmCapabilities);
+ AppendTextBuffer("wWidth: 0x%04X = %d\r\n", MJPEGFrameDesc->wWidth, MJPEGFrameDesc->wWidth);
+ AppendTextBuffer("wHeight: 0x%04X = %d\r\n", MJPEGFrameDesc->wHeight, MJPEGFrameDesc->wHeight);
+ AppendTextBuffer("dwMinBitRate: 0x%08X\r\n", MJPEGFrameDesc->dwMinBitRate);
+ AppendTextBuffer("dwMaxBitRate: 0x%08X\r\n", MJPEGFrameDesc->dwMaxBitRate);
+ AppendTextBuffer("dwMaxVideoFrameBufferSize: 0x%08X\r\n", MJPEGFrameDesc->dwMaxVideoFrameBufferSize);
+
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+ AppendTextBuffer("dwDefaultFrameInterval: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ MJPEGFrameDesc->dwDefaultFrameInterval,
+ ((double)MJPEGFrameDesc->dwDefaultFrameInterval)/10000.0,
+ (10000000.0/((double)MJPEGFrameDesc->dwDefaultFrameInterval))
+ );
+ AppendTextBuffer("bFrameIntervalType: 0x%02X\r\n", MJPEGFrameDesc->bFrameIntervalType);
+
+ if (MJPEGFrameDesc->bLength != bLength)
+ {
+ //@@TestCase B20.1 (descript.c line 1154)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is less than required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d is incorrect, should be %d\r\n",
+ MJPEGFrameDesc->bLength, bLength);
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->bFrameIndex == 0 )
+ {
+ //@@TestCase B20.2 (descript.c line 1159)
+ //@@WARNING
+ //@@Descriptor Field - bFrameIndex
+ //@@bFrameIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFrameIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B20.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bmCapabilities
+ //@@Question: Should we try to verify that bmCapabilities is valid?
+ // AppendTextBuffer("bmCapabilities: 0x%02X\r\n", MJPEGFrameDesc->bmCapabilities);
+
+ if (MJPEGFrameDesc->wWidth == 0 )
+ {
+ //@@TestCase B20.4 (descript.c line 1164)
+ //@@ERROR
+ //@@Descriptor Field - wWidth
+ //@@wWidth is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: wWidth = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->wHeight == 0 )
+ {
+ //@@TestCase B20.5 (descript.c line 1169)
+ //@@ERROR
+ //@@Descriptor Field - wHeight
+ //@@wHeight is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: wHeight = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->dwMinBitRate == 0 )
+ {
+ //@@TestCase B20.6 (descript.c line 1174)
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate
+ //@@dwMinBitRate is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinBitRate = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->dwMaxBitRate == 0 )
+ {
+ //@@TestCase B20.7 (descript.c line 1179)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxBitRate
+ //@@dwMaxBitRate is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxBitRate = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(MJPEGFrameDesc->dwMinBitRate > MJPEGFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B20.8
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is greater than dwMinBitRate
+ AppendTextBuffer("*!*ERROR: dwMinBitRate > dwMaxBitRate, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+ else if(MJPEGFrameDesc->bFrameIntervalType == 1 && MJPEGFrameDesc->dwMinBitRate != MJPEGFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B20.9
+ //@@WARNING
+ //@@Descriptor Field - bFrameIntervalType, dwMinBitRate, and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is equal to dwMinBitRate if bFrameIntervalType is 1
+ AppendTextBuffer("*!*WARNING: if bFrameIntervalType is 1 then dwMinBitRate should equal dwMaxBitRate\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->dwMaxVideoFrameBufferSize == 0 )
+ {
+ //@@TestCase B20.10 (descript.c line 1183)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxVideoFrameBufferSize
+ //@@dwMaxVideoFrameBufferSize is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxVideoFrameBufferSize = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (MJPEGFrameDesc->dwMaxVideoFrameBufferSize == 0 )
+ {
+ //@@TestCase B20.11 (descript.c line 1188)
+ //@@ERROR
+ //@@Descriptor Field - dwDefaultFrameInterval
+ //@@dwDefaultFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwDefaultFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (0 == MJPEGFrameDesc->bFrameIntervalType)
+ {
+ DisplayMJPEGContinuousFrameType(MJPEGFrameDesc);
+ }
+ else
+ {
+ DisplayMJPEGDiscreteFrameType(MJPEGFrameDesc);
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayMJPEGContinuousFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMJPEGContinuousFrameType(
+ PVIDEO_FRAME_MJPEG MContinuousDesc
+ )
+{
+ //@@DisplayMJPEGContinuousFrameType - MJPEG Continuous Frame
+ ULONG dwMinFrameInterval = MContinuousDesc->adwFrameInterval[0];
+ ULONG dwMaxFrameInterval = MContinuousDesc->adwFrameInterval[1];
+ ULONG dwFrameIntervalStep = MContinuousDesc->adwFrameInterval[2];
+
+ AppendTextBuffer("===>Additional Continuous Frame Type Data\r\n");
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+
+ AppendTextBuffer("dwMinFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMinFrameInterval,
+ ((double)dwMinFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMinFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwMaxFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMaxFrameInterval,
+ ((double)dwMaxFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMaxFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwFrameIntervalStep: 0x%08X\r\n", dwFrameIntervalStep);
+
+ if (dwMinFrameInterval == 0 )
+ {
+ //@@TestCase B21.2 (descript.c line 1188)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval
+ //@@dwMinFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (dwMaxFrameInterval == 0 )
+ {
+ //@@TestCase B21.3 (descript.c line 1188)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxFrameInterval
+ //@@dwMaxFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(dwMinFrameInterval > dwMaxFrameInterval)
+ {
+ //@@TestCase B21.4 (descript.c line 1211)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval is larger that dwMaxFrameInterval, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+ else if ((dwMinFrameInterval + dwFrameIntervalStep) > dwMaxFrameInterval)
+ {
+ //@@TestCase B21.5
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval combined with dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMinFrameInterval + dwFrameIntervalStep is greater than dwMaxFrameInterval, this could cause problems\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) == 0 )
+ {
+ //@@TestCase B21.6
+ //@@CAUTION
+ //@@Descriptor Field - dwFrameIntervalStep
+ //@@Suggestion to use descrite frames if dwFrameIntervalStep is zero
+ AppendTextBuffer("*!*CAUTION: dwFrameIntervalStep equals zero, consider using discrete frames\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) % dwFrameIntervalStep )
+ {
+ //@@TestCase B21.7 (descript.c line 1220)
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the difference between dwMaxFrameInterval and dwMinFrameInterval is evenly divisible by dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMaxFrameInterval minus dwMinFrameInterval is not evenly divisible by dwFrameIntervalStep, this could cause problems\r\n");
+ OOPS();
+ }
+
+ if (dwFrameIntervalStep == 0 && (dwMaxFrameInterval - dwMinFrameInterval))
+ {
+ //@@TestCase B21.8 (descript.c line 1200)
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the dwFrameIntervalStep is not zero if there is a difference between dwMaxFrameInterval and dwMinFrameInterval
+ AppendTextBuffer("*!*WARNING: dwFrameIntervalStep = 0, this invalidates the descriptor when there is a difference between \r\n *!*dwMinFrameInterval and dwMaxFrameInterval\r\n");
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayMJPEGDiscreteFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMJPEGDiscreteFrameType(
+ PVIDEO_FRAME_MJPEG MDiscreteDesc
+ )
+{
+ //@@DisplayMJPEGDiscreteFrameType -MJPEG Discrete Frame
+ UINT iNdex = 1;
+ UINT iCurFrame = 0;
+ ULONG * ulFrameInterval = NULL;
+
+ AppendTextBuffer("===>Additional Discrete Frame TypeData\r\n");
+
+ // There are (MDiscreteDesc->bFrameIntervalType) dwFrameIntervals (1 based index)
+ for (; iNdex <= MDiscreteDesc->bFrameIntervalType; iNdex++, iCurFrame++)
+ {
+ ulFrameInterval = &MDiscreteDesc->adwFrameInterval[iCurFrame];
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+ AppendTextBuffer("dwFrameInterval[%d]: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ iNdex, *ulFrameInterval,
+ ((double)*ulFrameInterval)/10000.0,
+ (10000000.0/((double)*ulFrameInterval))
+ );
+ if (0 == *ulFrameInterval)
+ {
+ //@@TestCase B22.1 (descript.c line 1229)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[x] must be non-zero
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[%d] must be non-zero\r\n", iNdex);
+ OOPS();
+ }
+ if ((iNdex > 1)&&(*ulFrameInterval <= MDiscreteDesc->adwFrameInterval[iCurFrame - 1]))
+ {
+ //@@TestCase B22.2 (descript.c line 1235)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[n] must be greater than dwFrameInterval[n - 1]
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[0x%02X] must be "\
+ "greater than preceding dwFrameInterval[0x%02X]\r\n", iNdex, iNdex - 1);
+ OOPS();
+ }
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayMPEG1SSFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMPEG1SSFormat (
+ PVIDEO_FORMAT_MPEG1SS MPEG1SSFormatDesc
+ )
+{
+ //@@DisplayMPEG1SSFormat -MPEG1 SS Format
+ AppendTextBuffer("\r\n ===>Video Streaming MPEG1-SS Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", MPEG1SSFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MPEG1SSFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MPEG1SSFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", MPEG1SSFormatDesc->bFormatIndex);
+ AppendTextBuffer("wPacketLength: 0x%02X\r\n", MPEG1SSFormatDesc->bPacketLength);
+ AppendTextBuffer("wPackLength: 0x%02X\r\n", MPEG1SSFormatDesc->bPackLength);
+ AppendTextBuffer("bPackdataType: 0x%02X", (MPEG1SSFormatDesc->bPackDataType));
+ if(gDoAnnotation) {
+ if(MPEG1SSFormatDesc->bPackDataType & 0x01){AppendTextBuffer(" -> Pack data size fixed\r\n");}
+ else {AppendTextBuffer(" -> Pack data size variable\r\n"); }}
+ else {AppendTextBuffer("\r\n");}
+
+
+ if (MPEG1SSFormatDesc->bLength != sizeof(VIDEO_FORMAT_MPEG1SS))
+ {
+ //@@TestCase B23.1 (descript.c line 1514)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d. USBView cannot correctly display descriptor\r\n",
+ MPEG1SSFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_MPEG1SS));
+ OOPS();
+ }
+
+ if (MPEG1SSFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B23.2 (descript.c line 1519)
+ //@@WARNING
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFormatIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B23.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bPackdataType
+ //@@Question - Should we validate that reserved bits are set to zero?
+ // AppendTextBuffer("bPackdataType: 0x%02X", (MPEG1SSFormatDesc->bPackdataType & 0x01));
+
+ // This descriptor is deprecated for UVC 1.1
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC version >= 1.1 devices\r\n");
+ }
+#else
+ if (UVC11 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.1 devices\r\n");
+ }
+#endif
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayMPEG2PSFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMPEG2PSFormat (
+ PVIDEO_FORMAT_MPEG2PS MPEG2PSFormatDesc
+ )
+{
+ //@@DisplayMPEG2PSFormat -MPEG2 PS Format
+ AppendTextBuffer("\r\n ===>Video Streaming MPEG2-PS Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", MPEG2PSFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MPEG2PSFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MPEG2PSFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", MPEG2PSFormatDesc->bFormatIndex);
+ AppendTextBuffer("bPacketLength: 0x%02X\r\n", MPEG2PSFormatDesc->bPacketLength);
+ AppendTextBuffer("bPackLength: 0x%02X\r\n", MPEG2PSFormatDesc->bPackLength);
+ AppendTextBuffer("bPackDataType: 0x%02X", (MPEG2PSFormatDesc->bPackDataType));
+
+ if (MPEG2PSFormatDesc->bLength != sizeof(VIDEO_FORMAT_MPEG2PS))
+ {
+ //@@TestCase B24.1 (descript.c line 1542)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d. USBView cannot correctly display descriptor\r\n",
+ MPEG2PSFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_MPEG2PS));
+ OOPS();
+ AppendTextBuffer("*!*USBView will try to display the rest of the descriptor but results may not be accurate\r\n");
+ }
+
+ if (MPEG2PSFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B24.2 (descript.c line 1547)
+ //@@WARNING
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFormatIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B24.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bPackdataType
+ //@@Question - Should we validate that reserved bits are set to zero?
+ // AppendTextBuffer("bPackdataType: 0x%02X", (MPEG2PSFormatDesc->bPackdataType & 0x01));
+
+ // This descriptor is deprecated for UVC 1.1
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC version >= 1.1 devices\r\n");
+ }
+#else
+ if (UVC11 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.1 devices\r\n");
+ }
+#endif
+
+ return TRUE;
+
+}
+
+
+//*****************************************************************************
+//
+// DisplayMPEG2TSFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMPEG2TSFormat (
+ PVIDEO_FORMAT_MPEG2TS MPEG2TSFormatDesc
+ )
+{
+ //@@DisplayMPEG2TSFormat -MPEG2 TS Format
+ UCHAR bLength = sizeof(VIDEO_FORMAT_MPEG2TS);
+
+ AppendTextBuffer("\r\n ===>Video Streaming MPEG2-TS Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", MPEG2TSFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MPEG2TSFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MPEG2TSFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", MPEG2TSFormatDesc->bFormatIndex);
+ AppendTextBuffer("bDataOffset: 0x%02X\r\n", MPEG2TSFormatDesc->bDataOffset);
+ AppendTextBuffer("bPacketLength: 0x%02X\r\n", MPEG2TSFormatDesc->bPacketLength);
+ AppendTextBuffer("bStrideLength: 0x%02X\r\n", MPEG2TSFormatDesc->bStrideLength);
+
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+#else
+ if (UVC11 == g_chUVCversion)
+#endif
+ {
+ int i = 0;
+ PCHAR pStr = NULL;
+ OLECHAR szGUID[256];
+ GUID * pStrideGuid = NULL;
+
+ pStrideGuid = (GUID *) (&MPEG2TSFormatDesc->bStrideLength + 1);
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) pStrideGuid, (LPOLESTR) szGUID, 255);
+ i++;
+ AppendTextBuffer("guidStrideFormat: %S", szGUID);
+ pStr = VidFormatGUIDCodeToName((REFGUID) pStrideGuid);
+ if(gDoAnnotation)
+ {
+ if (pStr)
+ {
+ AppendTextBuffer(" = %s Format", pStr);
+ }
+ }
+ AppendTextBuffer("\r\n");
+ bLength = sizeof(VIDEO_FORMAT_MPEG2TS) + sizeof(GUID);
+ }
+
+ if (MPEG2TSFormatDesc->bLength != bLength)
+ {
+ //@@TestCase B25.1 (descript.c line 1486)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ MPEG2TSFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_MPEG2TS));
+ OOPS();
+ }
+
+ if (MPEG2TSFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B25.2 (descript.c line 1491)
+ //@@WARNING
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFormatIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ //@@TestCase B25.3
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bDataOffset, wPacket and wStride
+ //@@Question - Should we check that if bDataOffset is 0 that wPacket and wStride should equal each other
+ // AppendTextBuffer("bDataOffset: 0x%02X\r\n", MPEG2TSFormatDesc->bDataOffset);
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayMPEG4SLFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayMPEG4SLFormat (
+ PVIDEO_FORMAT_MPEG4SL MPEG4SLFormatDesc
+ )
+{
+ //@@DisplayMPEG4SLFormat -MPEG4 SL Format
+
+ AppendTextBuffer("\r\n ===>Video Streaming MPEG4-SL Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", MPEG4SLFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", MPEG4SLFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", MPEG4SLFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", MPEG4SLFormatDesc->bFormatIndex);
+ AppendTextBuffer("bPacketLength: 0x%02X\r\n", MPEG4SLFormatDesc->bPacketLength);
+
+ if (MPEG4SLFormatDesc->bLength != sizeof(VIDEO_FORMAT_MPEG4SL))
+ {
+ //@@TestCase B26.1 (descript.c line 1568)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d. USBView cannot correctly display descriptor\r\n",
+ MPEG4SLFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_MPEG4SL));
+ OOPS();
+ }
+
+ if (MPEG4SLFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B26.2 (descript.c line 1573)
+ //@@WARNING
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFormatIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ // This descriptor is deprecated for UVC 1.1
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC version >= 1.1 devices\r\n");
+ }
+#else
+ if (UVC11 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.1 devices\r\n");
+ }
+#endif
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayStreamPayload()
+//
+//*****************************************************************************
+
+BOOL
+DisplayStreamPayload (
+ PVIDEO_FORMAT_STREAM StreamPayloadDesc
+ )
+{
+ //@@DisplayStreamPayload -Stream Based Payload Format
+ PCHAR pStr = NULL;
+ OLECHAR szGUID[256];
+ int i = 0;
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) &StreamPayloadDesc->guidFormat, (LPOLESTR) szGUID, 255);
+ i++;
+
+ AppendTextBuffer("\r\n ===>Video Streaming Stream Based Payload Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", StreamPayloadDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", StreamPayloadDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", StreamPayloadDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", StreamPayloadDesc->bFormatIndex);
+ AppendTextBuffer("guidFormat: %S", szGUID);
+
+ pStr = VidFormatGUIDCodeToName((REFGUID) &StreamPayloadDesc->guidFormat);
+ if(gDoAnnotation)
+ {
+ if (pStr)
+ {
+ AppendTextBuffer(" = %s Format", pStr);
+ }
+ }
+ AppendTextBuffer("\r\n");
+ AppendTextBuffer("dwPacketLength: 0x%02X\r\n", StreamPayloadDesc->dwPacketLength);
+
+ if (StreamPayloadDesc->bLength != sizeof(VIDEO_FORMAT_STREAM))
+ {
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ StreamPayloadDesc->bLength,
+ sizeof(PVIDEO_FORMAT_STREAM));
+ OOPS();
+ }
+
+ if (StreamPayloadDesc->bFormatIndex == 0 )
+ {
+ //@@WARNING
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: bFormatIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ // This descriptor is new for UVC 1.1
+ if (UVC10 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.0 devices\r\n");
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayDVFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayDVFormat (
+ PVIDEO_FORMAT_DV DVFormatDesc
+ )
+{
+ //@@DisplayDVFormat -Digital Video Format
+
+ AppendTextBuffer("\r\n ===>Video Streaming DV Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", DVFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", DVFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", DVFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", DVFormatDesc->bFormatIndex);
+ AppendTextBuffer("dwMaxVideoFrameBufferSize: 0x%08X\r\n", DVFormatDesc->dwMaxVideoFrameBufferSize);
+ AppendTextBuffer("bFormatType: 0x%02X\r\n", DVFormatDesc->bFormatType);
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" D0..6 = Format Type ->");
+ switch(DVFormatDesc->bFormatType & 0x03)
+ {
+ case 0x00:
+ AppendTextBuffer(" SD-DV\r\n");
+ break;
+ case 0x01:
+ AppendTextBuffer(" SDL-DV\r\n");
+ break;
+ case 0x02:
+ AppendTextBuffer(" HD-DV\r\n");
+ break;
+ default:
+ AppendTextBuffer(" Unknown Format\r\n");
+ break;
+ }
+ if (DVFormatDesc->bFormatType & 0x80)
+ AppendTextBuffer(" D7 = 60Hz");
+ else
+ AppendTextBuffer(" D7 = 50Hz");
+ AppendTextBuffer("\r\n");}
+
+ if (DVFormatDesc->bLength != sizeof(VIDEO_FORMAT_DV))
+ {
+ //@@TestCase B27.1 (descript.c line 1453)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ DVFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_DV));
+ OOPS();
+ }
+
+ if (DVFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B27.2 (descript.c line 1458)
+ //@@ERROR
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex invalid
+ AppendTextBuffer("*!*ERROR: bFormatIndex of 0x%02X is invalid\r\n",
+ DVFormatDesc->bFormatIndex);
+ OOPS();
+ }
+
+ if (DVFormatDesc->dwMaxVideoFrameBufferSize == 0 )
+ {
+ //@@TestCase B27.3 (descript.c line 1463)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxVideoFrameBufferSize
+ //@@dwMaxVideoFrameBufferSize invalid
+ AppendTextBuffer("*!*ERROR: dwMaxVideoFrameBufferSize of 0x%02X is invalid\r\n",
+ DVFormatDesc->dwMaxVideoFrameBufferSize);
+ OOPS();
+ }
+
+ //@@TestCase B27.4
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bFormatType
+ //@@Question - Should we validate that reserved bits are set to zero?
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVidVendorFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVendorVidFormat (
+ PVIDEO_FORMAT_VENDOR VendorVidFormatDesc
+ )
+{
+ //@@DisplayVendorVidFormat -Vendor Video Format
+ OLECHAR szGUID[256];
+ int i = 0;
+
+ // Initialize the default Frame
+ g_chVendorFrameDefault = VendorVidFormatDesc->bDefaultFrameIndex;
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) &VendorVidFormatDesc->guidMajorFormat, (LPOLESTR) szGUID, 255);
+ i++;
+
+ AppendTextBuffer("\r\n ===>Video Streaming Vendor Video Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", VendorVidFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VendorVidFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VendorVidFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", VendorVidFormatDesc->bFormatIndex);
+ AppendTextBuffer("bNumFrameDescriptors: 0x%02X\r\n", VendorVidFormatDesc->bNumFrameDescriptors);
+ AppendTextBuffer("guidMajorFormat: %S\r\n", szGUID);
+ i = StringFromGUID2((REFGUID) &VendorVidFormatDesc->guidSubFormat, (LPOLESTR) szGUID, 255);
+ i++;
+ AppendTextBuffer("guidSubFormat: %S\r\n", szGUID);
+ i = StringFromGUID2((REFGUID) &VendorVidFormatDesc->guidSpecifier, (LPOLESTR) szGUID, 255);
+ i++;
+ AppendTextBuffer("guidSpecifier: %S\r\n", szGUID);
+ AppendTextBuffer("bPayloadClass: 0x%02X\r\n", VendorVidFormatDesc->bPayloadClass);
+ AppendTextBuffer("bDefaultFrameIndex: 0x%02X\r\n", VendorVidFormatDesc->bDefaultFrameIndex);
+ AppendTextBuffer("bCopyProtect: 0x%02X", VendorVidFormatDesc->bCopyProtect);
+ if(gDoAnnotation) {
+ if(VendorVidFormatDesc->bCopyProtect) { AppendTextBuffer(" -> Duplication Restricted\r\n");}
+ else {AppendTextBuffer(" -> Duplication Unrestricted\r\n");}}
+ else {AppendTextBuffer("\r\n");}
+
+ if (VendorVidFormatDesc->bLength != sizeof(VIDEO_FORMAT_VENDOR))
+ {
+ //@@TestCase B28.1 (descript.c line 1297)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d. USBView cannot correctly display descriptor\r\n",
+ VendorVidFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_VENDOR));
+ OOPS();
+ }
+
+ if (VendorVidFormatDesc->bFormatIndex == 0 )
+ {
+ //@@TestCase B28.2 (descript.c line 1302)
+ //@@ERROR
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bFormatIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFormatDesc->bNumFrameDescriptors == 0 )
+ {
+ //@@TestCase B28.3 (descript.c line 1307)
+ //@@ERROR
+ //@@Descriptor Field - bNumFrameDescriptors
+ //@@bNumFrameDescriptors is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bNumFrameDescriptors = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(VendorVidFormatDesc->bPayloadClass > 1)
+ {
+ //@@TestCase B28.4
+ //@@WARNING
+ //@@Descriptor Field - bPayloadClass
+ //@@bPayloadClass is using reserved space
+ AppendTextBuffer("*!*WARNING: bPayloadClass is incorrectly using reserved space\r\n");
+ OOPS();
+ }
+ else
+ {
+ if (gDoAnnotation)
+ {
+ if(VendorVidFormatDesc->bPayloadClass == 1) { AppendTextBuffer(" -> Using a Frame Based Payload\r\n");}
+ else { AppendTextBuffer(" -> Using a Stream Based Payload\r\n");}
+ }
+ else {AppendTextBuffer("\r\n");}
+ }
+
+ if (VendorVidFormatDesc->bDefaultFrameIndex == 0 )
+ {
+ //@@TestCase B28.5 (descript.c line 1312)
+ //@@ERROR
+ //@@Descriptor Field - bDefaultFrameIndex
+ //@@bDefaultFrameIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bDefaultFrameIndex = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFormatDesc->bDefaultFrameIndex == 0 || VendorVidFormatDesc->bDefaultFrameIndex > VendorVidFormatDesc->bNumFrameDescriptors)
+ {
+ //@@TestCase B28.6
+ //@@WARNING
+ //@@Descriptor Field - bDefaultFrameIndex
+ //@@bDefaultFrameIndex is out of range
+ AppendTextBuffer("*!*WARNING: The value %d for the bDefaultFrameIndex is out of range this invalidates the descriptor\r\n*!* The proper range is 1 to %d)",
+ VendorVidFormatDesc->bDefaultFrameIndex,
+ VendorVidFormatDesc->bNumFrameDescriptors);
+ OOPS();
+ }
+
+ //@@TestCase B28.7
+ //@@Not yet implemented - Priority 1
+ //@@Descriptor Field - bCopyProtect
+ //@@Question - Are their reserved bits and should we validate that reserved bits are set to zero?
+ // AppendTextBuffer("bCopyProtect: 0x%02X", VendorVidFormatDesc->bCopyProtect);
+
+ // Check that the correct number of Frame Descriptors and one Color Matching
+ // descriptor follow
+ CheckForColorMatchingDesc ((PVIDEO_SPECIFIC) VendorVidFormatDesc,
+ VendorVidFormatDesc->bNumFrameDescriptors, VS_FRAME_VENDOR);
+
+ // This descriptor is deprecated for UVC 1.1
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC version >= 1.1 devices\r\n");
+ }
+#else
+ if (UVC11 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.1 devices\r\n");
+ }
+#endif
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVendorVidFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVendorVidFrameType (
+ PVIDEO_FRAME_VENDOR VendorVidFrameDesc
+ )
+{
+ //@@DisplayVendorVidFrameType -Vendor Video Frame
+ size_t bLength = 0;
+ bLength = SizeOfVideoFrameVendor(VendorVidFrameDesc);
+
+ AppendTextBuffer("\r\n ===>Video Streaming Vendor Video Frame Type Descriptor<===\r\n");
+ if (gDoAnnotation)
+ {
+ if(VendorVidFrameDesc->bFrameIndex == g_chVendorFrameDefault)
+ {
+ AppendTextBuffer(" --->This is the Default (optimum) Frame index\r\n");
+ }
+ }
+ AppendTextBuffer("bLength: 0x%02X\r\n", VendorVidFrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VendorVidFrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VendorVidFrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFrameIndex: 0x%02X\r\n", VendorVidFrameDesc->bFrameIndex);
+
+ if (VendorVidFrameDesc->bLength != bLength)
+ {
+ //@@TestCase B29.1 (descript.c line 1352)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is less than required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ VendorVidFrameDesc->bLength, bLength);
+ OOPS();
+ }
+
+ if (VendorVidFrameDesc->bFrameIndex == 0 )
+ {
+ //@@TestCase B29.2 (descript.c line 1357)
+ //@@ERROR
+ //@@Descriptor Field - bFrameIndex
+ //@@bFrameIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bFrameIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ AppendTextBuffer("bmCapabilities: 0x%02X", VendorVidFrameDesc->bmCapabilities);
+
+ if(VendorVidFrameDesc->bmCapabilities & 0x01){
+ if(gDoAnnotation) { AppendTextBuffer(" -> Still Images are supported\r\n");}
+ else {AppendTextBuffer("\r\n");} }
+ else if (VendorVidFrameDesc->bmCapabilities & 0xFF)
+ {
+ //@@TestCase B29.3
+ //@@WARNING
+ //@@Descriptor Field - bmCapabilities
+ //@@bmCapabilities has a bit using reserved areas that should be set to zero
+ AppendTextBuffer("\r\n*!*WARNING: bmCapabilities is using reserved areas.\r\n");
+ OOPS(); }
+ else {AppendTextBuffer("\r\n");}
+ AppendTextBuffer("wWidth: 0x%04X = %d\r\n", VendorVidFrameDesc->wWidth, VendorVidFrameDesc->wWidth);
+ AppendTextBuffer("wHeight: 0x%04X = %d\r\n", VendorVidFrameDesc->wHeight, VendorVidFrameDesc->wHeight);
+ AppendTextBuffer("dwMinBitRate: 0x%08X\r\n", VendorVidFrameDesc->dwMinBitRate);
+ AppendTextBuffer("dwMaxBitRate: 0x%08X\r\n", VendorVidFrameDesc->dwMaxBitRate);
+ AppendTextBuffer("dwMaxVideoFrameBufferSize: 0x%08X\r\n", VendorVidFrameDesc->dwMaxVideoFrameBufferSize);
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+ AppendTextBuffer("dwDefaultFrameInterval: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ VendorVidFrameDesc->dwDefaultFrameInterval,
+ ((double)VendorVidFrameDesc->dwDefaultFrameInterval)/10000.0,
+ (10000000.0/((double)VendorVidFrameDesc->dwDefaultFrameInterval))
+ );
+ AppendTextBuffer("bFrameIntervalType: 0x%02X\r\n", VendorVidFrameDesc->bFrameIntervalType);
+
+ if (VendorVidFrameDesc->wWidth == 0 )
+ {
+ //@@TestCase B29.4 (descript.c line 1362)
+ //@@ERROR
+ //@@Descriptor Field - wWidth
+ //@@wWidth is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: wWidth must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFrameDesc->wHeight == 0 )
+ {
+ //@@TestCase B29.5 (descript.c line 1367)
+ //@@ERROR
+ //@@Descriptor Field - wHeight
+ //@@wHeight is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: wHeight must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFrameDesc->dwMinBitRate == 0 )
+ {
+ //@@TestCase B29.6 (descript.c line 1372)
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate
+ //@@dwMinBitRate is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFrameDesc->dwMaxBitRate == 0 )
+ {
+ //@@TestCase B29.7 (descript.c line 1377)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxBitRate
+ //@@dwMaxBitRate is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if(VendorVidFrameDesc->dwMinBitRate > VendorVidFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B29.8
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is greater than dwMinBitRate
+ AppendTextBuffer("*!*ERROR: dwMinBitRate should be less than dwMaxBitRate\r\n");
+ OOPS();
+ }
+ else
+ {
+ if (VendorVidFrameDesc->bFrameIntervalType == 1 &&
+ VendorVidFrameDesc->dwMinBitRate != VendorVidFrameDesc->dwMaxBitRate)
+ {
+ //@@TestCase B29.9
+ //@@WARNING
+ //@@Descriptor Field - bFrameIntervalType, dwMinBitRate, and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is equal to dwMinBitRate if bFrameIntervalType is 1
+ AppendTextBuffer("*!*WARNING: if bFrameIntervalType is 1 then dwMinBitRate "\
+ "should equal dwMaxBitRate\r\n");
+ OOPS();
+ }
+ }
+
+ if (VendorVidFrameDesc->dwMaxVideoFrameBufferSize == 0 )
+ {
+ //@@TestCase B29.10 (descript.c line 1382)
+ //@@WARNING
+ //@@Descriptor Field - dwMaxVideoFrameBufferSize
+ //@@dwMaxVideoFrameBufferSize is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*WARNING: dwMaxVideoFrameBufferSize must be nonzero\r\n");
+ OOPS();
+ }
+ if (VendorVidFrameDesc->dwDefaultFrameInterval == 0 )
+ {
+ //@@TestCase B29.11 (descript.c line 1020)
+ //@@WARNING
+ //@@Descriptor Field - dwDefaultFrameInterval
+ //@@dwDefaultFrameInterval must be nonzero
+ AppendTextBuffer("*!*WARNING: dwDefaultFrameInterval must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (VendorVidFrameDesc->bFrameIntervalType == 0)
+ {
+ DisplayVendorVidContinuousFrameType(VendorVidFrameDesc);
+ }
+ else
+ {
+ DisplayVendorVidDiscreteFrameType(VendorVidFrameDesc);
+ }
+ // This descriptor is deprecated for UVC 1.1
+#ifdef H264_SUPPORT
+ if (UVC10 != g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC version >= 1.1 devices\r\n");
+ }
+#else
+ if (UVC11 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.1 devices\r\n");
+ }
+#endif
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVendorVidContinuousFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVendorVidContinuousFrameType(
+ PVIDEO_FRAME_VENDOR VContinuousDesc
+ )
+{
+ //@@DisplayVendorVidContinuousFrameType -Vendor Video Continuous Frame
+ ULONG dwMinFrameInterval = VContinuousDesc->adwFrameInterval[0];
+ ULONG dwMaxFrameInterval = VContinuousDesc->adwFrameInterval[1];
+ ULONG dwFrameIntervalStep = VContinuousDesc->adwFrameInterval[2];
+
+ AppendTextBuffer("===>Additional Continuous Frame Type Data\r\n");
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+
+ AppendTextBuffer("dwMinFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMinFrameInterval,
+ ((double)dwMinFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMinFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwMaxFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMaxFrameInterval,
+ ((double)dwMaxFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMaxFrameInterval) + 0.5));
+ AppendTextBuffer("dwFrameIntervalStep: 0x%08X\r\n", dwFrameIntervalStep);
+
+ if (dwMinFrameInterval == 0 )
+ {
+ //@@TestCase B30.2 (descript.c line 1388)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval
+ //@@dwMinFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (dwMaxFrameInterval == 0 )
+ {
+ //@@TestCase B30.3 (descript.c line 1388)
+ //@@ERROR
+ //@@Descriptor Field - dwMaxFrameInterval
+ //@@dwMaxFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(dwMinFrameInterval > dwMaxFrameInterval)
+ {
+ //@@TestCase B30.4 (descript.c line 1405)
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval is larger that dwMaxFrameInterval, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+ else if ((dwMinFrameInterval + dwFrameIntervalStep) > dwMaxFrameInterval)
+ {
+ //@@TestCase B30.5
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval combined with dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMinFrameInterval + dwFrameIntervalStep is greater than dwMaxFrameInterval, this could cause problems\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) == 0 )
+ {
+ //@@TestCase B30.6
+ //@@CAUTION
+ //@@Descriptor Field - dwFrameIntervalStep
+ //@@Suggestion to use descrite frames if dwFrameIntervalStep is zero
+ AppendTextBuffer("*!*CAUTION: dwFrameIntervalStep equals zero, consider using discrete frames\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) % dwFrameIntervalStep )
+ {
+ //@@TestCase B30.7 (descript.c line 1414)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the difference between dwMaxFrameInterval and dwMinFrameInterval is evenly divisible by dwFrameIntervalStep
+ AppendTextBuffer("*!*ERROR: dwMaxFrameInterval minus dwMinFrameInterval is not evenly divisible by dwFrameIntervalStep, this could cause problems\r\n");
+ OOPS();
+ }
+
+ if (dwFrameIntervalStep == 0 && (dwMaxFrameInterval - dwMinFrameInterval))
+ {
+ //@@TestCase B30.8 (descript.c line 1394)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the dwFrameIntervalStep is not zero if there is a difference between dwMaxFrameInterval and dwMinFrameInterval
+ AppendTextBuffer("*!*ERROR: dwFrameIntervalStep = 0, this invalidates the descriptor when there is a difference between \r\n dwMinFrameInterval and dwMaxFrameInterval\r\n");
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVendorVidDiscreteFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVendorVidDiscreteFrameType(
+ PVIDEO_FRAME_VENDOR VDiscreteDesc
+ )
+{
+ //@@DisplayVendorVidDiscreteFrameType -Vendor Video Discrete Frame
+ UINT iNdex = 1;
+ UINT iCurFrame = 0;
+ ULONG * ulFrameInterval = NULL;
+
+ AppendTextBuffer("===>Additional Discrete Frame TypeData\r\n");
+
+ // There are (VDiscreteDesc->bFrameIntervalType) dwFrameIntervals
+ for (; iNdex <= VDiscreteDesc->bFrameIntervalType; iNdex++, iCurFrame++)
+ {
+ ulFrameInterval = &VDiscreteDesc->adwFrameInterval[iCurFrame];
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+ AppendTextBuffer("dwFrameInterval[%d]: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ iNdex, *ulFrameInterval,
+ ((double)*ulFrameInterval)/10000.0,
+ (10000000.0/((double)*ulFrameInterval))
+ );
+ if (0 == *ulFrameInterval)
+ {
+ //@@TestCase B31.1 (descript.c line 1061)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[x] must be non-zero
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[%d] must be non-zero\r\n", iNdex);
+ OOPS();
+ }
+ if ((iNdex > 1)&&(*ulFrameInterval <= VDiscreteDesc->adwFrameInterval[iCurFrame - 1]))
+ {
+ //@@TestCase B31.2 (descript.c line 1067)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[n] must be greater than dwFrameInterval[n - 1]
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[0x%02X] must be "\
+ "greater than preceding dwFrameInterval[0x%02X]\r\n", iNdex, iNdex - 1);
+ OOPS();
+ }
+ }
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayFramePayloadFormat()
+//
+//*****************************************************************************
+
+BOOL
+DisplayFramePayloadFormat (
+ PVIDEO_FORMAT_FRAME FramePayloadFormatDesc
+ )
+{
+ //@@DisplayFramePayloadFormat - FrameBased Payload Format
+ PCHAR pStr = NULL;
+ OLECHAR szGUID[256];
+ int i = 0;
+
+ // Initialize the default Frame
+ g_chFrameBasedFrameDefault = FramePayloadFormatDesc->bDefaultFrameIndex;
+
+ memset((LPOLESTR) szGUID, 0, sizeof(OLECHAR) * 256);
+ i = StringFromGUID2((REFGUID) &FramePayloadFormatDesc->guidFormat, (LPOLESTR) szGUID, 255);
+ i++;
+
+ AppendTextBuffer("\r\n ===>Video Streaming Frame Based Payload Format Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X\r\n", FramePayloadFormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", FramePayloadFormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", FramePayloadFormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X\r\n", FramePayloadFormatDesc->bFormatIndex);
+ AppendTextBuffer("bNumFrameDescriptors: 0x%02X\r\n", FramePayloadFormatDesc->bNumFrameDescriptors);
+ AppendTextBuffer("guidFormat: %S", szGUID);
+
+ pStr = VidFormatGUIDCodeToName((REFGUID) &FramePayloadFormatDesc->guidFormat);
+ if ( pStr )
+ {
+ if ( gDoAnnotation )
+ {
+ AppendTextBuffer(" = %s Format", pStr);
+ }
+ }
+ AppendTextBuffer("\r\n");
+ AppendTextBuffer("bBitsPerPixel: 0x%02X\r\n", FramePayloadFormatDesc->bBitsPerPixel);
+ AppendTextBuffer("bDefaultFrameIndex: 0x%02X\r\n", FramePayloadFormatDesc->bDefaultFrameIndex);
+
+ if (FramePayloadFormatDesc->bLength != sizeof(VIDEO_FORMAT_FRAME))
+ {
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required
+ //@@length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ FramePayloadFormatDesc->bLength,
+ sizeof(VIDEO_FORMAT_FRAME));
+ OOPS();
+ }
+
+ if (FramePayloadFormatDesc->bFormatIndex == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - bFormatIndex
+ //@@bFormatIndex is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bFormatIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFormatDesc->bNumFrameDescriptors == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - bNumFrameDescriptors
+ //@@bNumFrameDescriptors is set to zero which is not in accordance with the
+ //@@USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bNumFrameDescriptors = 0, must have at least 1 Frame descriptor\r\n");
+ OOPS();
+ }
+
+ if(!(pStr))
+ {
+ //@@WARNING
+ //@@Descriptor Field - guidFormat
+ //@@guidFormat is set to unknown or undefined format
+ AppendTextBuffer("\r\n*!*WARNING: guidFormat is an unknown format\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFormatDesc->bBitsPerPixel == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - bBitsPerPixel
+ //@@bBitsPerPixel is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bBitsPerPixel = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFormatDesc->bDefaultFrameIndex == 0 || FramePayloadFormatDesc->bDefaultFrameIndex >
+ FramePayloadFormatDesc->bNumFrameDescriptors)
+ {
+ //@@ERROR
+ //@@Descriptor Field - bDefaultFrameIndex
+ //@@The value for bDefaultFrameIndex is not greater than 0 or less than or equal to bNumFrameDescriptors
+ AppendTextBuffer("*!*ERROR: The value %d for the bDefaultFrameIndex is out of range, this invalidates the descriptor\r\n*!*The proper range is 1 to %d)",
+ FramePayloadFormatDesc->bDefaultFrameIndex,
+ FramePayloadFormatDesc->bNumFrameDescriptors);
+ OOPS();
+ }
+
+ AppendTextBuffer("bAspectRatioX: 0x%02X\r\n",
+ FramePayloadFormatDesc->bAspectRatioX);
+ AppendTextBuffer("bAspectRatioY: 0x%02X",
+ FramePayloadFormatDesc->bAspectRatioY);
+
+ if (((FramePayloadFormatDesc->bmInterlaceFlags & 0x01) &&
+ (FramePayloadFormatDesc->bAspectRatioY != 0 &&
+ FramePayloadFormatDesc->bAspectRatioX != 0)))
+ {
+ if(gDoAnnotation)
+ {
+ AppendTextBuffer(" -> Aspect Ratio is set for a %d:%d display",
+ (FramePayloadFormatDesc->bAspectRatioX),(FramePayloadFormatDesc->bAspectRatioY));
+ }
+ else
+ {
+ if (FramePayloadFormatDesc->bAspectRatioY != 0 || FramePayloadFormatDesc->bAspectRatioX != 0)
+ {
+ //@@ERROR
+ //@@Descriptor Field - bAspectRatioX, bAspectRatioY
+ //@@Verify that that bAspectRatioX and bAspectRatioY are set to zero
+ //@@ if stream is non-interlaced
+ AppendTextBuffer("\r\n*!*ERROR: Both bAspectRatioX and bAspectRatioY "\
+ "must equal 0 if stream is non-interlaced");
+ OOPS();
+ }
+ }
+ }
+ AppendTextBuffer("\r\nbmInterlaceFlags: 0x%02X\r\n",
+ FramePayloadFormatDesc->bmInterlaceFlags);
+
+ if (gDoAnnotation)
+ {
+ AppendTextBuffer(" D0 = 0x%02X Interlaced stream or variable: %s\r\n",
+ (FramePayloadFormatDesc->bmInterlaceFlags & 1),
+ (FramePayloadFormatDesc->bmInterlaceFlags & 1) ? "Yes" : "No");
+ AppendTextBuffer(" D1 = 0x%02X Fields per frame: %s\r\n",
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 1) & 1),
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 1) & 1) ? "1 field" : "2 fields");
+ AppendTextBuffer(" D2 = 0x%02X Field 1 first: %s\r\n",
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 2) & 1),
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 2) & 1) ? "Yes" : "No");
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Validate that reserved bits (D3) are set to zero.
+ AppendTextBuffer(" D3 = 0x%02X Reserved%s\r\n",
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 3) & 1),
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 3) & 1) ?
+ "\r\n*!*ERROR: Reserved to 0" : "" );
+ AppendTextBuffer(" D4..5 = 0x%02X Field patterns ->",
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 4) & 3));
+ switch(FramePayloadFormatDesc->bmInterlaceFlags & 0x30)
+ {
+ case 0x00:
+ AppendTextBuffer(" Field 1 only");
+ break;
+ case 0x10:
+ AppendTextBuffer(" Field 2 only");
+ break;
+ case 0x20:
+ AppendTextBuffer(" Regular Pattern of fields 1 and 2");
+ break;
+ case 0x30:
+ AppendTextBuffer(" Random Pattern of fields 1 and 2");
+ break;
+ }
+ AppendTextBuffer("\r\n D6..7 = 0x%02X Display Mode ->",
+ ((FramePayloadFormatDesc->bmInterlaceFlags >> 6) & 3));
+
+ switch(FramePayloadFormatDesc->bmInterlaceFlags & 0xC0)
+ {
+ case 0x00:
+ AppendTextBuffer(" Bob only");
+ break;
+ case 0x40:
+ AppendTextBuffer(" Weave only");
+ break;
+ case 0x80:
+ AppendTextBuffer(" Bob or weave");
+ break;
+ case 0xC0:
+ //@@Descriptor Field - bmInterlaceFlags
+ //@@Question - Should we validate that reserved bits are set to zero?
+ AppendTextBuffer(" Reserved");
+ break;
+ }
+ }
+
+ //@@Descriptor Field - bCopyProtect
+ //@@Question - Are their reserved bits and should we validate that
+ //@@ reserved bits are set to zero?
+ AppendTextBuffer("\r\nbCopyProtect: 0x%02X",
+ FramePayloadFormatDesc->bCopyProtect);
+ if (gDoAnnotation)
+ {
+ if (FramePayloadFormatDesc->bCopyProtect)
+ AppendTextBuffer(" -> Duplication Restricted");
+ else
+ AppendTextBuffer(" -> Duplication Unrestricted");
+ }
+
+ //@@Descriptor Field - bVariableSize
+ AppendTextBuffer("\r\nbVariableSize: 0x%02X",
+ FramePayloadFormatDesc->bVariableSize);
+ if (gDoAnnotation)
+ {
+ if (FramePayloadFormatDesc->bVariableSize)
+ AppendTextBuffer(" -> Variable Size");
+ else
+ AppendTextBuffer(" -> Fixed Size");
+ }
+ AppendTextBuffer("\r\n");
+
+ // Check that the correct number of Frame Descriptors and one Color Matching
+ // descriptor follow
+ CheckForColorMatchingDesc ((PVIDEO_SPECIFIC) FramePayloadFormatDesc,
+ FramePayloadFormatDesc->bNumFrameDescriptors, VS_FRAME_FRAME_BASED);
+
+ // This descriptor is new for UVC 1.1
+ if (UVC10 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.0 devices\r\n");
+ }
+ return TRUE;
+ }
+
+
+//*****************************************************************************
+//
+// DisplayFramePayloadFrame()
+//
+//*****************************************************************************
+
+BOOL
+DisplayFramePayloadFrame (
+ PVIDEO_FRAME_FRAME FramePayloadFrameDesc
+ )
+{
+ size_t bLength = 0;
+ bLength = SizeOfVideoFrameFrame(FramePayloadFrameDesc);
+
+ //@@DisplayFramePayloadFrame -Frame Based Payload Frame
+
+ AppendTextBuffer("\r\n ===>Video Streaming Frame Based Payload Frame Type Descriptor<===\r\n");
+ if (gDoAnnotation)
+ {
+ if(FramePayloadFrameDesc->bFrameIndex == g_chFrameBasedFrameDefault)
+ {
+ AppendTextBuffer(" --->This is the Default (optimum) Frame index\r\n");
+ }
+ }
+ AppendTextBuffer("bLength: 0x%02X\r\n", FramePayloadFrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", FramePayloadFrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", FramePayloadFrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFrameIndex: 0x%02X\r\n", FramePayloadFrameDesc->bFrameIndex);
+ AppendTextBuffer("bmCapabilities: 0x%02X\r\n", FramePayloadFrameDesc->bmCapabilities);
+ AppendTextBuffer("wWidth: 0x%04X = %d\r\n", FramePayloadFrameDesc->wWidth, FramePayloadFrameDesc->wWidth);
+ AppendTextBuffer("wHeight: 0x%04X = %d\r\n", FramePayloadFrameDesc->wHeight, FramePayloadFrameDesc->wHeight);
+ AppendTextBuffer("dwMinBitRate: 0x%08X\r\n", FramePayloadFrameDesc->dwMinBitRate);
+ AppendTextBuffer("dwMaxBitRate: 0x%08X\r\n", FramePayloadFrameDesc->dwMaxBitRate);
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+ AppendTextBuffer("dwDefaultFrameInterval: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ FramePayloadFrameDesc->dwDefaultFrameInterval,
+ ((double)FramePayloadFrameDesc->dwDefaultFrameInterval)/10000.0,
+ (10000000.0/((double)FramePayloadFrameDesc->dwDefaultFrameInterval))
+ );
+ AppendTextBuffer("bFrameIntervalType: 0x%02X\r\n", FramePayloadFrameDesc->bFrameIntervalType);
+
+ if (FramePayloadFrameDesc->bLength != bLength)
+ {
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required
+ //@@length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d\r\n",
+ FramePayloadFrameDesc->bLength, bLength);
+ OOPS();
+ }
+
+ if (FramePayloadFrameDesc->bFrameIndex == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - bFrameIndex
+ //@@bFrameIndex must be nonzero
+ AppendTextBuffer("*!*ERROR: bFrameIndex = 0, this is a 1 based index\r\n");
+ OOPS();
+ }
+
+ //@@Descriptor Field - bmCapabilities
+ //@@Question: Should we try to verify that bmCapabilities is valid?
+ // AppendTextBuffer("bmCapabilities: 0x%02X\r\n", UnCompFrameDesc->bmCapabilities);
+
+ if (FramePayloadFrameDesc->wWidth == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - wWidth
+ //@@wWidth must be nonzero
+ AppendTextBuffer("*!*ERROR: wWidth must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFrameDesc->wHeight == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - wHeight
+ //@@wHeight must be nonzero
+ AppendTextBuffer("*!*ERROR: wHeight must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFrameDesc->dwMinBitRate == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate
+ //@@dwMinBitRate must be nonzero
+ AppendTextBuffer("*!*ERROR: dwMinBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (FramePayloadFrameDesc->dwMaxBitRate == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMaxBitRate
+ //@@dwMaxBitRate must be nonzero
+ AppendTextBuffer("*!*ERROR: dwMaxBitRate must be nonzero\r\n");
+ OOPS();
+ }
+
+ if(FramePayloadFrameDesc->dwMinBitRate > FramePayloadFrameDesc->dwMaxBitRate)
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMinBitRate and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is greater than dwMinBitRate
+ AppendTextBuffer("*!*ERROR: dwMinBitRate should be less than dwMaxBitRate\r\n");
+ OOPS();
+ }
+ else
+ {
+ if (FramePayloadFrameDesc->bFrameIntervalType == 1 &&
+ FramePayloadFrameDesc->dwMinBitRate != FramePayloadFrameDesc->dwMaxBitRate)
+ {
+ //@@WARNING
+ //@@Descriptor Field - bFrameIntervalType, dwMinBitRate, and dwMaxBitRate
+ //@@Verify that dwMaxBitRate is equal to dwMinBitRate if bFrameIntervalType is 1
+ AppendTextBuffer("*!*WARNING: if bFrameIntervalType is 1 then dwMinBitRate "\
+ "should equal dwMaxBitRate\r\n");
+ OOPS();
+ }
+ }
+
+ if (FramePayloadFrameDesc->dwDefaultFrameInterval == 0 )
+ {
+ //@@TestCase B16.11 (descript.c line 1020)
+ //@@WARNING
+ //@@Descriptor Field - dwDefaultFrameInterval
+ //@@dwDefaultFrameInterval must be nonzero
+ AppendTextBuffer("*!*WARNING: dwDefaultFrameInterval must be nonzero\r\n");
+ OOPS();
+ }
+
+ if (0 == FramePayloadFrameDesc->bFrameIntervalType)
+ {
+ DisplayFramePayloadContinuousFrameType(FramePayloadFrameDesc);
+ }
+ else
+ {
+ DisplayFramePayloadDiscreteFrameType(FramePayloadFrameDesc);
+ }
+ // This descriptor is new for UVC 1.1
+ if (UVC10 == g_chUVCversion)
+ {
+ AppendTextBuffer("*!*ERROR: This format is NOT ALLOWED for UVC 1.0 devices\r\n");
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayFramePayloadContinuousFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayFramePayloadContinuousFrameType(
+ PVIDEO_FRAME_FRAME FContinuousDesc
+ )
+{
+ //@@DisplayFramePayloadContinuousFrameType -Frame Payload Continuous Frame
+ ULONG dwMinFrameInterval = FContinuousDesc->adwFrameInterval[0];
+ ULONG dwMaxFrameInterval = FContinuousDesc->adwFrameInterval[1];
+ ULONG dwFrameIntervalStep = FContinuousDesc->adwFrameInterval[2];
+
+ AppendTextBuffer("===>Additional Continuous Frame Type Data\r\n");
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+
+ AppendTextBuffer("dwMinFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMinFrameInterval,
+ ((double)dwMinFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMinFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwMaxFrameInterval: 0x%08X = %lf mSec (%d Hz)\r\n",
+ dwMaxFrameInterval,
+ ((double)dwMaxFrameInterval)/10000.0,
+ (ULONG)(10000000.0/((double)dwMaxFrameInterval) + 0.5));
+
+ AppendTextBuffer("dwFrameIntervalStep: 0x%08X\r\n", dwFrameIntervalStep);
+
+ if (dwMinFrameInterval == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval
+ //@@dwMinFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if (dwMaxFrameInterval == 0 )
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMaxFrameInterval
+ //@@dwMaxFrameInterval is set to zero which is not in accordance with the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: dwMaxFrameInterval = 0, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+
+ if(dwMinFrameInterval > dwMaxFrameInterval)
+ {
+ //@@ERROR
+ //@@Descriptor Field - dwMinFrameInterval and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval
+ AppendTextBuffer("*!*ERROR: dwMinFrameInterval is larger that dwMaxFrameInterval, this invalidates the descriptor\r\n");
+ OOPS();
+ }
+ else if ((dwMinFrameInterval + dwFrameIntervalStep) > dwMaxFrameInterval)
+ {
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that dwMaxFrameInterval is greater than dwMinFrameInterval combined with dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMinFrameInterval + dwFrameIntervalStep is greater than dwMaxFrameInterval, this could cause problems\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) == 0 )
+ {
+ //@@CAUTION
+ //@@Descriptor Field - dwFrameIntervalStep
+ //@@Suggestion to use descrite frames if dwFrameIntervalStep is zero
+ AppendTextBuffer("*!*CAUTION: dwFrameIntervalStep equals zero, consider using discrete frames\r\n");
+ OOPS();
+ }
+ else if ((dwMaxFrameInterval - dwMinFrameInterval) % dwFrameIntervalStep )
+ {
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the difference between dwMaxFrameInterval and dwMinFrameInterval is evenly divisible by dwFrameIntervalStep
+ AppendTextBuffer("*!*WARNING: dwMaxFrameInterval minus dwMinFrameInterval is not evenly divisible by dwFrameIntervalStep, this could cause problems\r\n");
+ OOPS();
+ }
+
+ if (dwFrameIntervalStep == 0 && (dwMaxFrameInterval - dwMinFrameInterval))
+ {
+ //@@WARNING
+ //@@Descriptor Field - dwFrameIntervalStep, dwMinFrameInterval, and dwMaxFrameInterval
+ //@@Verify that the dwFrameIntervalStep is not zero if there is a difference between dwMaxFrameInterval and dwMinFrameInterval
+ AppendTextBuffer("*!*WARNING: dwFrameIntervalStep = 0, this invalidates the descriptor when there is a difference between dwMinFrameInterval and dwMaxFrameInterval\r\n");
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayFramePayloadDiscreteFrameType()
+//
+//*****************************************************************************
+
+BOOL
+DisplayFramePayloadDiscreteFrameType(
+ PVIDEO_FRAME_FRAME FDiscreteDesc
+ )
+{
+ //@@DisplayFramePayloadDiscreteFrameType -Frame Based Payload Discrete Frame
+ UINT iNdex = 1;
+ UINT iCurFrame = 0;
+ ULONG * ulFrameInterval = NULL;
+
+ AppendTextBuffer("===>Additional Discrete Frame Type Data\r\n");
+
+ // There are (UDiscreteDesc->bFrameIntervalType) dwFrameIntervals (1 based index)
+ for (; iNdex <= FDiscreteDesc->bFrameIntervalType; iNdex++, iCurFrame++)
+ {
+ ulFrameInterval = &FDiscreteDesc->adwFrameInterval[iCurFrame];
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+ AppendTextBuffer("dwFrameInterval[%d]: 0x%08X = %lf mSec (%4.2f Hz)\r\n",
+ iNdex, *ulFrameInterval,
+ ((double)*ulFrameInterval)/10000.0,
+ (10000000.0/((double)*ulFrameInterval))
+ );
+ if (0 == *ulFrameInterval)
+ {
+ //@@TestCase B18.1 (descript.c line 1061)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[x] must be non-zero
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[%d] must be non-zero\r\n", iNdex);
+ OOPS();
+ }
+ if ((iNdex > 1)&&(*ulFrameInterval <= FDiscreteDesc->adwFrameInterval[iCurFrame - 1]))
+ {
+ //@@TestCase B18.2 (descript.c line 1067)
+ //@@ERROR
+ //@@Descriptor Field - dwFrameInterval[x]
+ //@@dwFrameInterval[n] must be greater than dwFrameInterval[n - 1]
+ AppendTextBuffer("*!*ERROR: dwFrameInterval[0x%02X] must be "\
+ "greater than preceding dwFrameInterval[0x%02X]\r\n", iNdex, iNdex - 1);
+ OOPS();
+ }
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayVSEndpoint()
+//
+//*****************************************************************************
+
+BOOL
+DisplayVSEndpoint (
+ PVIDEO_CS_INTERRUPT VidEndpointDesc
+ )
+{
+ //@@DisplayVSEndpoint - Video Streaming Endpoint
+ AppendTextBuffer("\r\n ===>Class-specific VC Interrupt Endpoint Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X \r\n", VidEndpointDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X\r\n", VidEndpointDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X\r\n", VidEndpointDesc->bDescriptorSubtype);
+ AppendTextBuffer("wMaxTransferSize: 0x%04X", VidEndpointDesc->wMaxTransferSize);
+ if(gDoAnnotation) {
+ AppendTextBuffer(" = (%d) Bytes\r\n", VidEndpointDesc->wMaxTransferSize);}
+ else {AppendTextBuffer("\r\n");}
+
+ if (VidEndpointDesc->bLength != sizeof(VIDEO_CS_INTERRUPT))
+ {
+ //@@TestCase B32.1 (descript.c line 1616)
+ //@@ERROR
+ //@@Descriptor Field - bLength
+ //@@The declared length in the device descriptor is not equal to the required length in the USB Video Device Specification
+ AppendTextBuffer("*!*ERROR: bLength of %d incorrect, should be %d. USBView cannot correctly display descriptor\r\n",
+ VidEndpointDesc->bLength,
+ sizeof(VIDEO_CS_INTERRUPT));
+ OOPS();
+ }
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// VDisplayBytes()
+//
+//*****************************************************************************
+
+VOID
+VDisplayBytes (
+ PUCHAR Data,
+ USHORT Len
+ )
+{
+ USHORT i = 0;
+
+ for (i = 0; i < Len; i++)
+ {
+ AppendTextBuffer("0x%02X ", Data[i]);
+
+ if (i % 16 == 15)
+ {
+ AppendTextBuffer("\r\n");
+ }
+ }
+
+ if (i % 16 != 0)
+ {
+ AppendTextBuffer("\r\n");
+ }
+}
+
+//*****************************************************************************
+//
+// VidFormatGUIDCodeToName()
+//
+//*****************************************************************************
+
+
+PCHAR
+VidFormatGUIDCodeToName (
+ REFGUID VidFormatGUIDCode
+ )
+{
+ // GUID pYUY2 = YUY2_Format;
+ // GUID pNV12 = NV12_Format;
+ if (IsEqualGUID(VidFormatGUIDCode, (REFGUID) &YUY2_Format))
+ {
+ return (PCHAR) &"YUY2";
+ }
+ if (IsEqualGUID(VidFormatGUIDCode, (REFGUID) &NV12_Format))
+ {
+ return (PCHAR) &"NV12";
+ }
+#ifdef H264_SUPPORT
+ // GUID pH264 = H264_Format;
+ if (IsEqualGUID(VidFormatGUIDCode, (REFGUID) &H264_Format))
+ {
+ return (PCHAR) &"H.264";
+ }
+#endif
+
+ return FALSE;
+}
+
+/*****************************************************************************
+
+GetVCInterfaceSize()
+
+*****************************************************************************/
+
+UINT
+GetVCInterfaceSize (
+ PVIDEO_CONTROL_HEADER_UNIT VCInterfaceDesc
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = (PUSB_COMMON_DESCRIPTOR) VCInterfaceDesc;
+ PUCHAR descEnd = (PUCHAR) VCInterfaceDesc + VCInterfaceDesc->wTotalLength;
+ UINT uCount = 0;
+
+ // return this interface's sum of descriptor lengths
+ // starting from this header until (and not including) the first endpoint
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ if (commonDesc->bDescriptorType == USB_ENDPOINT_DESCRIPTOR_TYPE)
+ break;
+ uCount += commonDesc->bLength;
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uCount);
+}
+
+/*****************************************************************************
+
+CheckForColorMatchingDesc ()
+
+Given starting address of format descriptor;
+number of frame descriptors;
+subtype of frame to look for;
+
+1) walk through each descriptor
+= if desc is frame of given subtype, update counter
+= if desc is still frame, update counter
+= if desc is color matching descriptor, update counter
+! if frame is something else, break (all these frames should be consecutive)
+! if next frame is beyond ending address of configuration, break
+
+PASS
+frame count == numframes passed in
+color match == 1
+still frames are handled in the video stream input header and the frame displays
+
+*****************************************************************************/
+
+UINT
+CheckForColorMatchingDesc (
+ PVIDEO_SPECIFIC pFormatDesc,
+ UCHAR bNumFrameDescriptors,
+ UCHAR bDescriptorSubtype
+ )
+{
+ UINT uFrameCount = 0;
+ UINT uStillFrameCount = 0;
+ UINT uColorCount = 0;
+
+ // DONE if the descriptor address is beyond the configuration range
+ for ( ; ValidateDescAddress ((PUSB_COMMON_DESCRIPTOR) pFormatDesc); )
+ {
+ // DONE if it's not an interface desc
+ if (CS_INTERFACE != pFormatDesc->bDescriptorType)
+ {
+ break;
+ }
+ switch (pFormatDesc->bDescriptorSubtype)
+ {
+ case VS_STILL_IMAGE_FRAME:
+ uStillFrameCount++;
+ break;
+ case VS_COLORFORMAT:
+ uColorCount++;
+ break;
+ default:
+ if (bDescriptorSubtype == pFormatDesc->bDescriptorSubtype)
+ {
+ uFrameCount++;
+ }
+ break;
+ }
+ pFormatDesc = (PVIDEO_SPECIFIC) ((PUCHAR) pFormatDesc + pFormatDesc->bLength);
+ }
+ if (uFrameCount != bNumFrameDescriptors)
+ {
+ AppendTextBuffer("*!*ERROR: Found %d frame descriptors (should be %d)\r\n",
+ uFrameCount, bNumFrameDescriptors);
+ }
+ // We already check Still Frames in the Video Info Header and Still Frames displays
+ if (0 == uColorCount)
+ {
+ AppendTextBuffer("*!*ERROR: no Color Matching Descriptor for this format\r\n");
+ }
+ return (uColorCount);
+}
+
+/*****************************************************************************
+
+GetVSInterfaceSize()
+
+*****************************************************************************/
+
+UINT
+GetVSInterfaceSize (
+ PUSB_COMMON_DESCRIPTOR VidInHeaderDesc,
+ USHORT wTotalLength
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = (PUSB_COMMON_DESCRIPTOR) VidInHeaderDesc;
+ PUCHAR descEnd = (PUCHAR) VidInHeaderDesc + wTotalLength;
+ UINT uCount = 0;
+
+ // return this interface's sum of descriptor lengths
+ // starting from this header until (and not including) the first endpoint
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ if (commonDesc->bDescriptorType == USB_ENDPOINT_DESCRIPTOR_TYPE)
+ break;
+ uCount += commonDesc->bLength;
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+ return (uCount);
+}
+
+/*****************************************************************************
+
+ValidateTerminalID()
+
+*****************************************************************************/
+
+BOOL
+ValidateTerminalID(
+ UINT uTerminalID
+ )
+{
+ UNREFERENCED_PARAMETER(uTerminalID);
+ return (TRUE);
+}
diff --git a/tests/projects/winsdk/usbview/enum.c b/tests/projects/winsdk/usbview/enum.c new file mode 100644 index 000000000..314a08806 --- /dev/null +++ b/tests/projects/winsdk/usbview/enum.c @@ -0,0 +1,3366 @@ +/*++
+
+Copyright (c) 1997-2011 Microsoft Corporation
+
+Module Name:
+
+ ENUM.C
+
+Abstract:
+
+ This source file contains the routines which enumerate the USB bus
+ and populate the TreeView control.
+
+ The enumeration process goes like this:
+
+ (1) Enumerate Host Controllers and Root Hubs
+ EnumerateHostControllers()
+ EnumerateHostController()
+ Host controllers currently have symbolic link names of the form HCDx,
+ where x starts at 0. Use CreateFile() to open each host controller
+ symbolic link. Create a node in the TreeView to represent each host
+ controller.
+
+ GetRootHubName()
+ After a host controller has been opened, send the host controller an
+ IOCTL_USB_GET_ROOT_HUB_NAME request to get the symbolic link name of
+ the root hub that is part of the host controller.
+
+ (2) Enumerate Hubs (Root Hubs and External Hubs)
+ EnumerateHub()
+ Given the name of a hub, use CreateFile() to map the hub. Send the
+ hub an IOCTL_USB_GET_NODE_INFORMATION request to get info about the
+ hub, such as the number of downstream ports. Create a node in the
+ TreeView to represent each hub.
+
+ (3) Enumerate Downstream Ports
+ EnumerateHubPorts()
+ Given an handle to an open hub and the number of downstream ports on
+ the hub, send the hub an IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
+ request for each downstream port of the hub to get info about the
+ device (if any) attached to each port. If there is a device attached
+ to a port, send the hub an IOCTL_USB_GET_NODE_CONNECTION_NAME request
+ to get the symbolic link name of the hub attached to the downstream
+ port. If there is a hub attached to the downstream port, recurse to
+ step (2).
+
+ GetAllStringDescriptors()
+ GetConfigDescriptor()
+ Create a node in the TreeView to represent each hub port
+ and attached device.
+
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 04-25-97 : created
+
+--*/
+
+//*****************************************************************************
+// I N C L U D E S
+//*****************************************************************************
+
+#include "uvcview.h"
+
+//*****************************************************************************
+// D E F I N E S
+//*****************************************************************************
+
+#define NUM_STRING_DESC_TO_GET 32
+
+//*****************************************************************************
+// L O C A L F U N C T I O N P R O T O T Y P E S
+//*****************************************************************************
+
+VOID
+EnumerateHostControllers (
+ HTREEITEM hTreeParent,
+ ULONG *DevicesConnected
+);
+
+VOID
+EnumerateHostController (
+ HTREEITEM hTreeParent,
+ HANDLE hHCDev,
+ _Inout_ PCHAR leafName,
+ _In_ HANDLE deviceInfo,
+ _In_ PSP_DEVINFO_DATA deviceInfoData
+);
+
+VOID
+EnumerateHub (
+ HTREEITEM hTreeParent,
+ _In_reads_(cbHubName) PCHAR HubName,
+ _In_ size_t cbHubName,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2,
+ _In_opt_ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps,
+ _In_opt_ PUSB_DESCRIPTOR_REQUEST ConfigDesc,
+ _In_opt_ PUSB_DESCRIPTOR_REQUEST BosDesc,
+ _In_opt_ PSTRING_DESCRIPTOR_NODE StringDescs,
+ _In_opt_ PUSB_DEVICE_PNP_STRINGS DevProps
+);
+
+VOID
+EnumerateHubPorts (
+ HTREEITEM hTreeParent,
+ HANDLE hHubDevice,
+ ULONG NumPorts
+);
+
+PCHAR GetRootHubName (
+ HANDLE HostController
+);
+
+PCHAR GetExternalHubName (
+ HANDLE Hub,
+ ULONG ConnectionIndex
+);
+
+PCHAR GetHCDDriverKeyName (
+ HANDLE HCD
+);
+
+PCHAR GetDriverKeyName (
+ HANDLE Hub,
+ ULONG ConnectionIndex
+);
+
+PUSB_DESCRIPTOR_REQUEST
+GetConfigDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ UCHAR DescriptorIndex
+ );
+
+PUSB_DESCRIPTOR_REQUEST
+GetBOSDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex
+ );
+
+DWORD
+GetHostControllerPowerMap(
+ HANDLE hHCDev,
+ PUSBHOSTCONTROLLERINFO hcInfo);
+
+DWORD
+GetHostControllerInfo(
+ HANDLE hHCDev,
+ PUSBHOSTCONTROLLERINFO hcInfo);
+
+PCHAR WideStrToMultiStr (
+ _In_reads_bytes_(cbWideStr) PWCHAR WideStr,
+ _In_ size_t cbWideStr
+ );
+
+BOOL
+AreThereStringDescriptors (
+ PUSB_DEVICE_DESCRIPTOR DeviceDesc,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc
+);
+
+PSTRING_DESCRIPTOR_NODE
+GetAllStringDescriptors (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ PUSB_DEVICE_DESCRIPTOR DeviceDesc,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc
+);
+
+PSTRING_DESCRIPTOR_NODE
+GetStringDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ UCHAR DescriptorIndex,
+ USHORT LanguageID
+);
+
+HRESULT
+GetStringDescriptors (
+ _In_ HANDLE hHubDevice,
+ _In_ ULONG ConnectionIndex,
+ _In_ UCHAR DescriptorIndex,
+ _In_ ULONG NumLanguageIDs,
+ _In_reads_(NumLanguageIDs) USHORT *LanguageIDs,
+ _In_ PSTRING_DESCRIPTOR_NODE StringDescNodeHead
+);
+
+void
+EnumerateAllDevices();
+
+
+void
+EnumerateAllDevicesWithGuid(
+ PDEVICE_GUID_LIST DeviceList,
+ LPGUID Guid
+ );
+
+void
+FreeDeviceInfoNode(
+ _In_ PDEVICE_INFO_NODE *ppNode
+ );
+
+PDEVICE_INFO_NODE
+FindMatchingDeviceNodeForDriverName(
+ _In_ PSTR DriverKeyName,
+ _In_ BOOLEAN IsHub
+ );
+
+
+//*****************************************************************************
+// G L O B A L S
+//*****************************************************************************
+
+// List of enumerated host controllers.
+//
+LIST_ENTRY EnumeratedHCListHead =
+{
+ &EnumeratedHCListHead,
+ &EnumeratedHCListHead
+};
+
+DEVICE_GUID_LIST gHubList;
+DEVICE_GUID_LIST gDeviceList;
+
+
+//*****************************************************************************
+// G L O B A L S P R I V A T E T O T H I S F I L E
+//*****************************************************************************
+
+PCHAR ConnectionStatuses[] =
+{
+ "", // 0 - NoDeviceConnected
+ "", // 1 - DeviceConnected
+ "FailedEnumeration", // 2 - DeviceFailedEnumeration
+ "GeneralFailure", // 3 - DeviceGeneralFailure
+ "Overcurrent", // 4 - DeviceCausedOvercurrent
+ "NotEnoughPower", // 5 - DeviceNotEnoughPower
+ "NotEnoughBandwidth", // 6 - DeviceNotEnoughBandwidth
+ "HubNestedTooDeeply", // 7 - DeviceHubNestedTooDeeply
+ "InLegacyHub", // 8 - DeviceInLegacyHub
+ "Enumerating", // 9 - DeviceEnumerating
+ "Reset" // 10 - DeviceReset
+};
+
+ULONG TotalDevicesConnected;
+
+
+//*****************************************************************************
+//
+// EnumerateHostControllers()
+//
+// hTreeParent - Handle of the TreeView item under which host controllers
+// should be added.
+//
+//*****************************************************************************
+
+VOID
+EnumerateHostControllers (
+ HTREEITEM hTreeParent,
+ ULONG *DevicesConnected
+)
+{
+ HANDLE hHCDev = NULL;
+ HDEVINFO deviceInfo = NULL;
+ SP_DEVINFO_DATA deviceInfoData;
+ SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
+ PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetailData = NULL;
+ ULONG index = 0;
+ ULONG requiredLength = 0;
+ BOOL success;
+
+ TotalDevicesConnected = 0;
+ TotalHubs = 0;
+
+ EnumerateAllDevices();
+
+ // Iterate over host controllers using the new GUID based interface
+ //
+ deviceInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_HOST_CONTROLLER,
+ NULL,
+ NULL,
+ (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
+
+ deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+
+ for (index=0;
+ SetupDiEnumDeviceInfo(deviceInfo,
+ index,
+ &deviceInfoData);
+ index++)
+ {
+ deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+
+ success = SetupDiEnumDeviceInterfaces(deviceInfo,
+ 0,
+ (LPGUID)&GUID_CLASS_USB_HOST_CONTROLLER,
+ index,
+ &deviceInterfaceData);
+
+ if (!success)
+ {
+ OOPS();
+ break;
+ }
+
+ success = SetupDiGetDeviceInterfaceDetail(deviceInfo,
+ &deviceInterfaceData,
+ NULL,
+ 0,
+ &requiredLength,
+ NULL);
+
+ if (!success && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ OOPS();
+ break;
+ }
+
+ deviceDetailData = ALLOC(requiredLength);
+ if (deviceDetailData == NULL)
+ {
+ OOPS();
+ break;
+ }
+
+ deviceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ success = SetupDiGetDeviceInterfaceDetail(deviceInfo,
+ &deviceInterfaceData,
+ deviceDetailData,
+ requiredLength,
+ &requiredLength,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ break;
+ }
+
+ hHCDev = CreateFile(deviceDetailData->DevicePath,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ NULL);
+
+ // If the handle is valid, then we've successfully opened a Host
+ // Controller. Display some info about the Host Controller itself,
+ // then enumerate the Root Hub attached to the Host Controller.
+ //
+ if (hHCDev != INVALID_HANDLE_VALUE)
+ {
+ EnumerateHostController(hTreeParent,
+ hHCDev,
+ deviceDetailData->DevicePath,
+ deviceInfo,
+ &deviceInfoData);
+
+ CloseHandle(hHCDev);
+ }
+
+ FREE(deviceDetailData);
+ }
+
+ SetupDiDestroyDeviceInfoList(deviceInfo);
+
+ *DevicesConnected = TotalDevicesConnected;
+
+ return;
+}
+
+//*****************************************************************************
+//
+// EnumerateHostController()
+//
+// hTreeParent - Handle of the TreeView item under which host controllers
+// should be added.
+//
+//*****************************************************************************
+
+VOID
+EnumerateHostController (
+ HTREEITEM hTreeParent,
+ HANDLE hHCDev, _Inout_ PCHAR leafName,
+ _In_ HANDLE deviceInfo,
+ _In_ PSP_DEVINFO_DATA deviceInfoData
+)
+{
+ PCHAR driverKeyName = NULL;
+ HTREEITEM hHCItem = NULL;
+ PCHAR rootHubName = NULL;
+ PLIST_ENTRY listEntry = NULL;
+ PUSBHOSTCONTROLLERINFO hcInfo = NULL;
+ PUSBHOSTCONTROLLERINFO hcInfoInList = NULL;
+ DWORD dwSuccess;
+ BOOL success = FALSE;
+ ULONG deviceAndFunction = 0;
+ PUSB_DEVICE_PNP_STRINGS DevProps = NULL;
+
+
+ // Allocate a structure to hold information about this host controller.
+ //
+ hcInfo = (PUSBHOSTCONTROLLERINFO)ALLOC(sizeof(USBHOSTCONTROLLERINFO));
+
+ // just return if could not alloc memory
+ if (NULL == hcInfo)
+ return;
+
+ hcInfo->DeviceInfoType = HostControllerInfo;
+
+ // Obtain the driver key name for this host controller.
+ //
+ driverKeyName = GetHCDDriverKeyName(hHCDev);
+
+ if (NULL == driverKeyName)
+ {
+ // Failure obtaining driver key name.
+ OOPS();
+ FREE(hcInfo);
+ return;
+ }
+
+ // Don't enumerate this host controller again if it already
+ // on the list of enumerated host controllers.
+ //
+ listEntry = EnumeratedHCListHead.Flink;
+
+ while (listEntry != &EnumeratedHCListHead)
+ {
+ hcInfoInList = CONTAINING_RECORD(listEntry,
+ USBHOSTCONTROLLERINFO,
+ ListEntry);
+
+ if (strcmp(driverKeyName, hcInfoInList->DriverKey) == 0)
+ {
+ // Already on the list, exit
+ //
+ FREE(driverKeyName);
+ FREE(hcInfo);
+ return;
+ }
+
+ listEntry = listEntry->Flink;
+ }
+
+ // Obtain host controller device properties
+ {
+ size_t cbDriverName = 0;
+ HRESULT hr = S_OK;
+
+ hr = StringCbLength(driverKeyName, MAX_DRIVER_KEY_NAME, &cbDriverName);
+ if (SUCCEEDED(hr))
+ {
+ DevProps = DriverNameToDeviceProperties(driverKeyName, cbDriverName);
+ }
+ }
+
+ hcInfo->DriverKey = driverKeyName;
+
+ if (DevProps)
+ {
+ ULONG ven, dev, subsys, rev;
+ ven = dev = subsys = rev = 0;
+
+ if (sscanf_s(DevProps->DeviceId,
+ "PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x",
+ &ven, &dev, &subsys, &rev) != 4)
+ {
+ OOPS();
+ }
+
+ hcInfo->VendorID = ven;
+ hcInfo->DeviceID = dev;
+ hcInfo->SubSysID = subsys;
+ hcInfo->Revision = rev;
+ hcInfo->UsbDeviceProperties = DevProps;
+ }
+ else
+ {
+ OOPS();
+ }
+
+ if (DevProps != NULL && DevProps->DeviceDesc != NULL)
+ {
+ leafName = DevProps->DeviceDesc;
+ }
+ else
+ {
+ OOPS();
+ }
+
+ // Get the USB Host Controller power map
+ dwSuccess = GetHostControllerPowerMap(hHCDev, hcInfo);
+
+ if (ERROR_SUCCESS != dwSuccess)
+ {
+ OOPS();
+ }
+
+
+ // Get bus, device, and function
+ //
+ hcInfo->BusDeviceFunctionValid = FALSE;
+
+ success = SetupDiGetDeviceRegistryProperty(deviceInfo,
+ deviceInfoData,
+ SPDRP_BUSNUMBER,
+ NULL,
+ (PBYTE)&hcInfo->BusNumber,
+ sizeof(hcInfo->BusNumber),
+ NULL);
+
+ if (success)
+ {
+ success = SetupDiGetDeviceRegistryProperty(deviceInfo,
+ deviceInfoData,
+ SPDRP_ADDRESS,
+ NULL,
+ (PBYTE)&deviceAndFunction,
+ sizeof(deviceAndFunction),
+ NULL);
+ }
+
+ if (success)
+ {
+ hcInfo->BusDevice = deviceAndFunction >> 16;
+ hcInfo->BusFunction = deviceAndFunction & 0xffff;
+ hcInfo->BusDeviceFunctionValid = TRUE;
+ }
+
+ // Get the USB Host Controller info
+ dwSuccess = GetHostControllerInfo(hHCDev, hcInfo);
+
+ if (ERROR_SUCCESS != dwSuccess)
+ {
+ OOPS();
+ }
+
+ // Add this host controller to the USB device tree view.
+ //
+ hHCItem = AddLeaf(hTreeParent,
+ (LPARAM)hcInfo,
+ leafName,
+ hcInfo->Revision == UsbSuperSpeed ? GoodSsDeviceIcon : GoodDeviceIcon);
+
+ if (NULL == hHCItem)
+ {
+ // Failure adding host controller to USB device tree
+ // view.
+
+ OOPS();
+ FREE(driverKeyName);
+ FREE(hcInfo);
+ return;
+ }
+
+ // Add this host controller to the list of enumerated
+ // host controllers.
+ //
+ InsertTailList(&EnumeratedHCListHead,
+ &hcInfo->ListEntry);
+
+ // Get the name of the root hub for this host
+ // controller and then enumerate the root hub.
+ //
+ rootHubName = GetRootHubName(hHCDev);
+
+ if (rootHubName != NULL)
+ {
+ size_t cbHubName = 0;
+ HRESULT hr = S_OK;
+
+ hr = StringCbLength(rootHubName, MAX_DRIVER_KEY_NAME, &cbHubName);
+ if (SUCCEEDED(hr))
+ {
+ EnumerateHub(hHCItem,
+ rootHubName,
+ cbHubName,
+ NULL, // ConnectionInfo
+ NULL, // ConnectionInfoV2
+ NULL, // PortConnectorProps
+ NULL, // ConfigDesc
+ NULL, // BosDesc
+ NULL, // StringDescs
+ NULL); // We do not pass DevProps for RootHub
+ }
+ }
+ else
+ {
+ // Failure obtaining root hub name.
+
+ OOPS();
+ }
+
+ return;
+}
+
+
+//*****************************************************************************
+//
+// EnumerateHub()
+//
+// hTreeParent - Handle of the TreeView item under which this hub should be
+// added.
+//
+// HubName - Name of this hub. This pointer is kept so the caller can neither
+// free nor reuse this memory.
+//
+// ConnectionInfo - NULL if this is a root hub, else this is the connection
+// info for an external hub. This pointer is kept so the caller can neither
+// free nor reuse this memory.
+//
+// ConfigDesc - NULL if this is a root hub, else this is the Configuration
+// Descriptor for an external hub. This pointer is kept so the caller can
+// neither free nor reuse this memory.
+//
+// StringDescs - NULL if this is a root hub.
+//
+// DevProps - Device properties of the hub
+//
+//*****************************************************************************
+
+VOID
+EnumerateHub (
+ HTREEITEM hTreeParent,
+ _In_reads_(cbHubName) PCHAR HubName,
+ _In_ size_t cbHubName,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo,
+ _In_opt_ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2,
+ _In_opt_ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps,
+ _In_opt_ PUSB_DESCRIPTOR_REQUEST ConfigDesc,
+ _In_opt_ PUSB_DESCRIPTOR_REQUEST BosDesc,
+ _In_opt_ PSTRING_DESCRIPTOR_NODE StringDescs,
+ _In_opt_ PUSB_DEVICE_PNP_STRINGS DevProps
+ )
+{
+ // Initialize locals to not allocated state so the error cleanup routine
+ // only tries to cleanup things that were successfully allocated.
+ //
+ PUSB_NODE_INFORMATION hubInfo = NULL;
+ PUSB_HUB_INFORMATION_EX hubInfoEx = NULL;
+ PUSB_HUB_CAPABILITIES_EX hubCapabilityEx = NULL;
+ HANDLE hHubDevice = INVALID_HANDLE_VALUE;
+ HTREEITEM hItem = NULL;
+ PVOID info = NULL;
+ PCHAR deviceName = NULL;
+ ULONG nBytes = 0;
+ BOOL success = 0;
+ DWORD dwSizeOfLeafName = 0;
+ CHAR leafName[512] = {0};
+ HRESULT hr = S_OK;
+ size_t cchHeader = 0;
+ size_t cchFullHubName = 0;
+
+ // Allocate some space for a USBDEVICEINFO structure to hold the
+ // hub info, hub name, and connection info pointers. GPTR zero
+ // initializes the structure for us.
+ //
+ info = ALLOC(sizeof(USBEXTERNALHUBINFO));
+ if (info == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ // Allocate some space for a USB_NODE_INFORMATION structure for this Hub
+ //
+ hubInfo = (PUSB_NODE_INFORMATION)ALLOC(sizeof(USB_NODE_INFORMATION));
+ if (hubInfo == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ hubInfoEx = (PUSB_HUB_INFORMATION_EX)ALLOC(sizeof(USB_HUB_INFORMATION_EX));
+ if (hubInfoEx == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ hubCapabilityEx = (PUSB_HUB_CAPABILITIES_EX)ALLOC(sizeof(USB_HUB_CAPABILITIES_EX));
+ if(hubCapabilityEx == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ // Keep copies of the Hub Name, Connection Info, and Configuration
+ // Descriptor pointers
+ //
+ ((PUSBROOTHUBINFO)info)->HubInfo = hubInfo;
+ ((PUSBROOTHUBINFO)info)->HubName = HubName;
+
+ if (ConnectionInfo != NULL)
+ {
+ ((PUSBEXTERNALHUBINFO)info)->DeviceInfoType = ExternalHubInfo;
+ ((PUSBEXTERNALHUBINFO)info)->ConnectionInfo = ConnectionInfo;
+ ((PUSBEXTERNALHUBINFO)info)->ConfigDesc = ConfigDesc;
+ ((PUSBEXTERNALHUBINFO)info)->StringDescs = StringDescs;
+ ((PUSBEXTERNALHUBINFO)info)->PortConnectorProps = PortConnectorProps;
+ ((PUSBEXTERNALHUBINFO)info)->HubInfoEx = hubInfoEx;
+ ((PUSBEXTERNALHUBINFO)info)->HubCapabilityEx = hubCapabilityEx;
+ ((PUSBEXTERNALHUBINFO)info)->BosDesc = BosDesc;
+ ((PUSBEXTERNALHUBINFO)info)->ConnectionInfoV2 = ConnectionInfoV2;
+ ((PUSBEXTERNALHUBINFO)info)->UsbDeviceProperties = DevProps;
+ }
+ else
+ {
+ ((PUSBROOTHUBINFO)info)->DeviceInfoType = RootHubInfo;
+ ((PUSBROOTHUBINFO)info)->HubInfoEx = hubInfoEx;
+ ((PUSBROOTHUBINFO)info)->HubCapabilityEx = hubCapabilityEx;
+ ((PUSBROOTHUBINFO)info)->PortConnectorProps = PortConnectorProps;
+ ((PUSBROOTHUBINFO)info)->UsbDeviceProperties = DevProps;
+ }
+
+ // Allocate a temp buffer for the full hub device name.
+ //
+ hr = StringCbLength("\\\\.\\", MAX_DEVICE_PROP, &cchHeader);
+ if (FAILED(hr))
+ {
+ goto EnumerateHubError;
+ }
+ cchFullHubName = cchHeader + cbHubName + 1;
+ deviceName = (PCHAR)ALLOC((DWORD) cchFullHubName);
+ if (deviceName == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ // Create the full hub device name
+ //
+ hr = StringCchCopyN(deviceName, cchFullHubName, "\\\\.\\", cchHeader);
+ if (FAILED(hr))
+ {
+ goto EnumerateHubError;
+ }
+ hr = StringCchCatN(deviceName, cchFullHubName, HubName, cbHubName);
+ if (FAILED(hr))
+ {
+ goto EnumerateHubError;
+ }
+
+ // Try to hub the open device
+ //
+ hHubDevice = CreateFile(deviceName,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ NULL);
+
+ // Done with temp buffer for full hub device name
+ //
+ FREE(deviceName);
+
+ if (hHubDevice == INVALID_HANDLE_VALUE)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ //
+ // Now query USBHUB for the USB_NODE_INFORMATION structure for this hub.
+ // This will tell us the number of downstream ports to enumerate, among
+ // other things.
+ //
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_NODE_INFORMATION,
+ hubInfo,
+ sizeof(USB_NODE_INFORMATION),
+ hubInfo,
+ sizeof(USB_NODE_INFORMATION),
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_HUB_INFORMATION_EX,
+ hubInfoEx,
+ sizeof(USB_HUB_INFORMATION_EX),
+ hubInfoEx,
+ sizeof(USB_HUB_INFORMATION_EX),
+ &nBytes,
+ NULL);
+
+ //
+ // Fail gracefully for downlevel OS's from Win8
+ //
+ if (!success || nBytes < sizeof(USB_HUB_INFORMATION_EX))
+ {
+ FREE(hubInfoEx);
+ hubInfoEx = NULL;
+ if (ConnectionInfo != NULL)
+ {
+ ((PUSBEXTERNALHUBINFO)info)->HubInfoEx = NULL;
+ }
+ else
+ {
+ ((PUSBROOTHUBINFO)info)->HubInfoEx = NULL;
+ }
+ }
+
+ //
+ // Obtain Hub Capabilities
+ //
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_HUB_CAPABILITIES_EX,
+ hubCapabilityEx,
+ sizeof(USB_HUB_CAPABILITIES_EX),
+ hubCapabilityEx,
+ sizeof(USB_HUB_CAPABILITIES_EX),
+ &nBytes,
+ NULL);
+
+ //
+ // Fail gracefully
+ //
+ if (!success || nBytes < sizeof(USB_HUB_CAPABILITIES_EX))
+ {
+ FREE(hubCapabilityEx);
+ hubCapabilityEx = NULL;
+ if (ConnectionInfo != NULL)
+ {
+ ((PUSBEXTERNALHUBINFO)info)->HubCapabilityEx = NULL;
+ }
+ else
+ {
+ ((PUSBROOTHUBINFO)info)->HubCapabilityEx = NULL;
+ }
+ }
+
+ // Build the leaf name from the port number and the device description
+ //
+ dwSizeOfLeafName = sizeof(leafName);
+ if (ConnectionInfo)
+ {
+ StringCchPrintf(leafName, dwSizeOfLeafName, "[Port%d] ", ConnectionInfo->ConnectionIndex);
+ StringCchCat(leafName,
+ dwSizeOfLeafName,
+ ConnectionStatuses[ConnectionInfo->ConnectionStatus]);
+ StringCchCatN(leafName,
+ dwSizeOfLeafName,
+ " : ",
+ sizeof(" : "));
+ }
+
+ if (DevProps)
+ {
+ size_t cbDeviceDesc = 0;
+ hr = StringCbLength(DevProps->DeviceDesc, MAX_DRIVER_KEY_NAME, &cbDeviceDesc);
+ if(SUCCEEDED(hr))
+ {
+ StringCchCatN(leafName,
+ dwSizeOfLeafName,
+ DevProps->DeviceDesc,
+ cbDeviceDesc);
+ }
+ }
+ else
+ {
+ if(ConnectionInfo != NULL)
+ {
+ // External hub
+ StringCchCatN(leafName,
+ dwSizeOfLeafName,
+ HubName,
+ cbHubName);
+ }
+ else
+ {
+ // Root hub
+ StringCchCatN(leafName,
+ dwSizeOfLeafName,
+ "RootHub",
+ sizeof("RootHub"));
+ }
+ }
+
+ // Now add an item to the TreeView with the PUSBDEVICEINFO pointer info
+ // as the LPARAM reference value containing everything we know about the
+ // hub.
+ //
+ hItem = AddLeaf(hTreeParent,
+ (LPARAM)info,
+ leafName,
+ HubIcon);
+
+ if (hItem == NULL)
+ {
+ OOPS();
+ goto EnumerateHubError;
+ }
+
+ // Now recursively enumerate the ports of this hub.
+ //
+ EnumerateHubPorts(
+ hItem,
+ hHubDevice,
+ hubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts
+ );
+
+
+ CloseHandle(hHubDevice);
+ return;
+
+EnumerateHubError:
+ //
+ // Clean up any stuff that got allocated
+ //
+
+ if (hHubDevice != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(hHubDevice);
+ hHubDevice = INVALID_HANDLE_VALUE;
+ }
+
+ if (hubInfo)
+ {
+ FREE(hubInfo);
+ }
+
+ if (hubInfoEx)
+ {
+ FREE(hubInfoEx);
+ }
+
+ if (info)
+ {
+ FREE(info);
+ }
+
+ if (HubName)
+ {
+ FREE(HubName);
+ }
+
+ if (ConnectionInfo)
+ {
+ FREE(ConnectionInfo);
+ }
+
+ if (ConfigDesc)
+ {
+ FREE(ConfigDesc);
+ }
+
+ if (BosDesc)
+ {
+ FREE(BosDesc);
+ }
+
+ if (StringDescs != NULL)
+ {
+ PSTRING_DESCRIPTOR_NODE Next;
+
+ do {
+
+ Next = StringDescs->Next;
+ FREE(StringDescs);
+ StringDescs = Next;
+
+ } while (StringDescs != NULL);
+ }
+}
+
+//*****************************************************************************
+//
+// EnumerateHubPorts()
+//
+// hTreeParent - Handle of the TreeView item under which the hub port should
+// be added.
+//
+// hHubDevice - Handle of the hub device to enumerate.
+//
+// NumPorts - Number of ports on the hub.
+//
+//*****************************************************************************
+
+VOID
+EnumerateHubPorts (
+ HTREEITEM hTreeParent,
+ HANDLE hHubDevice,
+ ULONG NumPorts
+)
+{
+ ULONG index = 0;
+ BOOL success = 0;
+ HRESULT hr = S_OK;
+ PCHAR driverKeyName = NULL;
+ PUSB_DEVICE_PNP_STRINGS DevProps;
+ DWORD dwSizeOfLeafName = 0;
+ CHAR leafName[512];
+ int icon = 0;
+
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfoEx;
+ PUSB_PORT_CONNECTOR_PROPERTIES pPortConnectorProps;
+ USB_PORT_CONNECTOR_PROPERTIES portConnectorProps;
+ PUSB_DESCRIPTOR_REQUEST configDesc;
+ PUSB_DESCRIPTOR_REQUEST bosDesc;
+ PSTRING_DESCRIPTOR_NODE stringDescs;
+ PUSBDEVICEINFO info;
+ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 connectionInfoExV2;
+ PDEVICE_INFO_NODE pNode;
+
+ // Loop over all ports of the hub.
+ //
+ // Port indices are 1 based, not 0 based.
+ //
+ for (index = 1; index <= NumPorts; index++)
+ {
+ ULONG nBytesEx;
+ ULONG nBytes = 0;
+
+ connectionInfoEx = NULL;
+ pPortConnectorProps = NULL;
+ ZeroMemory(&portConnectorProps, sizeof(portConnectorProps));
+ configDesc = NULL;
+ bosDesc = NULL;
+ stringDescs = NULL;
+ info = NULL;
+ connectionInfoExV2 = NULL;
+ pNode = NULL;
+ DevProps = NULL;
+ ZeroMemory(leafName, sizeof(leafName));
+
+ //
+ // Allocate space to hold the connection info for this port.
+ // For now, allocate it big enough to hold info for 30 pipes.
+ //
+ // Endpoint numbers are 0-15. Endpoint number 0 is the standard
+ // control endpoint which is not explicitly listed in the Configuration
+ // Descriptor. There can be an IN endpoint and an OUT endpoint at
+ // endpoint numbers 1-15 so there can be a maximum of 30 endpoints
+ // per device configuration.
+ //
+ // Should probably size this dynamically at some point.
+ //
+
+ nBytesEx = sizeof(USB_NODE_CONNECTION_INFORMATION_EX) +
+ (sizeof(USB_PIPE_INFO) * 30);
+
+ connectionInfoEx = (PUSB_NODE_CONNECTION_INFORMATION_EX)ALLOC(nBytesEx);
+
+ if (connectionInfoEx == NULL)
+ {
+ OOPS();
+ break;
+ }
+
+ connectionInfoExV2 = (PUSB_NODE_CONNECTION_INFORMATION_EX_V2)
+ ALLOC(sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2));
+
+ if (connectionInfoExV2 == NULL)
+ {
+ OOPS();
+ FREE(connectionInfoEx);
+ break;
+ }
+
+ //
+ // Now query USBHUB for the structures
+ // for this port. This will tell us if a device is attached to this
+ // port, among other things.
+ // The fault tolerate code is executed first.
+ //
+
+ portConnectorProps.ConnectionIndex = index;
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_PORT_CONNECTOR_PROPERTIES,
+ &portConnectorProps,
+ sizeof(USB_PORT_CONNECTOR_PROPERTIES),
+ &portConnectorProps,
+ sizeof(USB_PORT_CONNECTOR_PROPERTIES),
+ &nBytes,
+ NULL);
+
+ if (success && nBytes == sizeof(USB_PORT_CONNECTOR_PROPERTIES))
+ {
+ pPortConnectorProps = (PUSB_PORT_CONNECTOR_PROPERTIES)
+ ALLOC(portConnectorProps.ActualLength);
+
+ if (pPortConnectorProps != NULL)
+ {
+ pPortConnectorProps->ConnectionIndex = index;
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_PORT_CONNECTOR_PROPERTIES,
+ pPortConnectorProps,
+ portConnectorProps.ActualLength,
+ pPortConnectorProps,
+ portConnectorProps.ActualLength,
+ &nBytes,
+ NULL);
+
+ if (!success || nBytes < portConnectorProps.ActualLength)
+ {
+ FREE(pPortConnectorProps);
+ pPortConnectorProps = NULL;
+ }
+ }
+ }
+
+ connectionInfoExV2->ConnectionIndex = index;
+ connectionInfoExV2->Length = sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2);
+ connectionInfoExV2->SupportedUsbProtocols.Usb300 = 1;
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2,
+ connectionInfoExV2,
+ sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2),
+ connectionInfoExV2,
+ sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2),
+ &nBytes,
+ NULL);
+
+ if (!success || nBytes < sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2))
+ {
+ FREE(connectionInfoExV2);
+ connectionInfoExV2 = NULL;
+ }
+
+ connectionInfoEx->ConnectionIndex = index;
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
+ connectionInfoEx,
+ nBytesEx,
+ connectionInfoEx,
+ nBytesEx,
+ &nBytesEx,
+ NULL);
+
+ if (success)
+ {
+ //
+ // Since the USB_NODE_CONNECTION_INFORMATION_EX is used to display
+ // the device speed, but the hub driver doesn't support indication
+ // of superspeed, we overwrite the value if the super speed
+ // data structures are available and indicate the device is operating
+ // at SuperSpeed.
+ //
+
+ if (connectionInfoEx->Speed == UsbHighSpeed
+ && connectionInfoExV2 != NULL
+ && (connectionInfoExV2->Flags.DeviceIsOperatingAtSuperSpeedOrHigher ||
+ connectionInfoExV2->Flags.DeviceIsOperatingAtSuperSpeedPlusOrHigher))
+ {
+ connectionInfoEx->Speed = UsbSuperSpeed;
+ }
+ }
+ else
+ {
+ PUSB_NODE_CONNECTION_INFORMATION connectionInfo = NULL;
+
+ // Try using IOCTL_USB_GET_NODE_CONNECTION_INFORMATION
+ // instead of IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
+ //
+
+ nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
+ sizeof(USB_PIPE_INFO) * 30;
+
+ connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)ALLOC(nBytes);
+
+ if (connectionInfo == NULL)
+ {
+ OOPS();
+
+ FREE(connectionInfoEx);
+ if (pPortConnectorProps != NULL)
+ {
+ FREE(pPortConnectorProps);
+ }
+ if (connectionInfoExV2 != NULL)
+ {
+ FREE(connectionInfoExV2);
+ }
+ continue;
+ }
+
+ connectionInfo->ConnectionIndex = index;
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
+ connectionInfo,
+ nBytes,
+ connectionInfo,
+ nBytes,
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+
+ FREE(connectionInfo);
+ FREE(connectionInfoEx);
+ if (pPortConnectorProps != NULL)
+ {
+ FREE(pPortConnectorProps);
+ }
+ if (connectionInfoExV2 != NULL)
+ {
+ FREE(connectionInfoExV2);
+ }
+ continue;
+ }
+
+ // Copy IOCTL_USB_GET_NODE_CONNECTION_INFORMATION into
+ // IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX structure.
+ //
+ connectionInfoEx->ConnectionIndex = connectionInfo->ConnectionIndex;
+ connectionInfoEx->DeviceDescriptor = connectionInfo->DeviceDescriptor;
+ connectionInfoEx->CurrentConfigurationValue = connectionInfo->CurrentConfigurationValue;
+ connectionInfoEx->Speed = connectionInfo->LowSpeed ? UsbLowSpeed : UsbFullSpeed;
+ connectionInfoEx->DeviceIsHub = connectionInfo->DeviceIsHub;
+ connectionInfoEx->DeviceAddress = connectionInfo->DeviceAddress;
+ connectionInfoEx->NumberOfOpenPipes = connectionInfo->NumberOfOpenPipes;
+ connectionInfoEx->ConnectionStatus = connectionInfo->ConnectionStatus;
+
+ memcpy(&connectionInfoEx->PipeList[0],
+ &connectionInfo->PipeList[0],
+ sizeof(USB_PIPE_INFO) * 30);
+
+ FREE(connectionInfo);
+ }
+
+ // Update the count of connected devices
+ //
+ if (connectionInfoEx->ConnectionStatus == DeviceConnected)
+ {
+ TotalDevicesConnected++;
+ }
+
+ if (connectionInfoEx->DeviceIsHub)
+ {
+ TotalHubs++;
+ }
+
+ // If there is a device connected, get the Device Description
+ //
+ if (connectionInfoEx->ConnectionStatus != NoDeviceConnected)
+ {
+ driverKeyName = GetDriverKeyName(hHubDevice, index);
+
+ if (driverKeyName)
+ {
+ size_t cbDriverName = 0;
+
+ hr = StringCbLength(driverKeyName, MAX_DRIVER_KEY_NAME, &cbDriverName);
+ if (SUCCEEDED(hr))
+ {
+ DevProps = DriverNameToDeviceProperties(driverKeyName, cbDriverName);
+ pNode = FindMatchingDeviceNodeForDriverName(driverKeyName, connectionInfoEx->DeviceIsHub);
+ }
+ FREE(driverKeyName);
+ }
+
+ }
+
+ // If there is a device connected to the port, try to retrieve the
+ // Configuration Descriptor from the device.
+ //
+ if (gDoConfigDesc &&
+ connectionInfoEx->ConnectionStatus == DeviceConnected)
+ {
+ configDesc = GetConfigDescriptor(hHubDevice,
+ index,
+ 0);
+ }
+ else
+ {
+ configDesc = NULL;
+ }
+
+ if (configDesc != NULL &&
+ connectionInfoEx->DeviceDescriptor.bcdUSB > 0x0200)
+ {
+ bosDesc = GetBOSDescriptor(hHubDevice,
+ index);
+ }
+ else
+ {
+ bosDesc = NULL;
+ }
+
+ if (configDesc != NULL &&
+ AreThereStringDescriptors(&connectionInfoEx->DeviceDescriptor,
+ (PUSB_CONFIGURATION_DESCRIPTOR)(configDesc+1)))
+ {
+ stringDescs = GetAllStringDescriptors (
+ hHubDevice,
+ index,
+ &connectionInfoEx->DeviceDescriptor,
+ (PUSB_CONFIGURATION_DESCRIPTOR)(configDesc+1));
+ }
+ else
+ {
+ stringDescs = NULL;
+ }
+
+ // If the device connected to the port is an external hub, get the
+ // name of the external hub and recursively enumerate it.
+ //
+ if (connectionInfoEx->DeviceIsHub)
+ {
+ PCHAR extHubName;
+ size_t cbHubName = 0;
+
+ extHubName = GetExternalHubName(hHubDevice, index);
+ if (extHubName != NULL)
+ {
+ hr = StringCbLength(extHubName, MAX_DRIVER_KEY_NAME, &cbHubName);
+ if (SUCCEEDED(hr))
+ {
+ EnumerateHub(hTreeParent, //hPortItem,
+ extHubName,
+ cbHubName,
+ connectionInfoEx,
+ connectionInfoExV2,
+ pPortConnectorProps,
+ configDesc,
+ bosDesc,
+ stringDescs,
+ DevProps);
+ }
+ }
+ }
+ else
+ {
+ // Allocate some space for a USBDEVICEINFO structure to hold the
+ // hub info, hub name, and connection info pointers. GPTR zero
+ // initializes the structure for us.
+ //
+ info = (PUSBDEVICEINFO) ALLOC(sizeof(USBDEVICEINFO));
+
+ if (info == NULL)
+ {
+ OOPS();
+ if (configDesc != NULL)
+ {
+ FREE(configDesc);
+ }
+ if (bosDesc != NULL)
+ {
+ FREE(bosDesc);
+ }
+ FREE(connectionInfoEx);
+
+ if (pPortConnectorProps != NULL)
+ {
+ FREE(pPortConnectorProps);
+ }
+ if (connectionInfoExV2 != NULL)
+ {
+ FREE(connectionInfoExV2);
+ }
+ break;
+ }
+
+ info->DeviceInfoType = DeviceInfo;
+ info->ConnectionInfo = connectionInfoEx;
+ info->PortConnectorProps = pPortConnectorProps;
+ info->ConfigDesc = configDesc;
+ info->StringDescs = stringDescs;
+ info->BosDesc = bosDesc;
+ info->ConnectionInfoV2 = connectionInfoExV2;
+ info->UsbDeviceProperties = DevProps;
+ info->DeviceInfoNode = pNode;
+
+ StringCchPrintf(leafName, sizeof(leafName), "[Port%d] ", index);
+
+ // Add error description if ConnectionStatus is other than NoDeviceConnected / DeviceConnected
+ StringCchCat(leafName,
+ sizeof(leafName),
+ ConnectionStatuses[connectionInfoEx->ConnectionStatus]);
+
+ if (DevProps)
+ {
+ size_t cchDeviceDesc = 0;
+
+ hr = StringCbLength(DevProps->DeviceDesc, MAX_DEVICE_PROP, &cchDeviceDesc);
+ if (FAILED(hr))
+ {
+ OOPS();
+ }
+ dwSizeOfLeafName = sizeof(leafName);
+ StringCchCatN(leafName,
+ dwSizeOfLeafName - 1,
+ " : ",
+ sizeof(" : "));
+ StringCchCatN(leafName,
+ dwSizeOfLeafName - 1,
+ DevProps->DeviceDesc,
+ cchDeviceDesc );
+ }
+
+ if (connectionInfoEx->ConnectionStatus == NoDeviceConnected)
+ {
+ if (connectionInfoExV2 != NULL &&
+ connectionInfoExV2->SupportedUsbProtocols.Usb300 == 1)
+ {
+ icon = NoSsDeviceIcon;
+ }
+ else
+ {
+ icon = NoDeviceIcon;
+ }
+ }
+ else if (connectionInfoEx->CurrentConfigurationValue)
+ {
+ if (connectionInfoEx->Speed == UsbSuperSpeed)
+ {
+ icon = GoodSsDeviceIcon;
+ }
+ else
+ {
+ icon = GoodDeviceIcon;
+ }
+ }
+ else
+ {
+ icon = BadDeviceIcon;
+ }
+
+ AddLeaf(hTreeParent, //hPortItem,
+ (LPARAM)info,
+ leafName,
+ icon);
+ }
+ } // for
+}
+
+
+//*****************************************************************************
+//
+// WideStrToMultiStr()
+//
+//*****************************************************************************
+
+PCHAR WideStrToMultiStr (
+ _In_reads_bytes_(cbWideStr) PWCHAR WideStr,
+ _In_ size_t cbWideStr
+ )
+{
+ ULONG nBytes = 0;
+ PCHAR MultiStr = NULL;
+ PWCHAR pWideStr = NULL;
+
+ // Use local string to guarantee zero termination
+ pWideStr = (PWCHAR) ALLOC((DWORD) cbWideStr + sizeof(WCHAR));
+ if (NULL == pWideStr)
+ {
+ return NULL;
+ }
+ memset(pWideStr, 0, cbWideStr + sizeof(WCHAR));
+ memcpy(pWideStr, WideStr, cbWideStr);
+
+ // Get the length of the converted string
+ //
+ nBytes = WideCharToMultiByte(
+ CP_ACP,
+ WC_NO_BEST_FIT_CHARS,
+ pWideStr,
+ -1,
+ NULL,
+ 0,
+ NULL,
+ NULL);
+
+ if (nBytes == 0)
+ {
+ FREE(pWideStr);
+ return NULL;
+ }
+
+ // Allocate space to hold the converted string
+ //
+ MultiStr = ALLOC(nBytes);
+ if (MultiStr == NULL)
+ {
+ FREE(pWideStr);
+ return NULL;
+ }
+
+ // Convert the string
+ //
+ nBytes = WideCharToMultiByte(
+ CP_ACP,
+ WC_NO_BEST_FIT_CHARS,
+ pWideStr,
+ -1,
+ MultiStr,
+ nBytes,
+ NULL,
+ NULL);
+
+ if (nBytes == 0)
+ {
+ FREE(MultiStr);
+ FREE(pWideStr);
+ return NULL;
+ }
+
+ FREE(pWideStr);
+ return MultiStr;
+}
+
+//*****************************************************************************
+//
+// GetRootHubName()
+//
+//*****************************************************************************
+
+PCHAR GetRootHubName (
+ HANDLE HostController
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ USB_ROOT_HUB_NAME rootHubName;
+ PUSB_ROOT_HUB_NAME rootHubNameW = NULL;
+ PCHAR rootHubNameA = NULL;
+
+ // Get the length of the name of the Root Hub attached to the
+ // Host Controller
+ //
+ success = DeviceIoControl(HostController,
+ IOCTL_USB_GET_ROOT_HUB_NAME,
+ 0,
+ 0,
+ &rootHubName,
+ sizeof(rootHubName),
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetRootHubNameError;
+ }
+
+ // Allocate space to hold the Root Hub name
+ //
+ nBytes = rootHubName.ActualLength;
+
+ rootHubNameW = ALLOC(nBytes);
+ if (rootHubNameW == NULL)
+ {
+ OOPS();
+ goto GetRootHubNameError;
+ }
+
+ // Get the name of the Root Hub attached to the Host Controller
+ //
+ success = DeviceIoControl(HostController,
+ IOCTL_USB_GET_ROOT_HUB_NAME,
+ NULL,
+ 0,
+ rootHubNameW,
+ nBytes,
+ &nBytes,
+ NULL);
+ if (!success)
+ {
+ OOPS();
+ goto GetRootHubNameError;
+ }
+
+ // Convert the Root Hub name
+ //
+ rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName, nBytes - sizeof(USB_ROOT_HUB_NAME) + sizeof(WCHAR));
+
+ // All done, free the uncoverted Root Hub name and return the
+ // converted Root Hub name
+ //
+ FREE(rootHubNameW);
+
+ return rootHubNameA;
+
+GetRootHubNameError:
+ // There was an error, free anything that was allocated
+ //
+ if (rootHubNameW != NULL)
+ {
+ FREE(rootHubNameW);
+ rootHubNameW = NULL;
+ }
+ return NULL;
+}
+
+
+//*****************************************************************************
+//
+// GetExternalHubName()
+//
+//*****************************************************************************
+
+PCHAR GetExternalHubName (
+ HANDLE Hub,
+ ULONG ConnectionIndex
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ USB_NODE_CONNECTION_NAME extHubName;
+ PUSB_NODE_CONNECTION_NAME extHubNameW = NULL;
+ PCHAR extHubNameA = NULL;
+
+ // Get the length of the name of the external hub attached to the
+ // specified port.
+ //
+ extHubName.ConnectionIndex = ConnectionIndex;
+
+ success = DeviceIoControl(Hub,
+ IOCTL_USB_GET_NODE_CONNECTION_NAME,
+ &extHubName,
+ sizeof(extHubName),
+ &extHubName,
+ sizeof(extHubName),
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetExternalHubNameError;
+ }
+
+ // Allocate space to hold the external hub name
+ //
+ nBytes = extHubName.ActualLength;
+
+ if (nBytes <= sizeof(extHubName))
+ {
+ OOPS();
+ goto GetExternalHubNameError;
+ }
+
+ extHubNameW = ALLOC(nBytes);
+
+ if (extHubNameW == NULL)
+ {
+ OOPS();
+ goto GetExternalHubNameError;
+ }
+
+ // Get the name of the external hub attached to the specified port
+ //
+ extHubNameW->ConnectionIndex = ConnectionIndex;
+
+ success = DeviceIoControl(Hub,
+ IOCTL_USB_GET_NODE_CONNECTION_NAME,
+ extHubNameW,
+ nBytes,
+ extHubNameW,
+ nBytes,
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetExternalHubNameError;
+ }
+
+ // Convert the External Hub name
+ //
+ extHubNameA = WideStrToMultiStr(extHubNameW->NodeName, nBytes - sizeof(USB_NODE_CONNECTION_NAME) + sizeof(WCHAR));
+
+ // All done, free the uncoverted external hub name and return the
+ // converted external hub name
+ //
+ FREE(extHubNameW);
+
+ return extHubNameA;
+
+
+GetExternalHubNameError:
+ // There was an error, free anything that was allocated
+ //
+ if (extHubNameW != NULL)
+ {
+ FREE(extHubNameW);
+ extHubNameW = NULL;
+ }
+
+ return NULL;
+}
+
+
+//*****************************************************************************
+//
+// GetDriverKeyName()
+//
+//*****************************************************************************
+
+PCHAR GetDriverKeyName (
+ HANDLE Hub,
+ ULONG ConnectionIndex
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ USB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyName;
+ PUSB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyNameW = NULL;
+ PCHAR driverKeyNameA = NULL;
+
+ // Get the length of the name of the driver key of the device attached to
+ // the specified port.
+ //
+ driverKeyName.ConnectionIndex = ConnectionIndex;
+
+ success = DeviceIoControl(Hub,
+ IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
+ &driverKeyName,
+ sizeof(driverKeyName),
+ &driverKeyName,
+ sizeof(driverKeyName),
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetDriverKeyNameError;
+ }
+
+ // Allocate space to hold the driver key name
+ //
+ nBytes = driverKeyName.ActualLength;
+
+ if (nBytes <= sizeof(driverKeyName))
+ {
+ OOPS();
+ goto GetDriverKeyNameError;
+ }
+
+ driverKeyNameW = ALLOC(nBytes);
+ if (driverKeyNameW == NULL)
+ {
+ OOPS();
+ goto GetDriverKeyNameError;
+ }
+
+ // Get the name of the driver key of the device attached to
+ // the specified port.
+ //
+ driverKeyNameW->ConnectionIndex = ConnectionIndex;
+
+ success = DeviceIoControl(Hub,
+ IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
+ driverKeyNameW,
+ nBytes,
+ driverKeyNameW,
+ nBytes,
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetDriverKeyNameError;
+ }
+
+ // Convert the driver key name
+ //
+ driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName, nBytes - sizeof(USB_NODE_CONNECTION_DRIVERKEY_NAME) + sizeof(WCHAR));
+
+ // All done, free the uncoverted driver key name and return the
+ // converted driver key name
+ //
+ FREE(driverKeyNameW);
+
+ return driverKeyNameA;
+
+
+GetDriverKeyNameError:
+ // There was an error, free anything that was allocated
+ //
+ if (driverKeyNameW != NULL)
+ {
+ FREE(driverKeyNameW);
+ driverKeyNameW = NULL;
+ }
+
+ return NULL;
+}
+
+
+//*****************************************************************************
+//
+// GetHCDDriverKeyName()
+//
+//*****************************************************************************
+
+PCHAR GetHCDDriverKeyName (
+ HANDLE HCD
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ USB_HCD_DRIVERKEY_NAME driverKeyName = {0};
+ PUSB_HCD_DRIVERKEY_NAME driverKeyNameW = NULL;
+ PCHAR driverKeyNameA = NULL;
+
+ ZeroMemory(&driverKeyName, sizeof(driverKeyName));
+
+ // Get the length of the name of the driver key of the HCD
+ //
+ success = DeviceIoControl(HCD,
+ IOCTL_GET_HCD_DRIVERKEY_NAME,
+ &driverKeyName,
+ sizeof(driverKeyName),
+ &driverKeyName,
+ sizeof(driverKeyName),
+ &nBytes,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ goto GetHCDDriverKeyNameError;
+ }
+
+ // Allocate space to hold the driver key name
+ //
+ nBytes = driverKeyName.ActualLength;
+ if (nBytes <= sizeof(driverKeyName))
+ {
+ OOPS();
+ goto GetHCDDriverKeyNameError;
+ }
+
+ driverKeyNameW = ALLOC(nBytes);
+ if (driverKeyNameW == NULL)
+ {
+ OOPS();
+ goto GetHCDDriverKeyNameError;
+ }
+
+ // Get the name of the driver key of the device attached to
+ // the specified port.
+ //
+
+ success = DeviceIoControl(HCD,
+ IOCTL_GET_HCD_DRIVERKEY_NAME,
+ driverKeyNameW,
+ nBytes,
+ driverKeyNameW,
+ nBytes,
+ &nBytes,
+ NULL);
+ if (!success)
+ {
+ OOPS();
+ goto GetHCDDriverKeyNameError;
+ }
+
+ //
+ // Convert the driver key name
+ // Pass the length of the DriverKeyName string
+ //
+
+ driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName, nBytes - sizeof(USB_HCD_DRIVERKEY_NAME) + sizeof(WCHAR));
+
+ // All done, free the uncoverted driver key name and return the
+ // converted driver key name
+ //
+ FREE(driverKeyNameW);
+
+ return driverKeyNameA;
+
+GetHCDDriverKeyNameError:
+ // There was an error, free anything that was allocated
+ //
+ if (driverKeyNameW != NULL)
+ {
+ FREE(driverKeyNameW);
+ driverKeyNameW = NULL;
+ }
+
+ return NULL;
+}
+
+
+//*****************************************************************************
+//
+// GetConfigDescriptor()
+//
+// hHubDevice - Handle of the hub device containing the port from which the
+// Configuration Descriptor will be requested.
+//
+// ConnectionIndex - Identifies the port on the hub to which a device is
+// attached from which the Configuration Descriptor will be requested.
+//
+// DescriptorIndex - Configuration Descriptor index, zero based.
+//
+//*****************************************************************************
+
+PUSB_DESCRIPTOR_REQUEST
+GetConfigDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ UCHAR DescriptorIndex
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ ULONG nBytesReturned = 0;
+
+ UCHAR configDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
+ sizeof(USB_CONFIGURATION_DESCRIPTOR)];
+
+ PUSB_DESCRIPTOR_REQUEST configDescReq = NULL;
+ PUSB_CONFIGURATION_DESCRIPTOR configDesc = NULL;
+
+
+ // Request the Configuration Descriptor the first time using our
+ // local buffer, which is just big enough for the Cofiguration
+ // Descriptor itself.
+ //
+ nBytes = sizeof(configDescReqBuf);
+
+ configDescReq = (PUSB_DESCRIPTOR_REQUEST)configDescReqBuf;
+ configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);
+
+ // Zero fill the entire request structure
+ //
+ memset(configDescReq, 0, nBytes);
+
+ // Indicate the port from which the descriptor will be requested
+ //
+ configDescReq->ConnectionIndex = ConnectionIndex;
+
+ //
+ // USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
+ // IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
+ //
+ // USBD will automatically initialize these fields:
+ // bmRequest = 0x80
+ // bRequest = 0x06
+ //
+ // We must inititialize these fields:
+ // wValue = Descriptor Type (high) and Descriptor Index (low byte)
+ // wIndex = Zero (or Language ID for String Descriptors)
+ // wLength = Length of descriptor buffer
+ //
+ configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
+ | DescriptorIndex;
+
+ configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
+
+ // Now issue the get descriptor request.
+ //
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
+ configDescReq,
+ nBytes,
+ configDescReq,
+ nBytes,
+ &nBytesReturned,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (nBytes != nBytesReturned)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (configDesc->wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ OOPS();
+ return NULL;
+ }
+
+ // Now request the entire Configuration Descriptor using a dynamically
+ // allocated buffer which is sized big enough to hold the entire descriptor
+ //
+ nBytes = sizeof(USB_DESCRIPTOR_REQUEST) + configDesc->wTotalLength;
+
+ configDescReq = (PUSB_DESCRIPTOR_REQUEST)ALLOC(nBytes);
+
+ if (configDescReq == NULL)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);
+
+ // Indicate the port from which the descriptor will be requested
+ //
+ configDescReq->ConnectionIndex = ConnectionIndex;
+
+ //
+ // USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
+ // IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
+ //
+ // USBD will automatically initialize these fields:
+ // bmRequest = 0x80
+ // bRequest = 0x06
+ //
+ // We must inititialize these fields:
+ // wValue = Descriptor Type (high) and Descriptor Index (low byte)
+ // wIndex = Zero (or Language ID for String Descriptors)
+ // wLength = Length of descriptor buffer
+ //
+ configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
+ | DescriptorIndex;
+
+ configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
+
+ // Now issue the get descriptor request.
+ //
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
+ configDescReq,
+ nBytes,
+ configDescReq,
+ nBytes,
+ &nBytesReturned,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ FREE(configDescReq);
+ return NULL;
+ }
+
+ if (nBytes != nBytesReturned)
+ {
+ OOPS();
+ FREE(configDescReq);
+ return NULL;
+ }
+
+ if (configDesc->wTotalLength != (nBytes - sizeof(USB_DESCRIPTOR_REQUEST)))
+ {
+ OOPS();
+ FREE(configDescReq);
+ return NULL;
+ }
+
+ return configDescReq;
+}
+
+
+
+//*****************************************************************************
+//
+// GetBOSDescriptor()
+//
+// hHubDevice - Handle of the hub device containing the port from which the
+// Configuration Descriptor will be requested.
+//
+// ConnectionIndex - Identifies the port on the hub to which a device is
+// attached from which the BOS Descriptor will be requested.
+//
+//*****************************************************************************
+
+PUSB_DESCRIPTOR_REQUEST
+GetBOSDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ ULONG nBytesReturned = 0;
+
+ UCHAR bosDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
+ sizeof(USB_BOS_DESCRIPTOR)];
+
+ PUSB_DESCRIPTOR_REQUEST bosDescReq = NULL;
+ PUSB_BOS_DESCRIPTOR bosDesc = NULL;
+
+
+ // Request the BOS Descriptor the first time using our
+ // local buffer, which is just big enough for the BOS
+ // Descriptor itself.
+ //
+ nBytes = sizeof(bosDescReqBuf);
+
+ bosDescReq = (PUSB_DESCRIPTOR_REQUEST)bosDescReqBuf;
+ bosDesc = (PUSB_BOS_DESCRIPTOR)(bosDescReq+1);
+
+ // Zero fill the entire request structure
+ //
+ memset(bosDescReq, 0, nBytes);
+
+ // Indicate the port from which the descriptor will be requested
+ //
+ bosDescReq->ConnectionIndex = ConnectionIndex;
+
+ //
+ // USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
+ // IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
+ //
+ // USBD will automatically initialize these fields:
+ // bmRequest = 0x80
+ // bRequest = 0x06
+ //
+ // We must inititialize these fields:
+ // wValue = Descriptor Type (high) and Descriptor Index (low byte)
+ // wIndex = Zero (or Language ID for String Descriptors)
+ // wLength = Length of descriptor buffer
+ //
+ bosDescReq->SetupPacket.wValue = (USB_BOS_DESCRIPTOR_TYPE << 8);
+
+ bosDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
+
+ // Now issue the get descriptor request.
+ //
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
+ bosDescReq,
+ nBytes,
+ bosDescReq,
+ nBytes,
+ &nBytesReturned,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (nBytes != nBytesReturned)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (bosDesc->wTotalLength < sizeof(USB_BOS_DESCRIPTOR))
+ {
+ OOPS();
+ return NULL;
+ }
+
+ // Now request the entire BOS Descriptor using a dynamically
+ // allocated buffer which is sized big enough to hold the entire descriptor
+ //
+ nBytes = sizeof(USB_DESCRIPTOR_REQUEST) + bosDesc->wTotalLength;
+
+ bosDescReq = (PUSB_DESCRIPTOR_REQUEST)ALLOC(nBytes);
+
+ if (bosDescReq == NULL)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ bosDesc = (PUSB_BOS_DESCRIPTOR)(bosDescReq+1);
+
+ // Indicate the port from which the descriptor will be requested
+ //
+ bosDescReq->ConnectionIndex = ConnectionIndex;
+
+ //
+ // USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
+ // IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
+ //
+ // USBD will automatically initialize these fields:
+ // bmRequest = 0x80
+ // bRequest = 0x06
+ //
+ // We must inititialize these fields:
+ // wValue = Descriptor Type (high) and Descriptor Index (low byte)
+ // wIndex = Zero (or Language ID for String Descriptors)
+ // wLength = Length of descriptor buffer
+ //
+ bosDescReq->SetupPacket.wValue = (USB_BOS_DESCRIPTOR_TYPE << 8);
+
+ bosDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
+
+ // Now issue the get descriptor request.
+ //
+
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
+ bosDescReq,
+ nBytes,
+ bosDescReq,
+ nBytes,
+ &nBytesReturned,
+ NULL);
+
+ if (!success)
+ {
+ OOPS();
+ FREE(bosDescReq);
+ return NULL;
+ }
+
+ if (nBytes != nBytesReturned)
+ {
+ OOPS();
+ FREE(bosDescReq);
+ return NULL;
+ }
+
+ if (bosDesc->wTotalLength != (nBytes - sizeof(USB_DESCRIPTOR_REQUEST)))
+ {
+ OOPS();
+ FREE(bosDescReq);
+ return NULL;
+ }
+
+ return bosDescReq;
+}
+
+
+//*****************************************************************************
+//
+// AreThereStringDescriptors()
+//
+// DeviceDesc - Device Descriptor for which String Descriptors should be
+// checked.
+//
+// ConfigDesc - Configuration Descriptor (also containing Interface Descriptor)
+// for which String Descriptors should be checked.
+//
+//*****************************************************************************
+
+BOOL
+AreThereStringDescriptors (
+ PUSB_DEVICE_DESCRIPTOR DeviceDesc,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc
+)
+{
+ PUCHAR descEnd = NULL;
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+
+ //
+ // Check Device Descriptor strings
+ //
+
+ if (DeviceDesc->iManufacturer ||
+ DeviceDesc->iProduct ||
+ DeviceDesc->iSerialNumber
+ )
+ {
+ return TRUE;
+ }
+
+
+ //
+ // Check the Configuration and Interface Descriptor strings
+ //
+
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+ case USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ OOPS();
+ break;
+ }
+ if (((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc)->iConfiguration)
+ {
+ return TRUE;
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+
+ case USB_INTERFACE_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR) &&
+ commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR2))
+ {
+ OOPS();
+ break;
+ }
+ if (((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->iInterface)
+ {
+ return TRUE;
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+
+ default:
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+
+//*****************************************************************************
+//
+// GetAllStringDescriptors()
+//
+// hHubDevice - Handle of the hub device containing the port from which the
+// String Descriptors will be requested.
+//
+// ConnectionIndex - Identifies the port on the hub to which a device is
+// attached from which the String Descriptors will be requested.
+//
+// DeviceDesc - Device Descriptor for which String Descriptors should be
+// requested.
+//
+// ConfigDesc - Configuration Descriptor (also containing Interface Descriptor)
+// for which String Descriptors should be requested.
+//
+//*****************************************************************************
+
+PSTRING_DESCRIPTOR_NODE
+GetAllStringDescriptors (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ PUSB_DEVICE_DESCRIPTOR DeviceDesc,
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc
+)
+{
+ PSTRING_DESCRIPTOR_NODE supportedLanguagesString = NULL;
+ ULONG numLanguageIDs = 0;
+ USHORT *languageIDs = NULL;
+
+ PUCHAR descEnd = NULL;
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ UCHAR uIndex = 1;
+ UCHAR bInterfaceClass = 0;
+ BOOL getMoreStrings = FALSE;
+ HRESULT hr = S_OK;
+
+ //
+ // Get the array of supported Language IDs, which is returned
+ // in String Descriptor 0
+ //
+ supportedLanguagesString = GetStringDescriptor(hHubDevice,
+ ConnectionIndex,
+ 0,
+ 0);
+
+ if (supportedLanguagesString == NULL)
+ {
+ return NULL;
+ }
+
+ numLanguageIDs = (supportedLanguagesString->StringDescriptor->bLength - 2) / 2;
+
+ languageIDs = &supportedLanguagesString->StringDescriptor->bString[0];
+
+ //
+ // Get the Device Descriptor strings
+ //
+
+ if (DeviceDesc->iManufacturer)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ DeviceDesc->iManufacturer,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+
+ if (DeviceDesc->iProduct)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ DeviceDesc->iProduct,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+
+ if (DeviceDesc->iSerialNumber)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ DeviceDesc->iSerialNumber,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+
+ //
+ // Get the Configuration and Interface Descriptor strings
+ //
+
+ descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength;
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc;
+
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ OOPS();
+ break;
+ }
+ if (((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc)->iConfiguration)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ ((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc)->iConfiguration,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+
+ case USB_IAD_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_IAD_DESCRIPTOR))
+ {
+ OOPS();
+ break;
+ }
+ if (((PUSB_IAD_DESCRIPTOR)commonDesc)->iFunction)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ ((PUSB_IAD_DESCRIPTOR)commonDesc)->iFunction,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+
+ case USB_INTERFACE_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR) &&
+ commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR2))
+ {
+ OOPS();
+ break;
+ }
+ if (((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->iInterface)
+ {
+ GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->iInterface,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+
+ //
+ // We need to display more string descriptors for the following
+ // interface classes
+ //
+ bInterfaceClass = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceClass;
+ if (bInterfaceClass == USB_DEVICE_CLASS_VIDEO)
+ {
+ getMoreStrings = TRUE;
+ }
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+
+ default:
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ continue;
+ }
+ break;
+ }
+
+ if (getMoreStrings)
+ {
+ //
+ // We might need to display strings later that are referenced only in
+ // class-specific descriptors. Get String Descriptors 1 through 32 (an
+ // arbitrary upper limit for Strings needed due to "bad devices"
+ // returning an infinite repeat of Strings 0 through 4) until one is not
+ // found.
+ //
+ // There are also "bad devices" that have issues even querying 1-32, but
+ // historically USBView made this query, so the query should be safe for
+ // video devices.
+ //
+ for (uIndex = 1; SUCCEEDED(hr) && (uIndex < NUM_STRING_DESC_TO_GET); uIndex++)
+ {
+ hr = GetStringDescriptors(hHubDevice,
+ ConnectionIndex,
+ uIndex,
+ numLanguageIDs,
+ languageIDs,
+ supportedLanguagesString);
+ }
+ }
+
+ return supportedLanguagesString;
+}
+
+
+
+//*****************************************************************************
+//
+// GetStringDescriptor()
+//
+// hHubDevice - Handle of the hub device containing the port from which the
+// String Descriptor will be requested.
+//
+// ConnectionIndex - Identifies the port on the hub to which a device is
+// attached from which the String Descriptor will be requested.
+//
+// DescriptorIndex - String Descriptor index.
+//
+// LanguageID - Language in which the string should be requested.
+//
+//*****************************************************************************
+
+PSTRING_DESCRIPTOR_NODE
+GetStringDescriptor (
+ HANDLE hHubDevice,
+ ULONG ConnectionIndex,
+ UCHAR DescriptorIndex,
+ USHORT LanguageID
+)
+{
+ BOOL success = 0;
+ ULONG nBytes = 0;
+ ULONG nBytesReturned = 0;
+
+ UCHAR stringDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
+ MAXIMUM_USB_STRING_LENGTH];
+
+ PUSB_DESCRIPTOR_REQUEST stringDescReq = NULL;
+ PUSB_STRING_DESCRIPTOR stringDesc = NULL;
+ PSTRING_DESCRIPTOR_NODE stringDescNode = NULL;
+
+ nBytes = sizeof(stringDescReqBuf);
+
+ stringDescReq = (PUSB_DESCRIPTOR_REQUEST)stringDescReqBuf;
+ stringDesc = (PUSB_STRING_DESCRIPTOR)(stringDescReq+1);
+
+ // Zero fill the entire request structure
+ //
+ memset(stringDescReq, 0, nBytes);
+
+ // Indicate the port from which the descriptor will be requested
+ //
+ stringDescReq->ConnectionIndex = ConnectionIndex;
+
+ //
+ // USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
+ // IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
+ //
+ // USBD will automatically initialize these fields:
+ // bmRequest = 0x80
+ // bRequest = 0x06
+ //
+ // We must inititialize these fields:
+ // wValue = Descriptor Type (high) and Descriptor Index (low byte)
+ // wIndex = Zero (or Language ID for String Descriptors)
+ // wLength = Length of descriptor buffer
+ //
+ stringDescReq->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8)
+ | DescriptorIndex;
+
+ stringDescReq->SetupPacket.wIndex = LanguageID;
+
+ stringDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
+
+ // Now issue the get descriptor request.
+ //
+ success = DeviceIoControl(hHubDevice,
+ IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
+ stringDescReq,
+ nBytes,
+ stringDescReq,
+ nBytes,
+ &nBytesReturned,
+ NULL);
+
+ //
+ // Do some sanity checks on the return from the get descriptor request.
+ //
+
+ if (!success)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (nBytesReturned < 2)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (stringDesc->bDescriptorType != USB_STRING_DESCRIPTOR_TYPE)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (stringDesc->bLength != nBytesReturned - sizeof(USB_DESCRIPTOR_REQUEST))
+ {
+ OOPS();
+ return NULL;
+ }
+
+ if (stringDesc->bLength % 2 != 0)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ //
+ // Looks good, allocate some (zero filled) space for the string descriptor
+ // node and copy the string descriptor to it.
+ //
+
+ stringDescNode = (PSTRING_DESCRIPTOR_NODE)ALLOC(sizeof(STRING_DESCRIPTOR_NODE) +
+ stringDesc->bLength);
+
+ if (stringDescNode == NULL)
+ {
+ OOPS();
+ return NULL;
+ }
+
+ stringDescNode->DescriptorIndex = DescriptorIndex;
+ stringDescNode->LanguageID = LanguageID;
+
+ memcpy(stringDescNode->StringDescriptor,
+ stringDesc,
+ stringDesc->bLength);
+
+ return stringDescNode;
+}
+
+
+//*****************************************************************************
+//
+// GetStringDescriptors()
+//
+// hHubDevice - Handle of the hub device containing the port from which the
+// String Descriptor will be requested.
+//
+// ConnectionIndex - Identifies the port on the hub to which a device is
+// attached from which the String Descriptor will be requested.
+//
+// DescriptorIndex - String Descriptor index.
+//
+// NumLanguageIDs - Number of languages in which the string should be
+// requested.
+//
+// LanguageIDs - Languages in which the string should be requested.
+//
+// StringDescNodeHead - First node in linked list of device's string descriptors
+//
+// Return Value: HRESULT indicating whether the string is on the list
+//
+//*****************************************************************************
+
+HRESULT
+GetStringDescriptors (
+ _In_ HANDLE hHubDevice,
+ _In_ ULONG ConnectionIndex,
+ _In_ UCHAR DescriptorIndex,
+ _In_ ULONG NumLanguageIDs,
+ _In_reads_(NumLanguageIDs) USHORT *LanguageIDs,
+ _In_ PSTRING_DESCRIPTOR_NODE StringDescNodeHead
+)
+{
+ PSTRING_DESCRIPTOR_NODE tail = NULL;
+ PSTRING_DESCRIPTOR_NODE trailing = NULL;
+ ULONG i = 0;
+
+ //
+ // Go to the end of the linked list, searching for the requested index to
+ // see if we've already retrieved it
+ //
+ for (tail = StringDescNodeHead; tail != NULL; tail = tail->Next)
+ {
+ if (tail->DescriptorIndex == DescriptorIndex)
+ {
+ return S_OK;
+ }
+
+ trailing = tail;
+ }
+
+ tail = trailing;
+
+ //
+ // Get the next String Descriptor. If this is NULL, then we're done (return)
+ // Otherwise, loop through all Language IDs
+ //
+ for (i = 0; (tail != NULL) && (i < NumLanguageIDs); i++)
+ {
+ tail->Next = GetStringDescriptor(hHubDevice,
+ ConnectionIndex,
+ DescriptorIndex,
+ LanguageIDs[i]);
+
+ tail = tail->Next;
+ }
+
+ if (tail == NULL)
+ {
+ return E_FAIL;
+ } else {
+ return S_OK;
+ }
+}
+
+
+//*****************************************************************************
+//
+// CleanupItem()
+//
+//*****************************************************************************
+
+VOID
+CleanupItem (
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+)
+{
+ TV_ITEM tvi;
+ PVOID info = NULL;
+
+ UNREFERENCED_PARAMETER(pContext);
+
+ tvi.mask = TVIF_HANDLE | TVIF_PARAM;
+ tvi.hItem = hTreeItem;
+
+ TreeView_GetItem(hTreeWnd,
+ &tvi);
+
+ info = (PVOID)tvi.lParam;
+
+ if (info)
+ {
+ PCHAR DriverKey = NULL;
+ PUSB_NODE_INFORMATION HubInfo = NULL;
+ PCHAR HubName = NULL;
+ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfoEx = NULL;
+ PUSB_DESCRIPTOR_REQUEST ConfigDesc = NULL;
+ PUSB_DESCRIPTOR_REQUEST BosDesc = NULL;
+ PSTRING_DESCRIPTOR_NODE StringDescs = NULL;
+ PUSB_HUB_INFORMATION_EX HubInfoEx = NULL;
+ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps = NULL;
+ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2 = NULL;
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx = NULL;
+ PUSB_DEVICE_PNP_STRINGS UsbDeviceProperties = NULL;
+ PUSB_CONTROLLER_INFO_0 ControllerInfo = NULL;
+
+ //
+ // All structures except DEVICE_INFO_NODE are free'd up here. DEVICE_INFO_NODE structures are free'd while
+ // destroying device info lists (ClearDeviceList())
+ //
+ switch (*(PUSBDEVICEINFOTYPE)info)
+ {
+ case HostControllerInfo:
+ //
+ // Remove this host controller from the list of enumerated
+ // host controllers.
+ //
+ RemoveEntryList(&((PUSBHOSTCONTROLLERINFO)info)->ListEntry);
+ DriverKey = ((PUSBHOSTCONTROLLERINFO)info)->DriverKey;
+ ControllerInfo = ((PUSBHOSTCONTROLLERINFO)info)->ControllerInfo;
+ UsbDeviceProperties = ((PUSBHOSTCONTROLLERINFO)info)->UsbDeviceProperties;
+ break;
+
+ case RootHubInfo:
+ HubInfo = ((PUSBROOTHUBINFO)info)->HubInfo;
+ HubInfoEx = ((PUSBROOTHUBINFO)info)->HubInfoEx;
+ HubName = ((PUSBROOTHUBINFO)info)->HubName;
+ PortConnectorProps = ((PUSBROOTHUBINFO)info)->PortConnectorProps;
+ UsbDeviceProperties = ((PUSBROOTHUBINFO)info)->UsbDeviceProperties;
+ HubCapabilityEx = ((PUSBROOTHUBINFO)info)->HubCapabilityEx;
+ break;
+
+ case ExternalHubInfo:
+ HubInfo = ((PUSBEXTERNALHUBINFO)info)->HubInfo;
+ HubInfoEx = ((PUSBEXTERNALHUBINFO)info)->HubInfoEx;
+ HubName = ((PUSBEXTERNALHUBINFO)info)->HubName;
+ ConnectionInfoEx = ((PUSBEXTERNALHUBINFO)info)->ConnectionInfo;
+ PortConnectorProps = ((PUSBEXTERNALHUBINFO)info)->PortConnectorProps;
+ ConfigDesc = ((PUSBEXTERNALHUBINFO)info)->ConfigDesc;
+ BosDesc = ((PUSBEXTERNALHUBINFO)info)->BosDesc;
+ StringDescs = ((PUSBEXTERNALHUBINFO)info)->StringDescs;
+ ConnectionInfoV2 = ((PUSBEXTERNALHUBINFO)info)->ConnectionInfoV2;
+ UsbDeviceProperties = ((PUSBEXTERNALHUBINFO)info)->UsbDeviceProperties;
+ HubCapabilityEx = ((PUSBEXTERNALHUBINFO)info)->HubCapabilityEx;
+ break;
+
+ case DeviceInfo:
+ ConnectionInfoEx = ((PUSBDEVICEINFO)info)->ConnectionInfo;
+ PortConnectorProps = ((PUSBDEVICEINFO)info)->PortConnectorProps;
+ ConfigDesc = ((PUSBDEVICEINFO)info)->ConfigDesc;
+ BosDesc = ((PUSBDEVICEINFO)info)->BosDesc;
+ StringDescs = ((PUSBDEVICEINFO)info)->StringDescs;
+ ConnectionInfoV2 = ((PUSBDEVICEINFO)info)->ConnectionInfoV2;
+ UsbDeviceProperties = ((PUSBDEVICEINFO)info)->UsbDeviceProperties;
+ break;
+ }
+
+ if(UsbDeviceProperties)
+ {
+ FreeDeviceProperties(&UsbDeviceProperties);
+ }
+
+ if(ControllerInfo)
+ {
+ FREE(ControllerInfo);
+ }
+
+ if(HubCapabilityEx)
+ {
+ FREE(HubCapabilityEx);
+ }
+
+ if (DriverKey)
+ {
+ FREE(DriverKey);
+ }
+
+ if (HubInfo)
+ {
+ FREE(HubInfo);
+ }
+
+ if (HubName)
+ {
+ FREE(HubName);
+ }
+
+ if (ConfigDesc)
+ {
+ FREE(ConfigDesc);
+ }
+
+ if (BosDesc)
+ {
+ FREE(BosDesc);
+ }
+
+ if (StringDescs)
+ {
+ PSTRING_DESCRIPTOR_NODE Next;
+
+ do {
+
+ Next = StringDescs->Next;
+ FREE(StringDescs);
+ StringDescs = Next;
+
+ } while (StringDescs);
+ }
+
+ if (ConnectionInfoEx)
+ {
+ FREE(ConnectionInfoEx);
+ }
+
+ if (HubInfoEx)
+ {
+ FREE(HubInfoEx);
+ }
+
+ if (PortConnectorProps)
+ {
+ FREE(PortConnectorProps);
+ }
+
+ if (ConnectionInfoV2)
+ {
+ FREE(ConnectionInfoV2);
+ }
+
+ FREE(info);
+ }
+}
+
+//*****************************************************************************
+//
+// GetHostControllerPowerMap()
+//
+// HANDLE hHCDev
+// - handle to USB Host Controller
+//
+// PUSBHOSTCONTROLLERINFO hcInfo
+// - data structure to receive the Power Map Info
+//
+// return DWORD dwError
+// - return ERROR_SUCCESS or last error
+//
+//*****************************************************************************
+
+DWORD
+GetHostControllerPowerMap(
+ HANDLE hHCDev,
+ PUSBHOSTCONTROLLERINFO hcInfo)
+{
+ USBUSER_POWER_INFO_REQUEST UsbPowerInfoRequest;
+ PUSB_POWER_INFO pUPI = &UsbPowerInfoRequest.PowerInformation ;
+ DWORD dwError = 0;
+ DWORD dwBytes = 0;
+ BOOL bSuccess = FALSE;
+ int nIndex = 0;
+ int nPowerState = WdmUsbPowerSystemWorking;
+
+ for ( ; nPowerState <= WdmUsbPowerSystemShutdown; nIndex++, nPowerState++)
+ {
+ // zero initialize our request
+ memset(&UsbPowerInfoRequest, 0, sizeof(UsbPowerInfoRequest));
+
+ // set the header and request sizes
+ UsbPowerInfoRequest.Header.UsbUserRequest = USBUSER_GET_POWER_STATE_MAP;
+ UsbPowerInfoRequest.Header.RequestBufferLength = sizeof(UsbPowerInfoRequest);
+ UsbPowerInfoRequest.PowerInformation.SystemState = nPowerState;
+
+ //
+ // Now query USBHUB for the USB_POWER_INFO structure for this hub.
+ // For Selective Suspend support
+ //
+ bSuccess = DeviceIoControl(hHCDev,
+ IOCTL_USB_USER_REQUEST,
+ &UsbPowerInfoRequest,
+ sizeof(UsbPowerInfoRequest),
+ &UsbPowerInfoRequest,
+ sizeof(UsbPowerInfoRequest),
+ &dwBytes,
+ NULL);
+
+ if (!bSuccess)
+ {
+ dwError = GetLastError();
+ OOPS();
+ }
+ else
+ {
+ // copy the data into our USB Host Controller's info structure
+ memcpy( &(hcInfo->USBPowerInfo[nIndex]), pUPI, sizeof(USB_POWER_INFO));
+ }
+ }
+
+ return dwError;
+}
+
+void
+EnumerateAllDevices()
+{
+ EnumerateAllDevicesWithGuid(&gDeviceList,
+ (LPGUID)&GUID_DEVINTERFACE_USB_DEVICE);
+
+ EnumerateAllDevicesWithGuid(&gHubList,
+ (LPGUID)&GUID_DEVINTERFACE_USB_HUB);
+}
+
+
+//*****************************************************************************
+//
+// GetHostControllerInfo()
+//
+// HANDLE hHCDev
+// - handle to USB Host Controller
+//
+// PUSBHOSTCONTROLLERINFO hcInfo
+// - data structure to receive the Power Map Info
+//
+// return DWORD dwError
+// - return ERROR_SUCCESS or last error
+//
+//*****************************************************************************
+
+DWORD
+GetHostControllerInfo(
+ HANDLE hHCDev,
+ PUSBHOSTCONTROLLERINFO hcInfo)
+{
+ USBUSER_CONTROLLER_INFO_0 UsbControllerInfo;
+ DWORD dwError = 0;
+ DWORD dwBytes = 0;
+ BOOL bSuccess = FALSE;
+
+ memset(&UsbControllerInfo, 0, sizeof(UsbControllerInfo));
+
+ // set the header and request sizes
+ UsbControllerInfo.Header.UsbUserRequest = USBUSER_GET_CONTROLLER_INFO_0;
+ UsbControllerInfo.Header.RequestBufferLength = sizeof(UsbControllerInfo);
+
+ //
+ // Query for the USB_CONTROLLER_INFO_0 structure
+ //
+ bSuccess = DeviceIoControl(hHCDev,
+ IOCTL_USB_USER_REQUEST,
+ &UsbControllerInfo,
+ sizeof(UsbControllerInfo),
+ &UsbControllerInfo,
+ sizeof(UsbControllerInfo),
+ &dwBytes,
+ NULL);
+
+ if (!bSuccess)
+ {
+ dwError = GetLastError();
+ OOPS();
+ }
+ else
+ {
+ hcInfo->ControllerInfo = (PUSB_CONTROLLER_INFO_0) ALLOC(sizeof(USB_CONTROLLER_INFO_0));
+ if(NULL == hcInfo->ControllerInfo)
+ {
+ dwError = GetLastError();
+ OOPS();
+ }
+ else
+ {
+ // copy the data into our USB Host Controller's info structure
+ memcpy(hcInfo->ControllerInfo, &UsbControllerInfo.Info0, sizeof(USB_CONTROLLER_INFO_0));
+ }
+ }
+ return dwError;
+}
+
+_Success_(return == TRUE)
+BOOL
+GetDeviceProperty(
+ _In_ HDEVINFO DeviceInfoSet,
+ _In_ PSP_DEVINFO_DATA DeviceInfoData,
+ _In_ DWORD Property,
+ _Outptr_ LPTSTR *ppBuffer
+ )
+{
+ BOOL bResult;
+ DWORD requiredLength = 0;
+ DWORD lastError;
+
+ if (ppBuffer == NULL)
+ {
+ return FALSE;
+ }
+
+ *ppBuffer = NULL;
+
+ bResult = SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+ DeviceInfoData,
+ Property ,
+ NULL,
+ NULL,
+ 0,
+ &requiredLength);
+ lastError = GetLastError();
+
+ if ((requiredLength == 0) || (bResult != FALSE && lastError != ERROR_INSUFFICIENT_BUFFER))
+ {
+ return FALSE;
+ }
+
+ *ppBuffer = ALLOC(requiredLength);
+
+ if (*ppBuffer == NULL)
+ {
+ return FALSE;
+ }
+
+ bResult = SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+ DeviceInfoData,
+ Property ,
+ NULL,
+ (PBYTE) *ppBuffer,
+ requiredLength,
+ &requiredLength);
+ if(bResult == FALSE)
+ {
+ FREE(*ppBuffer);
+ *ppBuffer = NULL;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+void
+EnumerateAllDevicesWithGuid(
+ PDEVICE_GUID_LIST DeviceList,
+ LPGUID Guid
+ )
+{
+ if (DeviceList->DeviceInfo != INVALID_HANDLE_VALUE)
+ {
+ ClearDeviceList(DeviceList);
+ }
+
+ DeviceList->DeviceInfo = SetupDiGetClassDevs(Guid,
+ NULL,
+ NULL,
+ (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
+
+ if (DeviceList->DeviceInfo != INVALID_HANDLE_VALUE)
+ {
+ ULONG index;
+ DWORD error;
+
+ error = 0;
+ index = 0;
+
+ while (error != ERROR_NO_MORE_ITEMS)
+ {
+ BOOL success;
+ PDEVICE_INFO_NODE pNode;
+
+ pNode = ALLOC(sizeof(DEVICE_INFO_NODE));
+ if (pNode == NULL)
+ {
+ OOPS();
+ break;
+ }
+ pNode->DeviceInfo = DeviceList->DeviceInfo;
+ pNode->DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+ pNode->DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+
+ success = SetupDiEnumDeviceInfo(DeviceList->DeviceInfo,
+ index,
+ &pNode->DeviceInfoData);
+
+ index++;
+
+ if (success == FALSE)
+ {
+ error = GetLastError();
+
+ if (error != ERROR_NO_MORE_ITEMS)
+ {
+ OOPS();
+ }
+
+ FreeDeviceInfoNode(&pNode);
+ }
+ else
+ {
+ BOOL bResult;
+ ULONG requiredLength;
+
+ bResult = GetDeviceProperty(DeviceList->DeviceInfo,
+ &pNode->DeviceInfoData,
+ SPDRP_DEVICEDESC,
+ &pNode->DeviceDescName);
+ if (bResult == FALSE)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ bResult = GetDeviceProperty(DeviceList->DeviceInfo,
+ &pNode->DeviceInfoData,
+ SPDRP_DRIVER,
+ &pNode->DeviceDriverName);
+ if (bResult == FALSE)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ pNode->DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+
+ success = SetupDiEnumDeviceInterfaces(DeviceList->DeviceInfo,
+ 0,
+ Guid,
+ index-1,
+ &pNode->DeviceInterfaceData);
+ if (!success)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ success = SetupDiGetDeviceInterfaceDetail(DeviceList->DeviceInfo,
+ &pNode->DeviceInterfaceData,
+ NULL,
+ 0,
+ &requiredLength,
+ NULL);
+
+ error = GetLastError();
+
+ if (!success && error != ERROR_INSUFFICIENT_BUFFER)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ pNode->DeviceDetailData = ALLOC(requiredLength);
+
+ if (pNode->DeviceDetailData == NULL)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ pNode->DeviceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ success = SetupDiGetDeviceInterfaceDetail(DeviceList->DeviceInfo,
+ &pNode->DeviceInterfaceData,
+ pNode->DeviceDetailData,
+ requiredLength,
+ &requiredLength,
+ NULL);
+ if (!success)
+ {
+ FreeDeviceInfoNode(&pNode);
+ OOPS();
+ break;
+ }
+
+ InsertTailList(&DeviceList->ListHead, &pNode->ListEntry);
+ }
+ }
+ }
+}
+
+DEVICE_POWER_STATE
+AcquireDevicePowerState(
+ _Inout_ PDEVICE_INFO_NODE pNode
+ )
+{
+ CM_POWER_DATA cmPowerData = {0};
+ BOOL bResult;
+
+ bResult = SetupDiGetDeviceRegistryProperty(pNode->DeviceInfo,
+ &pNode->DeviceInfoData,
+ SPDRP_DEVICE_POWER_DATA,
+ NULL,
+ (PBYTE)&cmPowerData,
+ sizeof(cmPowerData),
+ NULL);
+
+ pNode->LatestDevicePowerState = bResult ? cmPowerData.PD_MostRecentPowerState : PowerDeviceUnspecified;
+
+ return pNode->LatestDevicePowerState;
+}
+
+
+void
+ClearDeviceList(
+ PDEVICE_GUID_LIST DeviceList
+ )
+{
+ if (DeviceList->DeviceInfo != INVALID_HANDLE_VALUE)
+ {
+ SetupDiDestroyDeviceInfoList(DeviceList->DeviceInfo);
+ DeviceList->DeviceInfo = INVALID_HANDLE_VALUE;
+ }
+
+ while (!IsListEmpty(&DeviceList->ListHead))
+ {
+ PDEVICE_INFO_NODE pNode = NULL;
+ PLIST_ENTRY pEntry;
+
+ pEntry = RemoveHeadList(&DeviceList->ListHead);
+
+ pNode = CONTAINING_RECORD(pEntry,
+ DEVICE_INFO_NODE,
+ ListEntry);
+
+ FreeDeviceInfoNode(&pNode);
+ }
+}
+
+VOID
+FreeDeviceInfoNode(
+ _In_ PDEVICE_INFO_NODE *ppNode
+ )
+{
+ if (ppNode == NULL)
+ {
+ return;
+ }
+
+ if (*ppNode == NULL)
+ {
+ return;
+ }
+
+ if ((*ppNode)->DeviceDetailData != NULL)
+ {
+ FREE((*ppNode)->DeviceDetailData);
+ }
+
+ if ((*ppNode)->DeviceDescName != NULL)
+ {
+ FREE((*ppNode)->DeviceDescName);
+ }
+
+ if ((*ppNode)->DeviceDriverName != NULL)
+ {
+ FREE((*ppNode)->DeviceDriverName);
+ }
+
+ FREE(*ppNode);
+ *ppNode = NULL;
+}
+
+PDEVICE_INFO_NODE
+FindMatchingDeviceNodeForDriverName(
+ _In_ PSTR DriverKeyName,
+ _In_ BOOLEAN IsHub
+ )
+{
+ PDEVICE_INFO_NODE pNode = NULL;
+ PDEVICE_GUID_LIST pList = NULL;
+ PLIST_ENTRY pEntry = NULL;
+
+ pList = IsHub ? &gHubList : &gDeviceList;
+
+ pEntry = pList->ListHead.Flink;
+
+ while (pEntry != &pList->ListHead)
+ {
+ pNode = CONTAINING_RECORD(pEntry,
+ DEVICE_INFO_NODE,
+ ListEntry);
+ if (_stricmp(DriverKeyName, pNode->DeviceDriverName) == 0)
+ {
+ return pNode;
+ }
+
+ pEntry = pEntry->Flink;
+ }
+
+ return NULL;
+}
+
diff --git a/tests/projects/winsdk/usbview/h264.c b/tests/projects/winsdk/usbview/h264.c new file mode 100644 index 000000000..108a1d540 --- /dev/null +++ b/tests/projects/winsdk/usbview/h264.c @@ -0,0 +1,750 @@ +//*****************************************************************************
+// I N C L U D E S
+//*****************************************************************************
+
+#include "uvcview.h"
+#include "h264.h"
+
+#ifdef H264_SUPPORT
+
+//*****************************************************************************
+// G L O B A L S
+//*****************************************************************************
+// H.264 format
+UCHAR g_expectedNumberOfH264FrameDescriptors = 0;
+UCHAR g_numberOfH264FrameDescriptors = 0;
+
+// MJPEG format
+UCHAR g_expectedNumberOfMJPEGFrameDescriptors = 0;
+UCHAR g_numberOfMJPEGFrameDescriptors = 0;
+
+// Uncompressed frame format
+UCHAR g_expectedNumberOfUncompressedFrameFrameDescriptors = 0;
+UCHAR g_numberOfUncompressedFrameFrameDescriptors = 0;
+
+//*****************************************************************************
+//
+// external function prototypes
+//
+//*****************************************************************************
+extern VOID VDisplayBytes (PUCHAR Data, USHORT Len );
+
+//*****************************************************************************
+//
+// H.264 video format descriptor string tables
+//
+//*****************************************************************************
+STRINGLIST slSliceModes[]=
+{
+ {1, "Maximum number of Macroblocks per slice mode", ""},
+ {2, "Target compressed size per slice mode", ""},
+ {4, "Number of slices per frame mode", ""},
+ {8, "Number of Macroblock rows per slice mode", ""},
+ {0x10, "Reserved", ""},
+ {0x20, "Reserved", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+
+STRINGLIST slSyncFrameTypes[]=
+{
+ {1, "Reset" , ""},
+ {2, "IDR frame with SPS and PPS", ""},
+ {4, "IDR frame (with SPS and PPS) that is a long-term reference frame", ""},
+ {8, "Non-IDR random-access I frame (with SPS and PPS)", ""},
+ {0x10, "Non-IDR random-access I frame (with SPS and PPS) that is a long-term reference frame", ""},
+ {0x20, "P frame that is a long-term reference frame", ""},
+ {0x40, "Gradual Decoder Refresh frames", ""},
+ {0x80, "Reserved", ""},
+};
+
+
+//*****************************************************************************
+//
+// H.264 video frame rate descriptor string tables
+//
+//*****************************************************************************
+STRINGLIST slUsage[]=
+{
+ {0x00000001, "Real-time/UCConfig mode 0", ""}, // 0
+ {0x00000002, "Real-time/UCConfig mode 1", ""},
+ {0x00000004, "Real-time/UCConfig mode 2Q" ""},
+ {0x00000008, "Real-time/UCConfig mode 2S" ""},
+ {0x00000010, "Real-time/UCConfig mode 3", ""},
+ {0x00000020, "Reserved", ""},
+ {0x00000040, "Reserved", ""},
+ {0x00000080, "Reserved", ""},
+
+ {0x00000100, "Broadcast mode 0", ""}, // 8
+ {0x00000200, "Broadcast mode 1", ""},
+ {0x00000400, "Broadcast mode 2", ""},
+ {0x00000800, "Broadcast mode 3", ""},
+ {0x00001000, "Broadcast mode 4", ""},
+ {0x00002000, "Broadcast mode 5", ""},
+ {0x00004000, "Broadcast mode 6", ""},
+ {0x00008000, "Broadcast mode 7", ""},
+
+ {0x00010000, "File Storage mode with I and P slices (e.g. IPPP)", ""}, // 16
+ {0x00020000, "File Storage mode with I, P, and B slices (e.g. IB...BP)", ""}, // 17
+ {0x00040000, "File storage all I frame mode", ""}, // 18
+ {0x00080000, "Reserved", ""}, // 19
+ {0x00100000, "Reserved", ""}, // 20
+ {0x00200000, "Reserved", ""}, // 21
+ {0x00400000, "Reserved", ""}, // 22
+ {0x00800000, "Reserved", ""}, // 23
+
+ {0x01000000, "MVC Stereo High Mode", ""}, // 24
+ {0x02000000, "MVC Multiview Mode", ""}, // 25
+ {0x04000000, "Reserved", ""}, // 26
+ {0x08000000, "Reserved", ""}, // 27
+ {0x10000000, "Reserved", ""}, // 28
+ {0x20000000, "Reserved", ""}, // 29
+ {0x40000000, "Reserved", ""}, // 30
+ {0x80000000, "Reserved", ""}, // 31
+
+ };
+STRINGLIST slCapabilities[]=
+{
+ {0x0001, "CAVLC only", ""},
+ {0x0002, "CABAC only", ""},
+ {0x0004, "Constant frame rate", ""},
+ {0x0008, "Separate QP for luma/chroma", ""},
+ {0x0010, "Separate QP for Cb/Cr", ""},
+ {0x0020, "No picture reordering", ""},
+ {0x0040, "Long-term reference frame", ""},
+ {0x0080, "Reserved", ""},
+ {0x0100, "Reserved", ""},
+ {0x0200, "Reserved", ""},
+ {0x0400, "Reserved", ""},
+ {0x0800, "Reserved", ""},
+ {0x1000, "Reserved", ""},
+ {0x2000, "Reserved", ""},
+ {0x4000, "Reserved", ""},
+ {0x8000, "Reserved", ""},
+ };
+
+
+
+STRINGLIST slRateControlModes[]=
+{
+ {1, "Variable Bit Rate (VBR) with underflow allowed (H.264 low_delay_hrd_flag = 1)", ""},
+ {2, "Constant Bit Rate (CBR) (H.264 low_delay_hrd_flag = 0)", ""},
+ {4, "Constant QP", ""},
+ {8, "Global VBR with underflow allowed (H.264 low_delay_hrd_flag = 1)", ""},
+ {0x10, "VBR without underflow (H.264 low_delay_hrd_flag = 0)", ""},
+ {0x20, "Global VBR without underflow (H.264 low_delay_hrd_flag = 0)", ""},
+ {0x40, "Reserved", ""},
+ {0x80, "Reserved", ""},
+};
+
+
+STRINGLIST slProfiles[]=
+{
+ {0x4200, "Baseline Profile", ""},
+ {0x4240, "Constrained Baseline Profile", ""},
+ {0x4D00, "Main Profile", ""},
+ {0x5300, "Scalable Baseline Profile", ""},
+ {0x5304, "Scalable Constrained Baseline Profile", ""},
+ {0x5600, "Scalable High Profile", ""},
+ {0x5604, "Scalable Constrained High Profile", ""},
+ {0x6400, "High Profile", ""},
+ {0x640C, "Constrained High Profile", ""},
+ {0x7600, "Multiview High Profile", ""},
+ {0x8000, "Stereo High Profile", ""},
+ };
+
+//*****************************************************************************
+//
+// H.264 video encoding unit descriptor string tables
+//
+//*****************************************************************************
+
+STRINGLIST slEncodingUnitControls[]=
+{
+ {0x000001, "Select Layer", ""}, // D0
+ {0x000002, "Profile and Toolset", ""}, // D1
+ {0x000004, "Video Resolution", ""}, // D2
+ {0x000008, "Minimum Frame Interval", ""}, // D3
+ {0x000010, "Slice Mode", ""}, // D4
+ {0x000020, "Rate Control Mode", ""}, // D5
+ {0x000040, "Average Bit Rate", ""}, // D6
+ {0x000080, "CPB Size ", ""}, // D7
+ {0x000100, "Peak Bit Rate", ""}, // D8
+ {0x000200, "Quantization Parameter", ""}, // D9
+ {0x000400, "Synchronization and Long-Term Reference Frame", ""}, // D10
+ {0x000800, "Long-Term Buffer Size", ""}, // D11
+ {0x001000, "Picture Long-Term Reference", ""}, // D12
+ {0x002000, "Valid LTR", ""}, // D13
+ {0x004000, "Level IDC", ""}, // D14
+ {0x008000, "SEI Message", ""}, // D15
+ {0x010000, "QP Range", ""}, // D16
+ {0x020000, "Priority ID", ""}, // D17
+ {0x040000, "Start or Stop Layer/View", ""}, // D18
+ {0x080000, "Error Resiliency", ""}, // D19
+ {0x100000, "Reserved", ""}, // D20
+ {0x200000, "Reserved", ""}, // D21
+ {0x400000, "Reserved", ""}, // D22
+ {0x800000, "Reserved", ""}, // D23
+ };
+
+//*****************************************************************************
+//
+// commaPrintNumber()
+//
+//*****************************************************************************
+char * commaPrintNumber( ULONG number )
+{
+ static char comma = ',';
+ static char retbuf[30];
+ int digitCount = 0;
+
+ // null-terminate the string
+ char * pOutputString = &retbuf[ sizeof(retbuf)-1 ];
+ *pOutputString = '\0';
+
+ do
+ {
+ // for every 3rd digit, add a comma to the output string
+ if ( ( digitCount%3 ) == 0 && ( digitCount != 0 ) )
+ {
+ *--pOutputString = comma;
+ }
+ *--pOutputString = '0' + number % 10;
+ number /= 10;
+ digitCount++;
+ }
+ while( number != 0 );
+
+ return pOutputString;
+}
+
+//*****************************************************************************
+//
+// DisplayBitmapData()
+//
+// Note that USB is always oriented Little Endian (least significant byte
+// at the lowest address).
+//
+// Inputs:
+// PUCHAR pData - pointer to least significant byte of the data
+// UCHAR byteCount - number of bytes to print in the pData data buffer
+// char * stringLabel - string label to print for user's to identify the data type
+//
+//*****************************************************************************
+void DisplayBitmapData(_In_reads_(byteCount) PUCHAR pData, UCHAR byteCount, _In_ char * stringLabel)
+{
+ UCHAR byteIndex;
+ UCHAR data;
+ UCHAR mask;
+ UCHAR bitIndex;
+ UCHAR checkBit = 0; // the bit we want to print
+
+ // print the label and all the bytes on the first line
+ AppendTextBuffer("%s : ", stringLabel);
+ VDisplayBytes( pData, byteCount );
+
+ for ( byteIndex = 0; byteIndex < byteCount; byteIndex++ )
+ {
+ data = pData[ byteIndex ];
+ checkBit = 0; // the control bit value we are going to print
+ for ( mask = 1, bitIndex = 0; bitIndex < 8; bitIndex++ )
+ {
+ checkBit = data & mask;
+ AppendTextBuffer(" D%02d = %d %s\r\n",
+ bitIndex + 8 * byteIndex, // increment bit count
+ checkBit ? 1 : 0,
+ checkBit ? "yes" : " no");
+ mask = mask << 1;
+ }
+
+ }
+}
+
+//*****************************************************************************
+//
+// DisplayBitmapDataWithStrings()
+//
+// Note that USB is always oriented Little Endian (least significant byte
+// at the lowest address).
+//
+// This calls GetSTringFromList() to insert a string that corresonds to
+// the bit value being print.
+//
+// Inputs:
+// PUCHAR pData - pointer to least significant byte of the data
+// UCHAR byteCount - number of bytes to print in the pData data buffer
+// char * stringLabel - string label to print for user's to identify the data type
+// STRINGLIST stringList - string table in which to look up bitmap strings
+// ULONG numEntriesInTable - number of entrys (strings) in the table
+//*****************************************************************************
+void DisplayBitmapDataWithStrings( _In_reads_(byteCount) PUCHAR pData, UCHAR byteCount,
+ _In_ char * stringLabel, _In_ PSTRINGLIST stringList,
+ ULONG numEntriesInTable)
+{
+
+ UCHAR byteIndex;
+ UCHAR data;
+ UCHAR byteMask;
+ ULONGLONG stringMask;
+ UCHAR bitIndex;
+ UCHAR checkBit = 0; // the bit we want to print
+
+ // print the label and all the bytes on the first line
+ AppendTextBuffer("%s : ", stringLabel);
+ VDisplayBytes( pData, byteCount );
+
+ for ( stringMask = 1, byteIndex = 0; byteIndex < byteCount; byteIndex++ )
+ {
+ data = pData[ byteIndex ];
+ checkBit = 0; // the control bit value we are going to print
+ for ( byteMask = 1, bitIndex = 0; bitIndex < 8; bitIndex++ )
+ {
+ checkBit = data & byteMask;
+ AppendTextBuffer(" D%02d = %d %s %s\r\n",
+ bitIndex + 8 * byteIndex, // increment bit count
+ checkBit ? 1 : 0,
+ checkBit ? "yes - " : " no - ",
+ GetStringFromList(stringList,
+ numEntriesInTable,
+ stringMask,
+ "Reserved"));
+
+ byteMask = byteMask << 1;
+ stringMask = stringMask << 1;
+ }
+
+ }
+}
+
+//*****************************************************************************
+//
+// DisplayVCH264Format()
+//
+//*****************************************************************************
+BOOL DisplayVCH264Format( _In_reads_(sizeof(VIDEO_FORMAT_H264)) PVIDEO_FORMAT_H264 H264FormatDesc )
+{
+ if ( H264FormatDesc->bSimulcastSupport == 0 )
+ {
+ AppendTextBuffer("\r\n ===>Video Streaming H.264 Format Type Descriptor<===\r\n");
+ }
+ else
+ {
+ AppendTextBuffer("\r\n ===>Video Streaming H.264 Simulcast Format Type Descriptor<===\r\n");
+ }
+ AppendTextBuffer("bLength: 0x%02X = %d\r\n", H264FormatDesc->bLength, H264FormatDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X \r\n", H264FormatDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X \r\n", H264FormatDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFormatIndex: 0x%02X = %d\r\n", H264FormatDesc->bFormatIndex, H264FormatDesc->bFormatIndex);
+ AppendTextBuffer("bNumFrameDescriptors: 0x%02X = %d\r\n", H264FormatDesc->bNumFrameDescriptors, H264FormatDesc->bNumFrameDescriptors);
+ AppendTextBuffer("bDefaultFrameIndex: 0x%02X = %d\r\n", H264FormatDesc->bDefaultFrameIndex, H264FormatDesc->bDefaultFrameIndex);
+ AppendTextBuffer("bMaxCodecConfigDelay: 0x%02X = %d frames\r\n", H264FormatDesc->bMaxCodecConfigDelay, H264FormatDesc->bMaxCodecConfigDelay);
+ DisplayBitmapDataWithStrings( H264FormatDesc->bmSupportedSliceModes, sizeof(H264FormatDesc->bmSupportedSliceModes), "bmSupportedSliceModes", slSliceModes, sizeof(slSliceModes)/sizeof(STRINGLIST) );
+ DisplayBitmapDataWithStrings( H264FormatDesc->bmSupportedSyncFrameTypes, sizeof(H264FormatDesc->bmSupportedSyncFrameTypes), "bmSupportedSyncFrameTypes", slSyncFrameTypes, sizeof(slSyncFrameTypes)/sizeof(STRINGLIST) );
+
+ // handle bResolutionScaling
+ if ( H264FormatDesc->bResolutionScaling == 0 )
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Not Supported\r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+ else if ( H264FormatDesc->bResolutionScaling == 1 )
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Limited to 1.5 or 2.0 scaling in both directions, while maintaining the aspect ratio.\r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+ else if ( H264FormatDesc->bResolutionScaling == 2 )
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Limited to 1.0, 1.5 or 2.0 scaling in either direction.\r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+ else if ( H264FormatDesc->bResolutionScaling == 3 )
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Limited to resolutions reported by the associated Frame Descriptors\r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+ else if ( H264FormatDesc->bResolutionScaling == 4 )
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Arbitrary scaling\r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+ else // 5 ... 255
+ {
+ AppendTextBuffer("bResolutionScaling: 0x%02X = %d, Reserved \r\n",
+ H264FormatDesc->bResolutionScaling,
+ H264FormatDesc->bResolutionScaling );
+ }
+
+ // handle bSimulcastSupport
+ if ( H264FormatDesc->bSimulcastSupport == 0 )
+ {
+ AppendTextBuffer("bSimulcastSupport: 0x%02X = %d, one stream\r\n",
+ H264FormatDesc->bSimulcastSupport,
+ H264FormatDesc->bSimulcastSupport );
+ }
+ else if ( H264FormatDesc->bSimulcastSupport == 1 )
+ {
+ AppendTextBuffer("bSimulcastSupport: 0x%02X = %d, multiple streams\r\n",
+ H264FormatDesc->bSimulcastSupport,
+ H264FormatDesc->bSimulcastSupport );
+ }
+ else // ( H264FormatDesc->bSimulcastSupport > 1 )
+ {
+ AppendTextBuffer("bSimulcastSupport: 0x%02X = %d *!*ERROR: unknown bSimulcastSupport \r\n",
+ H264FormatDesc->bSimulcastSupport,
+ H264FormatDesc->bSimulcastSupport,
+ H264FormatDesc->bSimulcastSupport );
+ }
+
+
+ DisplayBitmapDataWithStrings( &(H264FormatDesc->bmSupportedRateControlModes), sizeof(H264FormatDesc->bmSupportedRateControlModes), "bmSupportedRateControlModes", slRateControlModes, sizeof(slRateControlModes)/sizeof(STRINGLIST) );
+
+ // Note that USB is Little Endian according to the UVC 2.0 spec
+
+
+ // Resolutions with no scalability
+ AppendTextBuffer("wMaxMBperSecOneResolutionNoScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecOneResolutionNoScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecOneResolutionNoScalability) );
+
+ AppendTextBuffer("wMaxMBperSecTwoResolutionsNoScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecTwoResolutionsNoScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecTwoResolutionsNoScalability) );
+
+ AppendTextBuffer("wMaxMBperSecThreeResolutionsNoScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecThreeResolutionsNoScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecThreeResolutionsNoScalability) );
+
+ AppendTextBuffer("wMaxMBperSecFourResolutionsNoScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecFourResolutionsNoScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecFourResolutionsNoScalability) );
+
+ // Resolutions with temporal scalability
+ AppendTextBuffer("wMaxMBperSecOneResolutionTemporalScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecOneResolutionTemporalScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecOneResolutionTemporalScalability) );
+
+ AppendTextBuffer("wMaxMBperSecTwoResolutionsTemporalScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalScalability) );
+
+ AppendTextBuffer("wMaxMBperSecThreeResolutionsTemporalScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalScalability) );
+
+ AppendTextBuffer("wMaxMBperSecFourResolutionsTemporalScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecFourResolutionsTemporalScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecFourResolutionsTemporalScalability) );
+
+ // Resolutions with temporal and quality scalability
+ AppendTextBuffer("wMaxMBperSecOneResolutionTemporalQualityScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecOneResolutionTemporalQualityScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecOneResolutionTemporalQualityScalability) );
+
+ AppendTextBuffer("wMaxMBperSecTwoResolutionsTemporalQualityScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalQualityScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalQualityScalability) );
+
+
+ AppendTextBuffer("wMaxMBperSecThreeResolutionsTemporalQualityScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalQualityScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalQualityScalability) );
+
+ AppendTextBuffer("wMaxMBperSecFourResolutionsTemporalQualityScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecFourResolutionsTemporalQualityScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecFourResolutionsTemporalQualityScalability) );
+
+ // Resolutions with temporal and spatial scalability
+ AppendTextBuffer("wMaxMBperSecOneResolutionTemporalSpatialScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecOneResolutionTemporalSpatialScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecOneResolutionTemporalSpatialScalability) );
+
+ AppendTextBuffer("wMaxMBperSecTwoResolutionsTemporalSpatialScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalSpatialScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecTwoResolutionsTemporalSpatialScalability) );
+
+
+ AppendTextBuffer("wMaxMBperSecThreeResolutionsTemporalSpatialScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalSpatialScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecThreeResolutionsTemporalSpatialScalability) );
+
+ AppendTextBuffer("wMaxMBperSecFourResolutionsTemporalSpatialScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecFourResolutionsTemporalSpatialScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecFourResolutionsTemporalSpatialScalability) );
+
+ // Resolutions with full scalability
+ AppendTextBuffer("wMaxMBperSecOneResolutionFullScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecOneResolutionFullScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecOneResolutionFullScalability) );
+
+ AppendTextBuffer("wMaxMBperSecTwoResolutionsFullScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecTwoResolutionsFullScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecTwoResolutionsFullScalability) );
+
+ AppendTextBuffer("wMaxMBperSecThreeResolutionsFullScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecThreeResolutionsFullScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecThreeResolutionsFullScalability) );
+
+ AppendTextBuffer("wMaxMBperSecFourResolutionsFullScalability: 0x%04X (%s MB/sec)\r\n",
+ H264FormatDesc->wMaxMBperSecFourResolutionsFullScalability,
+ commaPrintNumber(1000*H264FormatDesc->wMaxMBperSecFourResolutionsFullScalability) );
+
+
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DisplayVCH264FrameType()
+//
+//*****************************************************************************
+BOOL DisplayVCH264FrameType( _In_reads_(sizeof(VIDEO_FRAME_H264)) PVIDEO_FRAME_H264 H264FrameDesc )
+{
+
+ ULONG frameIntervalIndex;
+ ULONG value;
+ ULONG i;
+
+ AppendTextBuffer("\r\n ===>Video Streaming H.264 Frame Type Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X = %d\r\n", H264FrameDesc->bLength, H264FrameDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X \r\n", H264FrameDesc->bDescriptorType);
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X \r\n", H264FrameDesc->bDescriptorSubtype);
+ AppendTextBuffer("bFrameIndex: 0x%02X = %d\r\n", H264FrameDesc->bFrameIndex, H264FrameDesc->bFrameIndex);
+ AppendTextBuffer("wWidth: 0x%04X = %d\r\n", H264FrameDesc->wWidth, H264FrameDesc->wWidth);
+ AppendTextBuffer("wHeight: 0x%04X = %d\r\n", H264FrameDesc->wHeight, H264FrameDesc->wHeight);
+ AppendTextBuffer("wSARwidth: 0x%04X = %d\r\n", H264FrameDesc->wSARwidth, H264FrameDesc->wSARwidth);
+ AppendTextBuffer("wSARheight: 0x%04X = %d\r\n", H264FrameDesc->wSARheight, H264FrameDesc->wSARheight);
+ AppendTextBuffer("wProfile: 0x%04X - %s\r\n", H264FrameDesc->wProfile,
+ GetStringFromList( slProfiles, // string table
+ sizeof(slProfiles)/sizeof(STRINGLIST), // number of strings in the table
+ H264FrameDesc->wProfile, // index of string we want to look up in the string table
+ "Unknown profile" ) ); // string to use if the lookup fails
+
+ AppendTextBuffer("bLevelIDC: 0x%02X = %d = Level %01.01lf \r\n",
+ H264FrameDesc->bLevelIDC, H264FrameDesc->bLevelIDC, H264FrameDesc->bLevelIDC/10.0 );
+
+ AppendTextBuffer("wConstrainedToolset: 0x%04X %s\r\n", H264FrameDesc->wConstrainedToolset,
+ ((H264FrameDesc->wConstrainedToolset == 0) ? "- Reserved" : "*!*ERROR: field is reserved and should be zero"));
+
+ DisplayBitmapDataWithStrings( H264FrameDesc->bmSupportedUsages, sizeof(H264FrameDesc->bmSupportedUsages), "bmSupportedUsages", slUsage, sizeof(slUsage)/sizeof(STRINGLIST) );
+ DisplayBitmapDataWithStrings( H264FrameDesc->bmCapabilities, sizeof(H264FrameDesc->bmCapabilities), "bmCapabilities", slCapabilities, sizeof(slCapabilities)/sizeof(STRINGLIST) );
+
+
+ // bmSVCCapabilities[4]
+ AppendTextBuffer("%s : ", "bmSVCCapabilities");
+ VDisplayBytes( &(H264FrameDesc->bmSVCCapabilities[0]), sizeof(H264FrameDesc->bmSVCCapabilities) );
+ AppendTextBuffer(" D2..D0 = %d Maximum number of temporal layers = %d\r\n",
+ H264FrameDesc->bmSVCCapabilities[0] & 0x7,
+ (H264FrameDesc->bmSVCCapabilities[0] & 0x7) + 1 );
+ AppendTextBuffer(" D3 = %d %s - Rewrite Support\r\n", (H264FrameDesc->bmSVCCapabilities[0] & 0x8) >> 3,
+ ((H264FrameDesc->bmSVCCapabilities[0] & 0x8) >> 3) ? "yes" : " no" );
+ AppendTextBuffer(" D6..D4 = %d Maximum number of CGS layers = %d\r\n",
+ (H264FrameDesc->bmSVCCapabilities[0] & 0x70) >> 4,
+ ((H264FrameDesc->bmSVCCapabilities[0] & 0x70) >> 4) + 1 );
+
+ value = ( H264FrameDesc->bmSVCCapabilities[1] << 8 ) | H264FrameDesc->bmSVCCapabilities[0];
+ value >>= 7; // shift bit 7 right so that it ends up in the lsb of value
+ value &= 0x7;
+ AppendTextBuffer(" D9..D7 = %d Number of MGS sublayers\r\n", value );
+
+ AppendTextBuffer(" D10 = %d %s - Additional SNR scalability support in spatial enhancement layers\r\n",
+ (H264FrameDesc->bmSVCCapabilities[1] & 0x4) >> 2,
+ ((H264FrameDesc->bmSVCCapabilities[1] & 0x4) >> 2) ? "yes" : " no");
+ AppendTextBuffer(" D13..D11 = %d Maximum number of spatial layers = %d\r\n",
+ (H264FrameDesc->bmSVCCapabilities[1] & 0x38) >> 3,
+ ((H264FrameDesc->bmSVCCapabilities[1] & 0x38) >> 3) + 1 );
+
+ value = ( H264FrameDesc->bmSVCCapabilities[3] << 16 ) | ( H264FrameDesc->bmSVCCapabilities[2] << 8 ) | H264FrameDesc->bmSVCCapabilities[1];
+ value >>= 6; // get bit 14 at LSB
+ for ( i = 0; i < 18; i++ ) // bits 31...14
+ {
+ AppendTextBuffer(" D%02d = %d %s - Reserved \r\n", 14 + i, value & 0x1, (value & 0x1) ? "yes" : " no" );
+ value >>= 1;
+ }
+
+ // bmMVCCapabilities[4]
+ AppendTextBuffer("%s : ", "bmMVCCapabilities");
+ VDisplayBytes( &(H264FrameDesc->bmMVCCapabilities[0]), sizeof(H264FrameDesc->bmMVCCapabilities) );
+ AppendTextBuffer(" D2..D0 = %d Maximum number of temporal layers = %d\r\n",
+ H264FrameDesc->bmMVCCapabilities[0] & 0x7,
+ ((H264FrameDesc->bmMVCCapabilities[0] & 0x7) + 1) );
+
+ value = (H264FrameDesc->bmMVCCapabilities[1] << 8) | H264FrameDesc->bmMVCCapabilities[0];
+ value >>= 3; // shift bit 3 right so that it ends up in the lsb of value
+ value &= 0xff;
+ AppendTextBuffer(" D10..D3 = %d Maximum number of view components = %d\r\n",
+ value, value + 1);
+
+ value = ( (H264FrameDesc->bmMVCCapabilities[3] << 16) | (H264FrameDesc->bmMVCCapabilities[2] << 8) | H264FrameDesc->bmMVCCapabilities[1] );
+ value >>= 3; // shift bit 11 right so that it ends up in the lsb of value
+ for ( i = 0; i < 21; i++ ) // bits 31...11
+ {
+ AppendTextBuffer(" D%02d = %d %s - Reserved \r\n", 11 + i, value & 0x1, (value & 0x1) ? "yes" : " no" );
+ value >>= 1;
+ }
+
+
+ AppendTextBuffer("dwMinBitRate: 0x%08X = %s bps\r\n", H264FrameDesc->dwMinBitRate, commaPrintNumber(H264FrameDesc->dwMinBitRate));
+ AppendTextBuffer("dwMaxBitRate: 0x%08X = %s bps\r\n", H264FrameDesc->dwMaxBitRate, commaPrintNumber(H264FrameDesc->dwMaxBitRate));
+
+ // To convert the default frame interval, which is in 100 ns units, to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+ AppendTextBuffer("dwDefaultFrameInterval: 0x%08X = %lf mSec (%4.2f Hz) \r\n",
+ H264FrameDesc->dwDefaultFrameInterval, ((double)H264FrameDesc->dwDefaultFrameInterval)/10000.0, (10000000.0/((double)H264FrameDesc->dwDefaultFrameInterval)));
+ AppendTextBuffer("bNumFrameIntervals: 0x%02X = %d\r\n", H264FrameDesc->bNumFrameIntervals, H264FrameDesc->bNumFrameIntervals);
+
+
+ // frame interval 100 ns units.
+
+ //To convert the frame interval to seconds we would divide by 10,000,000.
+ // 100 ns = 10^(-7) seconds = 1/10,000,000
+
+ // To convert the frame interval to Hz, we divide by 10,000,000 and then take the inverse
+
+ // To convert the frame interval to milliseconds, we divide by 10,000.
+ // 100 ns = 10^(-7) seconds = 10^(-7) sec * 1000 msec/sec = 10^(-7) * 10^3 milleseconds = 10^(-4) seconds
+ // = 1/10,000 milliseconds
+
+ for ( frameIntervalIndex = 0; frameIntervalIndex < H264FrameDesc->bNumFrameIntervals; frameIntervalIndex++ )
+ {
+ value = (ULONG)H264FrameDesc->dwFrameInterval[ frameIntervalIndex ];
+ AppendTextBuffer("dwFrameInterval[%d]: 0x%08x = %lf mSec (%4.2f Hz)\r\n", frameIntervalIndex, value, ((double)value)/10000.0, (10000000.0/((double)value)) );
+
+ }
+
+ return TRUE;
+}
+
+
+//*****************************************************************************
+//
+// DisplayVCH264EncodingUnit()
+//
+//*****************************************************************************
+BOOL DisplayVCH264EncodingUnit(
+ _In_reads_(sizeof(VIDEO_ENCODING_UNIT)) PVIDEO_ENCODING_UNIT VidEncodingDesc
+ )
+{
+
+ PUCHAR pControlsRunTimeData = NULL;
+
+ AppendTextBuffer("\r\n ===>Video Control Encoding Unit Descriptor<===\r\n");
+ AppendTextBuffer("bLength: 0x%02X = %d\r\n", VidEncodingDesc->bLength, VidEncodingDesc->bLength);
+ AppendTextBuffer("bDescriptorType: 0x%02X \r\n", VidEncodingDesc->bDescriptorType );
+ AppendTextBuffer("bDescriptorSubtype: 0x%02X \r\n", VidEncodingDesc->bDescriptorSubtype );
+ AppendTextBuffer("bUnitID: 0x%02X = %d\r\n", VidEncodingDesc->bUnitID, VidEncodingDesc->bUnitID);
+ AppendTextBuffer("bSourceID: 0x%02X = %d\r\n", VidEncodingDesc->bSourceID, VidEncodingDesc->bSourceID);
+ AppendTextBuffer("iEncoding: 0x%02X = %d\r\n", VidEncodingDesc->iEncoding, VidEncodingDesc->iEncoding);
+ AppendTextBuffer("bControlSize: 0x%02X = %d\r\n", VidEncodingDesc->bControlSize, VidEncodingDesc->bControlSize);
+
+ if ( VidEncodingDesc->bControlSize > 0)
+ {
+ // Encoding Unit Descriptor bmControls field
+ DisplayBitmapDataWithStrings( VidEncodingDesc->bmControls, VidEncodingDesc->bControlSize /* print bControlSize bytes worth of bitmap info */,
+ "bmControls", slEncodingUnitControls, sizeof(slEncodingUnitControls)/sizeof(STRINGLIST) );
+
+ // Encoding Unit Descriptor bmControlsRuntime field
+ pControlsRunTimeData = ((UCHAR *)(&VidEncodingDesc->bmControls)) + VidEncodingDesc->bControlSize;
+ DisplayBitmapDataWithStrings( pControlsRunTimeData, VidEncodingDesc->bControlSize /* print bControlSize bytes worth of bitmap info */,
+ "bmControlsRuntime", slEncodingUnitControls, sizeof(slEncodingUnitControls)/sizeof(STRINGLIST) );
+ }
+ return TRUE;
+}
+
+//*****************************************************************************
+//
+// DoAdditionalErrorChecks()
+//
+// Currently this function only checks to see that the number of frame
+// descriptors actually found equals the number specified in the corresponding
+// format descriptor.
+//
+// Because this potentially involves parsing multiple frame descriptors, we
+// call this routine after the video descriptor has been parsed and displayed.
+//
+//*****************************************************************************
+void DoAdditionalErrorChecks()
+{
+ if( g_expectedNumberOfH264FrameDescriptors > 0 || g_numberOfH264FrameDescriptors > 0
+ || g_expectedNumberOfUncompressedFrameFrameDescriptors > 0 || g_numberOfUncompressedFrameFrameDescriptors > 0
+ || g_expectedNumberOfMJPEGFrameDescriptors > 0 || g_numberOfMJPEGFrameDescriptors > 0)
+ {
+ AppendTextBuffer("\r\n ===>Additional Error Checking<===\r\n");
+
+ // H.264 frame descriptor
+ if( g_expectedNumberOfH264FrameDescriptors > 0 || g_numberOfH264FrameDescriptors > 0)
+ {
+ if ( g_expectedNumberOfH264FrameDescriptors == g_numberOfH264FrameDescriptors )
+ {
+ AppendTextBuffer("PASS: number of H.264 frame descriptors (%d) == number of frame descriptors (%d) specified in H.264 format descriptor(s)\r\n",
+ g_expectedNumberOfH264FrameDescriptors, g_numberOfH264FrameDescriptors );
+ }
+ else
+ {
+ AppendTextBuffer("FAIL: number of H.264 frame descriptors (%d) != number of frame descriptors (%d) specified in H.264 format descriptor(s)\r\n",
+ g_expectedNumberOfH264FrameDescriptors, g_numberOfH264FrameDescriptors );
+ }
+ }
+
+ // uncompressed frame descriptor
+ if( g_expectedNumberOfUncompressedFrameFrameDescriptors > 0 || g_numberOfUncompressedFrameFrameDescriptors > 0)
+ {
+
+ if ( g_expectedNumberOfUncompressedFrameFrameDescriptors == g_numberOfUncompressedFrameFrameDescriptors )
+ {
+ AppendTextBuffer("PASS: number of uncompressed-frame frame descriptors (%d) == number of frame descriptors (%d) specified in uncompressed format descriptor(s)\r\n",
+ g_expectedNumberOfUncompressedFrameFrameDescriptors, g_numberOfUncompressedFrameFrameDescriptors );
+ }
+ else
+ {
+ AppendTextBuffer("FAIL: number of uncompressed-frame frame descriptors (%d) != number of frame descriptors (%d) specified in uncompressed format descriptor(s)\r\n",
+ g_expectedNumberOfUncompressedFrameFrameDescriptors, g_numberOfUncompressedFrameFrameDescriptors );
+ }
+ }
+
+ // MJPEG frame descriptor
+ if( g_expectedNumberOfMJPEGFrameDescriptors > 0 || g_numberOfMJPEGFrameDescriptors > 0)
+ {
+ if ( g_expectedNumberOfMJPEGFrameDescriptors == g_numberOfMJPEGFrameDescriptors )
+ {
+ AppendTextBuffer("PASS: number of MJPEG frame descriptors (%d) == number of frame descriptors (%d) specified in MJPEG format descriptor(s)\r\n",
+ g_expectedNumberOfMJPEGFrameDescriptors, g_numberOfMJPEGFrameDescriptors );
+ }
+ else
+ {
+ AppendTextBuffer("FAIL: number of MJPEG frame descriptors (%d) != number of frame descriptors (%d) specified in MJPEG format descriptor(s)\r\n",
+ g_expectedNumberOfMJPEGFrameDescriptors, g_numberOfMJPEGFrameDescriptors );
+ }
+ }
+ }
+}
+
+//*****************************************************************************
+//
+// ResetErrorCounts()
+//
+//*****************************************************************************
+void ResetErrorCounts()
+{
+
+ // H.264 format
+ g_expectedNumberOfH264FrameDescriptors = 0;
+ g_numberOfH264FrameDescriptors = 0;
+
+ // MJPEG format
+ g_expectedNumberOfMJPEGFrameDescriptors = 0;
+ g_numberOfMJPEGFrameDescriptors = 0;
+
+ // Uncompressed frame format
+ g_expectedNumberOfUncompressedFrameFrameDescriptors = 0;
+ g_numberOfUncompressedFrameFrameDescriptors = 0;
+}
+
+#endif //H264_SUPPORT
diff --git a/tests/projects/winsdk/usbview/h264.h b/tests/projects/winsdk/usbview/h264.h new file mode 100644 index 000000000..841318922 --- /dev/null +++ b/tests/projects/winsdk/usbview/h264.h @@ -0,0 +1,164 @@ +#pragma once
+
+#ifdef H264_SUPPORT
+
+//*****************************************************************************
+//
+// external variables
+//
+//*****************************************************************************
+extern UCHAR g_expectedNumberOfH264FrameDescriptors;
+extern UCHAR g_numberOfH264FrameDescriptors;
+
+extern UCHAR g_expectedNumberOfMJPEGFrameDescriptors;
+extern UCHAR g_numberOfMJPEGFrameDescriptors;
+
+extern UCHAR g_expectedNumberOfUncompressedFrameFrameDescriptors;
+extern UCHAR g_numberOfUncompressedFrameFrameDescriptors;
+
+#endif
+
+
+
+//*****************************************************************************
+//
+// defines
+//
+//*****************************************************************************
+
+//Version information printed at lower left of UI Window and top of output text window
+#define USBVIEW_MAJOR_VERSION 2
+#define USBVIEW_MINOR_VERSION 0
+#define UVC_SPEC_MAJOR_VERSION 1
+#define UVC_SPEC_MINOR_VERSION 5
+
+
+// definitions take from the proposed UVC 1.5 spec
+#define VS_FORMAT_H264 0x13
+#define VS_FRAME_H264 0x14
+
+
+// Video Class-Specific VC Interface Descriptor Subtypes
+// Note, this needs to be added to the list already in C:\nt\sdpublic\internal\drivers\inc\uvcdesc.h
+// Also, note that MAX_TYPE_UNIT needs to be bumped up by 1 to account for this new subtype..
+#define H264_ENCODING_UNIT 7
+
+//*****************************************************************************
+//
+// struct definitions
+//
+//*****************************************************************************
+
+// VideoStreaming H.264 Format Descriptor
+#pragma pack(push, 1) // pack on a 1 byte boundary
+typedef struct _VIDEO_FORMAT_H264
+{ // offset (in bytes):
+ UCHAR bLength; // 0
+ UCHAR bDescriptorType; // 1
+ UCHAR bDescriptorSubtype; // 2
+ UCHAR bFormatIndex; // 3
+ UCHAR bNumFrameDescriptors; // 4
+ UCHAR bDefaultFrameIndex; // 5
+ UCHAR bMaxCodecConfigDelay; // 6
+ UCHAR bmSupportedSliceModes[1]; // 7
+ UCHAR bmSupportedSyncFrameTypes[1]; // 8
+ UCHAR bResolutionScaling; // 9
+ UCHAR bSimulcastSupport; // 10
+ UCHAR bmSupportedRateControlModes; // 11
+
+ USHORT wMaxMBperSecOneResolutionNoScalability; // 12
+ USHORT wMaxMBperSecTwoResolutionsNoScalability; // 14
+ USHORT wMaxMBperSecThreeResolutionsNoScalability; // 16
+ USHORT wMaxMBperSecFourResolutionsNoScalability; // 18
+
+ USHORT wMaxMBperSecOneResolutionTemporalScalability; // 20
+ USHORT wMaxMBperSecTwoResolutionsTemporalScalability; // 22
+ USHORT wMaxMBperSecThreeResolutionsTemporalScalability; // 24
+ USHORT wMaxMBperSecFourResolutionsTemporalScalability; // 26
+
+ USHORT wMaxMBperSecOneResolutionTemporalQualityScalability; // 28
+ USHORT wMaxMBperSecTwoResolutionsTemporalQualityScalability; // 30
+ USHORT wMaxMBperSecThreeResolutionsTemporalQualityScalability; // 32
+ USHORT wMaxMBperSecFourResolutionsTemporalQualityScalability; // 34
+
+ USHORT wMaxMBperSecOneResolutionTemporalSpatialScalability; // 36
+ USHORT wMaxMBperSecTwoResolutionsTemporalSpatialScalability; // 38
+ USHORT wMaxMBperSecThreeResolutionsTemporalSpatialScalability; // 40
+ USHORT wMaxMBperSecFourResolutionsTemporalSpatialScalability; // 42
+
+ USHORT wMaxMBperSecOneResolutionFullScalability; // 44
+ USHORT wMaxMBperSecTwoResolutionsFullScalability; // 46
+ USHORT wMaxMBperSecThreeResolutionsFullScalability; // 48
+ USHORT wMaxMBperSecFourResolutionsFullScalability; // 50
+} VIDEO_FORMAT_H264, *PVIDEO_FORMAT_H264;
+#pragma pack(pop)
+
+
+// VideoStreaming H.264 Frame Descriptor
+#pragma pack(push, 1) // pack on a 1 byte boundary
+
+// Disable warning on zero sized array in CPP compiler
+#pragma warning(push)
+#pragma warning(disable:4200) // Zero sized array
+
+typedef struct _VIDEO_FRAME_H264
+{ // offset (in bytes):
+ UCHAR bLength; // 0
+ UCHAR bDescriptorType; // 1
+ UCHAR bDescriptorSubtype; // 2
+ UCHAR bFrameIndex; // 3
+ USHORT wWidth; // 4
+ USHORT wHeight; // 6
+ USHORT wSARwidth; // 8
+ USHORT wSARheight; // 10
+ USHORT wProfile; // 12
+ UCHAR bLevelIDC; // 14
+ USHORT wConstrainedToolset; // 15
+ UCHAR bmSupportedUsages[4]; // 17
+ UCHAR bmCapabilities[2]; // 21
+ UCHAR bmSVCCapabilities[4]; // 23
+ UCHAR bmMVCCapabilities[4]; // 27
+ ULONG dwMinBitRate; // 31
+ ULONG dwMaxBitRate; // 35
+ ULONG dwDefaultFrameInterval; // 39
+ UCHAR bNumFrameIntervals; // 43
+ ULONG dwFrameInterval[]; // 44 variable-length parameter
+} VIDEO_FRAME_H264, *PVIDEO_FRAME_H264;
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+// VideoControl Encoding Unit Descriptor
+#pragma pack(push, 1) // pack on a 1 byte boundary
+#pragma warning(push)
+#pragma warning(disable:4200) // Zero sized array
+typedef struct //_VIDEO_ENCODING_UNIT
+{ // offset (in bytes):
+ UCHAR bLength; // 0
+ UCHAR bDescriptorType; // 1
+ UCHAR bDescriptorSubtype; // 2
+ UCHAR bUnitID; // 3
+ UCHAR bSourceID; // 4
+ UCHAR iEncoding; // 5
+ UCHAR bControlSize; // 6
+ UCHAR bmControls[]; // 7 - variable-length parameter (bControlSize specifies the size)
+} VIDEO_ENCODING_UNIT, *PVIDEO_ENCODING_UNIT;
+// after bmControls[] there is also the variable-length parameter (bControlSize specifies the size:
+// UCHAR bmControlsRunTime[]
+#pragma warning(pop)
+#pragma pack(pop)
+
+
+
+//*****************************************************************************
+//
+// function prototypes
+//
+//*****************************************************************************
+BOOL DisplayVCH264Format( _In_reads_(sizeof(VIDEO_FORMAT_H264)) PVIDEO_FORMAT_H264 H264FormatDesc );
+BOOL DisplayVCH264FrameType( _In_reads_(sizeof(VIDEO_FRAME_H264)) PVIDEO_FRAME_H264 H264FrameDesc );
+BOOL DisplayVCH264EncodingUnit( _In_reads_(sizeof(VIDEO_ENCODING_UNIT)) PVIDEO_ENCODING_UNIT VidEncodingDesc );
+void DisplayBitmapData( _In_reads_(byteCount) PUCHAR pData, UCHAR byteCount, _In_ char * stringLabel);
+void DisplayBitmapDataWithStrings( _In_reads_(byteCount) PUCHAR pData, UCHAR byteCount, _In_ char * stringLabel, _In_ PSTRINGLIST stringList, ULONG numEntriesInTable );
+void DoAdditionalErrorChecks();
+void ResetErrorCounts();
diff --git a/tests/projects/winsdk/usbview/hub.ico b/tests/projects/winsdk/usbview/hub.ico Binary files differnew file mode 100644 index 000000000..d0620df89 --- /dev/null +++ b/tests/projects/winsdk/usbview/hub.ico diff --git a/tests/projects/winsdk/usbview/langidlist.h b/tests/projects/winsdk/usbview/langidlist.h new file mode 100644 index 000000000..0f2d90621 --- /dev/null +++ b/tests/projects/winsdk/usbview/langidlist.h @@ -0,0 +1,206 @@ +/*++
+
+Copyright (c) 2003-2008 Microsoft Corporation
+
+Module Name:
+
+ LANGIDLIST.H
+
+Abstract:
+
+ This file LANGIDLIST.H contains content from USB.org, and was reviewed
+ by LCA in June 2011. Per discussion with USB consortium counsel their
+ material is "free to any use".
+
+ This header file contains a list of all currently known USB Language IDs
+ and the language name associated with each Language ID.
+
+
+
+Source:
+ http://www.usb.org
+
+Environment:
+
+ Kernel & user mode
+
+Revision History:
+
+ 03-28-03 : created
+
+--*/
+
+#ifndef __LANGIDLIST_H__
+#define __LANGIDLIST_H__
+
+//
+// Language ID structure
+//
+typedef struct {
+ USHORT usLangID;
+ PCHAR szLanguage;
+} USBLANGID, *PUSBLANGID;
+
+//
+// This list built from information obtained on Nov-30-2000 from
+// http://www.usb.org
+//
+// This information has not been independently verified and no claims
+// are made here as to its accuracy.
+//
+
+USBLANGID USBLangIDs[] =
+{
+ {1078 , /* 0x0436 */ "Afrikaans"},
+ {1052 , /* 0x041c */ "Albanian"},
+ {1025 , /* 0x0401 */ "Arabic (Saudi Arabia)"},
+ {2049 , /* 0x0801 */ "Arabic (Iraq)"},
+ {3073 , /* 0x0c01 */ "Arabic (Egypt)"},
+ {4097 , /* 0x1001 */ "Arabic (Libya)"},
+ {5121 , /* 0x1401 */ "Arabic (Algeria)"},
+ {6145 , /* 0x1801 */ "Arabic (Morocco)"},
+ {7169 , /* 0x1c01 */ "Arabic (Tunisia)"},
+ {8193 , /* 0x2001 */ "Arabic (Oman)"},
+ {9217 , /* 0x2401 */ "Arabic (Yemen)"},
+ {10241 , /* 0x2801 */ "Arabic (Syria)"},
+ {11265 , /* 0x2c01 */ "Arabic (Jordan)"},
+ {12289 , /* 0x3001 */ "Arabic (Lebanon)"},
+ {13313 , /* 0x3401 */ "Arabic (Kuwait)"},
+ {14337 , /* 0x3801 */ "Arabic (U.A.E.)"},
+ {15361 , /* 0x3c01 */ "Arabic (Bahrain)"},
+ {16385 , /* 0x4001 */ "Arabic (Qatar) "},
+ {1067 , /* 0x042b */ "Armenian"},
+ {1101 , /* 0x044d */ "Assamese"},
+ {1068 , /* 0x042c */ "Azeri (Latin)"},
+ {2092 , /* 0x082c */ "Azeri (Cyrillic)"},
+ {1069 , /* 0x042d */ "Basque"},
+ {1059 , /* 0x0423 */ "Belarussian"},
+ {1093 , /* 0x0445 */ "Bengali"},
+ {1026 , /* 0x0402 */ "Bulgarian"},
+ {1109 , /* 0x0455 */ "Burmese"},
+ {1027 , /* 0x0403 */ "Catalan"},
+ {1028 , /* 0x0404 */ "Chinese (Taiwan)"},
+ {2052 , /* 0x0804 */ "Chinese (PRC)"},
+ {3076 , /* 0x0c04 */ "Chinese (Hong Kong SAR, PRC)"},
+ {4100 , /* 0x1004 */ "Chinese (Singapore)"},
+ {5124 , /* 0x1404 */ "Chinese (MACAO SAR)"},
+ {1050 , /* 0x041a */ "Croatian"},
+ {1029 , /* 0x0405 */ "Czech"},
+ {1030 , /* 0x0406 */ "Danish"},
+ {1043 , /* 0x0413 */ "Dutch (Netherlands)"},
+ {2067 , /* 0x0813 */ "Dutch (Belgium)"},
+ {1033 , /* 0x0409 */ "English (United States)"},
+ {2057 , /* 0x0809 */ "English (United Kingdom)"},
+ {3081 , /* 0x0c09 */ "English (Australian)"},
+ {4105 , /* 0x1009 */ "English (Canadian)"},
+ {5129 , /* 0x1409 */ "English (New Zealand)"},
+ {6153 , /* 0x1809 */ "English (Ireland)"},
+ {7177 , /* 0x1c09 */ "English (South Africa)"},
+ {8201 , /* 0x2009 */ "English (Jamaica)"},
+ {9225 , /* 0x2409 */ "English (Caribbean)"},
+ {10249 , /* 0x2809 */ "English (Belize)"},
+ {11273 , /* 0x2c09 */ "English (Trinidad)"},
+ {12297 , /* 0x3009 */ "English (Zimbabwe)"},
+ {13321 , /* 0x3409 */ "English (Philippines)"},
+ {1061 , /* 0x0425 */ "Estonian"},
+ {1080 , /* 0x0438 */ "Faeroese"},
+ {1065 , /* 0x0429 */ "Farsi "},
+ {1035 , /* 0x040b */ "Finnish"},
+ {1036 , /* 0x040c */ "French (Standard)"},
+ {2060 , /* 0x080c */ "French (Belgian)"},
+ {3084 , /* 0x0c0c */ "French (Canadian)"},
+ {4108 , /* 0x100c */ "French (Switzerland)"},
+ {5132 , /* 0x140c */ "French (Luxembourg)"},
+ {6156 , /* 0x180c */ "French (Monaco)"},
+ {1079 , /* 0x0437 */ "Georgian"},
+ {1031 , /* 0x0407 */ "German (Standard)"},
+ {2055 , /* 0x0807 */ "German (Switzerland)"},
+ {3079 , /* 0x0c07 */ "German (Austria)"},
+ {4103 , /* 0x1007 */ "German (Luxembourg)"},
+ {5127 , /* 0x1407 */ "German (Liechtenstein)"},
+ {1032 , /* 0x0408 */ "Greek"},
+ {1095 , /* 0x0447 */ "Gujarati"},
+ {1037 , /* 0x040d */ "Hebrew"},
+ {1081 , /* 0x0439 */ "Hindi"},
+ {1038 , /* 0x040e */ "Hungarian"},
+ {1039 , /* 0x040f */ "Icelandic"},
+ {1057 , /* 0x0421 */ "Indonesian"},
+ {1040 , /* 0x0410 */ "Italian (Standard)"},
+ {2064 , /* 0x0810 */ "Italian (Switzerland)"},
+ {1041 , /* 0x0411 */ "Japanese"},
+ {1099 , /* 0x044b */ "Kannada"},
+ {2144 , /* 0x0860 */ "Kashmiri (India)"},
+ {1087 , /* 0x043f */ "Kazakh"},
+ {1111 , /* 0x0457 */ "Konkani"},
+ {1042 , /* 0x0412 */ "Korean"},
+ {2066 , /* 0x0812 */ "Korean (Johab)"},
+ {1062 , /* 0x0426 */ "Latvian"},
+ {1063 , /* 0x0427 */ "Lithuanian"},
+ {2087 , /* 0x0827 */ "Lithuanian (Classic)"},
+ {1071 , /* 0x042f */ "Macedonia, Former Yugoslav Republic of"},
+ {1086 , /* 0x043e */ "Malay (Malaysian)"},
+ {2110 , /* 0x083e */ "Malay (Brunei Darussalam)"},
+ {1100 , /* 0x044c */ "Malayalam"},
+ {1112 , /* 0x0458 */ "Manipuri"},
+ {1102 , /* 0x044e */ "Marathi"},
+ {2145 , /* 0x0861 */ "Nepali (India)"},
+ {1044 , /* 0x0414 */ "Norwegian (Bokmal)"},
+ {2068 , /* 0x0814 */ "Norwegian (Nynorsk)"},
+ {1096 , /* 0x0448 */ "Odia"},
+ {1045 , /* 0x0415 */ "Polish"},
+ {1046 , /* 0x0416 */ "Portuguese (Brazil)"},
+ {2070 , /* 0x0816 */ "Portuguese (Portugal)"},
+ {1094 , /* 0x0446 */ "Punjabi"},
+ {1048 , /* 0x0418 */ "Romanian"},
+ {1049 , /* 0x0419 */ "Russian"},
+ {1103 , /* 0x044f */ "Sanskrit"},
+ {3098 , /* 0x0c1a */ "Serbian (Cyrillic)"},
+ {2074 , /* 0x081a */ "Serbian (Latin)"},
+ {1113 , /* 0x0459 */ "Sindhi"},
+ {1051 , /* 0x041b */ "Slovak"},
+ {1060 , /* 0x0424 */ "Slovenian"},
+ {1034 , /* 0x040a */ "Spanish (Traditional Sort)"},
+ {2058 , /* 0x080a */ "Spanish (Mexican)"},
+ {3082 , /* 0x0c0a */ "Spanish (Modern Sort)"},
+ {4106 , /* 0x100a */ "Spanish (Guatemala)"},
+ {5130 , /* 0x140a */ "Spanish (Costa Rica)"},
+ {6154 , /* 0x180a */ "Spanish (Panama)"},
+ {7178 , /* 0x1c0a */ "Spanish (Dominican Republic)"},
+ {8202 , /* 0x200a */ "Spanish (Venezuela)"},
+ {9226 , /* 0x240a */ "Spanish (Colombia)"},
+ {10250 , /* 0x280a */ "Spanish (Peru)"},
+ {11274 , /* 0x2c0a */ "Spanish (Argentina)"},
+ {12298 , /* 0x300a */ "Spanish (Ecuador)"},
+ {13322 , /* 0x340a */ "Spanish (Chile)"},
+ {14346 , /* 0x380a */ "Spanish (Uruguay)"},
+ {15370 , /* 0x3c0a */ "Spanish (Paraguay)"},
+ {16394 , /* 0x400a */ "Spanish (Bolivia)"},
+ {17418 , /* 0x440a */ "Spanish (El Salvador)"},
+ {18442 , /* 0x480a */ "Spanish (Honduras)"},
+ {19466 , /* 0x4c0a */ "Spanish (Nicaragua)"},
+ {20490 , /* 0x500a */ "Spanish (Puerto Rico)"},
+ {1072 , /* 0x0430 */ "Sutu"},
+ {1089 , /* 0x0441 */ "Swahili (Kenya)"},
+ {1053 , /* 0x041d */ "Swedish"},
+ {2077 , /* 0x081d */ "Swedish (Finland)"},
+ {1097 , /* 0x0449 */ "Tamil"},
+ {1092 , /* 0x0444 */ "Tatar (Tatarstan)"},
+ {1098 , /* 0x044a */ "Telugu"},
+ {1054 , /* 0x041e */ "Thai"},
+ {1055 , /* 0x041f */ "Turkish"},
+ {1058 , /* 0x0422 */ "Ukrainian"},
+ {1056 , /* 0x0420 */ "Urdu (Pakistan)"},
+ {2080 , /* 0x0820 */ "Urdu (India)"},
+ {1091 , /* 0x0443 */ "Uzbek (Latin)"},
+ {2115 , /* 0x0843 */ "Uzbek (Cyrillic)"},
+ {1066 , /* 0x042a */ "Vietnamese"},
+ {1279 , /* 0x04ff */ "HID (Usage Data Descriptor)"},
+ {61695 , /* 0xf0ff */ "HID (Vendor Defined 1)"},
+ {62719 , /* 0xf4ff */ "HID (Vendor Defined 2)"},
+ {63743 , /* 0xf8ff */ "HID (Vendor Defined 3)"},
+ {64767 , /* 0xfcff */ "HID (Vendor Defined 4)"},
+ { 0x00, "End"}
+};
+
+#endif /* __LANGIDLIST_H__ */
+
diff --git a/tests/projects/winsdk/usbview/monitor.ico b/tests/projects/winsdk/usbview/monitor.ico Binary files differnew file mode 100644 index 000000000..e015959f6 --- /dev/null +++ b/tests/projects/winsdk/usbview/monitor.ico diff --git a/tests/projects/winsdk/usbview/port.ico b/tests/projects/winsdk/usbview/port.ico Binary files differnew file mode 100644 index 000000000..98c8aa04c --- /dev/null +++ b/tests/projects/winsdk/usbview/port.ico diff --git a/tests/projects/winsdk/usbview/resource.h b/tests/projects/winsdk/usbview/resource.h new file mode 100644 index 000000000..921fa6a30 --- /dev/null +++ b/tests/projects/winsdk/usbview/resource.h @@ -0,0 +1,51 @@ +/*++
+Copyright (c) 1998-2008 Microsoft Corporation, All Rights Reserved.
+--*/
+
+#define IDD_MAINDIALOG 101
+#define IDR_MENU 102
+#define IDD_ABOUT 103
+#define IDI_ICON 104
+#define IDC_SPLIT 105
+#define IDACCEL 106
+
+#define IDI_BADICON 107
+#define IDI_COMPUTER 108
+#define IDI_HUB 109
+#define IDI_NODEVICE 110
+#define IDI_SSICON 111
+#define IDI_NOSSDEVICE 112
+
+#define IDC_TREE 1000
+#define IDC_EDIT 1001
+#define IDC_STATUS 1002
+
+#define IDS_STRINGBASE 2000
+#define IDS_STANDARD_FONT 2001
+#define IDS_STANDARD_FONT_HEIGHT 2002
+#define IDS_STANDARD_FONT_WIDTH 2003
+#define IDS_USBVIEW_USAGE 2004
+#define IDS_USBVIEW_PRESSKEY 2005
+#define IDS_USBVIEW_INVALIDARG 2006
+#define IDS_USBVIEW_FILE_EXISTS_TXT 2007
+#define IDS_USBVIEW_FILE_EXISTS_XML 2008
+#define IDS_USBVIEW_INTERNAL_ERROR 2009
+#define IDS_USBVIEW_SAVED_TO 2010
+#define IDS_USBVIEW_INVALID_FILENAME 2011
+
+#define IDC_VERSION 3000
+#define IDC_UVCVERSION 3001
+
+#define ID_EXIT 40001
+#define ID_REFRESH 40002
+#define ID_AUTO_REFRESH 40003
+#define ID_CONFIG_DESCRIPTORS 40004
+#define ID_ABOUT 40005
+#define ID_ANNOTATION 40007
+#define ID_UNUSED 40008
+#define ID_LOG_DEBUG 40009
+#define ID_SAVE 40010
+#define ID_SAVEALL 40011
+#define ID_SAVEXML 40012
+#define IDC_STATIC 0xFFFFFFFF
+
diff --git a/tests/projects/winsdk/usbview/split.cur b/tests/projects/winsdk/usbview/split.cur Binary files differnew file mode 100644 index 000000000..41d65e3c5 --- /dev/null +++ b/tests/projects/winsdk/usbview/split.cur diff --git a/tests/projects/winsdk/usbview/ssport.ico b/tests/projects/winsdk/usbview/ssport.ico Binary files differnew file mode 100644 index 000000000..e0f712ae6 --- /dev/null +++ b/tests/projects/winsdk/usbview/ssport.ico diff --git a/tests/projects/winsdk/usbview/ssusb.ico b/tests/projects/winsdk/usbview/ssusb.ico Binary files differnew file mode 100644 index 000000000..71f0ebe1d --- /dev/null +++ b/tests/projects/winsdk/usbview/ssusb.ico diff --git a/tests/projects/winsdk/usbview/usb.ico b/tests/projects/winsdk/usbview/usb.ico Binary files differnew file mode 100644 index 000000000..e615d3e24 --- /dev/null +++ b/tests/projects/winsdk/usbview/usb.ico diff --git a/tests/projects/winsdk/usbview/usbdesc.h b/tests/projects/winsdk/usbview/usbdesc.h new file mode 100644 index 000000000..8b78a3c39 --- /dev/null +++ b/tests/projects/winsdk/usbview/usbdesc.h @@ -0,0 +1,394 @@ +/*++
+
+Copyright (c) 1997-2008 Microsoft Corporation
+
+Module Name:
+
+ USBDESC.H
+
+Abstract:
+
+ This is a header file for USB descriptors which are not yet in
+ a standard system header file.
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 03-06-1998 : created
+ 03-28-2003 : minor changes to support UVC and USB200
+
+--*/
+
+#pragma pack(push, 1)
+
+/*****************************************************************************
+ D E F I N E S
+*****************************************************************************/
+
+//
+//Device Descriptor bDeviceClass values
+//
+#define USB_INTERFACE_CLASS_DEVICE 0x00
+#define USB_COMMUNICATION_DEVICE 0x02
+#define USB_HUB_DEVICE 0x09
+#define USB_DEVICE_CLASS_BILLBOARD 0x11
+#define USB_DIAGNOSTIC_DEVICE 0xDC
+#define USB_WIRELESS_CONTROLLER_DEVICE 0xE0
+#define USB_MISCELLANEOUS_DEVICE 0xEF
+#define USB_VENDOR_SPECIFIC_DEVICE 0xFF
+
+//
+//Device Descriptor bDeviceSubClass values
+//
+#define USB_COMMON_SUB_CLASS 0x02
+
+//
+//Interface Descriptor bInterfaceClass values:
+//
+//#define USB_AUDIO_INTERFACE 0x01
+//#define USB_CDC_CONTROL_INTERFACE 0x02
+//#define USB_HID_INTERFACE 0x03
+//#define USB_PHYSICAL_INTERFACE 0x05
+//#define USB_IMAGE_INTERFACE 0x06
+//#define USB_PRINTER_INTERFACE 0x07
+//#define USB_MASS_STORAGE_INTERFACE 0x08
+//#define USB_HUB_INTERFACE 0x09
+#define USB_CDC_DATA_INTERFACE 0x0A
+#define USB_CHIP_SMART_CARD_INTERFACE 0x0B
+#define USB_CONTENT_SECURITY_INTERFACE 0x0D
+#define USB_DIAGNOSTIC_DEVICE_INTERFACE 0xDC
+#define USB_WIRELESS_CONTROLLER_INTERFACE 0xE0
+#define USB_APPLICATION_SPECIFIC_INTERFACE 0xFE
+//#define USB_VENDOR_SPECIFIC_INTERFACE 0xFF
+#define USB_HID_DESCRIPTOR_TYPE 0x21
+
+//
+//IAD protocol values
+//
+#define USB_IAD_PROTOCOL 0x01
+
+//
+//Device class specific values
+//
+#define BILLBOARD_MAX_NUM_ALT_MODE 0x34
+
+//
+//USB 2.0 Specification Changes - New Descriptors
+//
+#define USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE 0x07
+#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08
+#define USB_OTG_DESCRIPTOR_TYPE 0x09
+#define USB_DEBUG_DESCRIPTOR_TYPE 0x0A
+#define USB_IAD_DESCRIPTOR_TYPE 0x0B
+
+//
+// USB Device Class Definition for Audio Devices
+// Appendix A. Audio Device Class Codes
+//
+
+// A.2 Audio Interface Subclass Codes
+//
+#define USB_AUDIO_SUBCLASS_UNDEFINED 0x00
+#define USB_AUDIO_SUBCLASS_AUDIOCONTROL 0x01
+#define USB_AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
+#define USB_AUDIO_SUBCLASS_MIDISTREAMING 0x03
+
+// A.4 Audio Class-Specific Descriptor Types
+//
+#define USB_AUDIO_CS_UNDEFINED 0x20
+#define USB_AUDIO_CS_DEVICE 0x21
+#define USB_AUDIO_CS_CONFIGURATION 0x22
+#define USB_AUDIO_CS_STRING 0x23
+#define USB_AUDIO_CS_INTERFACE 0x24
+#define USB_AUDIO_CS_ENDPOINT 0x25
+
+// A.5 Audio Class-Specific AC (Audio Control) Interface Descriptor Subtypes
+//
+#define USB_AUDIO_AC_UNDEFINED 0x00
+#define USB_AUDIO_AC_HEADER 0x01
+#define USB_AUDIO_AC_INPUT_TERMINAL 0x02
+#define USB_AUDIO_AC_OUTPUT_TERMINAL 0x03
+#define USB_AUDIO_AC_MIXER_UNIT 0x04
+#define USB_AUDIO_AC_SELECTOR_UNIT 0x05
+#define USB_AUDIO_AC_FEATURE_UNIT 0x06
+#define USB_AUDIO_AC_PROCESSING_UNIT 0x07
+#define USB_AUDIO_AC_EXTENSION_UNIT 0x08
+
+// A.6 Audio Class-Specific AS (Audio Streaming) Interface Descriptor Subtypes
+//
+#define USB_AUDIO_AS_UNDEFINED 0x00
+#define USB_AUDIO_AS_GENERAL 0x01
+#define USB_AUDIO_AS_FORMAT_TYPE 0x02
+#define USB_AUDIO_AS_FORMAT_SPECIFIC 0x03
+
+// A.7 Processing Unit Process Types
+//
+#define USB_AUDIO_PROCESS_UNDEFINED 0x00
+#define USB_AUDIO_PROCESS_UPDOWNMIX 0x01
+#define USB_AUDIO_PROCESS_DOLBYPROLOGIC 0x02
+#define USB_AUDIO_PROCESS_3DSTEREOEXTENDER 0x03
+#define USB_AUDIO_PROCESS_REVERBERATION 0x04
+#define USB_AUDIO_PROCESS_CHORUS 0x05
+#define USB_AUDIO_PROCESS_DYNRANGECOMP 0x06
+
+
+/*****************************************************************************
+ T Y P E D E F S
+*****************************************************************************/
+
+// HID Class HID Descriptor
+//
+typedef struct _USB_HID_DESCRIPTOR
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ USHORT bcdHID;
+ UCHAR bCountryCode;
+ UCHAR bNumDescriptors;
+ struct
+ {
+ UCHAR bDescriptorType;
+ USHORT wDescriptorLength;
+ } OptionalDescriptors[1];
+} USB_HID_DESCRIPTOR, *PUSB_HID_DESCRIPTOR;
+
+
+// OTG Descriptor
+//
+typedef struct _USB_OTG_DESCRIPTOR
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bmAttributes;
+} USB_OTG_DESCRIPTOR, *PUSB_OTG_DESCRIPTOR;
+
+// IAD Descriptor
+//
+typedef struct _USB_IAD_DESCRIPTOR
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bFirstInterface;
+ UCHAR bInterfaceCount;
+ UCHAR bFunctionClass;
+ UCHAR bFunctionSubClass;
+ UCHAR bFunctionProtocol;
+ UCHAR iFunction;
+} USB_IAD_DESCRIPTOR, *PUSB_IAD_DESCRIPTOR;
+
+
+// Common Class Endpoint Descriptor
+//
+typedef struct _USB_ENDPOINT_DESCRIPTOR2 {
+ UCHAR bLength; // offset 0, size 1
+ UCHAR bDescriptorType; // offset 1, size 1
+ UCHAR bEndpointAddress; // offset 2, size 1
+ UCHAR bmAttributes; // offset 3, size 1
+ USHORT wMaxPacketSize; // offset 4, size 2
+ USHORT wInterval; // offset 6, size 2
+ UCHAR bSyncAddress; // offset 8, size 1
+} USB_ENDPOINT_DESCRIPTOR2, *PUSB_ENDPOINT_DESCRIPTOR2;
+
+// Common Class Interface Descriptor
+//
+typedef struct _USB_INTERFACE_DESCRIPTOR2 {
+ UCHAR bLength; // offset 0, size 1
+ UCHAR bDescriptorType; // offset 1, size 1
+ UCHAR bInterfaceNumber; // offset 2, size 1
+ UCHAR bAlternateSetting; // offset 3, size 1
+ UCHAR bNumEndpoints; // offset 4, size 1
+ UCHAR bInterfaceClass; // offset 5, size 1
+ UCHAR bInterfaceSubClass; // offset 6, size 1
+ UCHAR bInterfaceProtocol; // offset 7, size 1
+ UCHAR iInterface; // offset 8, size 1
+ USHORT wNumClasses; // offset 9, size 2
+} USB_INTERFACE_DESCRIPTOR2, *PUSB_INTERFACE_DESCRIPTOR2;
+
+
+//
+// USB Device Class Definition for Audio Devices
+//
+
+typedef struct _USB_AUDIO_COMMON_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+} USB_AUDIO_COMMON_DESCRIPTOR,
+*PUSB_AUDIO_COMMON_DESCRIPTOR;
+
+// 4.3.2 Class-Specific AC (Audio Control) Interface Descriptor
+//
+typedef struct _USB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ USHORT bcdADC;
+ USHORT wTotalLength;
+ UCHAR bInCollection;
+ UCHAR baInterfaceNr[1];
+} USB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR,
+*PUSB_AUDIO_AC_INTERFACE_HEADER_DESCRIPTOR;
+
+// 4.3.2.1 Input Terminal Descriptor
+//
+typedef struct _USB_AUDIO_INPUT_TERMINAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR bNrChannels;
+ USHORT wChannelConfig;
+ UCHAR iChannelNames;
+ UCHAR iTerminal;
+} USB_AUDIO_INPUT_TERMINAL_DESCRIPTOR,
+*PUSB_AUDIO_INPUT_TERMINAL_DESCRIPTOR;
+
+// 4.3.2.2 Output Terminal Descriptor
+//
+typedef struct _USB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR bSourceID;
+ UCHAR iTerminal;
+} USB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR,
+*PUSB_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR;
+
+// 4.3.2.3 Mixer Unit Descriptor
+//
+typedef struct _USB_AUDIO_MIXER_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ UCHAR bNrInPins;
+ UCHAR baSourceID[1];
+} USB_AUDIO_MIXER_UNIT_DESCRIPTOR,
+*PUSB_AUDIO_MIXER_UNIT_DESCRIPTOR;
+
+// 4.3.2.4 Selector Unit Descriptor
+//
+typedef struct _USB_AUDIO_SELECTOR_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ UCHAR bNrInPins;
+ UCHAR baSourceID[1];
+} USB_AUDIO_SELECTOR_UNIT_DESCRIPTOR,
+*PUSB_AUDIO_SELECTOR_UNIT_DESCRIPTOR;
+
+// 4.3.2.5 Feature Unit Descriptor
+//
+typedef struct _USB_AUDIO_FEATURE_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ UCHAR bSourceID;
+ UCHAR bControlSize;
+ UCHAR bmaControls[1];
+} USB_AUDIO_FEATURE_UNIT_DESCRIPTOR,
+*PUSB_AUDIO_FEATURE_UNIT_DESCRIPTOR;
+
+// 4.3.2.6 Processing Unit Descriptor
+//
+typedef struct _USB_AUDIO_PROCESSING_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ USHORT wProcessType;
+ UCHAR bNrInPins;
+ UCHAR baSourceID[1];
+} USB_AUDIO_PROCESSING_UNIT_DESCRIPTOR,
+*PUSB_AUDIO_PROCESSING_UNIT_DESCRIPTOR;
+
+// 4.3.2.7 Extension Unit Descriptor
+//
+typedef struct _USB_AUDIO_EXTENSION_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ USHORT wExtensionCode;
+ UCHAR bNrInPins;
+ UCHAR baSourceID[1];
+} USB_AUDIO_EXTENSION_UNIT_DESCRIPTOR,
+*PUSB_AUDIO_EXTENSION_UNIT_DESCRIPTOR;
+
+// 4.5.2 Class-Specific AS Interface Descriptor
+//
+typedef struct _USB_AUDIO_GENERAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalLink;
+ UCHAR bDelay;
+ USHORT wFormatTag;
+} USB_AUDIO_GENERAL_DESCRIPTOR,
+*PUSB_AUDIO_GENERAL_DESCRIPTOR;
+
+// 4.6.1.2 Class-Specific AS Endpoint Descriptor
+//
+typedef struct _USB_AUDIO_ENDPOINT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bmAttributes;
+ UCHAR bLockDelayUnits;
+ USHORT wLockDelay;
+} USB_AUDIO_ENDPOINT_DESCRIPTOR,
+*PUSB_AUDIO_ENDPOINT_DESCRIPTOR;
+
+//
+// USB Device Class Definition for Audio Data Formats
+//
+
+typedef struct _USB_AUDIO_COMMON_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatType;
+} USB_AUDIO_COMMON_FORMAT_DESCRIPTOR,
+*PUSB_AUDIO_COMMON_FORMAT_DESCRIPTOR;
+
+
+// 2.1.5 Type I Format Type Descriptor
+// 2.3.1 Type III Format Type Descriptor
+//
+typedef struct _USB_AUDIO_TYPE_I_OR_III_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatType;
+ UCHAR bNrChannels;
+ UCHAR bSubframeSize;
+ UCHAR bBitResolution;
+ UCHAR bSamFreqType;
+} USB_AUDIO_TYPE_I_OR_III_FORMAT_DESCRIPTOR,
+*PUSB_AUDIO_TYPE_I_OR_III_FORMAT_DESCRIPTOR;
+
+
+// 2.2.6 Type II Format Type Descriptor
+//
+typedef struct _USB_AUDIO_TYPE_II_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatType;
+ USHORT wMaxBitRate;
+ USHORT wSamplesPerFrame;
+ UCHAR bSamFreqType;
+} USB_AUDIO_TYPE_II_FORMAT_DESCRIPTOR,
+*PUSB_AUDIO_TYPE_II_FORMAT_DESCRIPTOR;
+
+#pragma pack(pop)
diff --git a/tests/projects/winsdk/usbview/usbschema.hpp b/tests/projects/winsdk/usbview/usbschema.hpp new file mode 100644 index 000000000..1aac6d000 --- /dev/null +++ b/tests/projects/winsdk/usbview/usbschema.hpp @@ -0,0 +1,6119 @@ +// +// This file is auto-generated from XSD using the command: +// xsd.exe /language:CPP /c /order /namespace:Microsoft.Kits.Samples.Usb +// + +#pragma once + +#using <mscorlib.dll> +#using <System.dll> +#using <System.Xml.dll> + +using namespace System::Security::Permissions; +// +// This source code was auto-generated by xsd, Version=4.0.30319.0. +// +namespace Microsoft { + namespace Kits { + namespace Samples { + namespace Usb { + using namespace System::Xml::Serialization; + using namespace System; + ref class UvcViewAll; + ref class UvcViewType; + ref class MachineInfoType; + ref class NoDeviceType; + ref class PortConnectorType; + ref class UsbPortPropertiesType; + ref class NodeConnectionInfoExV2Type; + ref class UsbBillboardSVIDType; + ref class UsbBillboardCapabilityDescriptorType; + ref class UsbDispContIdCapExtDescriptorType; + ref class UsbUsb20ExtensionDescriptorType; + ref class UsbSuperSpeedExtensionDescriptorType; + ref class UsbBosDescriptorType; + ref class UsbDeviceUnknownDescriptorType; + ref class UsbDeviceIADDescriptorType; + ref class UsbDeviceClassType; + ref class UsbDeviceOTGDescriptorType; + ref class UsbDeviceHidOptionalDescriptorsType; + ref class UsbDeviceHidDescriptorType; + ref class UsbDeviceInterfaceDescriptorType; + ref class UsbDeviceQualifierDescriptorType; + ref class UsbConfigurationDescriptorType; + ref class UsbDeviceConfigurationType; + ref class EndpointDescriptorType; + ref class UsbDeviceType; + ref class NodeConnectionInfoExType; + ref class NodeConnectionInfoExStructType; + ref class UsbDeviceDescriptorType; + ref class UsbPipeInfoType; + ref class UsbDeviceClassDetailsType; + ref class ExternalHubType; + ref class HubNodeInformationType; + ref class HubInformationType; + ref class HubDescriptorType; + ref class HubCharacteristicsType; + ref class HubInformationExType; + ref class Hub30DescriptorType; + ref class HubCapabilitiesExType; + ref class RootHubType; + ref class UsbHCPowerStateType; + ref class UsbHCPowerStateMappingType; + ref class UsbHCDeviceInfoType; + ref class HostControllerType; + + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public enum class UsbConnectionSpeedType { + + /// <remarks/> + Low, + + /// <remarks/> + Full, + + /// <remarks/> + High, + + /// <remarks/> + Super, + + /// <remarks/> + Unknown, + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public enum class UsbConnectionStatusType { + + /// <remarks/> + NoDeviceConnected, + + /// <remarks/> + DeviceConnected, + + /// <remarks/> + DeviceFailedEnumeration, + + /// <remarks/> + DeviceGeneralFailure, + + /// <remarks/> + DeviceCausedOvercurrent, + + /// <remarks/> + DeviceNotEnoughPower, + + /// <remarks/> + DeviceNotEnoughBandwidth, + + /// <remarks/> + DeviceHubNestedTooDeeply, + + /// <remarks/> + DeviceInLegacyHub, + + /// <remarks/> + DeviceEnumerating, + + /// <remarks/> + DeviceReset, + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public enum class DevicePowerStateType { + + /// <remarks/> + PowerDeviceUnspecified, + + /// <remarks/> + PowerDeviceD0, + + /// <remarks/> + PowerDeviceD1, + + /// <remarks/> + PowerDeviceD2, + + /// <remarks/> + PowerDeviceD3, + + /// <remarks/> + PowerDeviceMaximum, + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public enum class HubNodeType { + + /// <remarks/> + UsbHub, + + /// <remarks/> + UsbMiParent, + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public enum class HubTypeType { + + /// <remarks/> + UnknownHubType, + + /// <remarks/> + UsbRootHub, + + /// <remarks/> + Usb20Hub, + + /// <remarks/> + Usb30Hub, + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(AnonymousType=true, Namespace=L"USB"), + System::Xml::Serialization::XmlRootAttribute(Namespace=L"USB", IsNullable=false)] + public ref class UvcViewAll { + + private: Microsoft::Kits::Samples::Usb::UvcViewType^ uvcViewField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::UvcViewType^ UvcView { + Microsoft::Kits::Samples::Usb::UvcViewType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UvcViewType^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UvcViewType { + + private: Microsoft::Kits::Samples::Usb::MachineInfoType^ machineInfoField; + + private: cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ usbTreeField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::MachineInfoType^ MachineInfo { + Microsoft::Kits::Samples::Usb::MachineInfoType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::MachineInfoType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlArrayAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1), + System::Xml::Serialization::XmlArrayItemAttribute(L"UsbController", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, IsNullable=false)] + property cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ UsbTree { + cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class MachineInfoType { + + private: System::Byte uvcMajorVersionField; + + private: System::Byte uvcMinorVersionField; + + private: System::Byte uvcMajorSpecVersionField; + + private: System::Byte uvcMinorSpecVersionField; + + private: System::DateTime collectionTimeField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::Byte UvcMajorVersion { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::Byte UvcMinorVersion { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::Byte UvcMajorSpecVersion { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::Byte UvcMinorSpecVersion { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::DateTime CollectionTime { + System::DateTime get(); + System::Void set(System::DateTime value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class NoDeviceType { + + private: Microsoft::Kits::Samples::Usb::PortConnectorType^ portConnectorField; + + private: System::String^ usbPortNumberField; + + private: System::String^ nameField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::PortConnectorType^ PortConnector { + Microsoft::Kits::Samples::Usb::PortConnectorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbPortNumber { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ Name { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class PortConnectorType { + + private: System::UInt64 connectionIndexField; + + private: System::UInt64 actualLengthField; + + private: Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ usbPortPropertiesField; + + private: System::UInt16 companionIndexField; + + private: System::UInt16 companionPortNumberField; + + private: System::String^ companionHubSymbolicLinkNameField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::UInt64 ConnectionIndex { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::UInt64 ActualLength { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ UsbPortProperties { + Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::UInt16 CompanionIndex { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::UInt16 CompanionPortNumber { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::String^ CompanionHubSymbolicLinkName { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbPortPropertiesType { + + private: System::Boolean portIsUserConnectableField; + + private: System::Boolean portIsDebugCapableField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::Boolean PortIsUserConnectable { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::Boolean PortIsDebugCapable { + System::Boolean get(); + System::Void set(System::Boolean value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class NodeConnectionInfoExV2Type { + + private: System::UInt64 connectionIndexField; + + private: System::UInt64 lengthField; + + private: System::Boolean usb110SupportedField; + + private: System::Boolean usb200SupportedField; + + private: System::Boolean usb300SupportedField; + + private: System::Boolean deviceIsOperatingAtSuperSpeedOrHigherField; + + private: System::Boolean deviceIsSuperSpeedCapableOrHigherField; + + private: System::Boolean deviceIsOperatingAtSuperSpeedPlusOrHigherField; + + private: System::Boolean deviceIsSuperSpeedPlusCapableOrHigherField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::UInt64 ConnectionIndex { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::UInt64 Length { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::Boolean Usb110Supported { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::Boolean Usb200Supported { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::Boolean Usb300Supported { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::Boolean DeviceIsOperatingAtSuperSpeedOrHigher { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::Boolean DeviceIsSuperSpeedCapableOrHigher { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=7)] + property System::Boolean DeviceIsOperatingAtSuperSpeedPlusOrHigher { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property System::Boolean DeviceIsSuperSpeedPlusCapableOrHigher { + System::Boolean get(); + System::Void set(System::Boolean value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbBillboardSVIDType { + + private: System::String^ descriptionField; + + private: System::String^ alternateModeStringField; + + private: System::UInt16 wSVIDField; + + private: System::Byte bAlternateModeField; + + private: System::Byte iAlternateModeStringField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ Description { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ AlternateModeString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WSVID { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BAlternateMode { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IAlternateModeString { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbBillboardCapabilityDescriptorType { + + private: System::String^ vConnPowerField; + + private: System::String^ billboardDescriptorErrorsField; + + private: System::String^ addtionalInfoURLField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ usbBillboardSVIDField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bDevCapabilityTypeField; + + private: System::Byte iAddtionalInfoURLField; + + private: System::Byte bNumberOfAlternateModesField; + + private: System::Byte bPreferredAlternateModeField; + + private: System::Byte calculatedBLengthField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ VConnPower { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ BillboardDescriptorErrors { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ AddtionalInfoURL { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbBillboardSVID", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=3)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ UsbBillboardSVID { + cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDevCapabilityType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IAddtionalInfoURL { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BNumberOfAlternateModes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BPreferredAlternateMode { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte CalculatedBLength { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDispContIdCapExtDescriptorType { + + private: System::String^ reservedBitErrorField; + + private: System::String^ containerIdStrField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bReservedField; + + private: System::Byte bDevCapabilityTypeField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ ReservedBitError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ ContainerIdStr { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BReserved { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDevCapabilityType { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbUsb20ExtensionDescriptorType { + + private: System::String^ reservedBitErrorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bDevCapabilityTypeField; + + private: System::UInt64 bmAttributesField; + + private: System::Boolean supportsLinkPowerManagementField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ ReservedBitError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDevCapabilityType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt64 BmAttributes { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean SupportsLinkPowerManagement { + System::Boolean get(); + System::Void set(System::Boolean value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbSuperSpeedExtensionDescriptorType { + + private: System::String^ reservedAttributesBitErrorField; + + private: System::String^ reservedSpeedBitErrorField; + + private: System::String^ reservedSpeedErrorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bDevCapabilityTypeField; + + private: System::UInt64 bmAttributesField; + + private: System::Boolean latencyToleranceMsgCapableField; + + private: System::Byte bFunctionalitySupportField; + + private: System::Byte bU1DevExitLatField; + + private: System::UInt16 wSpeedsSupportedField; + + private: System::UInt16 wU2DevExitLatField; + + private: System::Boolean supportsLowSpeedField; + + private: System::Boolean supportsFullSpeedField; + + private: System::Boolean supportsHighSpeedField; + + private: System::Boolean supportsSuperSpeedField; + + private: System::String^ lowestSpeedField; + + private: System::String^ u1DevExitLatencyStringField; + + private: System::String^ u2DevExitLatencyStringField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ ReservedAttributesBitError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ ReservedSpeedBitError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ ReservedSpeedError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDevCapabilityType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt64 BmAttributes { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean LatencyToleranceMsgCapable { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BFunctionalitySupport { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BU1DevExitLat { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WSpeedsSupported { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WU2DevExitLat { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean SupportsLowSpeed { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean SupportsFullSpeed { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean SupportsHighSpeed { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean SupportsSuperSpeed { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ LowestSpeed { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ U1DevExitLatencyString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ U2DevExitLatencyString { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbBosDescriptorType { + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ unknownDescriptorField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ usbSuperSpeedExtensionDescriptorField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ usbUsb20ExtensionDescriptorField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ usbDispContIdCapExtDescriptorField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ usbBillboardCapabilityDescriptorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::UInt16 wTotalLengthField; + + private: System::Byte bNumDeviceCapsField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UnknownDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=0)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ UnknownDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbSuperSpeedExtensionDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=1)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ UsbSuperSpeedExtensionDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbUsb20ExtensionDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=2)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ UsbUsb20ExtensionDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbDispContIdCapExtDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=3)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ UsbDispContIdCapExtDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbBillboardCapabilityDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=4)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ UsbBillboardCapabilityDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WTotalLength { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BNumDeviceCaps { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceUnknownDescriptorType { + + private: System::String^ unknownDescriptorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ UnknownDescriptor { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceIADDescriptorType { + + private: Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ functionDetailsField; + + private: System::String^ interfaceErrorField; + + private: System::String^ functionClassErrorField; + + private: System::String^ protocolField; + + private: System::String^ stringDescField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bFirstInterfaceField; + + private: System::Byte bInterfaceCountField; + + private: System::Byte bFunctionClassField; + + private: System::Byte bFunctionSubclassField; + + private: System::Byte bFunctionProtocolField; + + private: System::Byte iFunctionField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ FunctionDetails { + Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ InterfaceError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ FunctionClassError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::String^ Protocol { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ StringDesc { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BFirstInterface { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BInterfaceCount { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BFunctionClass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BFunctionSubclass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BFunctionProtocol { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IFunction { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceClassType { + + private: System::String^ deviceClassField; + + private: System::String^ deviceSubclassField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ DeviceSubclass { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceOTGDescriptorType { + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bmAttributesField; + + private: System::String^ attributesStringField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BmAttributes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ AttributesString { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceHidOptionalDescriptorsType { + + private: System::Byte bDescriptorTypeField; + + private: System::UInt16 wDescriptorLengthField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WDescriptorLength { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceHidDescriptorType { + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ optionalDescriptorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::UInt16 bcdHIDField; + + private: System::Byte bCountryCodeField; + + private: System::Byte bNumDescriptorsField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"OptionalDescriptor", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=0)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ OptionalDescriptor { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 BcdHID { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BCountryCode { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BNumDescriptors { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceInterfaceDescriptorType { + + private: Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ interfaceDetailsField; + + private: System::String^ protocolErrorField; + + private: System::String^ stringDescField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::Byte bInterfaceNumberField; + + private: System::Byte bAlternateSettingField; + + private: System::Byte bNumEndpointsField; + + private: System::Byte bInterfaceClassField; + + private: System::Byte bInterfaceSubclassField; + + private: System::Byte bInterfaceProtocolField; + + private: System::Byte iInterfaceField; + + private: System::UInt16 wNumClassesField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ InterfaceDetails { + Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ ProtocolError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ StringDesc { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BInterfaceNumber { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BAlternateSetting { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BNumEndpoints { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BInterfaceClass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BInterfaceSubclass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BInterfaceProtocol { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IInterface { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WNumClasses { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceQualifierDescriptorType { + + private: System::String^ deviceClassField; + + private: System::Byte maxPacketSizeInBytesField; + + private: System::Boolean maxPacketSizeInBytesFieldSpecified; + + private: System::String^ deviceClassErrorField; + + private: System::String^ deviceSubclassErrorField; + + private: System::String^ deviceProtocolErrorField; + + private: System::String^ deviceNumConfigErrorField; + + private: System::String^ reservedErrorField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::UInt16 bcdUSBField; + + private: System::Byte bDeviceClassField; + + private: System::Byte bDeviceSubclassField; + + private: System::Byte bDeviceProtocolField; + + private: System::Byte bMaxPacketSize0Field; + + private: System::Byte numConfigurationsField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::Byte MaxPacketSizeInBytes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlIgnoreAttribute] + property System::Boolean MaxPacketSizeInBytesSpecified { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ DeviceClassError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::String^ DeviceSubclassError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ DeviceProtocolError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::String^ DeviceNumConfigError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::String^ ReservedError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 BcdUSB { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDeviceClass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDeviceSubclass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDeviceProtocol { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BMaxPacketSize0 { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte NumConfigurations { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbConfigurationDescriptorType { + + private: System::String^ configDescErrorField; + + private: System::String^ confValueErrorField; + + private: System::String^ confStringDescField; + + private: System::String^ attributesStrField; + + private: System::String^ maxCurrentField; + + private: System::Byte bLengthField; + + private: System::Byte bDescriptorTypeField; + + private: System::UInt16 wTotalLengthField; + + private: System::Byte bNumInterfacesField; + + private: System::Byte bConfigurationValueField; + + private: System::Byte iConfigurationField; + + private: System::Byte bmAttributesField; + + private: System::Byte maxPowerField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ ConfigDescError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ ConfValueError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ ConfStringDesc { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::String^ AttributesStr { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ MaxCurrent { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BDescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WTotalLength { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BNumInterfaces { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BConfigurationValue { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IConfiguration { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte BmAttributes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte MaxPower { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceConfigurationType { + + private: System::String^ deviceQualifierErrorField; + + private: System::String^ speedConfigurationErrorField; + + private: System::String^ deviceConfigurationErrorField; + + private: System::String^ interfaceErrorField; + + private: System::String^ preReleaseErrorField; + + private: System::String^ endpointErrorField; + + private: System::String^ hidErrorField; + + private: System::String^ otgErrorField; + + private: System::String^ iadErrorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ deviceDetailsField; + + private: Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ configurationDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ deviceQualifierDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ interfaceDescriptorField; + + private: Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ endpointDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ hidDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ otgDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ iadDescriptorField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ unknownDescriptorField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ DeviceQualifierError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ SpeedConfigurationError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ DeviceConfigurationError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::String^ InterfaceError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ PreReleaseError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::String^ EndpointError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::String^ HidError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=7)] + property System::String^ OtgError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property System::String^ IadError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=9)] + property Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ DeviceDetails { + Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=10)] + property Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ ConfigurationDescriptor { + Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=11)] + property Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ DeviceQualifierDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=12)] + property Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ InterfaceDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=13)] + property Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ EndpointDescriptor { + Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=14)] + property Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ HidDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=15)] + property Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ OtgDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=16)] + property Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ IadDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=17)] + property Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ UnknownDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class EndpointDescriptorType { + + private: System::Byte lengthField; + + private: System::Byte descriptorTypeField; + + private: System::Byte endpointAddressField; + + private: System::Byte attributesField; + + private: System::UInt16 maxPacketSizeField; + + private: System::Byte intervalField; + + private: System::UInt16 wIntervalField; + + private: System::Byte syncAddressField; + + private: System::String^ endpointDirectionField; + + private: System::Byte endpointIdField; + + private: System::String^ endpointTypeField; + + private: System::String^ endpointPacketInfoField; + + private: System::String^ endpointPacketSizeValidationField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte Length { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte EndpointAddress { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte Attributes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 MaxPacketSize { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte Interval { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 WInterval { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte SyncAddress { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ EndpointDirection { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte EndpointId { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ EndpointType { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ EndpointPacketInfo { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ EndpointPacketSizeValidation { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceType { + + private: Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ connectionInfoField; + + private: Microsoft::Kits::Samples::Usb::PortConnectorType^ portConnectorField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ deviceConfigurationField; + + private: Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ bosDescriptorField; + + private: Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ connectionInfoV2Field; + + private: System::String^ usbPortNumberField; + + private: System::String^ serviceNameField; + + private: System::String^ hwIdField; + + private: System::String^ deviceIdField; + + private: System::String^ deviceNameField; + + private: System::String^ deviceClassField; + + private: System::String^ usbProtocolField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ ConnectionInfo { + Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property Microsoft::Kits::Samples::Usb::PortConnectorType^ PortConnector { + Microsoft::Kits::Samples::Usb::PortConnectorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"DeviceConfiguration", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=2)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ DeviceConfiguration { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ BosDescriptor { + Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ ConnectionInfoV2 { + Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbPortNumber { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ ServiceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HwId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbProtocol { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class NodeConnectionInfoExType { + + private: Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ connectionInfoStructField; + + private: System::String^ iProductStringDescEnField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ deviceClassDetailsField; + + private: System::Byte maxPacketSizeInBytesField; + + private: System::String^ vendorStringField; + + private: System::String^ manufacturerStringField; + + private: System::String^ productStringField; + + private: System::String^ langIdStringField; + + private: System::String^ serialStringField; + + private: System::String^ pipeInfoErrorField; + + private: System::String^ lengthErrorField; + + private: System::String^ deviceErrorField; + + private: System::String^ packetSizeErrorField; + + private: System::String^ configurationCountErrorField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ ConnectionInfoStruct { + Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ IProductStringDescEn { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ DeviceClassDetails { + Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::Byte MaxPacketSizeInBytes { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ VendorString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::String^ ManufacturerString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::String^ ProductString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=7)] + property System::String^ LangIdString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property System::String^ SerialString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=9)] + property System::String^ PipeInfoError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=10)] + property System::String^ LengthError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=11)] + property System::String^ DeviceError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=12)] + property System::String^ PacketSizeError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=13)] + property System::String^ ConfigurationCountError { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class NodeConnectionInfoExStructType { + + private: System::UInt64 connectionIndexField; + + private: Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ deviceDescriptorField; + + private: System::Byte currentConfigurationValueField; + + private: System::Byte speedField; + + private: Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType speedStrField; + + private: System::Boolean deviceIsHubField; + + private: System::Byte deviceAddressField; + + private: System::UInt64 numOfOpenPipesField; + + private: Microsoft::Kits::Samples::Usb::UsbConnectionStatusType usbConnectionStatusField; + + private: Microsoft::Kits::Samples::Usb::DevicePowerStateType devicePowerStateField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ pipeField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::UInt64 ConnectionIndex { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ DeviceDescriptor { + Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::Byte CurrentConfigurationValue { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::Byte Speed { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType SpeedStr { + Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::Boolean DeviceIsHub { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::Byte DeviceAddress { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=7)] + property System::UInt64 NumOfOpenPipes { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property Microsoft::Kits::Samples::Usb::UsbConnectionStatusType UsbConnectionStatus { + Microsoft::Kits::Samples::Usb::UsbConnectionStatusType get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbConnectionStatusType value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=9)] + property Microsoft::Kits::Samples::Usb::DevicePowerStateType DevicePowerState { + Microsoft::Kits::Samples::Usb::DevicePowerStateType get(); + System::Void set(Microsoft::Kits::Samples::Usb::DevicePowerStateType value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"Pipe", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=10)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ Pipe { + cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceDescriptorType { + + private: System::Byte lengthField; + + private: System::Byte descriptorTypeField; + + private: System::UInt16 cdUSBField; + + private: System::Byte deviceClassField; + + private: System::Byte deviceSubclassField; + + private: System::Byte deviceProtocolField; + + private: System::Byte maxPacketSize0Field; + + private: System::UInt16 idVendorField; + + private: System::UInt16 idProductField; + + private: System::UInt16 cdDeviceField; + + private: System::Byte iManufacturerField; + + private: System::Byte iProductField; + + private: System::Byte iSerialNumberField; + + private: System::Byte numConfigurationsField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte Length { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 CdUSB { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DeviceClass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DeviceSubclass { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DeviceProtocol { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte MaxPacketSize0 { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 IdVendor { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 IdProduct { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 CdDevice { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IManufacturer { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte IProduct { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte ISerialNumber { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte NumConfigurations { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbPipeInfoType { + + private: Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ endpointDescriptorField; + + private: System::UInt64 scheduleOffsetField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ EndpointDescriptor { + Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::UInt64 ScheduleOffset { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbDeviceClassDetailsType { + + private: System::String^ deviceTypeField; + + private: System::String^ deviceTypeErrorField; + + private: System::String^ subclassTypeField; + + private: System::String^ subclassTypeErrorField; + + private: System::String^ deviceProtocolField; + + private: System::String^ deviceProtocolErrorField; + + private: System::UInt32 uvcVersionField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::String^ DeviceType { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ DeviceTypeError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ SubclassType { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::String^ SubclassTypeError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::String^ DeviceProtocol { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::String^ DeviceProtocolError { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::UInt32 UvcVersion { + System::UInt32 get(); + System::Void set(System::UInt32 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class ExternalHubType { + + private: Microsoft::Kits::Samples::Usb::HubNodeInformationType^ hubNodeInformationField; + + private: System::String^ hubNameField; + + private: Microsoft::Kits::Samples::Usb::HubInformationExType^ hubInformationExField; + + private: Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ hubCapabilityExField; + + private: Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ connectionInfoField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ usbDeviceField; + + private: cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ noDeviceField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ deviceConfigurationField; + + private: Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ bosDescriptorField; + + private: Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ connectionInfoV2Field; + + private: cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ externalHubField; + + private: Microsoft::Kits::Samples::Usb::PortConnectorType^ portConnectorField; + + private: System::String^ serviceNameField; + + private: System::String^ hwIdField; + + private: System::String^ deviceIdField; + + private: System::String^ deviceNameField; + + private: System::String^ deviceClassField; + + private: System::String^ usbProtocolField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::HubNodeInformationType^ HubNodeInformation { + Microsoft::Kits::Samples::Usb::HubNodeInformationType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubNodeInformationType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ HubName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::HubInformationExType^ HubInformationEx { + Microsoft::Kits::Samples::Usb::HubInformationExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubInformationExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ HubCapabilityEx { + Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ ConnectionInfo { + Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbDevice", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=5)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ UsbDevice { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"NoDevice", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ NoDevice { + cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"DeviceConfiguration", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=7)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ DeviceConfiguration { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ BosDescriptor { + Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=9)] + property Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ ConnectionInfoV2 { + Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"ExternalHub", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=10)] + property cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ ExternalHub { + cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=11)] + property Microsoft::Kits::Samples::Usb::PortConnectorType^ PortConnector { + Microsoft::Kits::Samples::Usb::PortConnectorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ ServiceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HwId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbProtocol { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubNodeInformationType { + + private: Microsoft::Kits::Samples::Usb::HubNodeType hubNodeField; + + private: Microsoft::Kits::Samples::Usb::HubInformationType^ hubInformationField; + + private: System::UInt64 miParentNumberOfInterfacesField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::HubNodeType HubNode { + Microsoft::Kits::Samples::Usb::HubNodeType get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubNodeType value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property Microsoft::Kits::Samples::Usb::HubInformationType^ HubInformation { + Microsoft::Kits::Samples::Usb::HubInformationType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubInformationType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::UInt64 MiParentNumberOfInterfaces { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubInformationType { + + private: System::Boolean isRootHubField; + + private: System::Boolean isBusPoweredField; + + private: Microsoft::Kits::Samples::Usb::HubDescriptorType^ hubDescriptorField; + + private: Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ hubCharacteristicsField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::Boolean IsRootHub { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::Boolean IsBusPowered { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::HubDescriptorType^ HubDescriptor { + Microsoft::Kits::Samples::Usb::HubDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ HubCharacteristics { + Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubDescriptorType { + + private: System::Byte descriptorLengthField; + + private: System::Byte descriptorTypeField; + + private: System::Byte numberOfPortsField; + + private: System::Byte powerOntoPowerGoodField; + + private: System::Byte hubControlCurrentField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DescriptorLength { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte NumberOfPorts { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte PowerOntoPowerGood { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte HubControlCurrent { + System::Byte get(); + System::Void set(System::Byte value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubCharacteristicsType { + + private: System::UInt32 hubCharacteristicsValueField; + + private: System::String^ powerSwitchingField; + + private: System::Boolean compoundDeviceField; + + private: System::String^ overCurrentProtectionField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt32 HubCharacteristicsValue { + System::UInt32 get(); + System::Void set(System::UInt32 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ PowerSwitching { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean CompoundDevice { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ OverCurrentProtection { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubInformationExType { + + private: Microsoft::Kits::Samples::Usb::HubTypeType hubTypeField; + + private: System::UInt16 highestPortNumberField; + + private: Microsoft::Kits::Samples::Usb::HubDescriptorType^ hubDescriptorField; + + private: Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ hub30DescriptorField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::HubTypeType HubType { + Microsoft::Kits::Samples::Usb::HubTypeType get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubTypeType value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::UInt16 HighestPortNumber { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::HubDescriptorType^ HubDescriptor { + Microsoft::Kits::Samples::Usb::HubDescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubDescriptorType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ Hub30Descriptor { + Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class Hub30DescriptorType { + + private: System::Byte lengthField; + + private: System::Byte descriptorTypeField; + + private: System::Byte numberOfPortsField; + + private: System::UInt16 hubCharacteristicsField; + + private: System::Byte powerOntoPowerGoodField; + + private: System::Byte hubControlCurrentField; + + private: System::Byte hubHdrDecLatField; + + private: System::UInt16 hubDelayField; + + private: System::UInt16 deviceRemovableField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte Length { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte DescriptorType { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte NumberOfPorts { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 HubCharacteristics { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte PowerOntoPowerGood { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte HubControlCurrent { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Byte HubHdrDecLat { + System::Byte get(); + System::Void set(System::Byte value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 HubDelay { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::UInt16 DeviceRemovable { + System::UInt16 get(); + System::Void set(System::UInt16 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HubCapabilitiesExType { + + private: System::Boolean hubIsHighSpeedCapableField; + + private: System::Boolean hubIsHighSpeedField; + + private: System::Boolean hubIsMultiTtCapableField; + + private: System::Boolean hubIsMultiTtField; + + private: System::Boolean hubIsRootField; + + private: System::Boolean hubIsArmedWakeOnConnectField; + + private: System::Boolean hubIsBusPoweredField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsHighSpeedCapable { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsHighSpeed { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsMultiTtCapable { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsMultiTt { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsRoot { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsArmedWakeOnConnect { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean HubIsBusPowered { + System::Boolean get(); + System::Void set(System::Boolean value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class RootHubType { + + private: Microsoft::Kits::Samples::Usb::HubNodeInformationType^ hubNodeInformationField; + + private: System::String^ hubNameField; + + private: Microsoft::Kits::Samples::Usb::HubInformationExType^ hubInformationExField; + + private: Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ hubCapabilityExField; + + private: cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ externalHubField; + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ usbDeviceField; + + private: cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ noDeviceField; + + private: System::String^ serviceNameField; + + private: System::String^ hwIdField; + + private: System::String^ deviceIdField; + + private: System::String^ deviceNameField; + + private: System::String^ deviceClassField; + + private: System::String^ usbProtocolField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::HubNodeInformationType^ HubNodeInformation { + Microsoft::Kits::Samples::Usb::HubNodeInformationType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubNodeInformationType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ HubName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::HubInformationExType^ HubInformationEx { + Microsoft::Kits::Samples::Usb::HubInformationExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubInformationExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ HubCapabilityEx { + Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"ExternalHub", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=4)] + property cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ ExternalHub { + cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"UsbDevice", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, + Order=5)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ UsbDevice { + cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"NoDevice", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ NoDevice { + cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ ServiceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HwId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbProtocol { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbHCPowerStateType { + + private: System::String^ systemStateField; + + private: System::String^ hostControllerStateField; + + private: System::String^ hubStateField; + + private: System::Boolean canWakeUpField; + + private: System::Boolean isPoweredField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ SystemState { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HostControllerState { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HubState { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean CanWakeUp { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::Boolean IsPowered { + System::Boolean get(); + System::Void set(System::Boolean value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbHCPowerStateMappingType { + + private: cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ powerMapField; + + private: System::String^ lastSleepStateField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(L"PowerMap", Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ PowerMap { + cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ get(); + System::Void set(cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::String^ LastSleepState { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class UsbHCDeviceInfoType { + + private: System::Int64 vendorIdField; + + private: System::Int64 deviceIdField; + + private: System::String^ driverKeyField; + + private: System::Int64 subSysIdField; + + private: System::Int64 revisionField; + + private: System::UInt64 debugPortField; + + private: System::UInt64 numberOfRootPortsField; + + private: System::UInt64 controllerFlavorField; + + private: System::String^ controllerFlavorStringField; + + private: System::Boolean portSwitchingEnabledField; + + private: System::Boolean selectiveSuspendEnabledField; + + private: System::UInt64 legacyBiosField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property System::Int64 VendorId { + System::Int64 get(); + System::Void set(System::Int64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property System::Int64 DeviceId { + System::Int64 get(); + System::Void set(System::Int64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property System::String^ DriverKey { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=3)] + property System::Int64 SubSysId { + System::Int64 get(); + System::Void set(System::Int64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=4)] + property System::Int64 Revision { + System::Int64 get(); + System::Void set(System::Int64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=5)] + property System::UInt64 DebugPort { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=6)] + property System::UInt64 NumberOfRootPorts { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=7)] + property System::UInt64 ControllerFlavor { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=8)] + property System::String^ ControllerFlavorString { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=9)] + property System::Boolean PortSwitchingEnabled { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=10)] + property System::Boolean SelectiveSuspendEnabled { + System::Boolean get(); + System::Void set(System::Boolean value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=11)] + property System::UInt64 LegacyBios { + System::UInt64 get(); + System::Void set(System::UInt64 value); + } + }; + + /// <remarks/> + [System::CodeDom::Compiler::GeneratedCodeAttribute(L"xsd", L"4.6.24.0"), + System::SerializableAttribute, + System::Diagnostics::DebuggerStepThroughAttribute, + System::ComponentModel::DesignerCategoryAttribute(L"code"), + System::Xml::Serialization::XmlTypeAttribute(Namespace=L"USB")] + public ref class HostControllerType { + + private: Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ controllerInfoField; + + private: Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ powerMappingField; + + private: Microsoft::Kits::Samples::Usb::RootHubType^ rootHubField; + + private: System::String^ serviceNameField; + + private: System::String^ hwIdField; + + private: System::String^ deviceIdField; + + private: System::String^ deviceNameField; + + private: System::String^ deviceClassField; + + private: System::String^ usbProtocolField; + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=0)] + property Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ ControllerInfo { + Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=1)] + property Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ PowerMapping { + Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlElementAttribute(Form=System::Xml::Schema::XmlSchemaForm::Unqualified, Order=2)] + property Microsoft::Kits::Samples::Usb::RootHubType^ RootHub { + Microsoft::Kits::Samples::Usb::RootHubType^ get(); + System::Void set(Microsoft::Kits::Samples::Usb::RootHubType^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ ServiceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ HwId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceId { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceName { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ DeviceClass { + System::String^ get(); + System::Void set(System::String^ value); + } + + /// <remarks/> + public: [System::Xml::Serialization::XmlAttributeAttribute] + property System::String^ UsbProtocol { + System::String^ get(); + System::Void set(System::String^ value); + } + }; + } + } + } +} +namespace Microsoft { + namespace Kits { + namespace Samples { + namespace Usb { + + + + + + + + inline Microsoft::Kits::Samples::Usb::UvcViewType^ UvcViewAll::UvcView::get() { + return this->uvcViewField; + } + inline System::Void UvcViewAll::UvcView::set(Microsoft::Kits::Samples::Usb::UvcViewType^ value) { + this->uvcViewField = value; + } + + + inline Microsoft::Kits::Samples::Usb::MachineInfoType^ UvcViewType::MachineInfo::get() { + return this->machineInfoField; + } + inline System::Void UvcViewType::MachineInfo::set(Microsoft::Kits::Samples::Usb::MachineInfoType^ value) { + this->machineInfoField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ UvcViewType::UsbTree::get() { + return this->usbTreeField; + } + inline System::Void UvcViewType::UsbTree::set(cli::array< Microsoft::Kits::Samples::Usb::HostControllerType^ >^ value) { + this->usbTreeField = value; + } + + + inline System::Byte MachineInfoType::UvcMajorVersion::get() { + return this->uvcMajorVersionField; + } + inline System::Void MachineInfoType::UvcMajorVersion::set(System::Byte value) { + this->uvcMajorVersionField = value; + } + + inline System::Byte MachineInfoType::UvcMinorVersion::get() { + return this->uvcMinorVersionField; + } + inline System::Void MachineInfoType::UvcMinorVersion::set(System::Byte value) { + this->uvcMinorVersionField = value; + } + + inline System::Byte MachineInfoType::UvcMajorSpecVersion::get() { + return this->uvcMajorSpecVersionField; + } + inline System::Void MachineInfoType::UvcMajorSpecVersion::set(System::Byte value) { + this->uvcMajorSpecVersionField = value; + } + + inline System::Byte MachineInfoType::UvcMinorSpecVersion::get() { + return this->uvcMinorSpecVersionField; + } + inline System::Void MachineInfoType::UvcMinorSpecVersion::set(System::Byte value) { + this->uvcMinorSpecVersionField = value; + } + + inline System::DateTime MachineInfoType::CollectionTime::get() { + return this->collectionTimeField; + } + inline System::Void MachineInfoType::CollectionTime::set(System::DateTime value) { + this->collectionTimeField = value; + } + + + inline Microsoft::Kits::Samples::Usb::PortConnectorType^ NoDeviceType::PortConnector::get() { + return this->portConnectorField; + } + inline System::Void NoDeviceType::PortConnector::set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value) { + this->portConnectorField = value; + } + + inline System::String^ NoDeviceType::UsbPortNumber::get() { + return this->usbPortNumberField; + } + inline System::Void NoDeviceType::UsbPortNumber::set(System::String^ value) { + this->usbPortNumberField = value; + } + + inline System::String^ NoDeviceType::Name::get() { + return this->nameField; + } + inline System::Void NoDeviceType::Name::set(System::String^ value) { + this->nameField = value; + } + + + inline System::UInt64 PortConnectorType::ConnectionIndex::get() { + return this->connectionIndexField; + } + inline System::Void PortConnectorType::ConnectionIndex::set(System::UInt64 value) { + this->connectionIndexField = value; + } + + inline System::UInt64 PortConnectorType::ActualLength::get() { + return this->actualLengthField; + } + inline System::Void PortConnectorType::ActualLength::set(System::UInt64 value) { + this->actualLengthField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ PortConnectorType::UsbPortProperties::get() { + return this->usbPortPropertiesField; + } + inline System::Void PortConnectorType::UsbPortProperties::set(Microsoft::Kits::Samples::Usb::UsbPortPropertiesType^ value) { + this->usbPortPropertiesField = value; + } + + inline System::UInt16 PortConnectorType::CompanionIndex::get() { + return this->companionIndexField; + } + inline System::Void PortConnectorType::CompanionIndex::set(System::UInt16 value) { + this->companionIndexField = value; + } + + inline System::UInt16 PortConnectorType::CompanionPortNumber::get() { + return this->companionPortNumberField; + } + inline System::Void PortConnectorType::CompanionPortNumber::set(System::UInt16 value) { + this->companionPortNumberField = value; + } + + inline System::String^ PortConnectorType::CompanionHubSymbolicLinkName::get() { + return this->companionHubSymbolicLinkNameField; + } + inline System::Void PortConnectorType::CompanionHubSymbolicLinkName::set(System::String^ value) { + this->companionHubSymbolicLinkNameField = value; + } + + + inline System::Boolean UsbPortPropertiesType::PortIsUserConnectable::get() { + return this->portIsUserConnectableField; + } + inline System::Void UsbPortPropertiesType::PortIsUserConnectable::set(System::Boolean value) { + this->portIsUserConnectableField = value; + } + + inline System::Boolean UsbPortPropertiesType::PortIsDebugCapable::get() { + return this->portIsDebugCapableField; + } + inline System::Void UsbPortPropertiesType::PortIsDebugCapable::set(System::Boolean value) { + this->portIsDebugCapableField = value; + } + + + inline System::UInt64 NodeConnectionInfoExV2Type::ConnectionIndex::get() { + return this->connectionIndexField; + } + inline System::Void NodeConnectionInfoExV2Type::ConnectionIndex::set(System::UInt64 value) { + this->connectionIndexField = value; + } + + inline System::UInt64 NodeConnectionInfoExV2Type::Length::get() { + return this->lengthField; + } + inline System::Void NodeConnectionInfoExV2Type::Length::set(System::UInt64 value) { + this->lengthField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::Usb110Supported::get() { + return this->usb110SupportedField; + } + inline System::Void NodeConnectionInfoExV2Type::Usb110Supported::set(System::Boolean value) { + this->usb110SupportedField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::Usb200Supported::get() { + return this->usb200SupportedField; + } + inline System::Void NodeConnectionInfoExV2Type::Usb200Supported::set(System::Boolean value) { + this->usb200SupportedField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::Usb300Supported::get() { + return this->usb300SupportedField; + } + inline System::Void NodeConnectionInfoExV2Type::Usb300Supported::set(System::Boolean value) { + this->usb300SupportedField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::DeviceIsOperatingAtSuperSpeedOrHigher::get() { + return this->deviceIsOperatingAtSuperSpeedOrHigherField; + } + inline System::Void NodeConnectionInfoExV2Type::DeviceIsOperatingAtSuperSpeedOrHigher::set(System::Boolean value) { + this->deviceIsOperatingAtSuperSpeedOrHigherField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::DeviceIsSuperSpeedCapableOrHigher::get() { + return this->deviceIsSuperSpeedCapableOrHigherField; + } + inline System::Void NodeConnectionInfoExV2Type::DeviceIsSuperSpeedCapableOrHigher::set(System::Boolean value) { + this->deviceIsSuperSpeedCapableOrHigherField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::DeviceIsOperatingAtSuperSpeedPlusOrHigher::get() { + return this->deviceIsOperatingAtSuperSpeedPlusOrHigherField; + } + inline System::Void NodeConnectionInfoExV2Type::DeviceIsOperatingAtSuperSpeedPlusOrHigher::set(System::Boolean value) { + this->deviceIsOperatingAtSuperSpeedPlusOrHigherField = value; + } + + inline System::Boolean NodeConnectionInfoExV2Type::DeviceIsSuperSpeedPlusCapableOrHigher::get() { + return this->deviceIsSuperSpeedPlusCapableOrHigherField; + } + inline System::Void NodeConnectionInfoExV2Type::DeviceIsSuperSpeedPlusCapableOrHigher::set(System::Boolean value) { + this->deviceIsSuperSpeedPlusCapableOrHigherField = value; + } + + + inline System::String^ UsbBillboardSVIDType::Description::get() { + return this->descriptionField; + } + inline System::Void UsbBillboardSVIDType::Description::set(System::String^ value) { + this->descriptionField = value; + } + + inline System::String^ UsbBillboardSVIDType::AlternateModeString::get() { + return this->alternateModeStringField; + } + inline System::Void UsbBillboardSVIDType::AlternateModeString::set(System::String^ value) { + this->alternateModeStringField = value; + } + + inline System::UInt16 UsbBillboardSVIDType::WSVID::get() { + return this->wSVIDField; + } + inline System::Void UsbBillboardSVIDType::WSVID::set(System::UInt16 value) { + this->wSVIDField = value; + } + + inline System::Byte UsbBillboardSVIDType::BAlternateMode::get() { + return this->bAlternateModeField; + } + inline System::Void UsbBillboardSVIDType::BAlternateMode::set(System::Byte value) { + this->bAlternateModeField = value; + } + + inline System::Byte UsbBillboardSVIDType::IAlternateModeString::get() { + return this->iAlternateModeStringField; + } + inline System::Void UsbBillboardSVIDType::IAlternateModeString::set(System::Byte value) { + this->iAlternateModeStringField = value; + } + + + inline System::String^ UsbBillboardCapabilityDescriptorType::VConnPower::get() { + return this->vConnPowerField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::VConnPower::set(System::String^ value) { + this->vConnPowerField = value; + } + + inline System::String^ UsbBillboardCapabilityDescriptorType::BillboardDescriptorErrors::get() { + return this->billboardDescriptorErrorsField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BillboardDescriptorErrors::set(System::String^ value) { + this->billboardDescriptorErrorsField = value; + } + + inline System::String^ UsbBillboardCapabilityDescriptorType::AddtionalInfoURL::get() { + return this->addtionalInfoURLField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::AddtionalInfoURL::set(System::String^ value) { + this->addtionalInfoURLField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ UsbBillboardCapabilityDescriptorType::UsbBillboardSVID::get() { + return this->usbBillboardSVIDField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::UsbBillboardSVID::set(cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardSVIDType^ >^ value) { + this->usbBillboardSVIDField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::BDevCapabilityType::get() { + return this->bDevCapabilityTypeField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BDevCapabilityType::set(System::Byte value) { + this->bDevCapabilityTypeField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::IAddtionalInfoURL::get() { + return this->iAddtionalInfoURLField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::IAddtionalInfoURL::set(System::Byte value) { + this->iAddtionalInfoURLField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::BNumberOfAlternateModes::get() { + return this->bNumberOfAlternateModesField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BNumberOfAlternateModes::set(System::Byte value) { + this->bNumberOfAlternateModesField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::BPreferredAlternateMode::get() { + return this->bPreferredAlternateModeField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::BPreferredAlternateMode::set(System::Byte value) { + this->bPreferredAlternateModeField = value; + } + + inline System::Byte UsbBillboardCapabilityDescriptorType::CalculatedBLength::get() { + return this->calculatedBLengthField; + } + inline System::Void UsbBillboardCapabilityDescriptorType::CalculatedBLength::set(System::Byte value) { + this->calculatedBLengthField = value; + } + + + inline System::String^ UsbDispContIdCapExtDescriptorType::ReservedBitError::get() { + return this->reservedBitErrorField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::ReservedBitError::set(System::String^ value) { + this->reservedBitErrorField = value; + } + + inline System::String^ UsbDispContIdCapExtDescriptorType::ContainerIdStr::get() { + return this->containerIdStrField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::ContainerIdStr::set(System::String^ value) { + this->containerIdStrField = value; + } + + inline System::Byte UsbDispContIdCapExtDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDispContIdCapExtDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbDispContIdCapExtDescriptorType::BReserved::get() { + return this->bReservedField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::BReserved::set(System::Byte value) { + this->bReservedField = value; + } + + inline System::Byte UsbDispContIdCapExtDescriptorType::BDevCapabilityType::get() { + return this->bDevCapabilityTypeField; + } + inline System::Void UsbDispContIdCapExtDescriptorType::BDevCapabilityType::set(System::Byte value) { + this->bDevCapabilityTypeField = value; + } + + + inline System::String^ UsbUsb20ExtensionDescriptorType::ReservedBitError::get() { + return this->reservedBitErrorField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::ReservedBitError::set(System::String^ value) { + this->reservedBitErrorField = value; + } + + inline System::Byte UsbUsb20ExtensionDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbUsb20ExtensionDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbUsb20ExtensionDescriptorType::BDevCapabilityType::get() { + return this->bDevCapabilityTypeField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::BDevCapabilityType::set(System::Byte value) { + this->bDevCapabilityTypeField = value; + } + + inline System::UInt64 UsbUsb20ExtensionDescriptorType::BmAttributes::get() { + return this->bmAttributesField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::BmAttributes::set(System::UInt64 value) { + this->bmAttributesField = value; + } + + inline System::Boolean UsbUsb20ExtensionDescriptorType::SupportsLinkPowerManagement::get() { + return this->supportsLinkPowerManagementField; + } + inline System::Void UsbUsb20ExtensionDescriptorType::SupportsLinkPowerManagement::set(System::Boolean value) { + this->supportsLinkPowerManagementField = value; + } + + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::ReservedAttributesBitError::get() { + return this->reservedAttributesBitErrorField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::ReservedAttributesBitError::set(System::String^ value) { + this->reservedAttributesBitErrorField = value; + } + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::ReservedSpeedBitError::get() { + return this->reservedSpeedBitErrorField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::ReservedSpeedBitError::set(System::String^ value) { + this->reservedSpeedBitErrorField = value; + } + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::ReservedSpeedError::get() { + return this->reservedSpeedErrorField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::ReservedSpeedError::set(System::String^ value) { + this->reservedSpeedErrorField = value; + } + + inline System::Byte UsbSuperSpeedExtensionDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbSuperSpeedExtensionDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbSuperSpeedExtensionDescriptorType::BDevCapabilityType::get() { + return this->bDevCapabilityTypeField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BDevCapabilityType::set(System::Byte value) { + this->bDevCapabilityTypeField = value; + } + + inline System::UInt64 UsbSuperSpeedExtensionDescriptorType::BmAttributes::get() { + return this->bmAttributesField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BmAttributes::set(System::UInt64 value) { + this->bmAttributesField = value; + } + + inline System::Boolean UsbSuperSpeedExtensionDescriptorType::LatencyToleranceMsgCapable::get() { + return this->latencyToleranceMsgCapableField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::LatencyToleranceMsgCapable::set(System::Boolean value) { + this->latencyToleranceMsgCapableField = value; + } + + inline System::Byte UsbSuperSpeedExtensionDescriptorType::BFunctionalitySupport::get() { + return this->bFunctionalitySupportField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BFunctionalitySupport::set(System::Byte value) { + this->bFunctionalitySupportField = value; + } + + inline System::Byte UsbSuperSpeedExtensionDescriptorType::BU1DevExitLat::get() { + return this->bU1DevExitLatField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::BU1DevExitLat::set(System::Byte value) { + this->bU1DevExitLatField = value; + } + + inline System::UInt16 UsbSuperSpeedExtensionDescriptorType::WSpeedsSupported::get() { + return this->wSpeedsSupportedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::WSpeedsSupported::set(System::UInt16 value) { + this->wSpeedsSupportedField = value; + } + + inline System::UInt16 UsbSuperSpeedExtensionDescriptorType::WU2DevExitLat::get() { + return this->wU2DevExitLatField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::WU2DevExitLat::set(System::UInt16 value) { + this->wU2DevExitLatField = value; + } + + inline System::Boolean UsbSuperSpeedExtensionDescriptorType::SupportsLowSpeed::get() { + return this->supportsLowSpeedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::SupportsLowSpeed::set(System::Boolean value) { + this->supportsLowSpeedField = value; + } + + inline System::Boolean UsbSuperSpeedExtensionDescriptorType::SupportsFullSpeed::get() { + return this->supportsFullSpeedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::SupportsFullSpeed::set(System::Boolean value) { + this->supportsFullSpeedField = value; + } + + inline System::Boolean UsbSuperSpeedExtensionDescriptorType::SupportsHighSpeed::get() { + return this->supportsHighSpeedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::SupportsHighSpeed::set(System::Boolean value) { + this->supportsHighSpeedField = value; + } + + inline System::Boolean UsbSuperSpeedExtensionDescriptorType::SupportsSuperSpeed::get() { + return this->supportsSuperSpeedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::SupportsSuperSpeed::set(System::Boolean value) { + this->supportsSuperSpeedField = value; + } + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::LowestSpeed::get() { + return this->lowestSpeedField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::LowestSpeed::set(System::String^ value) { + this->lowestSpeedField = value; + } + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::U1DevExitLatencyString::get() { + return this->u1DevExitLatencyStringField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::U1DevExitLatencyString::set(System::String^ value) { + this->u1DevExitLatencyStringField = value; + } + + inline System::String^ UsbSuperSpeedExtensionDescriptorType::U2DevExitLatencyString::get() { + return this->u2DevExitLatencyStringField; + } + inline System::Void UsbSuperSpeedExtensionDescriptorType::U2DevExitLatencyString::set(System::String^ value) { + this->u2DevExitLatencyStringField = value; + } + + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ UsbBosDescriptorType::UnknownDescriptor::get() { + return this->unknownDescriptorField; + } + inline System::Void UsbBosDescriptorType::UnknownDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ >^ value) { + this->unknownDescriptorField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ UsbBosDescriptorType::UsbSuperSpeedExtensionDescriptor::get() { + return this->usbSuperSpeedExtensionDescriptorField; + } + inline System::Void UsbBosDescriptorType::UsbSuperSpeedExtensionDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbSuperSpeedExtensionDescriptorType^ >^ value) { + this->usbSuperSpeedExtensionDescriptorField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ UsbBosDescriptorType::UsbUsb20ExtensionDescriptor::get() { + return this->usbUsb20ExtensionDescriptorField; + } + inline System::Void UsbBosDescriptorType::UsbUsb20ExtensionDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbUsb20ExtensionDescriptorType^ >^ value) { + this->usbUsb20ExtensionDescriptorField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ UsbBosDescriptorType::UsbDispContIdCapExtDescriptor::get() { + return this->usbDispContIdCapExtDescriptorField; + } + inline System::Void UsbBosDescriptorType::UsbDispContIdCapExtDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDispContIdCapExtDescriptorType^ >^ value) { + this->usbDispContIdCapExtDescriptorField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ UsbBosDescriptorType::UsbBillboardCapabilityDescriptor::get() { + return this->usbBillboardCapabilityDescriptorField; + } + inline System::Void UsbBosDescriptorType::UsbBillboardCapabilityDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbBillboardCapabilityDescriptorType^ >^ value) { + this->usbBillboardCapabilityDescriptorField = value; + } + + inline System::Byte UsbBosDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbBosDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbBosDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbBosDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::UInt16 UsbBosDescriptorType::WTotalLength::get() { + return this->wTotalLengthField; + } + inline System::Void UsbBosDescriptorType::WTotalLength::set(System::UInt16 value) { + this->wTotalLengthField = value; + } + + inline System::Byte UsbBosDescriptorType::BNumDeviceCaps::get() { + return this->bNumDeviceCapsField; + } + inline System::Void UsbBosDescriptorType::BNumDeviceCaps::set(System::Byte value) { + this->bNumDeviceCapsField = value; + } + + + inline System::String^ UsbDeviceUnknownDescriptorType::UnknownDescriptor::get() { + return this->unknownDescriptorField; + } + inline System::Void UsbDeviceUnknownDescriptorType::UnknownDescriptor::set(System::String^ value) { + this->unknownDescriptorField = value; + } + + inline System::Byte UsbDeviceUnknownDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceUnknownDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceUnknownDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceUnknownDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + + inline Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ UsbDeviceIADDescriptorType::FunctionDetails::get() { + return this->functionDetailsField; + } + inline System::Void UsbDeviceIADDescriptorType::FunctionDetails::set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value) { + this->functionDetailsField = value; + } + + inline System::String^ UsbDeviceIADDescriptorType::InterfaceError::get() { + return this->interfaceErrorField; + } + inline System::Void UsbDeviceIADDescriptorType::InterfaceError::set(System::String^ value) { + this->interfaceErrorField = value; + } + + inline System::String^ UsbDeviceIADDescriptorType::FunctionClassError::get() { + return this->functionClassErrorField; + } + inline System::Void UsbDeviceIADDescriptorType::FunctionClassError::set(System::String^ value) { + this->functionClassErrorField = value; + } + + inline System::String^ UsbDeviceIADDescriptorType::Protocol::get() { + return this->protocolField; + } + inline System::Void UsbDeviceIADDescriptorType::Protocol::set(System::String^ value) { + this->protocolField = value; + } + + inline System::String^ UsbDeviceIADDescriptorType::StringDesc::get() { + return this->stringDescField; + } + inline System::Void UsbDeviceIADDescriptorType::StringDesc::set(System::String^ value) { + this->stringDescField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceIADDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceIADDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BFirstInterface::get() { + return this->bFirstInterfaceField; + } + inline System::Void UsbDeviceIADDescriptorType::BFirstInterface::set(System::Byte value) { + this->bFirstInterfaceField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BInterfaceCount::get() { + return this->bInterfaceCountField; + } + inline System::Void UsbDeviceIADDescriptorType::BInterfaceCount::set(System::Byte value) { + this->bInterfaceCountField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BFunctionClass::get() { + return this->bFunctionClassField; + } + inline System::Void UsbDeviceIADDescriptorType::BFunctionClass::set(System::Byte value) { + this->bFunctionClassField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BFunctionSubclass::get() { + return this->bFunctionSubclassField; + } + inline System::Void UsbDeviceIADDescriptorType::BFunctionSubclass::set(System::Byte value) { + this->bFunctionSubclassField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::BFunctionProtocol::get() { + return this->bFunctionProtocolField; + } + inline System::Void UsbDeviceIADDescriptorType::BFunctionProtocol::set(System::Byte value) { + this->bFunctionProtocolField = value; + } + + inline System::Byte UsbDeviceIADDescriptorType::IFunction::get() { + return this->iFunctionField; + } + inline System::Void UsbDeviceIADDescriptorType::IFunction::set(System::Byte value) { + this->iFunctionField = value; + } + + + inline System::String^ UsbDeviceClassType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void UsbDeviceClassType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::String^ UsbDeviceClassType::DeviceSubclass::get() { + return this->deviceSubclassField; + } + inline System::Void UsbDeviceClassType::DeviceSubclass::set(System::String^ value) { + this->deviceSubclassField = value; + } + + + inline System::Byte UsbDeviceOTGDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceOTGDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceOTGDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceOTGDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbDeviceOTGDescriptorType::BmAttributes::get() { + return this->bmAttributesField; + } + inline System::Void UsbDeviceOTGDescriptorType::BmAttributes::set(System::Byte value) { + this->bmAttributesField = value; + } + + inline System::String^ UsbDeviceOTGDescriptorType::AttributesString::get() { + return this->attributesStringField; + } + inline System::Void UsbDeviceOTGDescriptorType::AttributesString::set(System::String^ value) { + this->attributesStringField = value; + } + + + inline System::Byte UsbDeviceHidOptionalDescriptorsType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceHidOptionalDescriptorsType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::UInt16 UsbDeviceHidOptionalDescriptorsType::WDescriptorLength::get() { + return this->wDescriptorLengthField; + } + inline System::Void UsbDeviceHidOptionalDescriptorsType::WDescriptorLength::set(System::UInt16 value) { + this->wDescriptorLengthField = value; + } + + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ UsbDeviceHidDescriptorType::OptionalDescriptor::get() { + return this->optionalDescriptorField; + } + inline System::Void UsbDeviceHidDescriptorType::OptionalDescriptor::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceHidOptionalDescriptorsType^ >^ value) { + this->optionalDescriptorField = value; + } + + inline System::Byte UsbDeviceHidDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceHidDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceHidDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceHidDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::UInt16 UsbDeviceHidDescriptorType::BcdHID::get() { + return this->bcdHIDField; + } + inline System::Void UsbDeviceHidDescriptorType::BcdHID::set(System::UInt16 value) { + this->bcdHIDField = value; + } + + inline System::Byte UsbDeviceHidDescriptorType::BCountryCode::get() { + return this->bCountryCodeField; + } + inline System::Void UsbDeviceHidDescriptorType::BCountryCode::set(System::Byte value) { + this->bCountryCodeField = value; + } + + inline System::Byte UsbDeviceHidDescriptorType::BNumDescriptors::get() { + return this->bNumDescriptorsField; + } + inline System::Void UsbDeviceHidDescriptorType::BNumDescriptors::set(System::Byte value) { + this->bNumDescriptorsField = value; + } + + + inline Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ UsbDeviceInterfaceDescriptorType::InterfaceDetails::get() { + return this->interfaceDetailsField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::InterfaceDetails::set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value) { + this->interfaceDetailsField = value; + } + + inline System::String^ UsbDeviceInterfaceDescriptorType::ProtocolError::get() { + return this->protocolErrorField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::ProtocolError::set(System::String^ value) { + this->protocolErrorField = value; + } + + inline System::String^ UsbDeviceInterfaceDescriptorType::StringDesc::get() { + return this->stringDescField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::StringDesc::set(System::String^ value) { + this->stringDescField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BInterfaceNumber::get() { + return this->bInterfaceNumberField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BInterfaceNumber::set(System::Byte value) { + this->bInterfaceNumberField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BAlternateSetting::get() { + return this->bAlternateSettingField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BAlternateSetting::set(System::Byte value) { + this->bAlternateSettingField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BNumEndpoints::get() { + return this->bNumEndpointsField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BNumEndpoints::set(System::Byte value) { + this->bNumEndpointsField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BInterfaceClass::get() { + return this->bInterfaceClassField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BInterfaceClass::set(System::Byte value) { + this->bInterfaceClassField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BInterfaceSubclass::get() { + return this->bInterfaceSubclassField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BInterfaceSubclass::set(System::Byte value) { + this->bInterfaceSubclassField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::BInterfaceProtocol::get() { + return this->bInterfaceProtocolField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::BInterfaceProtocol::set(System::Byte value) { + this->bInterfaceProtocolField = value; + } + + inline System::Byte UsbDeviceInterfaceDescriptorType::IInterface::get() { + return this->iInterfaceField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::IInterface::set(System::Byte value) { + this->iInterfaceField = value; + } + + inline System::UInt16 UsbDeviceInterfaceDescriptorType::WNumClasses::get() { + return this->wNumClassesField; + } + inline System::Void UsbDeviceInterfaceDescriptorType::WNumClasses::set(System::UInt16 value) { + this->wNumClassesField = value; + } + + + inline System::String^ UsbDeviceQualifierDescriptorType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void UsbDeviceQualifierDescriptorType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::MaxPacketSizeInBytes::get() { + return this->maxPacketSizeInBytesField; + } + inline System::Void UsbDeviceQualifierDescriptorType::MaxPacketSizeInBytes::set(System::Byte value) { + this->maxPacketSizeInBytesField = value; + } + + inline System::Boolean UsbDeviceQualifierDescriptorType::MaxPacketSizeInBytesSpecified::get() { + return this->maxPacketSizeInBytesFieldSpecified; + } + inline System::Void UsbDeviceQualifierDescriptorType::MaxPacketSizeInBytesSpecified::set(System::Boolean value) { + this->maxPacketSizeInBytesFieldSpecified = value; + } + + inline System::String^ UsbDeviceQualifierDescriptorType::DeviceClassError::get() { + return this->deviceClassErrorField; + } + inline System::Void UsbDeviceQualifierDescriptorType::DeviceClassError::set(System::String^ value) { + this->deviceClassErrorField = value; + } + + inline System::String^ UsbDeviceQualifierDescriptorType::DeviceSubclassError::get() { + return this->deviceSubclassErrorField; + } + inline System::Void UsbDeviceQualifierDescriptorType::DeviceSubclassError::set(System::String^ value) { + this->deviceSubclassErrorField = value; + } + + inline System::String^ UsbDeviceQualifierDescriptorType::DeviceProtocolError::get() { + return this->deviceProtocolErrorField; + } + inline System::Void UsbDeviceQualifierDescriptorType::DeviceProtocolError::set(System::String^ value) { + this->deviceProtocolErrorField = value; + } + + inline System::String^ UsbDeviceQualifierDescriptorType::DeviceNumConfigError::get() { + return this->deviceNumConfigErrorField; + } + inline System::Void UsbDeviceQualifierDescriptorType::DeviceNumConfigError::set(System::String^ value) { + this->deviceNumConfigErrorField = value; + } + + inline System::String^ UsbDeviceQualifierDescriptorType::ReservedError::get() { + return this->reservedErrorField; + } + inline System::Void UsbDeviceQualifierDescriptorType::ReservedError::set(System::String^ value) { + this->reservedErrorField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::UInt16 UsbDeviceQualifierDescriptorType::BcdUSB::get() { + return this->bcdUSBField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BcdUSB::set(System::UInt16 value) { + this->bcdUSBField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BDeviceClass::get() { + return this->bDeviceClassField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BDeviceClass::set(System::Byte value) { + this->bDeviceClassField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BDeviceSubclass::get() { + return this->bDeviceSubclassField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BDeviceSubclass::set(System::Byte value) { + this->bDeviceSubclassField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BDeviceProtocol::get() { + return this->bDeviceProtocolField; + } + inline System::Void UsbDeviceQualifierDescriptorType::BDeviceProtocol::set(System::Byte value) { + this->bDeviceProtocolField = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::BMaxPacketSize0::get() { + return this->bMaxPacketSize0Field; + } + inline System::Void UsbDeviceQualifierDescriptorType::BMaxPacketSize0::set(System::Byte value) { + this->bMaxPacketSize0Field = value; + } + + inline System::Byte UsbDeviceQualifierDescriptorType::NumConfigurations::get() { + return this->numConfigurationsField; + } + inline System::Void UsbDeviceQualifierDescriptorType::NumConfigurations::set(System::Byte value) { + this->numConfigurationsField = value; + } + + + inline System::String^ UsbConfigurationDescriptorType::ConfigDescError::get() { + return this->configDescErrorField; + } + inline System::Void UsbConfigurationDescriptorType::ConfigDescError::set(System::String^ value) { + this->configDescErrorField = value; + } + + inline System::String^ UsbConfigurationDescriptorType::ConfValueError::get() { + return this->confValueErrorField; + } + inline System::Void UsbConfigurationDescriptorType::ConfValueError::set(System::String^ value) { + this->confValueErrorField = value; + } + + inline System::String^ UsbConfigurationDescriptorType::ConfStringDesc::get() { + return this->confStringDescField; + } + inline System::Void UsbConfigurationDescriptorType::ConfStringDesc::set(System::String^ value) { + this->confStringDescField = value; + } + + inline System::String^ UsbConfigurationDescriptorType::AttributesStr::get() { + return this->attributesStrField; + } + inline System::Void UsbConfigurationDescriptorType::AttributesStr::set(System::String^ value) { + this->attributesStrField = value; + } + + inline System::String^ UsbConfigurationDescriptorType::MaxCurrent::get() { + return this->maxCurrentField; + } + inline System::Void UsbConfigurationDescriptorType::MaxCurrent::set(System::String^ value) { + this->maxCurrentField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::BLength::get() { + return this->bLengthField; + } + inline System::Void UsbConfigurationDescriptorType::BLength::set(System::Byte value) { + this->bLengthField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::BDescriptorType::get() { + return this->bDescriptorTypeField; + } + inline System::Void UsbConfigurationDescriptorType::BDescriptorType::set(System::Byte value) { + this->bDescriptorTypeField = value; + } + + inline System::UInt16 UsbConfigurationDescriptorType::WTotalLength::get() { + return this->wTotalLengthField; + } + inline System::Void UsbConfigurationDescriptorType::WTotalLength::set(System::UInt16 value) { + this->wTotalLengthField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::BNumInterfaces::get() { + return this->bNumInterfacesField; + } + inline System::Void UsbConfigurationDescriptorType::BNumInterfaces::set(System::Byte value) { + this->bNumInterfacesField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::BConfigurationValue::get() { + return this->bConfigurationValueField; + } + inline System::Void UsbConfigurationDescriptorType::BConfigurationValue::set(System::Byte value) { + this->bConfigurationValueField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::IConfiguration::get() { + return this->iConfigurationField; + } + inline System::Void UsbConfigurationDescriptorType::IConfiguration::set(System::Byte value) { + this->iConfigurationField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::BmAttributes::get() { + return this->bmAttributesField; + } + inline System::Void UsbConfigurationDescriptorType::BmAttributes::set(System::Byte value) { + this->bmAttributesField = value; + } + + inline System::Byte UsbConfigurationDescriptorType::MaxPower::get() { + return this->maxPowerField; + } + inline System::Void UsbConfigurationDescriptorType::MaxPower::set(System::Byte value) { + this->maxPowerField = value; + } + + + inline System::String^ UsbDeviceConfigurationType::DeviceQualifierError::get() { + return this->deviceQualifierErrorField; + } + inline System::Void UsbDeviceConfigurationType::DeviceQualifierError::set(System::String^ value) { + this->deviceQualifierErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::SpeedConfigurationError::get() { + return this->speedConfigurationErrorField; + } + inline System::Void UsbDeviceConfigurationType::SpeedConfigurationError::set(System::String^ value) { + this->speedConfigurationErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::DeviceConfigurationError::get() { + return this->deviceConfigurationErrorField; + } + inline System::Void UsbDeviceConfigurationType::DeviceConfigurationError::set(System::String^ value) { + this->deviceConfigurationErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::InterfaceError::get() { + return this->interfaceErrorField; + } + inline System::Void UsbDeviceConfigurationType::InterfaceError::set(System::String^ value) { + this->interfaceErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::PreReleaseError::get() { + return this->preReleaseErrorField; + } + inline System::Void UsbDeviceConfigurationType::PreReleaseError::set(System::String^ value) { + this->preReleaseErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::EndpointError::get() { + return this->endpointErrorField; + } + inline System::Void UsbDeviceConfigurationType::EndpointError::set(System::String^ value) { + this->endpointErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::HidError::get() { + return this->hidErrorField; + } + inline System::Void UsbDeviceConfigurationType::HidError::set(System::String^ value) { + this->hidErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::OtgError::get() { + return this->otgErrorField; + } + inline System::Void UsbDeviceConfigurationType::OtgError::set(System::String^ value) { + this->otgErrorField = value; + } + + inline System::String^ UsbDeviceConfigurationType::IadError::get() { + return this->iadErrorField; + } + inline System::Void UsbDeviceConfigurationType::IadError::set(System::String^ value) { + this->iadErrorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ UsbDeviceConfigurationType::DeviceDetails::get() { + return this->deviceDetailsField; + } + inline System::Void UsbDeviceConfigurationType::DeviceDetails::set(Microsoft::Kits::Samples::Usb::UsbDeviceClassType^ value) { + this->deviceDetailsField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ UsbDeviceConfigurationType::ConfigurationDescriptor::get() { + return this->configurationDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::ConfigurationDescriptor::set(Microsoft::Kits::Samples::Usb::UsbConfigurationDescriptorType^ value) { + this->configurationDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ UsbDeviceConfigurationType::DeviceQualifierDescriptor::get() { + return this->deviceQualifierDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::DeviceQualifierDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceQualifierDescriptorType^ value) { + this->deviceQualifierDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ UsbDeviceConfigurationType::InterfaceDescriptor::get() { + return this->interfaceDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::InterfaceDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceInterfaceDescriptorType^ value) { + this->interfaceDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ UsbDeviceConfigurationType::EndpointDescriptor::get() { + return this->endpointDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::EndpointDescriptor::set(Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ value) { + this->endpointDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ UsbDeviceConfigurationType::HidDescriptor::get() { + return this->hidDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::HidDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceHidDescriptorType^ value) { + this->hidDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ UsbDeviceConfigurationType::OtgDescriptor::get() { + return this->otgDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::OtgDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceOTGDescriptorType^ value) { + this->otgDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ UsbDeviceConfigurationType::IadDescriptor::get() { + return this->iadDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::IadDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceIADDescriptorType^ value) { + this->iadDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ UsbDeviceConfigurationType::UnknownDescriptor::get() { + return this->unknownDescriptorField; + } + inline System::Void UsbDeviceConfigurationType::UnknownDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceUnknownDescriptorType^ value) { + this->unknownDescriptorField = value; + } + + + inline System::Byte EndpointDescriptorType::Length::get() { + return this->lengthField; + } + inline System::Void EndpointDescriptorType::Length::set(System::Byte value) { + this->lengthField = value; + } + + inline System::Byte EndpointDescriptorType::DescriptorType::get() { + return this->descriptorTypeField; + } + inline System::Void EndpointDescriptorType::DescriptorType::set(System::Byte value) { + this->descriptorTypeField = value; + } + + inline System::Byte EndpointDescriptorType::EndpointAddress::get() { + return this->endpointAddressField; + } + inline System::Void EndpointDescriptorType::EndpointAddress::set(System::Byte value) { + this->endpointAddressField = value; + } + + inline System::Byte EndpointDescriptorType::Attributes::get() { + return this->attributesField; + } + inline System::Void EndpointDescriptorType::Attributes::set(System::Byte value) { + this->attributesField = value; + } + + inline System::UInt16 EndpointDescriptorType::MaxPacketSize::get() { + return this->maxPacketSizeField; + } + inline System::Void EndpointDescriptorType::MaxPacketSize::set(System::UInt16 value) { + this->maxPacketSizeField = value; + } + + inline System::Byte EndpointDescriptorType::Interval::get() { + return this->intervalField; + } + inline System::Void EndpointDescriptorType::Interval::set(System::Byte value) { + this->intervalField = value; + } + + inline System::UInt16 EndpointDescriptorType::WInterval::get() { + return this->wIntervalField; + } + inline System::Void EndpointDescriptorType::WInterval::set(System::UInt16 value) { + this->wIntervalField = value; + } + + inline System::Byte EndpointDescriptorType::SyncAddress::get() { + return this->syncAddressField; + } + inline System::Void EndpointDescriptorType::SyncAddress::set(System::Byte value) { + this->syncAddressField = value; + } + + inline System::String^ EndpointDescriptorType::EndpointDirection::get() { + return this->endpointDirectionField; + } + inline System::Void EndpointDescriptorType::EndpointDirection::set(System::String^ value) { + this->endpointDirectionField = value; + } + + inline System::Byte EndpointDescriptorType::EndpointId::get() { + return this->endpointIdField; + } + inline System::Void EndpointDescriptorType::EndpointId::set(System::Byte value) { + this->endpointIdField = value; + } + + inline System::String^ EndpointDescriptorType::EndpointType::get() { + return this->endpointTypeField; + } + inline System::Void EndpointDescriptorType::EndpointType::set(System::String^ value) { + this->endpointTypeField = value; + } + + inline System::String^ EndpointDescriptorType::EndpointPacketInfo::get() { + return this->endpointPacketInfoField; + } + inline System::Void EndpointDescriptorType::EndpointPacketInfo::set(System::String^ value) { + this->endpointPacketInfoField = value; + } + + inline System::String^ EndpointDescriptorType::EndpointPacketSizeValidation::get() { + return this->endpointPacketSizeValidationField; + } + inline System::Void EndpointDescriptorType::EndpointPacketSizeValidation::set(System::String^ value) { + this->endpointPacketSizeValidationField = value; + } + + + inline Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ UsbDeviceType::ConnectionInfo::get() { + return this->connectionInfoField; + } + inline System::Void UsbDeviceType::ConnectionInfo::set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ value) { + this->connectionInfoField = value; + } + + inline Microsoft::Kits::Samples::Usb::PortConnectorType^ UsbDeviceType::PortConnector::get() { + return this->portConnectorField; + } + inline System::Void UsbDeviceType::PortConnector::set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value) { + this->portConnectorField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ UsbDeviceType::DeviceConfiguration::get() { + return this->deviceConfigurationField; + } + inline System::Void UsbDeviceType::DeviceConfiguration::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ value) { + this->deviceConfigurationField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ UsbDeviceType::BosDescriptor::get() { + return this->bosDescriptorField; + } + inline System::Void UsbDeviceType::BosDescriptor::set(Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ value) { + this->bosDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ UsbDeviceType::ConnectionInfoV2::get() { + return this->connectionInfoV2Field; + } + inline System::Void UsbDeviceType::ConnectionInfoV2::set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ value) { + this->connectionInfoV2Field = value; + } + + inline System::String^ UsbDeviceType::UsbPortNumber::get() { + return this->usbPortNumberField; + } + inline System::Void UsbDeviceType::UsbPortNumber::set(System::String^ value) { + this->usbPortNumberField = value; + } + + inline System::String^ UsbDeviceType::ServiceName::get() { + return this->serviceNameField; + } + inline System::Void UsbDeviceType::ServiceName::set(System::String^ value) { + this->serviceNameField = value; + } + + inline System::String^ UsbDeviceType::HwId::get() { + return this->hwIdField; + } + inline System::Void UsbDeviceType::HwId::set(System::String^ value) { + this->hwIdField = value; + } + + inline System::String^ UsbDeviceType::DeviceId::get() { + return this->deviceIdField; + } + inline System::Void UsbDeviceType::DeviceId::set(System::String^ value) { + this->deviceIdField = value; + } + + inline System::String^ UsbDeviceType::DeviceName::get() { + return this->deviceNameField; + } + inline System::Void UsbDeviceType::DeviceName::set(System::String^ value) { + this->deviceNameField = value; + } + + inline System::String^ UsbDeviceType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void UsbDeviceType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::String^ UsbDeviceType::UsbProtocol::get() { + return this->usbProtocolField; + } + inline System::Void UsbDeviceType::UsbProtocol::set(System::String^ value) { + this->usbProtocolField = value; + } + + + inline Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ NodeConnectionInfoExType::ConnectionInfoStruct::get() { + return this->connectionInfoStructField; + } + inline System::Void NodeConnectionInfoExType::ConnectionInfoStruct::set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExStructType^ value) { + this->connectionInfoStructField = value; + } + + inline System::String^ NodeConnectionInfoExType::IProductStringDescEn::get() { + return this->iProductStringDescEnField; + } + inline System::Void NodeConnectionInfoExType::IProductStringDescEn::set(System::String^ value) { + this->iProductStringDescEnField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ NodeConnectionInfoExType::DeviceClassDetails::get() { + return this->deviceClassDetailsField; + } + inline System::Void NodeConnectionInfoExType::DeviceClassDetails::set(Microsoft::Kits::Samples::Usb::UsbDeviceClassDetailsType^ value) { + this->deviceClassDetailsField = value; + } + + inline System::Byte NodeConnectionInfoExType::MaxPacketSizeInBytes::get() { + return this->maxPacketSizeInBytesField; + } + inline System::Void NodeConnectionInfoExType::MaxPacketSizeInBytes::set(System::Byte value) { + this->maxPacketSizeInBytesField = value; + } + + inline System::String^ NodeConnectionInfoExType::VendorString::get() { + return this->vendorStringField; + } + inline System::Void NodeConnectionInfoExType::VendorString::set(System::String^ value) { + this->vendorStringField = value; + } + + inline System::String^ NodeConnectionInfoExType::ManufacturerString::get() { + return this->manufacturerStringField; + } + inline System::Void NodeConnectionInfoExType::ManufacturerString::set(System::String^ value) { + this->manufacturerStringField = value; + } + + inline System::String^ NodeConnectionInfoExType::ProductString::get() { + return this->productStringField; + } + inline System::Void NodeConnectionInfoExType::ProductString::set(System::String^ value) { + this->productStringField = value; + } + + inline System::String^ NodeConnectionInfoExType::LangIdString::get() { + return this->langIdStringField; + } + inline System::Void NodeConnectionInfoExType::LangIdString::set(System::String^ value) { + this->langIdStringField = value; + } + + inline System::String^ NodeConnectionInfoExType::SerialString::get() { + return this->serialStringField; + } + inline System::Void NodeConnectionInfoExType::SerialString::set(System::String^ value) { + this->serialStringField = value; + } + + inline System::String^ NodeConnectionInfoExType::PipeInfoError::get() { + return this->pipeInfoErrorField; + } + inline System::Void NodeConnectionInfoExType::PipeInfoError::set(System::String^ value) { + this->pipeInfoErrorField = value; + } + + inline System::String^ NodeConnectionInfoExType::LengthError::get() { + return this->lengthErrorField; + } + inline System::Void NodeConnectionInfoExType::LengthError::set(System::String^ value) { + this->lengthErrorField = value; + } + + inline System::String^ NodeConnectionInfoExType::DeviceError::get() { + return this->deviceErrorField; + } + inline System::Void NodeConnectionInfoExType::DeviceError::set(System::String^ value) { + this->deviceErrorField = value; + } + + inline System::String^ NodeConnectionInfoExType::PacketSizeError::get() { + return this->packetSizeErrorField; + } + inline System::Void NodeConnectionInfoExType::PacketSizeError::set(System::String^ value) { + this->packetSizeErrorField = value; + } + + inline System::String^ NodeConnectionInfoExType::ConfigurationCountError::get() { + return this->configurationCountErrorField; + } + inline System::Void NodeConnectionInfoExType::ConfigurationCountError::set(System::String^ value) { + this->configurationCountErrorField = value; + } + + + inline System::UInt64 NodeConnectionInfoExStructType::ConnectionIndex::get() { + return this->connectionIndexField; + } + inline System::Void NodeConnectionInfoExStructType::ConnectionIndex::set(System::UInt64 value) { + this->connectionIndexField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ NodeConnectionInfoExStructType::DeviceDescriptor::get() { + return this->deviceDescriptorField; + } + inline System::Void NodeConnectionInfoExStructType::DeviceDescriptor::set(Microsoft::Kits::Samples::Usb::UsbDeviceDescriptorType^ value) { + this->deviceDescriptorField = value; + } + + inline System::Byte NodeConnectionInfoExStructType::CurrentConfigurationValue::get() { + return this->currentConfigurationValueField; + } + inline System::Void NodeConnectionInfoExStructType::CurrentConfigurationValue::set(System::Byte value) { + this->currentConfigurationValueField = value; + } + + inline System::Byte NodeConnectionInfoExStructType::Speed::get() { + return this->speedField; + } + inline System::Void NodeConnectionInfoExStructType::Speed::set(System::Byte value) { + this->speedField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType NodeConnectionInfoExStructType::SpeedStr::get() { + return this->speedStrField; + } + inline System::Void NodeConnectionInfoExStructType::SpeedStr::set(Microsoft::Kits::Samples::Usb::UsbConnectionSpeedType value) { + this->speedStrField = value; + } + + inline System::Boolean NodeConnectionInfoExStructType::DeviceIsHub::get() { + return this->deviceIsHubField; + } + inline System::Void NodeConnectionInfoExStructType::DeviceIsHub::set(System::Boolean value) { + this->deviceIsHubField = value; + } + + inline System::Byte NodeConnectionInfoExStructType::DeviceAddress::get() { + return this->deviceAddressField; + } + inline System::Void NodeConnectionInfoExStructType::DeviceAddress::set(System::Byte value) { + this->deviceAddressField = value; + } + + inline System::UInt64 NodeConnectionInfoExStructType::NumOfOpenPipes::get() { + return this->numOfOpenPipesField; + } + inline System::Void NodeConnectionInfoExStructType::NumOfOpenPipes::set(System::UInt64 value) { + this->numOfOpenPipesField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbConnectionStatusType NodeConnectionInfoExStructType::UsbConnectionStatus::get() { + return this->usbConnectionStatusField; + } + inline System::Void NodeConnectionInfoExStructType::UsbConnectionStatus::set(Microsoft::Kits::Samples::Usb::UsbConnectionStatusType value) { + this->usbConnectionStatusField = value; + } + + inline Microsoft::Kits::Samples::Usb::DevicePowerStateType NodeConnectionInfoExStructType::DevicePowerState::get() { + return this->devicePowerStateField; + } + inline System::Void NodeConnectionInfoExStructType::DevicePowerState::set(Microsoft::Kits::Samples::Usb::DevicePowerStateType value) { + this->devicePowerStateField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ NodeConnectionInfoExStructType::Pipe::get() { + return this->pipeField; + } + inline System::Void NodeConnectionInfoExStructType::Pipe::set(cli::array< Microsoft::Kits::Samples::Usb::UsbPipeInfoType^ >^ value) { + this->pipeField = value; + } + + + inline System::Byte UsbDeviceDescriptorType::Length::get() { + return this->lengthField; + } + inline System::Void UsbDeviceDescriptorType::Length::set(System::Byte value) { + this->lengthField = value; + } + + inline System::Byte UsbDeviceDescriptorType::DescriptorType::get() { + return this->descriptorTypeField; + } + inline System::Void UsbDeviceDescriptorType::DescriptorType::set(System::Byte value) { + this->descriptorTypeField = value; + } + + inline System::UInt16 UsbDeviceDescriptorType::CdUSB::get() { + return this->cdUSBField; + } + inline System::Void UsbDeviceDescriptorType::CdUSB::set(System::UInt16 value) { + this->cdUSBField = value; + } + + inline System::Byte UsbDeviceDescriptorType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void UsbDeviceDescriptorType::DeviceClass::set(System::Byte value) { + this->deviceClassField = value; + } + + inline System::Byte UsbDeviceDescriptorType::DeviceSubclass::get() { + return this->deviceSubclassField; + } + inline System::Void UsbDeviceDescriptorType::DeviceSubclass::set(System::Byte value) { + this->deviceSubclassField = value; + } + + inline System::Byte UsbDeviceDescriptorType::DeviceProtocol::get() { + return this->deviceProtocolField; + } + inline System::Void UsbDeviceDescriptorType::DeviceProtocol::set(System::Byte value) { + this->deviceProtocolField = value; + } + + inline System::Byte UsbDeviceDescriptorType::MaxPacketSize0::get() { + return this->maxPacketSize0Field; + } + inline System::Void UsbDeviceDescriptorType::MaxPacketSize0::set(System::Byte value) { + this->maxPacketSize0Field = value; + } + + inline System::UInt16 UsbDeviceDescriptorType::IdVendor::get() { + return this->idVendorField; + } + inline System::Void UsbDeviceDescriptorType::IdVendor::set(System::UInt16 value) { + this->idVendorField = value; + } + + inline System::UInt16 UsbDeviceDescriptorType::IdProduct::get() { + return this->idProductField; + } + inline System::Void UsbDeviceDescriptorType::IdProduct::set(System::UInt16 value) { + this->idProductField = value; + } + + inline System::UInt16 UsbDeviceDescriptorType::CdDevice::get() { + return this->cdDeviceField; + } + inline System::Void UsbDeviceDescriptorType::CdDevice::set(System::UInt16 value) { + this->cdDeviceField = value; + } + + inline System::Byte UsbDeviceDescriptorType::IManufacturer::get() { + return this->iManufacturerField; + } + inline System::Void UsbDeviceDescriptorType::IManufacturer::set(System::Byte value) { + this->iManufacturerField = value; + } + + inline System::Byte UsbDeviceDescriptorType::IProduct::get() { + return this->iProductField; + } + inline System::Void UsbDeviceDescriptorType::IProduct::set(System::Byte value) { + this->iProductField = value; + } + + inline System::Byte UsbDeviceDescriptorType::ISerialNumber::get() { + return this->iSerialNumberField; + } + inline System::Void UsbDeviceDescriptorType::ISerialNumber::set(System::Byte value) { + this->iSerialNumberField = value; + } + + inline System::Byte UsbDeviceDescriptorType::NumConfigurations::get() { + return this->numConfigurationsField; + } + inline System::Void UsbDeviceDescriptorType::NumConfigurations::set(System::Byte value) { + this->numConfigurationsField = value; + } + + + inline Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ UsbPipeInfoType::EndpointDescriptor::get() { + return this->endpointDescriptorField; + } + inline System::Void UsbPipeInfoType::EndpointDescriptor::set(Microsoft::Kits::Samples::Usb::EndpointDescriptorType^ value) { + this->endpointDescriptorField = value; + } + + inline System::UInt64 UsbPipeInfoType::ScheduleOffset::get() { + return this->scheduleOffsetField; + } + inline System::Void UsbPipeInfoType::ScheduleOffset::set(System::UInt64 value) { + this->scheduleOffsetField = value; + } + + + inline System::String^ UsbDeviceClassDetailsType::DeviceType::get() { + return this->deviceTypeField; + } + inline System::Void UsbDeviceClassDetailsType::DeviceType::set(System::String^ value) { + this->deviceTypeField = value; + } + + inline System::String^ UsbDeviceClassDetailsType::DeviceTypeError::get() { + return this->deviceTypeErrorField; + } + inline System::Void UsbDeviceClassDetailsType::DeviceTypeError::set(System::String^ value) { + this->deviceTypeErrorField = value; + } + + inline System::String^ UsbDeviceClassDetailsType::SubclassType::get() { + return this->subclassTypeField; + } + inline System::Void UsbDeviceClassDetailsType::SubclassType::set(System::String^ value) { + this->subclassTypeField = value; + } + + inline System::String^ UsbDeviceClassDetailsType::SubclassTypeError::get() { + return this->subclassTypeErrorField; + } + inline System::Void UsbDeviceClassDetailsType::SubclassTypeError::set(System::String^ value) { + this->subclassTypeErrorField = value; + } + + inline System::String^ UsbDeviceClassDetailsType::DeviceProtocol::get() { + return this->deviceProtocolField; + } + inline System::Void UsbDeviceClassDetailsType::DeviceProtocol::set(System::String^ value) { + this->deviceProtocolField = value; + } + + inline System::String^ UsbDeviceClassDetailsType::DeviceProtocolError::get() { + return this->deviceProtocolErrorField; + } + inline System::Void UsbDeviceClassDetailsType::DeviceProtocolError::set(System::String^ value) { + this->deviceProtocolErrorField = value; + } + + inline System::UInt32 UsbDeviceClassDetailsType::UvcVersion::get() { + return this->uvcVersionField; + } + inline System::Void UsbDeviceClassDetailsType::UvcVersion::set(System::UInt32 value) { + this->uvcVersionField = value; + } + + + inline Microsoft::Kits::Samples::Usb::HubNodeInformationType^ ExternalHubType::HubNodeInformation::get() { + return this->hubNodeInformationField; + } + inline System::Void ExternalHubType::HubNodeInformation::set(Microsoft::Kits::Samples::Usb::HubNodeInformationType^ value) { + this->hubNodeInformationField = value; + } + + inline System::String^ ExternalHubType::HubName::get() { + return this->hubNameField; + } + inline System::Void ExternalHubType::HubName::set(System::String^ value) { + this->hubNameField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubInformationExType^ ExternalHubType::HubInformationEx::get() { + return this->hubInformationExField; + } + inline System::Void ExternalHubType::HubInformationEx::set(Microsoft::Kits::Samples::Usb::HubInformationExType^ value) { + this->hubInformationExField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ ExternalHubType::HubCapabilityEx::get() { + return this->hubCapabilityExField; + } + inline System::Void ExternalHubType::HubCapabilityEx::set(Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ value) { + this->hubCapabilityExField = value; + } + + inline Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ ExternalHubType::ConnectionInfo::get() { + return this->connectionInfoField; + } + inline System::Void ExternalHubType::ConnectionInfo::set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExType^ value) { + this->connectionInfoField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ ExternalHubType::UsbDevice::get() { + return this->usbDeviceField; + } + inline System::Void ExternalHubType::UsbDevice::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ value) { + this->usbDeviceField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ ExternalHubType::NoDevice::get() { + return this->noDeviceField; + } + inline System::Void ExternalHubType::NoDevice::set(cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ value) { + this->noDeviceField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ ExternalHubType::DeviceConfiguration::get() { + return this->deviceConfigurationField; + } + inline System::Void ExternalHubType::DeviceConfiguration::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceConfigurationType^ >^ value) { + this->deviceConfigurationField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ ExternalHubType::BosDescriptor::get() { + return this->bosDescriptorField; + } + inline System::Void ExternalHubType::BosDescriptor::set(Microsoft::Kits::Samples::Usb::UsbBosDescriptorType^ value) { + this->bosDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ ExternalHubType::ConnectionInfoV2::get() { + return this->connectionInfoV2Field; + } + inline System::Void ExternalHubType::ConnectionInfoV2::set(Microsoft::Kits::Samples::Usb::NodeConnectionInfoExV2Type^ value) { + this->connectionInfoV2Field = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ ExternalHubType::ExternalHub::get() { + return this->externalHubField; + } + inline System::Void ExternalHubType::ExternalHub::set(cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ value) { + this->externalHubField = value; + } + + inline Microsoft::Kits::Samples::Usb::PortConnectorType^ ExternalHubType::PortConnector::get() { + return this->portConnectorField; + } + inline System::Void ExternalHubType::PortConnector::set(Microsoft::Kits::Samples::Usb::PortConnectorType^ value) { + this->portConnectorField = value; + } + + inline System::String^ ExternalHubType::ServiceName::get() { + return this->serviceNameField; + } + inline System::Void ExternalHubType::ServiceName::set(System::String^ value) { + this->serviceNameField = value; + } + + inline System::String^ ExternalHubType::HwId::get() { + return this->hwIdField; + } + inline System::Void ExternalHubType::HwId::set(System::String^ value) { + this->hwIdField = value; + } + + inline System::String^ ExternalHubType::DeviceId::get() { + return this->deviceIdField; + } + inline System::Void ExternalHubType::DeviceId::set(System::String^ value) { + this->deviceIdField = value; + } + + inline System::String^ ExternalHubType::DeviceName::get() { + return this->deviceNameField; + } + inline System::Void ExternalHubType::DeviceName::set(System::String^ value) { + this->deviceNameField = value; + } + + inline System::String^ ExternalHubType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void ExternalHubType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::String^ ExternalHubType::UsbProtocol::get() { + return this->usbProtocolField; + } + inline System::Void ExternalHubType::UsbProtocol::set(System::String^ value) { + this->usbProtocolField = value; + } + + + inline Microsoft::Kits::Samples::Usb::HubNodeType HubNodeInformationType::HubNode::get() { + return this->hubNodeField; + } + inline System::Void HubNodeInformationType::HubNode::set(Microsoft::Kits::Samples::Usb::HubNodeType value) { + this->hubNodeField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubInformationType^ HubNodeInformationType::HubInformation::get() { + return this->hubInformationField; + } + inline System::Void HubNodeInformationType::HubInformation::set(Microsoft::Kits::Samples::Usb::HubInformationType^ value) { + this->hubInformationField = value; + } + + inline System::UInt64 HubNodeInformationType::MiParentNumberOfInterfaces::get() { + return this->miParentNumberOfInterfacesField; + } + inline System::Void HubNodeInformationType::MiParentNumberOfInterfaces::set(System::UInt64 value) { + this->miParentNumberOfInterfacesField = value; + } + + + inline System::Boolean HubInformationType::IsRootHub::get() { + return this->isRootHubField; + } + inline System::Void HubInformationType::IsRootHub::set(System::Boolean value) { + this->isRootHubField = value; + } + + inline System::Boolean HubInformationType::IsBusPowered::get() { + return this->isBusPoweredField; + } + inline System::Void HubInformationType::IsBusPowered::set(System::Boolean value) { + this->isBusPoweredField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubDescriptorType^ HubInformationType::HubDescriptor::get() { + return this->hubDescriptorField; + } + inline System::Void HubInformationType::HubDescriptor::set(Microsoft::Kits::Samples::Usb::HubDescriptorType^ value) { + this->hubDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ HubInformationType::HubCharacteristics::get() { + return this->hubCharacteristicsField; + } + inline System::Void HubInformationType::HubCharacteristics::set(Microsoft::Kits::Samples::Usb::HubCharacteristicsType^ value) { + this->hubCharacteristicsField = value; + } + + + inline System::Byte HubDescriptorType::DescriptorLength::get() { + return this->descriptorLengthField; + } + inline System::Void HubDescriptorType::DescriptorLength::set(System::Byte value) { + this->descriptorLengthField = value; + } + + inline System::Byte HubDescriptorType::DescriptorType::get() { + return this->descriptorTypeField; + } + inline System::Void HubDescriptorType::DescriptorType::set(System::Byte value) { + this->descriptorTypeField = value; + } + + inline System::Byte HubDescriptorType::NumberOfPorts::get() { + return this->numberOfPortsField; + } + inline System::Void HubDescriptorType::NumberOfPorts::set(System::Byte value) { + this->numberOfPortsField = value; + } + + inline System::Byte HubDescriptorType::PowerOntoPowerGood::get() { + return this->powerOntoPowerGoodField; + } + inline System::Void HubDescriptorType::PowerOntoPowerGood::set(System::Byte value) { + this->powerOntoPowerGoodField = value; + } + + inline System::Byte HubDescriptorType::HubControlCurrent::get() { + return this->hubControlCurrentField; + } + inline System::Void HubDescriptorType::HubControlCurrent::set(System::Byte value) { + this->hubControlCurrentField = value; + } + + + inline System::UInt32 HubCharacteristicsType::HubCharacteristicsValue::get() { + return this->hubCharacteristicsValueField; + } + inline System::Void HubCharacteristicsType::HubCharacteristicsValue::set(System::UInt32 value) { + this->hubCharacteristicsValueField = value; + } + + inline System::String^ HubCharacteristicsType::PowerSwitching::get() { + return this->powerSwitchingField; + } + inline System::Void HubCharacteristicsType::PowerSwitching::set(System::String^ value) { + this->powerSwitchingField = value; + } + + inline System::Boolean HubCharacteristicsType::CompoundDevice::get() { + return this->compoundDeviceField; + } + inline System::Void HubCharacteristicsType::CompoundDevice::set(System::Boolean value) { + this->compoundDeviceField = value; + } + + inline System::String^ HubCharacteristicsType::OverCurrentProtection::get() { + return this->overCurrentProtectionField; + } + inline System::Void HubCharacteristicsType::OverCurrentProtection::set(System::String^ value) { + this->overCurrentProtectionField = value; + } + + + inline Microsoft::Kits::Samples::Usb::HubTypeType HubInformationExType::HubType::get() { + return this->hubTypeField; + } + inline System::Void HubInformationExType::HubType::set(Microsoft::Kits::Samples::Usb::HubTypeType value) { + this->hubTypeField = value; + } + + inline System::UInt16 HubInformationExType::HighestPortNumber::get() { + return this->highestPortNumberField; + } + inline System::Void HubInformationExType::HighestPortNumber::set(System::UInt16 value) { + this->highestPortNumberField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubDescriptorType^ HubInformationExType::HubDescriptor::get() { + return this->hubDescriptorField; + } + inline System::Void HubInformationExType::HubDescriptor::set(Microsoft::Kits::Samples::Usb::HubDescriptorType^ value) { + this->hubDescriptorField = value; + } + + inline Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ HubInformationExType::Hub30Descriptor::get() { + return this->hub30DescriptorField; + } + inline System::Void HubInformationExType::Hub30Descriptor::set(Microsoft::Kits::Samples::Usb::Hub30DescriptorType^ value) { + this->hub30DescriptorField = value; + } + + + inline System::Byte Hub30DescriptorType::Length::get() { + return this->lengthField; + } + inline System::Void Hub30DescriptorType::Length::set(System::Byte value) { + this->lengthField = value; + } + + inline System::Byte Hub30DescriptorType::DescriptorType::get() { + return this->descriptorTypeField; + } + inline System::Void Hub30DescriptorType::DescriptorType::set(System::Byte value) { + this->descriptorTypeField = value; + } + + inline System::Byte Hub30DescriptorType::NumberOfPorts::get() { + return this->numberOfPortsField; + } + inline System::Void Hub30DescriptorType::NumberOfPorts::set(System::Byte value) { + this->numberOfPortsField = value; + } + + inline System::UInt16 Hub30DescriptorType::HubCharacteristics::get() { + return this->hubCharacteristicsField; + } + inline System::Void Hub30DescriptorType::HubCharacteristics::set(System::UInt16 value) { + this->hubCharacteristicsField = value; + } + + inline System::Byte Hub30DescriptorType::PowerOntoPowerGood::get() { + return this->powerOntoPowerGoodField; + } + inline System::Void Hub30DescriptorType::PowerOntoPowerGood::set(System::Byte value) { + this->powerOntoPowerGoodField = value; + } + + inline System::Byte Hub30DescriptorType::HubControlCurrent::get() { + return this->hubControlCurrentField; + } + inline System::Void Hub30DescriptorType::HubControlCurrent::set(System::Byte value) { + this->hubControlCurrentField = value; + } + + inline System::Byte Hub30DescriptorType::HubHdrDecLat::get() { + return this->hubHdrDecLatField; + } + inline System::Void Hub30DescriptorType::HubHdrDecLat::set(System::Byte value) { + this->hubHdrDecLatField = value; + } + + inline System::UInt16 Hub30DescriptorType::HubDelay::get() { + return this->hubDelayField; + } + inline System::Void Hub30DescriptorType::HubDelay::set(System::UInt16 value) { + this->hubDelayField = value; + } + + inline System::UInt16 Hub30DescriptorType::DeviceRemovable::get() { + return this->deviceRemovableField; + } + inline System::Void Hub30DescriptorType::DeviceRemovable::set(System::UInt16 value) { + this->deviceRemovableField = value; + } + + + inline System::Boolean HubCapabilitiesExType::HubIsHighSpeedCapable::get() { + return this->hubIsHighSpeedCapableField; + } + inline System::Void HubCapabilitiesExType::HubIsHighSpeedCapable::set(System::Boolean value) { + this->hubIsHighSpeedCapableField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsHighSpeed::get() { + return this->hubIsHighSpeedField; + } + inline System::Void HubCapabilitiesExType::HubIsHighSpeed::set(System::Boolean value) { + this->hubIsHighSpeedField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsMultiTtCapable::get() { + return this->hubIsMultiTtCapableField; + } + inline System::Void HubCapabilitiesExType::HubIsMultiTtCapable::set(System::Boolean value) { + this->hubIsMultiTtCapableField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsMultiTt::get() { + return this->hubIsMultiTtField; + } + inline System::Void HubCapabilitiesExType::HubIsMultiTt::set(System::Boolean value) { + this->hubIsMultiTtField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsRoot::get() { + return this->hubIsRootField; + } + inline System::Void HubCapabilitiesExType::HubIsRoot::set(System::Boolean value) { + this->hubIsRootField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsArmedWakeOnConnect::get() { + return this->hubIsArmedWakeOnConnectField; + } + inline System::Void HubCapabilitiesExType::HubIsArmedWakeOnConnect::set(System::Boolean value) { + this->hubIsArmedWakeOnConnectField = value; + } + + inline System::Boolean HubCapabilitiesExType::HubIsBusPowered::get() { + return this->hubIsBusPoweredField; + } + inline System::Void HubCapabilitiesExType::HubIsBusPowered::set(System::Boolean value) { + this->hubIsBusPoweredField = value; + } + + + inline Microsoft::Kits::Samples::Usb::HubNodeInformationType^ RootHubType::HubNodeInformation::get() { + return this->hubNodeInformationField; + } + inline System::Void RootHubType::HubNodeInformation::set(Microsoft::Kits::Samples::Usb::HubNodeInformationType^ value) { + this->hubNodeInformationField = value; + } + + inline System::String^ RootHubType::HubName::get() { + return this->hubNameField; + } + inline System::Void RootHubType::HubName::set(System::String^ value) { + this->hubNameField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubInformationExType^ RootHubType::HubInformationEx::get() { + return this->hubInformationExField; + } + inline System::Void RootHubType::HubInformationEx::set(Microsoft::Kits::Samples::Usb::HubInformationExType^ value) { + this->hubInformationExField = value; + } + + inline Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ RootHubType::HubCapabilityEx::get() { + return this->hubCapabilityExField; + } + inline System::Void RootHubType::HubCapabilityEx::set(Microsoft::Kits::Samples::Usb::HubCapabilitiesExType^ value) { + this->hubCapabilityExField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ RootHubType::ExternalHub::get() { + return this->externalHubField; + } + inline System::Void RootHubType::ExternalHub::set(cli::array< Microsoft::Kits::Samples::Usb::ExternalHubType^ >^ value) { + this->externalHubField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ RootHubType::UsbDevice::get() { + return this->usbDeviceField; + } + inline System::Void RootHubType::UsbDevice::set(cli::array< Microsoft::Kits::Samples::Usb::UsbDeviceType^ >^ value) { + this->usbDeviceField = value; + } + + inline cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ RootHubType::NoDevice::get() { + return this->noDeviceField; + } + inline System::Void RootHubType::NoDevice::set(cli::array< Microsoft::Kits::Samples::Usb::NoDeviceType^ >^ value) { + this->noDeviceField = value; + } + + inline System::String^ RootHubType::ServiceName::get() { + return this->serviceNameField; + } + inline System::Void RootHubType::ServiceName::set(System::String^ value) { + this->serviceNameField = value; + } + + inline System::String^ RootHubType::HwId::get() { + return this->hwIdField; + } + inline System::Void RootHubType::HwId::set(System::String^ value) { + this->hwIdField = value; + } + + inline System::String^ RootHubType::DeviceId::get() { + return this->deviceIdField; + } + inline System::Void RootHubType::DeviceId::set(System::String^ value) { + this->deviceIdField = value; + } + + inline System::String^ RootHubType::DeviceName::get() { + return this->deviceNameField; + } + inline System::Void RootHubType::DeviceName::set(System::String^ value) { + this->deviceNameField = value; + } + + inline System::String^ RootHubType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void RootHubType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::String^ RootHubType::UsbProtocol::get() { + return this->usbProtocolField; + } + inline System::Void RootHubType::UsbProtocol::set(System::String^ value) { + this->usbProtocolField = value; + } + + + inline System::String^ UsbHCPowerStateType::SystemState::get() { + return this->systemStateField; + } + inline System::Void UsbHCPowerStateType::SystemState::set(System::String^ value) { + this->systemStateField = value; + } + + inline System::String^ UsbHCPowerStateType::HostControllerState::get() { + return this->hostControllerStateField; + } + inline System::Void UsbHCPowerStateType::HostControllerState::set(System::String^ value) { + this->hostControllerStateField = value; + } + + inline System::String^ UsbHCPowerStateType::HubState::get() { + return this->hubStateField; + } + inline System::Void UsbHCPowerStateType::HubState::set(System::String^ value) { + this->hubStateField = value; + } + + inline System::Boolean UsbHCPowerStateType::CanWakeUp::get() { + return this->canWakeUpField; + } + inline System::Void UsbHCPowerStateType::CanWakeUp::set(System::Boolean value) { + this->canWakeUpField = value; + } + + inline System::Boolean UsbHCPowerStateType::IsPowered::get() { + return this->isPoweredField; + } + inline System::Void UsbHCPowerStateType::IsPowered::set(System::Boolean value) { + this->isPoweredField = value; + } + + + inline cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ UsbHCPowerStateMappingType::PowerMap::get() { + return this->powerMapField; + } + inline System::Void UsbHCPowerStateMappingType::PowerMap::set(cli::array< Microsoft::Kits::Samples::Usb::UsbHCPowerStateType^ >^ value) { + this->powerMapField = value; + } + + inline System::String^ UsbHCPowerStateMappingType::LastSleepState::get() { + return this->lastSleepStateField; + } + inline System::Void UsbHCPowerStateMappingType::LastSleepState::set(System::String^ value) { + this->lastSleepStateField = value; + } + + + inline System::Int64 UsbHCDeviceInfoType::VendorId::get() { + return this->vendorIdField; + } + inline System::Void UsbHCDeviceInfoType::VendorId::set(System::Int64 value) { + this->vendorIdField = value; + } + + inline System::Int64 UsbHCDeviceInfoType::DeviceId::get() { + return this->deviceIdField; + } + inline System::Void UsbHCDeviceInfoType::DeviceId::set(System::Int64 value) { + this->deviceIdField = value; + } + + inline System::String^ UsbHCDeviceInfoType::DriverKey::get() { + return this->driverKeyField; + } + inline System::Void UsbHCDeviceInfoType::DriverKey::set(System::String^ value) { + this->driverKeyField = value; + } + + inline System::Int64 UsbHCDeviceInfoType::SubSysId::get() { + return this->subSysIdField; + } + inline System::Void UsbHCDeviceInfoType::SubSysId::set(System::Int64 value) { + this->subSysIdField = value; + } + + inline System::Int64 UsbHCDeviceInfoType::Revision::get() { + return this->revisionField; + } + inline System::Void UsbHCDeviceInfoType::Revision::set(System::Int64 value) { + this->revisionField = value; + } + + inline System::UInt64 UsbHCDeviceInfoType::DebugPort::get() { + return this->debugPortField; + } + inline System::Void UsbHCDeviceInfoType::DebugPort::set(System::UInt64 value) { + this->debugPortField = value; + } + + inline System::UInt64 UsbHCDeviceInfoType::NumberOfRootPorts::get() { + return this->numberOfRootPortsField; + } + inline System::Void UsbHCDeviceInfoType::NumberOfRootPorts::set(System::UInt64 value) { + this->numberOfRootPortsField = value; + } + + inline System::UInt64 UsbHCDeviceInfoType::ControllerFlavor::get() { + return this->controllerFlavorField; + } + inline System::Void UsbHCDeviceInfoType::ControllerFlavor::set(System::UInt64 value) { + this->controllerFlavorField = value; + } + + inline System::String^ UsbHCDeviceInfoType::ControllerFlavorString::get() { + return this->controllerFlavorStringField; + } + inline System::Void UsbHCDeviceInfoType::ControllerFlavorString::set(System::String^ value) { + this->controllerFlavorStringField = value; + } + + inline System::Boolean UsbHCDeviceInfoType::PortSwitchingEnabled::get() { + return this->portSwitchingEnabledField; + } + inline System::Void UsbHCDeviceInfoType::PortSwitchingEnabled::set(System::Boolean value) { + this->portSwitchingEnabledField = value; + } + + inline System::Boolean UsbHCDeviceInfoType::SelectiveSuspendEnabled::get() { + return this->selectiveSuspendEnabledField; + } + inline System::Void UsbHCDeviceInfoType::SelectiveSuspendEnabled::set(System::Boolean value) { + this->selectiveSuspendEnabledField = value; + } + + inline System::UInt64 UsbHCDeviceInfoType::LegacyBios::get() { + return this->legacyBiosField; + } + inline System::Void UsbHCDeviceInfoType::LegacyBios::set(System::UInt64 value) { + this->legacyBiosField = value; + } + + + inline Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ HostControllerType::ControllerInfo::get() { + return this->controllerInfoField; + } + inline System::Void HostControllerType::ControllerInfo::set(Microsoft::Kits::Samples::Usb::UsbHCDeviceInfoType^ value) { + this->controllerInfoField = value; + } + + inline Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ HostControllerType::PowerMapping::get() { + return this->powerMappingField; + } + inline System::Void HostControllerType::PowerMapping::set(Microsoft::Kits::Samples::Usb::UsbHCPowerStateMappingType^ value) { + this->powerMappingField = value; + } + + inline Microsoft::Kits::Samples::Usb::RootHubType^ HostControllerType::RootHub::get() { + return this->rootHubField; + } + inline System::Void HostControllerType::RootHub::set(Microsoft::Kits::Samples::Usb::RootHubType^ value) { + this->rootHubField = value; + } + + inline System::String^ HostControllerType::ServiceName::get() { + return this->serviceNameField; + } + inline System::Void HostControllerType::ServiceName::set(System::String^ value) { + this->serviceNameField = value; + } + + inline System::String^ HostControllerType::HwId::get() { + return this->hwIdField; + } + inline System::Void HostControllerType::HwId::set(System::String^ value) { + this->hwIdField = value; + } + + inline System::String^ HostControllerType::DeviceId::get() { + return this->deviceIdField; + } + inline System::Void HostControllerType::DeviceId::set(System::String^ value) { + this->deviceIdField = value; + } + + inline System::String^ HostControllerType::DeviceName::get() { + return this->deviceNameField; + } + inline System::Void HostControllerType::DeviceName::set(System::String^ value) { + this->deviceNameField = value; + } + + inline System::String^ HostControllerType::DeviceClass::get() { + return this->deviceClassField; + } + inline System::Void HostControllerType::DeviceClass::set(System::String^ value) { + this->deviceClassField = value; + } + + inline System::String^ HostControllerType::UsbProtocol::get() { + return this->usbProtocolField; + } + inline System::Void HostControllerType::UsbProtocol::set(System::String^ value) { + this->usbProtocolField = value; + } + } + } + } +} + diff --git a/tests/projects/winsdk/usbview/usbviddesc.h b/tests/projects/winsdk/usbview/usbviddesc.h new file mode 100644 index 000000000..f5a17164f --- /dev/null +++ b/tests/projects/winsdk/usbview/usbviddesc.h @@ -0,0 +1,743 @@ +/*++
+
+Copyright (c) 2002-2003 Microsoft Corporation
+
+Module Name:
+
+ USBVIDDESC.H
+
+Abstract:
+
+ This is a header file for USB Video Class Specific descriptors which are not yet in
+ a standard system header file.
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 11-20-2002 : created
+ 03-28-2003 : major updates to support latest UVC specs
+
+--*/
+
+#pragma pack(push, 1)
+
+/*****************************************************************************
+ D E F I N E S
+*****************************************************************************/
+
+//global version for USB Video Class spec version
+#define BCDVDC 0x0083
+
+//
+// USB Device Class Definition for Video Devices v8.c
+// Appendix A. Video Device Class Codes
+//
+
+// A.1 Video Interface Class Code
+//TBD Normally would be in USB100.h but not official yet
+#define USB_DEVICE_CLASS_VIDEO 0x0E
+#define USB_DEVICE_CLASS_VIDEO_PRERELEASE 0xFF
+//CC_VIDEO in spec. The rest of the codes will be USB_VIDEO plus text from spec codes
+
+// A.2 Video Interface Subclass Codes
+//
+#define USB_VIDEO_SC_UNDEFINED 0x00
+#define USB_VIDEO_SC_VIDEOCONTROL 0x01
+#define USB_VIDEO_SC_VIDEOSTREAMING 0x02
+#define USB_VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03
+
+// A.3 Video Interface Protocol Codes
+//
+#define USB_VIDEO_PC_PROTOCOL_UNDEFINED 0x00
+
+// A.4 Video Class-Specific Descriptor Types
+//
+#define USB_VIDEO_CS_UNDEFINED 0x20
+#define USB_VIDEO_CS_DEVICE 0x21
+#define USB_VIDEO_CS_CONFIGURATION 0x22
+#define USB_VIDEO_CS_STRING 0x23
+#define USB_VIDEO_CS_INTERFACE 0x24
+#define USB_VIDEO_CS_ENDPOINT 0x25
+
+// A.5 Video Class-Specific VC (Video Control) Interface Descriptor Subtypes
+//
+#define USB_VIDEO_VC_DESCRIPTOR_UNDEFINED 0x00
+#define USB_VIDEO_VC_HEADER 0x01
+#define USB_VIDEO_VC_INPUT_TERMINAL 0x02
+#define USB_VIDEO_VC_OUTPUT_TERMINAL 0x03
+#define USB_VIDEO_VC_SELECTOR_UNIT 0x04
+#define USB_VIDEO_VC_PROCESSING_UNIT 0x05
+#define USB_VIDEO_VC_EXTENSION_UNIT 0x06
+
+// A.6 Video Class-Specific VS (Video Streaming) Interface Descriptor Subtypes
+//
+#define USB_VIDEO_VS_UNDEFINED 0x00
+#define USB_VIDEO_VS_INPUT_HEADER 0x01
+#define USB_VIDEO_VS_OUTPUT_HEADER 0x02
+#define USB_VIDEO_VS_STILL_IMAGE_FRAME 0x03
+#define USB_VIDEO_VS_FORMAT_UNCOMPRESSED 0x04
+#define USB_VIDEO_VS_FRAME_UNCOMPRESSED 0x05
+#define USB_VIDEO_VS_FORMAT_MJPEG 0x06
+#define USB_VIDEO_VS_FRAME_MJPEG 0x07
+#define USB_VIDEO_VS_FORMAT_MPEG1 0x08
+#define USB_VIDEO_VS_FORMAT_MPEG2PS 0x09
+#define USB_VIDEO_VS_FORMAT_MPEG2TS 0x0A
+#define USB_VIDEO_VS_FORMAT_MPEG4SL 0x0B
+#define USB_VIDEO_VS_FORMAT_DV 0x0C
+#define USB_VIDEO_VS_COLORFORMAT 0x0D
+#define USB_VIDEO_VS_FORMAT_VENDOR 0x0E
+#define USB_VIDEO_VS_FRAME_VENDOR 0x0F
+
+// A.7 Video Class-Specific Endpoint Descriptor Subtypes
+//
+#define USB_VIDEO_EP_UNDEFINED 0x00
+#define USB_VIDEO_EP_GENERAL 0x01
+#define USB_VIDEO_EP_ENDPOINT 0x02
+#define USB_VIDEO_EP_INTERRUPT 0x03
+
+//
+// Below definitions only necessary if testing requests
+//
+// A.8 Video Class-Specific Request Codes
+//
+#define USB_VIDEO_RC_UNDEFINED 0x00
+#define USB_VIDEO_SET_CUR 0x01
+#define USB_VIDEO_GET_CUR 0x81
+#define USB_VIDEO_GET_MIN 0x82
+#define USB_VIDEO_GET_MAX 0x83
+#define USB_VIDEO_GET_RES 0x84
+#define USB_VIDEO_GET_LEN 0x85
+#define USB_VIDEO_GET_INFO 0x86
+#define USB_VIDEO_GET_DEF 0x87
+
+// A.9 Control Selector Codes
+// A.9.1 VideoControl Interface Control Selectors
+#define USB_VIDEO_VC_UNDEFINED_CONTROL 0x00
+#define USB_VIDEO_VC_VIDEO_POWER_MODE_CONTROL 0x01
+#define USB_VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02
+#define USB_VIDEO_VC_INDICATE_HOST_CLOCK_CONTROL 0x03
+
+//A.9.2 Terminal Control Selectors
+//
+#define USB_VIDEO_TE_CONTROL_UNDEFINED 0x00
+
+//A.9.3 Selector Unit Control Selectors
+//
+#define USB_VIDEO_SU_CONTROL_UNDEFINED 0x00
+#define USB_VIDEO_SU_INPUT_SELECT_CONTROL 0x01
+
+//A.9.4 Camera Terminal Control Selectors
+//
+#define USB_VIDEO_CT_CONTROL_UNDEFINED 0x00
+#define USB_VIDEO_CT_SCANNING_MODE_CONTROL 0x01
+#define USB_VIDEO_CT_AE_MODE_CONTROL 0x02
+#define USB_VIDEO_CT_AE_PRIORITY_CONTROL 0x03
+#define USB_VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
+#define USB_VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
+#define USB_VIDEO_CT_FOCUS_ABSOLUTE_CONTROL 0x06
+#define USB_VIDEO_CT_FOCUS_RELATIVE_CONTROL 0x07
+#define USB_VIDEO_CT_FOCUS_AUTO_CONTROL 0x08
+#define USB_VIDEO_CT_IRIS_ABSOLUTE_CONTROL 0x09
+#define USB_VIDEO_CT_IRIS_RELATIVE_CONTROL 0x0A
+#define USB_VIDEO_CT_ZOOM_ABSOLUTE_CONTROL 0x0B
+#define USB_VIDEO_CT_ZOOM_RELATIVE_CONTROL 0x0C
+#define USB_VIDEO_CT_PANTILT_ABSOLUTE_CONTROL 0x0D
+#define USB_VIDEO_CT_PANTILT_RELATIVE_CONTROL 0x0E
+#define USB_VIDEO_CT_ROLL_ABSOLUTE_CONTROL 0x0F
+#define USB_VIDEO_CT_ROLL_RELATIVE_CONTROL 0x10
+
+//A.9.5 Processing Unit Control Selectors
+//
+#define USB_VIDEO_PU_CONTROL_UNDEFINED 0x04
+#define USB_VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
+#define USB_VIDEO_PU_BRIGHTNESS_CONTROL 0x02
+#define USB_VIDEO_PU_CONTRAST_CONTROL 0x03
+#define USB_VIDEO_PU_GAIN_CONTROL 0x04
+#define USB_VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL 0x05
+#define USB_VIDEO_PU_HUE_CONTROL 0x06
+#define USB_VIDEO_PU_SATURATION_CONTROL 0x07
+#define USB_VIDEO_PU_SHARPNESS_CONTROL 0x08
+#define USB_VIDEO_PU_GAMMA_CONTROL 0x09
+#define USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0A
+#define USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0B
+#define USB_VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0C
+#define USB_VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0D
+#define USB_VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL 0x0E
+#define USB_VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0F
+#define USB_VIDEO_PU_HUE_AUTO_CONTROL 0x10
+
+//A.9.6 Extension Unit Control Selectors
+//
+#define USB_VIDEO_XU_CONTROL_UNDEFINED 0x00
+
+//A.9.7 VideoStreaming Interface Control Selectors
+//
+#define USB_VIDEO_VS_CONTROL_UNDEFINED 0x00
+#define USB_VIDEO_VS_PROBE_CONTROL 0x01
+#define USB_VIDEO_VS_COMMIT_CONTROL 0x02
+#define USB_VIDEO_VS_STILL_PROBE_CONTROL 0x03
+#define USB_VIDEO_VS_STILL_COMMIT_CONTROL 0x04
+#define USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
+#define USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL 0x06
+#define USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL 0x07
+#define USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
+#define USB_VIDEO_VS_SYNCH_DELAY_CONTROL 0x09
+
+#define TapeControls 0
+#define TransportModes 1
+#define CameraControls 2
+#define ProcessorControls 3
+#define InHeaderControls 4
+
+/*****************************************************************************
+ T Y P E D E F S
+*****************************************************************************/
+
+
+/*****************************************************************************
+ USB Device Class Definition for Video Devices v8.b
+*****************************************************************************/
+
+typedef struct _USB_VIDEO_COMMON_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+} USB_VIDEO_COMMON_DESCRIPTOR,
+*PUSB_VIDEO_COMMON_DESCRIPTOR;
+
+// 3.6.2 Class-Specific VC (Video Control) Interface Descriptor
+//
+typedef struct _USB_VIDEO_VC_INTERFACE_HEADER_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ USHORT bcdVDC;
+ USHORT wTotalLength;
+ ULONG32 dwClockFrequency;
+ UCHAR bInCollection;
+// UCHAR baInterfaceNr; // variable length (0 minimum)
+} USB_VIDEO_VC_INTERFACE_HEADER_DESCRIPTOR,
+*PUSB_VIDEO_VC_INTERFACE_HEADER_DESCRIPTOR;
+
+// 3.6.2.1 Input Terminal Descriptor
+//
+typedef struct _USB_VIDEO_INPUT_TERMINAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR iTerminal;
+} USB_VIDEO_INPUT_TERMINAL_DESCRIPTOR,
+*PUSB_VIDEO_INPUT_TERMINAL_DESCRIPTOR;
+
+// 3.6.2.2 Output Terminal Descriptor
+//
+typedef struct _USB_VIDEO_OUTPUT_TERMINAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR bSourceID;
+ UCHAR iTerminal;
+} USB_VIDEO_OUTPUT_TERMINAL_DESCRIPTOR,
+*PUSB_VIDEO_OUTPUT_TERMINAL_DESCRIPTOR;
+
+// 3.6.2.3 Camera Unit Descriptor
+//
+typedef struct _USB_VIDEO_CAMERA_TERMINAL_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR iTerminal;
+ USHORT wObjectiveFocalLengthMin;
+ USHORT wObjectiveFocalLengthMax;
+ USHORT wOcularFocalLength;
+ UCHAR bControlSize;
+// UCHAR bmControls; // variable length (0 min, 3 max)
+} USB_VIDEO_CAMERA_TERMINAL_DESCRIPTOR,
+*PUSB_VIDEO_CAMERA_TERMINAL_DESCRIPTOR;
+
+// 3.6.2.4 Selector Unit Descriptor
+//
+typedef struct _USB_VIDEO_SELECTOR_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ UCHAR bNrInPins;
+ UCHAR baSourceID; // variable length (1 minimum)
+ UCHAR iSelector;
+} USB_VIDEO_SELECTOR_UNIT_DESCRIPTOR,
+*PUSB_VIDEO_SELECTOR_UNIT_DESCRIPTOR;
+
+// 3.6.2.5 Processing Unit Descriptor
+//
+typedef struct _USB_VIDEO_PROCESSING_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ UCHAR bSourceID;
+ USHORT wMaxMultiplier;
+ UCHAR bControlSize;
+// UCHAR bmControls; // variable length (0 minimum)
+ UCHAR iProcessing;
+} USB_VIDEO_PROCESSING_UNIT_DESCRIPTOR,
+*PUSB_VIDEO_PROCESSING_UNIT_DESCRIPTOR;
+
+// 3.6.2.6 Extension Unit Descriptor
+//
+typedef struct _USB_VIDEO_EXTENSION_UNIT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bUnitID;
+ GUID guidExtensionCode;
+ UCHAR bNumControls;
+ UCHAR bNrInPins;
+ UCHAR baSourceID; // variable length (1 minimum)
+// UCHAR bControlSize;
+// UCHAR bmControls; // variable length (0 minimum)
+// UCHAR iExtension;
+} USB_VIDEO_EXTENSION_UNIT_DESCRIPTOR,
+*PUSB_VIDEO_EXTENSION_UNIT_DESCRIPTOR;
+
+// 3.7.2.2 Class-Specific VC Interrupt EndPoint Descriptor
+//
+typedef struct _USB_VIDEO_VC_INTERRUPT_ENDPOINT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubType;
+ USHORT wMaxTransferSize;
+} USB_VIDEO_VC_INTERRUPT_ENDPOINT_DESCRIPTOR,
+*PUSB_VIDEO_VC_INTERRUPT_ENDPOINT_DESCRIPTOR;
+// 3.8.2.1 Class-Specific Input Header Descriptor
+//
+typedef struct _USB_VIDEO_INPUT_HEADER_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bNumFormats;
+ USHORT wTotalLength;
+ UCHAR bEndpointAddress;
+ UCHAR bmInfo;
+ UCHAR bTerminalLink;
+ UCHAR bStillCaptureMethod;
+ UCHAR bTriggerSupport;
+ UCHAR bTriggerUsage;
+ UCHAR bControlSize;
+// UCHAR bmaControls; // variable length (0 minimum)
+} USB_VIDEO_INPUT_HEADER_DESCRIPTOR,
+*PUSB_VIDEO_INPUT_HEADER_DESCRIPTOR;
+
+// 3.8.2.2 Class-Specific Output Header Descriptor
+//
+typedef struct _USB_VIDEO_OUTPUT_HEADER_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bNumFormats;
+ USHORT wTotalLength;
+ UCHAR bEndpointAddress;
+ UCHAR bTerminalLink;
+} USB_VIDEO_OUTPUT_HEADER_DESCRIPTOR,
+*PUSB_VIDEO_OUTPUT_HEADER_DESCRIPTOR;
+
+// 3.8.2.3 Payload Format Descriptors
+//Payload Format Descriptor Document
+//Uncompressed Video DWGVideo Payload Uncompressed 0.xx.doc
+//MJPEG Video DWGVideo Payload MJPEG Format Ver0.xx.doc
+//MPEG1 System Stream DWGVideo Payload MPEG1 System Stream, MPEG2-PS Format Ver0.xx.doc
+//MPEG2 PS DWGVideo Payload MPEG1 System Stream, MPEG2-PS Format Ver0.xx.doc
+//MPEG-2 TS DWGVideo Payload MPEG2TS Format Ver0.xx.doc
+//MPEG-4 SL DWGVideo Payload MPEG4 SL format Ver0.xx.doc
+//DV DWGVideo Payload DV Format Ver0.xx.doc
+
+// 3.8.2.4 Video Frame Descriptor
+//
+//Video Frame Descriptor Document
+//Uncompressed DWGVideo Payload Uncompressed 0.xx.doc
+//MJPEG DWGVideo Payload MJPEG Format Ver0.xx.doc
+
+// 3.8.2.5 Still Image Frame Descriptor
+//
+typedef struct _VIDEO_STILL_IMAGE {
+ USHORT wWidth;
+ USHORT wHeight;
+} VIDEO_STILL_IMAGE,
+*PVIDEO_STILL_IMAGE;
+
+typedef struct _USB_VIDEO_STILL_IMAGE_FRAME_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bEndpointAddress;
+ UCHAR bNumImageSizePatterns;
+ VIDEO_STILL_IMAGE dwStillImage; // variable count
+ UCHAR bNumCompressionPattern;
+ UCHAR bCompression; // variable count
+} USB_VIDEO_STILL_IMAGE_FRAME_DESCRIPTOR,
+*PUSB_VIDEO_STILL_IMAGE_FRAME_DESCRIPTOR;
+
+// 3.8.2.6 Color Matching Descriptor
+//
+typedef struct _USB_VIDEO_COLOR_MATCHING_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bColorPrimaries;
+ UCHAR bTransferCharacteristics;
+ UCHAR bMatrixCoefficients;
+} USB_VIDEO_COLOR_MATCHING_DESCRIPTOR,
+*PUSB_VIDEO_COLOR_MATCHING_DESCRIPTOR;
+/*
+// 3.9.1 Class-specific VC Interrupt Endpoint Descriptor
+typedef struct _USB_VIDEO_VS_ENDPOINT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubType;
+ USHORT wMaxTransferSize;
+} USB_VIDEO_VS_ENDPOINT_DESCRIPTOR,
+*PUSB_VIDEO_VS_ENDPOINT_DESCRIPTOR;
+*/
+//
+// USB Device Class Definition for Video Devices: Uncompressed Payload 0.8a Draft Revision
+//
+
+// 3.1.1 Uncompressed Video Format Descriptor
+//
+typedef struct _USB_VIDEO_UNCOMPRESSED_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ GUID guidFormat;
+ UCHAR bBitsPerPixel;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bAspectRatioX;
+ UCHAR bAspectRatioY;
+ UCHAR bmInterlaceFlags;
+ UCHAR bCopyProtect;
+} USB_VIDEO_UNCOMPRESSED_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_UNCOMPRESSED_FORMAT_DESCRIPTOR;
+
+// 3.1.2 Uncompressed Video Frame Descriptor Common
+//
+typedef struct _USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_COMMON {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+} USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_COMMON,
+*PUSB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_COMMON;
+
+// 3.1.2 Uncompressed Video Frame Descriptor - Continuous
+//
+typedef struct _USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_CONTINUOUS {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwMinFrameInterval;
+ ULONG32 dwMaxFrameInterval;
+ ULONG32 dwFrameIntervalStep;
+} USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_CONTINUOUS,
+*PUSB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_CONTINUOUS;
+
+// 3.1.2 Uncompressed Video Frame Descriptor - Discrete
+//
+typedef struct _USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_DISCRETE {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwFrameInterval; // variable count
+} USB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_DISCRETE,
+*PUSB_VIDEO_UNCOMPRESSED_FRAME_DESCRIPTOR_DISCRETE;
+
+//
+// USB Device Class Definition for Video Devices: Motion-JPEG Payload 0.8a Draft Revision
+// 3.1.1 MJPEG Video Format Descriptor
+//
+typedef struct _USB_VIDEO_MJPEG_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ UCHAR bmFlags;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bAspectRatioX;
+ UCHAR bAspectRatioY;
+ UCHAR bmInterlaceFlags;
+ UCHAR bCopyProtect;
+} USB_VIDEO_MJPEG_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_MJPEG_FORMAT_DESCRIPTOR;
+
+// 3.1.2 MJPEG Video Frame Descriptors Common
+//
+typedef struct _USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_COMMON {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+} USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_COMMON,
+*PUSB_VIDEO_MJPEG_FRAME_DESCRIPTOR_COMMON;
+
+// 3.1.2 MJPEG Video Frame Descriptors - Continuous
+//
+typedef struct _USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_CONTINUOUS {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwMinFrameInterval;
+ ULONG32 dwMaxFrameInterval;
+ ULONG32 dwFrameIntervalStep;
+} USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_CONTINUOUS,
+*PUSB_VIDEO_MJPEG_FRAME_DESCRIPTOR_CONTINUOUS;
+
+// 3.1.2 MJPEG Video Frame Descriptors -Discrete
+//
+typedef struct _USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_DISCRETE {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwFrameInterval; // variable count
+} USB_VIDEO_MJPEG_FRAME_DESCRIPTOR_DISCRETE,
+*PUSB_VIDEO_MJPEG_FRAME_DESCRIPTOR_DISCRETE;
+
+//
+// USB Device Class Definition for Video Devices: MPEG1-SS, MPEG2-PS Payload 0.8a Draft Revision
+// 3.1.1 MPEG1 System Stream Format Descriptor
+//
+typedef struct _USB_VIDEO_MPEG1_SS_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ USHORT wPacketLength;
+ USHORT wPackLength;
+ UCHAR bPackdataType;
+} USB_VIDEO_MPEG1_SS_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_MPEG1_SS_FORMAT_DESCRIPTOR;
+
+// 3.1.2 MPEG2 PS Format Descriptor
+//
+typedef struct _USB_VIDEO_MPEG2_PS_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ USHORT wPacketLength;
+ USHORT wPackLength;
+ UCHAR bPackdataType;
+} USB_VIDEO_MPEG2_PS_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_MPEG2_PS_FORMAT_DESCRIPTOR;
+
+//
+// USB Device Class Definition for Video Devices: MPEG-2 TS Payload 0.8a Draft Revision
+// 3.1.1 MPEG-2 TS Format Descriptor
+//
+typedef struct _USB_VIDEO_MPEG2_TS_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bDataOffset;
+ UCHAR bPacketLength;
+ UCHAR bStrideLength;
+} USB_VIDEO_MPEG2_TS_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_MPEG2_TS_FORMAT_DESCRIPTOR;
+
+//
+// USB Device Class Definition for Video Devices: MPEG4 SL Payload 0.8a Draft Revision
+// 3.1.1 MPEG4 SL Format Descriptor
+//
+typedef struct _USB_VIDEO_MPEG4_SL_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ USHORT wPacketLength;
+} USB_VIDEO_MPEG4_SL_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_MPEG4_SL_FORMAT_DESCRIPTOR;
+
+// USB Device Class Definition for Video Devices: DV Payload 0.8a Draft Revision
+// 3.1.1 DV Format Descriptor
+typedef struct _USB_VIDEO_DV_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ UCHAR bFormatType;
+} USB_VIDEO_DV_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_DV_FORMAT_DESCRIPTOR;
+
+// USB Device Class Definition for Video Devices: Vendor Payload 0.8c Draft Revision
+// 3.1.1 Vendor Video Format Descriptor
+typedef struct _USB_VIDEO_VENDOR_VIDEO_FORMAT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ GUID guidMajorFormat;
+ GUID guidSubFormat;
+ GUID guidSpecifier;
+ UCHAR bPayloadClass;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bCopyProtect;
+} USB_VIDEO_VENDOR_VIDEO_FORMAT_DESCRIPTOR,
+*PUSB_VIDEO_VENDOR_VIDEO_FORMAT_DESCRIPTOR;
+
+// USB Device Class Definition for Video Devices: Vendor Payload 0.8c Draft Revision
+// 3.1.2 Vendor Video Frame Descriptor
+typedef struct _USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_COMMON {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+} USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_COMMON,
+*PUSB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_COMMON;
+
+typedef struct _USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_CONTINUOUS {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwMinFrameInterval;
+ ULONG32 dwMaxFrameInterval;
+ ULONG32 dwFrameIntervalStep;
+} USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_CONTINUOUS,
+*PUSB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_CONTINUOUS;
+
+typedef struct _USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_DISCRETE {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG32 dwMinBitRate;
+ ULONG32 dwMaxBitRate;
+ ULONG32 dwMaxVideoFrameBufferSize;
+ ULONG32 dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG32 dwFrameInterval; // variable count
+} USB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_DISCRETE,
+*PUSB_VIDEO_VENDOR_VIDEO_FRAME_DESCRIPTOR_DISCRETE;
+
+// USB Device Class Definition for Video Devices: Media Transport Terminal 0.8a Draft Revision
+// 3.1 Media Transport Input Descriptor
+typedef struct _USB_VIDEO_MEDIA_TRANSPORT_INPUT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR iTerminal;
+ UCHAR bControlSize;
+ UCHAR bmControls; // variable size (min 1)
+// UCHAR bTransportModeSize; // variable count (min 0)
+// UCHAR bmTransportModes; // variable count (min 0)
+} USB_VIDEO_MEDIA_TRANSPORT_INPUT_DESCRIPTOR,
+*PUSB_VIDEO_MEDIA_TRANSPORT_INPUT_DESCRIPTOR;
+
+// 3.2 Media Transport Output Descriptor
+typedef struct _USB_VIDEO_MEDIA_TRANSPORT_OUTPUT_DESCRIPTOR {
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bTerminalID;
+ USHORT wTerminalType;
+ UCHAR bAssocTerminal;
+ UCHAR bSourceID;
+ UCHAR iTerminal;
+ UCHAR bControlSize;
+ UCHAR bmControls; // variable size (min 1)
+// UCHAR bTransportModeSize; // variable count (min 0)
+// UCHAR bmTransportModes; // variable count (min 0)
+} USB_VIDEO_MEDIA_TRANSPORT_OUTPUT_DESCRIPTOR,
+*PUSB_VIDEO_MEDIA_TRANSPORT_OUTPUT_DESCRIPTOR;
+
+#pragma pack(pop)
diff --git a/tests/projects/winsdk/usbview/uvcdesc.h b/tests/projects/winsdk/usbview/uvcdesc.h new file mode 100644 index 000000000..f343fa731 --- /dev/null +++ b/tests/projects/winsdk/usbview/uvcdesc.h @@ -0,0 +1,1106 @@ +//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+//
+// Copyright (C) Microsoft Corporation, 1999 - 2008
+//
+// File: uvcdesc.h
+//
+// This header is from the UVC 1.1 USBVideo driver
+//
+//--------------------------------------------------------------------------
+
+#ifndef ___UVCDESC_H___
+#define ___UVCDESC_H___
+
+
+// USB Video Device Class Code
+#define USB_DEVICE_CLASS_VIDEO 0x0E
+
+// Video sub-classes
+#define SUBCLASS_UNDEFINED 0x00
+#define VIDEO_SUBCLASS_CONTROL 0x01
+#define VIDEO_SUBCLASS_STREAMING 0x02
+
+// Video Class-Specific Descriptor Types
+#define CS_UNDEFINED 0x20
+#define CS_DEVICE 0x21
+#define CS_CONFIGURATION 0x22
+#define CS_STRING 0x23
+#define CS_INTERFACE 0x24
+#define CS_ENDPOINT 0x25
+
+// Video Class-Specific VC Interface Descriptor Subtypes
+#define VC_HEADER 0x01
+#define INPUT_TERMINAL 0x02
+#define OUTPUT_TERMINAL 0x03
+#define SELECTOR_UNIT 0x04
+#define PROCESSING_UNIT 0x05
+#define EXTENSION_UNIT 0x06
+#define MAX_TYPE_UNIT 0x07
+
+// Video Class-Specific VS Interface Descriptor Subtypes
+#define VS_DESCRIPTOR_UNDEFINED 0x00
+#define VS_INPUT_HEADER 0x01
+#define VS_OUTPUT_HEADER 0x02
+#define VS_STILL_IMAGE_FRAME 0x03
+#define VS_FORMAT_UNCOMPRESSED 0x04
+#define VS_FRAME_UNCOMPRESSED 0x05
+#define VS_FORMAT_MJPEG 0x06
+#define VS_FRAME_MJPEG 0x07
+#define VS_FORMAT_MPEG1 0x08
+#define VS_FORMAT_MPEG2PS 0x09
+#define VS_FORMAT_MPEG2TS 0x0A
+#define VS_FORMAT_MPEG4SL 0x0B
+#define VS_FORMAT_DV 0x0C
+#define VS_COLORFORMAT 0x0D
+#define VS_FORMAT_VENDOR 0x0E
+#define VS_FRAME_VENDOR 0x0F
+
+// Video Class-Specific Endpoint Descriptor Subtypes
+#define EP_UNDEFINED 0x00
+#define EP_GENERAL 0x01
+#define EP_ENDPOINT 0x02
+#define EP_INTERRUPT 0x03
+
+// Video Class-Specific Terminal Types
+#define TERMINAL_TYPE_VENDOR_SPECIFIC 0x0100
+#define TERMINAL_TYPE_USB_STREAMING 0x0101
+#define TERMINAL_TYPE_INPUT_MASK 0x0200
+#define TERMINAL_TYPE_INPUT_VENDOR_SPECIFIC 0x0200
+#define TERMINAL_TYPE_INPUT_CAMERA 0x0201
+#define TERMINAL_TYPE_INPUT_MEDIA_TRANSPORT 0x0202
+#define TERMINAL_TYPE_OUTPUT_MASK 0x0300
+#define TERMINAL_TYPE_OUTPUT_VENDOR_SPECIFIC 0x0300
+#define TERMINAL_TYPE_OUTPUT_DISPLAY 0x0301
+#define TERMINAL_TYPE_OUTPUT_MEDIA_TRANSPORT 0x0302
+#define TERMINAL_TYPE_EXTERNAL_VENDOR_SPECIFIC 0x0400
+#define TERMINAL_TYPE_EXTERNAL_UNDEFINED 0x0400
+#define TERMINAL_TYPE_EXTERNAL_COMPOSITE 0x0401
+#define TERMINAL_TYPE_EXTERNAL_SVIDEO 0x0402
+#define TERMINAL_TYPE_EXTERNAL_COMPONENT 0x0403
+
+
+// Controls for error checking only
+#define DEV_SPECIFIC_CONTROL 0x1001
+
+// Map KSNODE_TYPE GUIDs to Indexes
+#define NODE_TYPE_NONE 0
+#define NODE_TYPE_STREAMING 1
+#define NODE_TYPE_INPUT_TERMINAL 2
+#define NODE_TYPE_OUTPUT_TERMINAL 3
+#define NODE_TYPE_SELECTOR 4
+#define NODE_TYPE_PROCESSING 5
+#define NODE_TYPE_CAMERA_TERMINAL 6
+#define NODE_TYPE_INPUT_MTT 7
+#define NODE_TYPE_OUTPUT_MTT 8
+#define NODE_TYPE_DEV_SPEC 9
+#define NODE_TYPE_MAX 9
+
+// USB bmRequestType values
+#define USBVIDEO_INTERFACE_SET 0x21
+#define USBVIDEO_ENDPOINT_SET 0x22
+#define USBVIDEO_INTERFACE_GET 0xA1
+#define USBVIDEO_ENDPOINT_GET 0xA2
+
+// Video Class-specific specific requests
+#define CLASS_SPECIFIC_GET_MASK 0x80
+
+#define RC_UNDEFINED 0x00
+#define SET_CUR 0x01
+#define GET_CUR 0x81
+#define GET_MIN 0x82
+#define GET_MAX 0x83
+#define GET_RES 0x84
+#define GET_LEN 0x85
+#define GET_INFO 0x86
+#define GET_DEF 0x87
+
+// Power Mode Control constants
+#define POWER_MODE_CONTROL_FULL 0x0
+#define POWER_MODE_CONTROL_DEV_DEPENDENT 0x1
+
+// Video Class-specific Processing Unit Controls
+#define PU_CONTROL_UNDEFINED 0x00
+#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
+#define PU_BRIGHTNESS_CONTROL 0x02
+#define PU_CONTRAST_CONTROL 0x03
+#define PU_GAIN_CONTROL 0x04
+#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
+#define PU_HUE_CONTROL 0x06
+#define PU_SATURATION_CONTROL 0x07
+#define PU_SHARPNESS_CONTROL 0x08
+#define PU_GAMMA_CONTROL 0x09
+#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0A
+#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0B
+#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0C
+#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0D
+#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0E
+#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0F
+#define PU_HUE_AUTO_CONTROL 0x10
+#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
+#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
+
+// Video Class-specific Camera Terminal Controls
+#define CT_CONTROL_UNDEFINED 0x00
+#define CT_SCANNING_MODE_CONTROL 0x01
+#define CT_AE_MODE_CONTROL 0x02
+#define CT_AE_PRIORITY_CONTROL 0x03
+#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
+#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
+#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
+#define CT_FOCUS_RELATIVE_CONTROL 0x07
+#define CT_FOCUS_AUTO_CONTROL 0x08
+#define CT_IRIS_ABSOLUTE_CONTROL 0x09
+#define CT_IRIS_RELATIVE_CONTROL 0x0A
+#define CT_ZOOM_ABSOLUTE_CONTROL 0x0B
+#define CT_ZOOM_RELATIVE_CONTROL 0x0C
+#define CT_PANTILT_ABSOLUTE_CONTROL 0x0D
+#define CT_PANTILT_RELATIVE_CONTROL 0x0E
+#define CT_ROLL_ABSOLUTE_CONTROL 0x0F
+#define CT_ROLL_RELATIVE_CONTROL 0x10
+#define CT_PRIVACY_CONTROL 0x11
+
+#define CT_RELATIVE_INCREASE 0x01
+#define CT_RELATIVE_DECREASE 0xff
+#define CT_RELATIVE_STOP 0x00
+
+// Selector Unit Control Selector
+#define SU_INPUT_SELECT_CONTROL 0x01
+
+// Media Tape Transport Control Selector
+#define MTT_CONTROL_UNDEFINED 0x00
+#define MTT_TRANSPORT_CONTROL 0x01
+#define MTT_ATN_INFORMATION_CONTROL 0x02
+#define MTT_MEDIA_INFORMATION_CONTROL 0x03
+#define MTT_TIME_CODE_INFORMATION_CONTROL 0x04
+
+// Media Transport Terminal States
+#define MTT_STATE_PLAY_NEXT_FRAME 0x00
+#define MTT_STATE_PLAY_FWD_SLOWEST 0x01
+#define MTT_STATE_PLAY_SLOW_FWD_4 0x02
+#define MTT_STATE_PLAY_SLOW_FWD_3 0x03
+#define MTT_STATE_PLAY_SLOW_FWD_2 0x04
+#define MTT_STATE_PLAY_SLOW_FWD_1 0x05
+#define MTT_STATE_PLAY_X1 0x06
+#define MTT_STATE_PLAY_FAST_FWD_1 0x07
+#define MTT_STATE_PLAY_FAST_FWD_2 0x08
+#define MTT_STATE_PLAY_FAST_FWD_3 0x09
+#define MTT_STATE_PLAY_FAST_FWD_4 0x0A
+#define MTT_STATE_PLAY_FASTEST_FWD 0x0B
+#define MTT_STATE_PLAY_PREV_FRAME 0x0C
+#define MTT_STATE_PLAY_SLOWEST_REV 0x0D
+#define MTT_STATE_PLAY_SLOW_REV_4 0x0E
+#define MTT_STATE_PLAY_SLOW_REV_3 0x0F
+#define MTT_STATE_PLAY_SLOW_REV_2 0x10
+#define MTT_STATE_PLAY_SLOW_REV_1 0x11
+#define MTT_STATE_PLAY_REV 0x12
+#define MTT_STATE_PLAY_FAST_REV_1 0x13
+#define MTT_STATE_PLAY_FAST_REV_2 0x14
+#define MTT_STATE_PLAY_FAST_REV_3 0x15
+#define MTT_STATE_PLAY_FAST_REV_4 0x16
+#define MTT_STATE_PLAY_FASTEST_REV 0x17
+#define MTT_STATE_PLAY 0x18
+#define MTT_STATE_PAUSE 0x19
+#define MTT_STATE_PLAY_REVERSE_PAUSE 0x1A
+
+
+#define MTT_STATE_STOP 0x40
+#define MTT_STATE_FAST_FORWARD 0x41
+#define MTT_STATE_REWIND 0x42
+#define MTT_STATE_HIGH_SPEED_REWIND 0x43
+
+#define MTT_STATE_RECORD_START 0x50
+#define MTT_STATE_RECORD_PAUSE 0x51
+
+#define MTT_STATE_EJECT 0x60
+
+#define MTT_STATE_PLAY_SLOW_FWD_X 0x70
+#define MTT_STATE_PLAY_FAST_FWD_X 0x71
+#define MTT_STATE_PLAY_SLOW_REV_X 0x72
+#define MTT_STATE_PLAY_FAST_REV_X 0x73
+#define MTT_STATE_STOP_START 0x74
+#define MTT_STATE_STOP_END 0x75
+#define MTT_STATE_STOP_EMERGENCY 0x76
+#define MTT_STATE_STOP_CONDENSATION 0x77
+#define MTT_STATE_UNSPECIFIED 0x7F
+
+// Video Control Interface Control Selectors
+#define VC_UNDEFINED_CONTROL 0x00
+#define VC_VIDEO_POWER_MODE_CONTROL 0x01
+#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
+
+// VideoStreaming Interface Control Selectors
+#define VS_CONTROL_UNDEFINED 0x00
+#define VS_PROBE_CONTROL 0x01
+#define VS_COMMIT_CONTROL 0x02
+#define VS_STILL_PROBE_CONTROL 0x03
+#define VS_STILL_COMMIT_CONTROL 0x04
+#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
+#define VS_STREAM_ERROR_CODE_CONTROL 0x06
+#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
+#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
+#define VS_SYNC_DELAY_CONTROL 0x09
+
+// Probe commit bitmap framing info
+#define VS_PROBE_COMMIT_BIT_FID 0x01
+#define VS_PROBE_COMMIT_BIT_EOF 0x02
+
+// Stream payload header Bit Field Header bits
+#define BFH_FID 0x01 // Frame ID bit
+#define BFH_EOF 0x02 // End of Frame bit
+#define BFH_PTS 0x04 // Presentation Time Stamp bit
+#define BFH_SCR 0x08 // Source Clock Reference bit
+#define BFH_RES 0x10 // Reserved bit
+#define BFH_STI 0x20 // Still image bit
+#define BFH_ERR 0x40 // Error bit
+#define BFH_EOH 0x80 // End of header bit
+
+#define HDR_LENGTH 1 // Length of header length field in bytes
+#define BFH_LENGTH 1 // Length of BFH field in bytes
+#define PTS_LENGTH 4 // Length of PTS field in bytes
+#define SCR_LENGTH 6 // Length of SCR field in bytes
+
+// USB Video Status Codes (Request Error Code Control)
+#define USBVIDEO_RE_STATUS_NOERROR 0x00
+#define USBVIDEO_RE_STATUS_NOT_READY 0x01
+#define USBVIDEO_RE_STATUS_WRONG_STATE 0x02
+#define USBVIDEO_RE_STATUS_POWER 0x03
+#define USBVIDEO_RE_STATUS_OUT_OF_RANGE 0x04
+#define USBVIDEO_RE_STATUS_INVALID_UNIT 0x05
+#define USBVIDEO_RE_STATUS_INVALID_CONTROL 0x06
+#define USBVIDEO_RE_STATUS_UNKNOWN 0x07
+
+// USB Video Device Status Codes (Stream Error Code Control)
+#define USBVIDEO_SE_STATUS_NOERROR 0x00
+#define USBVIDEO_SE_STATUS_PROTECTED_CONTENT 0x01
+#define USBVIDEO_SE_STATUS_INPUT_BUFFER_UNDERRUN 0x02
+#define USBVIDEO_SE_STATUS_DATA_DICONTINUITY 0x03
+#define USBVIDEO_SE_STATUS_OUTPUT_BUFFER_UNDERRUN 0x04
+#define USBVIDEO_SE_STATUS_OUTPUT_BUFFER_OVERRUN 0x05
+#define USBVIDEO_SE_STATUS_FORMAT_CHANGE 0x06
+#define USBVIDEO_SE_STATUS_STILL_IMAGE_ERROR 0x07
+#define USBVIDEO_SE_STATUS_UNKNOWN 0x08
+
+// Status Interrupt Types
+#define STATUS_INTERRUPT_VC 1
+#define STATUS_INTERRUPT_VS 2
+
+// Status Interrupt Attributes
+#define STATUS_INTERRUPT_ATTRIBUTE_VALUE 0x00
+#define STATUS_INTERRUPT_ATTRIBUTE_INFO 0x01
+#define STATUS_INTERRUPT_ATTRIBUTE_FAILURE 0x02
+
+// VideoStreaming interface interrupt types
+#define VS_INTERRUPT_EVENT_BUTTON_PRESS 0x00
+#define VS_INTERRUPT_VALUE_BUTTON_RELEASE 0x00
+#define VS_INTERRUPT_VALUE_BUTTON_PRESS 0x01
+
+// Get Info Values
+#define USBVIDEO_ASYNC_CONTROL 0x10
+#define USBVIDEO_SETTABLE_CONTROL 0x2
+
+#define MAX_INTERRUPT_PACKET_VALUE_SIZE 8
+
+// Frame descriptor frame interval array offsets
+#define MIN_FRAME_INTERVAL_OFFSET 0
+#define MAX_FRAME_INTERVAL_OFFSET 1
+#define FRAME_INTERVAL_STEP_OFFSET 2
+
+// Still image capture methods
+#define STILL_CAPTURE_METHOD_NONE 0
+#define STILL_CAPTURE_METHOD_1 1
+#define STILL_CAPTURE_METHOD_2 2
+#define STILL_CAPTURE_METHOD_3 3
+
+// Still image trigger control states
+#define STILL_IMAGE_TRIGGER_NORMAL 0
+#define STILL_IMAGE_TRIGGER_TRANSMIT 1
+#define STILL_IMAGE_TRIGGER_TRANSMIT_BULK 2
+#define STILL_IMAGE_TRIGGER_TRANSMIT_ABORT 3
+
+// Endpoint descriptor masks
+#define EP_DESCRIPTOR_TRANSACTION_SIZE_MASK 0x07ff
+#define EP_DESCRIPTOR_NUM_TRANSACTION_MASK 0x1800
+#define EP_DESCRIPTOR_NUM_TRANSACTION_OFFSET 11
+
+
+// Copy protection flag defined in the Uncompressed Payload Spec
+#define USB_VIDEO_UNCOMPRESSED_RESTRICT_DUPLICATION 1
+
+// Interlace flags
+#define INTERLACE_FLAGS_SUPPORTED_MASK 0x01
+#define INTERLACE_FLAGS_FIELDS_PER_FRAME_MASK 0x02
+#define INTERLACE_FLAGS_FIELDS_PER_FRAME_2 0x00
+#define INTERLACE_FLAGS_FIELDS_PER_FRAME_1 0x02
+#define INTERLACE_FLAGS_FIELD_1_FIRST_MASK 0x04
+#define INTERLACE_FLAGS_FIELD_PATTERN_MASK 0x30
+#define INTERLACE_FLAGS_FIELD_PATTERN_FIELD1 0x00
+#define INTERLACE_FLAGS_FIELD_PATTERN_FIELD2 0x10
+#define INTERLACE_FLAGS_FIELD_PATTERN_REGULAR 0x20
+#define INTERLACE_FLAGS_FIELD_PATTERN_RANDOM 0x30
+#define INTERLACE_FLAGS_DISPLAY_MODE_MASK 0xC0
+#define INTERLACE_FLAGS_DISPLAY_MODE_BOB 0x00
+#define INTERLACE_FLAGS_DISPLAY_MODE_WEAVE 0x40
+#define INTERLACE_FLAGS_DISPLAY_MODE_BOB_WEAVE 0x80
+
+// Color Matching Flags
+#define UVC_PRIMARIES_UNKNOWN 0x0
+#define UVC_PRIMARIES_BT709 0x1
+#define UVC_PRIMARIES_BT470_2M 0x2
+#define UVC_PRIMARIES_BT470_2BG 0x3
+#define UVC_PRIMARIES_SMPTE_170M 0x4
+#define UVC_PRIMARIES_SMPTE_240M 0x5
+
+#define UVC_GAMMA_UNKNOWN 0x0
+#define UVC_GAMMA_BT709 0x1
+#define UVC_GAMMA_BT470_2M 0x2
+#define UVC_GAMMA_BT470_2BG 0x3
+#define UVC_GAMMA_SMPTE_170M 0x4
+#define UVC_GAMMA_SMPTE_240M 0x5
+#define UVC_GAMMA_LINEAR 0x6
+#define UVC_GAMMA_sRGB 0x7
+
+#define UVC_TRANSFER_MATRIX_UNKNOWN 0x0
+#define UVC_TRANSFER_MATRIX_BT709 0x1
+#define UVC_TRANSFER_MATRIX_FCC 0x2
+#define UVC_TRANSFER_MATRIX_BT470_2BG 0x3
+#define UVC_TRANSFER_MATRIX_BT601 0x4
+#define UVC_TRANSFER_MATRIX_SMPTE_240M 0x5
+
+//
+// BEGIN - VDC Descriptor and Control Structures
+//
+#pragma warning( disable : 4200 ) // Allow zero-sized arrays at end of structs
+#pragma pack( push, vdc_descriptor_structs, 1)
+
+// Video Specific Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // descriptor subtype
+} VIDEO_SPECIFIC, *PVIDEO_SPECIFIC;
+
+#define SIZEOF_VIDEO_SPECIFIC(pDesc) sizeof(VIDEO_SPECIFIC)
+
+
+// Video Unit Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // descriptor subtype
+ UCHAR bUnitID; // Constant uniquely identifying the Unit
+} VIDEO_UNIT, *PVIDEO_UNIT;
+
+#define SIZEOF_VIDEO_UNIT(pDesc) sizeof(VIDEO_UNIT)
+
+// VideoControl Header Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // VC_HEADER descriptor subtype
+ USHORT bcdVideoSpec; // USB video class spec revision number
+ USHORT wTotalLength; // Total length, including all units and terminals
+ ULONG dwClockFreq; // Device clock frequency in Hz
+ UCHAR bInCollection; // number of video streaming interfaces
+ UCHAR baInterfaceNr[]; // interface number array
+} VIDEO_CONTROL_HEADER_UNIT, *PVIDEO_CONTROL_HEADER_UNIT;
+
+#define SIZEOF_VIDEO_CONTROL_HEADER_UNIT(pDesc) \
+ ((sizeof(VIDEO_CONTROL_HEADER_UNIT) + (pDesc)->bInCollection))
+
+
+// VideoControl Input Terminal Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // INPUT_TERMINAL descriptor subtype
+ UCHAR bTerminalID; // Constant uniquely identifying the Terminal
+ USHORT wTerminalType; // Constant characterizing the terminal type
+ UCHAR bAssocTerminal; // ID of associated output terminal
+ UCHAR iTerminal; // Index of string descriptor
+} VIDEO_INPUT_TERMINAL, *PVIDEO_INPUT_TERMINAL;
+
+#define SIZEOF_VIDEO_INPUT_TERMINAL(pDesc) sizeof(VIDEO_INPUT_TERMINAL)
+
+
+// VideoControl Output Terminal Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // OUTPUT_TERMINAL descriptor subtype
+ UCHAR bTerminalID; // Constant uniquely identifying the Terminal
+ USHORT wTerminalType; // Constant characterizing the terminal type
+ UCHAR bAssocTerminal; // ID of associated input terminal
+ UCHAR bSourceID; // ID of source unit/terminal
+ UCHAR iTerminal; // Index of string descriptor
+} VIDEO_OUTPUT_TERMINAL, *PVIDEO_OUTPUT_TERMINAL;
+
+#define SIZEOF_VIDEO_OUTPUT_TERMINAL(pDesc) sizeof(VIDEO_OUTPUT_TERMINAL)
+
+
+// VideoControl Camera Terminal Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // INPUT_TERMINAL descriptor subtype
+ UCHAR bTerminalID; // Constant uniquely identifying the Terminal
+ USHORT wTerminalType; // Sensor type
+ UCHAR bAssocTerminal; // ID of associated output terminal
+ UCHAR iTerminal; // Index of string descriptor
+ USHORT wObjectiveFocalLengthMin; // Min focal length for zoom
+ USHORT wObjectiveFocalLengthMax; // Max focal length for zoom
+ USHORT wOcularFocalLength; // Ocular focal length for zoom
+ UCHAR bControlSize; // Size of bmControls field
+ UCHAR bmControls[]; // Bitmap of controls supported
+} VIDEO_CAMERA_TERMINAL, *PVIDEO_CAMERA_TERMINAL;
+
+#define SIZEOF_VIDEO_CAMERA_TERMINAL(pDesc) \
+ (sizeof(VIDEO_CAMERA_TERMINAL) + (pDesc)->bControlSize)
+
+
+// Media Transport Input Terminal Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // INPUT_TERMINAL descriptor subtype
+ UCHAR bTerminalID; // Constant uniquely identifying the Terminal
+ USHORT wTerminalType; // Media Transport type
+ UCHAR bAssocTerminal; // ID of associated output terminal
+ UCHAR iTerminal; // Index of string descriptor
+ UCHAR bControlSize; // Size of bmControls field
+ UCHAR bmControls[]; // Bitmap of controls supported
+} VIDEO_INPUT_MTT, *PVIDEO_INPUT_MTT;
+
+
+__inline size_t SizeOfVideoInputMTT(_In_ PVIDEO_INPUT_MTT pDesc)
+{
+ UCHAR bTransportModeSize;
+ PUCHAR pbCurr;
+
+ pbCurr = pDesc->bmControls + pDesc->bControlSize;
+ bTransportModeSize = *pbCurr;
+
+ return sizeof(VIDEO_INPUT_MTT) + pDesc->bControlSize + 1 + bTransportModeSize;
+}
+
+#define SIZEOF_VIDEO_INPUT_MTT(pDesc) SizeOfVideoInputMTT(pDesc)
+
+
+// Media Transport Output Terminal Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // OUTPUT_TERMINAL descriptor subtype
+ UCHAR bTerminalID; // Constant uniquely identifying the Terminal
+ USHORT wTerminalType; // Media Transport type
+ UCHAR bAssocTerminal; // ID of associated output terminal
+ UCHAR bSourceID; // ID of source unit/terminal
+ UCHAR iTerminal; // Index of string descriptor
+ UCHAR bControlSize; // Size of bmControls field
+ UCHAR bmControls[]; // Bitmap of controls supported
+} VIDEO_OUTPUT_MTT, *PVIDEO_OUTPUT_MTT;
+
+
+__inline size_t SizeOfVideoOutputMTT(_In_ PVIDEO_OUTPUT_MTT pDesc)
+{
+ UCHAR bTransportModeSize;
+ PUCHAR pbCurr;
+
+ pbCurr = pDesc->bmControls + pDesc->bControlSize;
+ bTransportModeSize = *pbCurr;
+
+ return sizeof(VIDEO_OUTPUT_MTT) + pDesc->bControlSize + 1+ bTransportModeSize;
+}
+
+#define SIZEOF_VIDEO_OUTPUT_MTT(pDesc) SizeOfVideoOutputMTT(pDesc)
+
+
+// VideoControl Selector Unit Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // SELECTOR_UNIT descriptor subtype
+ UCHAR bUnitID; // Constant uniquely identifying the Unit
+ UCHAR bNrInPins; // Number of input pins
+ UCHAR baSourceID[]; // IDs of connected units/terminals
+} VIDEO_SELECTOR_UNIT, *PVIDEO_SELECTOR_UNIT;
+
+#define SIZEOF_VIDEO_SELECTOR_UNIT(pDesc) \
+ (sizeof(VIDEO_SELECTOR_UNIT) + (pDesc)->bNrInPins + 1)
+
+
+// VideoControl Processing Unit Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // PROCESSING_UNIT descriptor subtype
+ UCHAR bUnitID; // Constant uniquely identifying the Unit
+ UCHAR bSourceID; // ID of connected unit/terminal
+ USHORT wMaxMultiplier; // Maximum digital magnification
+ UCHAR bControlSize; // Size of bmControls field
+ UCHAR bmControls[]; // Bitmap of controls supported
+} VIDEO_PROCESSING_UNIT, *PVIDEO_PROCESSING_UNIT;
+
+#define SIZEOF_VIDEO_PROCESSING_UNIT(pDesc) \
+ (sizeof(VIDEO_PROCESSING_UNIT) + 1 + (pDesc)->bControlSize)
+
+
+// VideoControl Extension Unit Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // EXTENSION_UNIT descriptor subtype
+ UCHAR bUnitID; // Constant uniquely identifying the Unit
+ GUID guidExtensionCode; // Vendor-specific code identifying extension unit
+ UCHAR bNumControls; // Number of controls in Extension Unit
+ UCHAR bNrInPins; // Number of input pins
+ UCHAR baSourceID[]; // IDs of connected units/terminals
+} VIDEO_EXTENSION_UNIT, *PVIDEO_EXTENSION_UNIT;
+// this is followed by bControlSize, bmControls and iExtension (1 byte)
+
+__inline size_t SizeOfVideoExtensionUnit(PVIDEO_EXTENSION_UNIT pDesc)
+{
+ UCHAR bControlSize;
+ PUCHAR pbCurr;
+
+ // baSourceID is an array, and hence understood to be an address
+ pbCurr = pDesc->baSourceID + pDesc->bNrInPins;
+ if (((ULONG_PTR) pbCurr < (ULONG_PTR) pDesc->baSourceID) ||
+ (ULONG_PTR) pbCurr >= (ULONG_PTR)((UCHAR *) pDesc + pDesc->bLength))
+ return 0;
+
+ bControlSize = *pbCurr;
+ return 24 + pDesc->bNrInPins + bControlSize;
+}
+
+#define SIZEOF_VIDEO_EXTENSION_UNIT(pDesc) SizeOfVideoExtensionUnit(pDesc)
+
+
+// Class-specific Interrupt Endpoint Descriptor
+typedef struct {
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_ENDPOINT descriptor type
+ UCHAR bDescriptorSubtype; // EP_INTERRUPT descriptor subtype
+ USHORT wMaxTransferSize; // Max interrupt payload size
+} VIDEO_CS_INTERRUPT, *PVIDEO_CS_INTERRUPT;
+
+#define SIZEOF_VIDEO_CS_INTERRUPT(pDesc) sizeof(VIDEO_CS_INTERRUPT)
+
+
+// VideoStreaming Input Header Descriptor
+typedef struct _VIDEO_STREAMING_INPUT_HEADER
+{
+ UCHAR bLength; // Size of this descriptor in bytes
+ UCHAR bDescriptorType; // CS_INTERFACE descriptor type
+ UCHAR bDescriptorSubtype; // VS_INPUT_HEADER descriptor subtype
+ UCHAR bNumFormats;
+ USHORT wTotalLength;
+ UCHAR bEndpointAddress;
+ UCHAR bmInfo;
+ UCHAR bTerminalLink;
+ UCHAR bStillCaptureMethod;
+ UCHAR bTriggerSupport;
+ UCHAR bTriggerUsage;
+ UCHAR bControlSize;
+ UCHAR bmaControls[];
+} VIDEO_STREAMING_INPUT_HEADER, *PVIDEO_STREAMING_INPUT_HEADER;
+
+#define SIZEOF_VIDEO_STREAMING_INPUT_HEADER(pDesc) \
+ (sizeof(VIDEO_STREAMING_INPUT_HEADER) + (pDesc->bNumFormats * pDesc->bControlSize))
+
+
+// VideoStreaming Output Header Descriptor
+typedef struct _VIDEO_STREAMING_OUTPUT_HEADER
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bNumFormats;
+ USHORT wTotalLength;
+ UCHAR bEndpointAddress;
+ UCHAR bTerminalLink;
+} VIDEO_STREAMING_OUTPUT_HEADER, *PVIDEO_STREAMING_OUTPUT_HEADER;
+
+#define SIZEOF_VIDEO_STREAMING_OUTPUT_HEADER(pDesc) sizeof(VIDEO_STREAMING_OUTPUT_HEADER)
+
+
+typedef struct _VIDEO_STILL_IMAGE_RECT
+{
+ USHORT wWidth;
+ USHORT wHeight;
+} VIDEO_STILL_IMAGE_RECT;
+
+// VideoStreaming Still Image Frame Descriptor
+typedef struct _VIDEO_STILL_IMAGE_FRAME
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bEndpointAddress;
+ UCHAR bNumImageSizePatterns;
+ VIDEO_STILL_IMAGE_RECT aStillRect[];
+} VIDEO_STILL_IMAGE_FRAME, *PVIDEO_STILL_IMAGE_FRAME;
+
+__inline size_t SizeOfVideoStillImageFrame(PVIDEO_STILL_IMAGE_FRAME pDesc)
+{
+ UCHAR bNumCompressionPatterns;
+ PUCHAR pbCurr;
+
+ pbCurr = (PUCHAR) pDesc->aStillRect + (sizeof(VIDEO_STILL_IMAGE_RECT) * pDesc->bNumImageSizePatterns);
+ bNumCompressionPatterns = *pbCurr;
+
+ return (sizeof(VIDEO_STILL_IMAGE_FRAME) +
+ (sizeof(VIDEO_STILL_IMAGE_RECT) * pDesc->bNumImageSizePatterns) +
+ 1 + bNumCompressionPatterns);
+}
+
+#define SIZEOF_VIDEO_STILL_IMAGE_FRAME(pDesc) SizeOfVideoStillImageFrame(pDesc)
+
+
+// VideoStreaming Color Matching Descriptor
+typedef struct _VIDEO_COLORFORMAT
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bColorPrimaries;
+ UCHAR bTransferCharacteristics;
+ UCHAR bMatrixCoefficients;
+} VIDEO_COLORFORMAT, *PVIDEO_COLORFORMAT;
+
+#define SIZEOF_VIDEO_COLORFORMAT(pDesc) sizeof(VIDEO_COLORFORMAT)
+
+
+// VideoStreaming Uncompressed Format Descriptor
+typedef struct _VIDEO_FORMAT_UNCOMPRESSED
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ GUID guidFormat;
+ UCHAR bBitsPerPixel;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bAspectRatioX;
+ UCHAR bAspectRatioY;
+ UCHAR bmInterlaceFlags;
+ UCHAR bCopyProtect;
+} VIDEO_FORMAT_UNCOMPRESSED, *PVIDEO_FORMAT_UNCOMPRESSED;
+
+#define SIZEOF_VIDEO_FORMAT_UNCOMPRESSED(pDesc) sizeof(VIDEO_FORMAT_UNCOMPRESSED)
+
+
+// VideoStreaming Uncompressed Frame Descriptor
+typedef struct _VIDEO_FRAME_UNCOMPRESSED
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG dwMinBitRate;
+ ULONG dwMaxBitRate;
+ ULONG dwMaxVideoFrameBufferSize;
+ ULONG dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG adwFrameInterval[];
+} VIDEO_FRAME_UNCOMPRESSED, *PVIDEO_FRAME_UNCOMPRESSED;
+
+
+__inline size_t SizeOfVideoFrameUncompressed(_In_ PVIDEO_FRAME_UNCOMPRESSED pDesc)
+{
+ if (pDesc->bFrameIntervalType == 0) { // Continuous
+ return sizeof(VIDEO_FRAME_UNCOMPRESSED) + (3 * sizeof(ULONG));
+ }
+ else { // Discrete
+ return sizeof(VIDEO_FRAME_UNCOMPRESSED) + (pDesc->bFrameIntervalType * sizeof(ULONG));
+ }
+}
+
+#define SIZEOF_VIDEO_FRAME_UNCOMPRESSED(pDesc) SizeOfVideoFrameUncompressed(pDesc)
+
+
+// VideoStreaming MJPEG Format Descriptor
+typedef struct _VIDEO_FORMAT_MJPEG
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ UCHAR bmFlags;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bAspectRatioX;
+ UCHAR bAspectRatioY;
+ UCHAR bmInterlaceFlags;
+ UCHAR bCopyProtect;
+} VIDEO_FORMAT_MJPEG, *PVIDEO_FORMAT_MJPEG;
+
+#define SIZEOF_VIDEO_FORMAT_MJPEG(pDesc) sizeof(VIDEO_FORMAT_MJPEG)
+
+
+// VideoStreaming MJPEG Frame Descriptor
+typedef struct _VIDEO_FRAME_MJPEG
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG dwMinBitRate;
+ ULONG dwMaxBitRate;
+ ULONG dwMaxVideoFrameBufferSize;
+ ULONG dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG adwFrameInterval[];
+} VIDEO_FRAME_MJPEG, *PVIDEO_FRAME_MJPEG;
+
+
+__inline size_t SizeOfVideoFrameMjpeg(_In_ PVIDEO_FRAME_MJPEG pDesc)
+{
+ if (pDesc->bFrameIntervalType == 0) { // Continuous
+ return sizeof(VIDEO_FRAME_MJPEG) + (3 * sizeof(ULONG));
+ }
+ else { // Discrete
+ return sizeof(VIDEO_FRAME_MJPEG) + (pDesc->bFrameIntervalType * sizeof(ULONG));
+ }
+}
+
+#define SIZEOF_VIDEO_FRAME_MJPEG(pDesc) SizeOfVideoFrameMjpeg(pDesc)
+
+
+// VideoStreaming Vendor Format Descriptor
+typedef struct _VIDEO_FORMAT_VENDOR
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ GUID guidMajorFormat;
+ GUID guidSubFormat;
+ GUID guidSpecifier;
+ UCHAR bPayloadClass;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bCopyProtect;
+} VIDEO_FORMAT_VENDOR, *PVIDEO_FORMAT_VENDOR;
+
+#define SIZEOF_VIDEO_FORMAT_VENDOR(pDesc) sizeof(VIDEO_FORMAT_VENDOR)
+
+
+// VideoStreaming Vendor Frame Descriptor
+typedef struct _VIDEO_FRAME_VENDOR
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG dwMinBitRate;
+ ULONG dwMaxBitRate;
+ ULONG dwMaxVideoFrameBufferSize;
+ ULONG dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ DWORD adwFrameInterval[];
+} VIDEO_FRAME_VENDOR, *PVIDEO_FRAME_VENDOR;
+
+__inline size_t SizeOfVideoFrameVendor(_In_ PVIDEO_FRAME_VENDOR pDesc)
+{
+ if (pDesc->bFrameIntervalType == 0) { // Continuous
+ return sizeof(VIDEO_FRAME_VENDOR) + (3 * sizeof(ULONG));
+ }
+ else { // Discrete
+ return sizeof(VIDEO_FRAME_VENDOR) + (pDesc->bFrameIntervalType * sizeof(ULONG));
+ }
+}
+
+#define SIZEOF_VIDEO_FRAME_VENDOR(pDesc) SizeOfVideoFrameVendor(pDesc)
+
+
+// VideoStreaming DV Format Descriptor
+typedef struct _VIDEO_FORMAT_DV
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ ULONG dwMaxVideoFrameBufferSize;
+ UCHAR bFormatType;
+} VIDEO_FORMAT_DV, *PVIDEO_FORMAT_DV;
+
+#define SIZEOF_VIDEO_FORMAT_DV(pDesc) sizeof(VIDEO_FORMAT_DV)
+
+
+// VideoStreaming MPEG2-TS Format Descriptor
+typedef struct _VIDEO_FORMAT_MPEG2TS
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bDataOffset;
+ UCHAR bPacketLength;
+ UCHAR bStrideLength;
+} VIDEO_FORMAT_MPEG2TS, *PVIDEO_FORMAT_MPEG2TS;
+
+#define SIZEOF_VIDEO_FORMAT_MPEG2TS(pDesc) sizeof(VIDEO_FORMAT_MPEG2TS)
+
+
+// VideoStreaming MPEG1 System Stream Format Descriptor
+typedef struct _VIDEO_FORMAT_MPEG1SS
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bPacketLength;
+ UCHAR bPackLength;
+ UCHAR bPackDataType;
+} VIDEO_FORMAT_MPEG1SS, *PVIDEO_FORMAT_MPEG1SS;
+
+#define SIZEOF_VIDEO_FORMAT_MPEG1SS(pDesc) sizeof(VIDEO_FORMAT_MPEG1SS)
+
+
+// VideoStreaming MPEG2-PS Format Descriptor
+typedef struct _VIDEO_FORMAT_MPEG2PS
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bPacketLength;
+ UCHAR bPackLength;
+ UCHAR bPackDataType;
+} VIDEO_FORMAT_MPEG2PS, *PVIDEO_FORMAT_MPEG2PS;
+
+#define SIZEOF_VIDEO_FORMAT_MPEG2PS(pDesc) sizeof(VIDEO_FORMAT_MPEG2PS)
+
+
+// VideoStreaming MPEG4-SL Format Descriptor
+typedef struct _VIDEO_FORMAT_MPEG4SL
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bPacketLength;
+} VIDEO_FORMAT_MPEG4SL, *PVIDEO_FORMAT_MPEG4SL;
+
+#define SIZEOF_VIDEO_FORMAT_MPEG4SL(pDesc) sizeof(VIDEO_FORMAT_MPEG4SL)
+
+// VideoStreaming Probe/Commit Control
+typedef struct _VS_PROBE_COMMIT_CONTROL
+{
+ USHORT bmHint;
+ UCHAR bFormatIndex;
+ UCHAR bFrameIndex;
+ ULONG dwFrameInterval;
+ USHORT wKeyFrameRate;
+ USHORT wPFrameRate;
+ USHORT wCompQuality;
+ USHORT wCompWindowSize;
+ USHORT wDelay;
+ ULONG dwMaxVideoFrameSize;
+ ULONG dwMaxPayloadTransferSize;
+} VS_PROBE_COMMIT_CONTROL, *PVS_PROBE_COMMIT_CONTROL;
+
+// VideoStreaming Still Probe/Commit Control
+typedef struct _VS_STILL_PROBE_COMMIT_CONTROL
+{
+ UCHAR bFormatIndex;
+ UCHAR bFrameIndex;
+ UCHAR bCompressionIndex;
+ ULONG dwMaxVideoFrameSize;
+ ULONG dwMaxPayloadTransferSize;
+} VS_STILL_PROBE_COMMIT_CONTROL, *PVS_STILL_PROBE_COMMIT_CONTROL;
+
+
+// Status Interrupt Packet (Video Control)
+typedef struct _VC_INTERRUPT_PACKET
+{
+ UCHAR bStatusType;
+ UCHAR bOriginator;
+ UCHAR bEvent;
+ UCHAR bSelector;
+ UCHAR bAttribute;
+ UCHAR bValue[1];
+} VC_INTERRUPT_PACKET, *PVC_INTERRUPT_PACKET;
+
+// Status Interrupt Packet (Video Control)
+typedef struct _VC_INTERRUPT_PACKET_EX
+{
+ UCHAR bStatusType;
+ UCHAR bOriginator;
+ UCHAR bEvent;
+ UCHAR bSelector;
+ UCHAR bAttribute;
+ UCHAR bValue[MAX_INTERRUPT_PACKET_VALUE_SIZE];
+} VC_INTERRUPT_PACKET_EX, *PVC_INTERRUPT_PACKET_EX;
+
+// Status Interrupt Packet (Video Streaming)
+typedef struct _VS_INTERRUPT_PACKET
+{
+ UCHAR bStatusType;
+ UCHAR bOriginator;
+ UCHAR bEvent;
+ UCHAR bValue[1];
+} VS_INTERRUPT_PACKET, *PVS_INTERRUPT_PACKET;
+
+// Status Interrupt Packet (Generic)
+typedef struct _VIDEO_INTERRUPT_PACKET
+{
+ UCHAR bStatusType;
+ UCHAR bOriginator;
+} VIDEO_INTERRUPT_PACKET, *PVIDEO_INTERRUPT_PACKET;
+
+
+// Relative property struct
+typedef struct _VIDEO_RELATIVE_PROPERTY
+{
+ UCHAR bValue;
+ UCHAR bSpeed;
+} VIDEO_RELATIVE_PROPERTY, *PVIDEO_RELATIVE_PROPERTY;
+
+// Relative Zoom control struct
+typedef struct _ZOOM_RELATIVE_PROPERTY
+{
+ UCHAR bZoom;
+ UCHAR bDigitalZoom;
+ UCHAR bSpeed;
+} ZOOM_RELATIVE_PROPERTY, *PZOOM_RELATIVE_PROPERTY;
+
+// Relative pan-tilt struct
+typedef struct _PANTILT_RELATIVE_PROPERTY
+{
+ UCHAR bPanRelative;
+ UCHAR bPanSpeed;
+ UCHAR bTiltRelative;
+ UCHAR bTiltSpeed;
+} PANTILT_RELATIVE_PROPERTY, *PPANTILT_RELATIVE_PROPERTY;
+
+typedef struct _MEDIA_INFORMATION_CONTROL
+{
+ UCHAR bmMediaType;
+ UCHAR bmWriteProtect;
+} MEDIA_INFORMATION_CONTROL, *PMEDIA_INFORMATION_CONTROL;
+
+typedef struct _TIME_CODE_INFORMATION_CONTROL
+{
+ UCHAR bcdFrame;
+ UCHAR bcdSecond;
+ UCHAR bcdMinute;
+ UCHAR bcdHour;
+} TIME_CODE_INFORMATION_CONTROL, *PTIME_CODE_INFORMATION_CONTROL;
+
+typedef struct _ATN_INFORMATION_CONTROL
+{
+ UCHAR bmMediaType;
+ DWORD dwATN_Data;
+} ATN_INFORMATION_CONTROL, *PATN_INFORMATION_CONTROL;
+
+#define VS_FORMAT_FRAME_BASED 0x10
+#define VS_FRAME_FRAME_BASED 0x11
+#define VS_FORMAT_STREAM_BASED 0x12
+
+// Format Descriptor for UVC 1.1 frame based format
+typedef struct _VIDEO_FORMAT_FRAME
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ UCHAR bNumFrameDescriptors;
+ GUID guidFormat;
+ UCHAR bBitsPerPixel;
+ UCHAR bDefaultFrameIndex;
+ UCHAR bAspectRatioX;
+ UCHAR bAspectRatioY;
+ UCHAR bmInterlaceFlags;
+ UCHAR bCopyProtect;
+ UCHAR bVariableSize;
+} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;
+
+#define SIZEOF_VIDEO_FORMAT_FRAME(pDesc) sizeof(VIDEO_FORMAT_FRAME)
+
+
+// Frame Descriptor for UVC 1.1 frame based format
+typedef struct _VIDEO_FRAME_FRAME
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFrameIndex;
+ UCHAR bmCapabilities;
+ USHORT wWidth;
+ USHORT wHeight;
+ ULONG dwMinBitRate;
+ ULONG dwMaxBitRate;
+ ULONG dwDefaultFrameInterval;
+ UCHAR bFrameIntervalType;
+ ULONG dwBytesPerLine;
+ ULONG adwFrameInterval[];
+} VIDEO_FRAME_FRAME, *PVIDEO_FRAME_FRAME;
+
+__inline size_t SizeOfVideoFrameFrame(_In_ PVIDEO_FRAME_FRAME pDesc)
+{
+ if (pDesc->bFrameIntervalType == 0) { // Continuous
+ return sizeof(VIDEO_FRAME_FRAME) + (3 * sizeof(ULONG));
+ }
+ else { // Discrete
+ return sizeof(VIDEO_FRAME_FRAME) + (pDesc->bFrameIntervalType * sizeof(ULONG));
+ }
+}
+
+#define SIZEOF_VIDEO_FRAME_FRAME(pDesc) SizeOfVideoFrameFrame(pDesc)
+
+// VideoStreaming Stream Based Format Descriptor
+typedef struct _VIDEO_FORMAT_STREAM
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ UCHAR bDescriptorSubtype;
+ UCHAR bFormatIndex;
+ GUID guidFormat;
+ ULONG dwPacketLength;
+} VIDEO_FORMAT_STREAM, *PVIDEO_FORMAT_STREAM;
+
+#define SIZEOF_VIDEO_FORMAT_STREAM(pDesc) sizeof(VIDEO_FORMAT_STREAM)
+
+// VideoStreaming Probe/Commit Control
+typedef struct _VS_PROBE_COMMIT_CONTROL2
+{
+ USHORT bmHint;
+ UCHAR bFormatIndex;
+ UCHAR bFrameIndex;
+ ULONG dwFrameInterval;
+ USHORT wKeyFrameRate;
+ USHORT wPFrameRate;
+ USHORT wCompQuality;
+ USHORT wCompWindowSize;
+ USHORT wDelay;
+ ULONG dwMaxVideoFrameSize;
+ ULONG dwMaxPayloadTransferSize;
+ ULONG dwClockFrequency;
+ UCHAR bmFramingInfo;
+ UCHAR bPreferredVersion;
+ UCHAR bMinVersion;
+ UCHAR bMaxVersion;
+} VS_PROBE_COMMIT_CONTROL2, *PVS_PROBE_COMMIT_CONTROL2;
+
+#pragma pack( pop, vdc_descriptor_structs )
+#pragma warning( default : 4200 )
+
+
+//
+// END - VDC Descriptor and Control Structures
+//
+
+#endif // ___UVCDESC_H___
diff --git a/tests/projects/winsdk/usbview/uvcview.c b/tests/projects/winsdk/usbview/uvcview.c new file mode 100644 index 000000000..04b295292 --- /dev/null +++ b/tests/projects/winsdk/usbview/uvcview.c @@ -0,0 +1,2153 @@ +/*++
+
+Copyright (c) 1997-2011 Microsoft Corporation
+
+Module Name:
+
+USBVIEW.C
+
+Abstract:
+
+This is the GUI goop for the USBVIEW application.
+
+Environment:
+
+user mode
+
+Revision History:
+
+04-25-97 : created
+11-20-02 : minor changes to support more reporting options
+04/13/2005 : major bug fixing
+07/01/2008 : add UVC 1.1 support and move to Dev branch
+
+--*/
+
+/*****************************************************************************
+I N C L U D E S
+*****************************************************************************/
+
+#include "resource.h"
+#include "uvcview.h"
+#include "h264.h"
+#include "xmlhelper.h"
+
+#include <commdlg.h>
+
+
+/*****************************************************************************
+D E F I N E S
+*****************************************************************************/
+
+// window control defines
+//
+#define SIZEBAR 0
+#define WINDOWSCALEFACTOR 15
+
+/*****************************************************************************
+ L O C A L T Y P E D E F S
+*****************************************************************************/
+typedef struct _TREEITEMINFO
+{
+ struct _TREEITEMINFO *Next;
+ USHORT Depth;
+ PCHAR Name;
+
+} TREEITEMINFO, *PTREEITEMINFO;
+
+
+/*****************************************************************************
+L O C A L E N U M S
+*****************************************************************************/
+
+typedef enum _USBVIEW_SAVE_FILE_TYPE
+{
+ UsbViewNone = 0,
+ UsbViewXmlFile,
+ UsbViewTxtFile
+} USBVIEW_SAVE_FILE_TYPE;
+
+/*****************************************************************************
+L O C A L F U N C T I O N P R O T O T Y P E S
+*****************************************************************************/
+
+int WINAPI
+WinMain (
+ _In_ HINSTANCE hInstance,
+ _In_opt_ HINSTANCE hPrevInstance,
+ _In_ LPSTR lpszCmdLine,
+ _In_ int nCmdShow
+ );
+
+BOOL
+CreateMainWindow (
+ int nCmdShow
+ );
+
+VOID
+ResizeWindows (
+ BOOL bSizeBar,
+ int BarLocation
+ );
+
+LRESULT CALLBACK
+MainDlgProc (
+ HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ );
+
+BOOL
+USBView_OnInitDialog (
+ HWND hWnd,
+ HWND hWndFocus,
+ LPARAM lParam
+ );
+
+VOID
+USBView_OnClose (
+ HWND hWnd
+ );
+
+VOID
+USBView_OnCommand (
+ HWND hWnd,
+ int id,
+ HWND hwndCtl,
+ UINT codeNotify
+ );
+
+VOID
+USBView_OnLButtonDown (
+ HWND hWnd,
+ BOOL fDoubleClick,
+ int x,
+ int y,
+ UINT keyFlags
+ );
+
+VOID
+USBView_OnLButtonUp (
+ HWND hWnd,
+ int x,
+ int y,
+ UINT keyFlags
+ );
+
+VOID
+USBView_OnMouseMove (
+ HWND hWnd,
+ int x,
+ int y,
+ UINT keyFlags
+ );
+
+VOID
+USBView_OnSize (
+ HWND hWnd,
+ UINT state,
+ int cx,
+ int cy
+ );
+
+LRESULT
+USBView_OnNotify (
+ HWND hWnd,
+ int DlgItem,
+ LPNMHDR lpNMHdr
+ );
+
+BOOL
+USBView_OnDeviceChange (
+ HWND hwnd,
+ UINT uEvent,
+ DWORD dwEventData
+ );
+
+VOID DestroyTree (VOID);
+
+VOID RefreshTree (VOID);
+
+LRESULT CALLBACK
+AboutDlgProc (
+ HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ );
+
+VOID
+WalkTree (
+ _In_ HTREEITEM hTreeItem,
+ _In_ LPFNTREECALLBACK lpfnTreeCallback,
+ _In_opt_ PVOID pContext
+ );
+
+VOID
+ExpandItem (
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ );
+
+VOID
+AddItemInformationToFile(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ );
+
+DWORD
+DisplayLastError(
+ _Inout_updates_bytes_(count) char *szString,
+ int count);
+
+VOID AddItemInformationToXmlView(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ );
+HRESULT InitializeConsole();
+VOID UnInitializeConsole();
+BOOL IsStdOutFile();
+VOID DisplayMessage(DWORD dwMsgId, ...);
+VOID PrintString(LPTSTR lpszString);
+LPTSTR WStringToAnsiString(LPWSTR lpwszString);
+VOID WaitForKeyPress();
+BOOL ProcessCommandLine();
+HRESULT ProcessCommandSaveFile(LPTSTR szFileName, DWORD dwCreationDisposition, USBVIEW_SAVE_FILE_TYPE fileType);
+HRESULT SaveAllInformationAsText(LPTSTR lpstrTextFileName, DWORD dwCreationDisposition);
+HRESULT SaveAllInformationAsXml(LPTSTR lpstrTextFileName , DWORD dwCreationDisposition);
+
+/*****************************************************************************
+G L O B A L S
+*****************************************************************************/
+BOOL gDoConfigDesc = TRUE;
+BOOL gDoAnnotation = TRUE;
+BOOL gLogDebug = FALSE;
+int TotalHubs = 0;
+
+extern DEVICE_GUID_LIST gHubList;
+extern DEVICE_GUID_LIST gDeviceList;
+
+/*****************************************************************************
+G L O B A L S P R I V A T E T O T H I S F I L E
+*****************************************************************************/
+
+HINSTANCE ghInstance = NULL;
+HWND ghMainWnd = NULL;
+HWND ghTreeWnd = NULL;
+HWND ghEditWnd = NULL;
+HWND ghStatusWnd = NULL;
+HMENU ghMainMenu = NULL;
+HTREEITEM ghTreeRoot = NULL;
+HCURSOR ghSplitCursor = NULL;
+HDEVNOTIFY gNotifyDevHandle = NULL;
+HDEVNOTIFY gNotifyHubHandle = NULL;
+HANDLE ghStdOut = NULL;
+
+BOOL gbConsoleFile = FALSE;
+BOOL gbConsoleInitialized = FALSE;
+BOOL gbButtonDown = FALSE;
+BOOL gDoAutoRefresh = TRUE;
+
+int gBarLocation = 0;
+int giGoodDevice = 0;
+int giBadDevice = 0;
+int giComputer = 0;
+int giHub = 0;
+int giNoDevice = 0;
+int giGoodSsDevice = 0;
+int giNoSsDevice = 0;
+
+
+/*****************************************************************************
+
+WinMain()
+
+*****************************************************************************/
+
+int WINAPI
+WinMain (
+ _In_ HINSTANCE hInstance,
+ _In_opt_ HINSTANCE hPrevInstance,
+ _In_ LPSTR lpszCmdLine,
+ _In_ int nCmdShow
+ )
+{
+ MSG msg;
+ HACCEL hAccel;
+ int retStatus = 0;
+
+ UNREFERENCED_PARAMETER(hPrevInstance);
+ UNREFERENCED_PARAMETER(lpszCmdLine);
+
+ InitXmlHelper();
+
+ ghInstance = hInstance;
+
+ ghSplitCursor = LoadCursor(ghInstance,
+ MAKEINTRESOURCE(IDC_SPLIT));
+
+ if (!ghSplitCursor)
+ {
+ OOPS();
+ return retStatus;
+ }
+
+ hAccel = LoadAccelerators(ghInstance,
+ MAKEINTRESOURCE(IDACCEL));
+
+ if (!hAccel)
+ {
+ OOPS();
+ return retStatus;
+ }
+
+ if (!CreateTextBuffer())
+ {
+ return retStatus;
+ }
+
+ if (!ProcessCommandLine())
+ {
+ // There were no command line flags, open GUI
+ if (CreateMainWindow(nCmdShow))
+ {
+ while (GetMessage(&msg, NULL, 0, 0))
+ {
+ if (!TranslateAccelerator(ghMainWnd,
+ hAccel,
+ &msg) &&
+ !IsDialogMessage(ghMainWnd,
+ &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+ retStatus = 1;
+ }
+ }
+
+ DestroyTextBuffer();
+
+ ReleaseXmlWriter();
+
+ CHECKFORLEAKS();
+
+ return retStatus;
+}
+
+
+/*****************************************************************************
+
+ProcessCommandLine()
+
+Parses the command line and takes appropriate actions. Returns FALSE If there is no action to
+perform
+*****************************************************************************/
+BOOL ProcessCommandLine()
+{
+ LPWSTR *szArgList = NULL;
+ LPTSTR szArg = NULL;
+ LPTSTR szAnsiArg= NULL;
+ BOOL quietMode = FALSE;
+
+ HRESULT hr = S_OK;
+ DWORD dwCreationDisposition = CREATE_NEW;
+ USBVIEW_SAVE_FILE_TYPE fileType = UsbViewNone;
+
+ int nArgs = 0;
+ int i = 0;
+ BOOL bStatus = FALSE;
+ BOOL bStopArgProcessing = FALSE;
+
+ szArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs);
+
+ // If there are no arguments we return false
+ bStatus = (nArgs > 1)? TRUE:FALSE;
+
+ if (NULL != szArgList)
+ {
+ if (nArgs > 1)
+ {
+ // If there are arguments, initialize console for ouput
+ InitializeConsole();
+ }
+
+ for (i = 1; (i < nArgs) && (bStopArgProcessing == FALSE); i++)
+ {
+ // Convert argument to ANSI string for futher processing
+
+ szAnsiArg = WStringToAnsiString(szArgList[i]);
+
+ if(NULL == szAnsiArg)
+ {
+ DisplayMessage(IDS_USBVIEW_INVALIDARG, szAnsiArg);
+ DisplayMessage(IDS_USBVIEW_USAGE);
+ break;
+ }
+
+ if (0 == _stricmp(szAnsiArg, "/?"))
+ {
+ DisplayMessage(IDS_USBVIEW_USAGE);
+ break;
+ }
+ else if (NULL != StrStrI(szAnsiArg, "/saveall:"))
+ {
+ fileType = UsbViewTxtFile;
+ }
+ else if (NULL != StrStrI(szAnsiArg, "/savexml:"))
+ {
+ fileType = UsbViewXmlFile;
+ }
+ else if (0 == _stricmp(szAnsiArg, "/f"))
+ {
+ dwCreationDisposition = CREATE_ALWAYS;
+ }
+ else if (0 == _stricmp(szAnsiArg, "/q"))
+ {
+ quietMode = TRUE;
+ }
+ else
+ {
+ DisplayMessage(IDS_USBVIEW_INVALIDARG, szAnsiArg);
+ DisplayMessage(IDS_USBVIEW_USAGE);
+ bStopArgProcessing = TRUE;
+ }
+
+ if (fileType != UsbViewNone)
+ {
+ // Save view information as to file
+ szArg = strchr(szAnsiArg, ':');
+
+ if (NULL == szArg || strlen(szArg) == 1)
+ {
+ // No ':' or just a ':'
+ DisplayMessage(IDS_USBVIEW_INVALID_FILENAME, szAnsiArg);
+ DisplayMessage(IDS_USBVIEW_USAGE);
+ bStopArgProcessing = TRUE;
+ }
+ else
+ {
+ hr = ProcessCommandSaveFile(szArg + 1, dwCreationDisposition, fileType);
+
+ if (FAILED(hr))
+ {
+ // No more processing
+ bStopArgProcessing = TRUE;
+ }
+
+ fileType = UsbViewNone;
+ }
+ }
+
+ if (NULL != szAnsiArg)
+ {
+ LocalFree(szAnsiArg);
+ }
+ }
+
+ if(!quietMode)
+ {
+ WaitForKeyPress();
+ }
+
+ if (gbConsoleInitialized)
+ {
+ UnInitializeConsole();
+ }
+
+ LocalFree(szArgList);
+ }
+ return bStatus;
+}
+
+
+/*****************************************************************************
+
+ProcessCommandSaveFile()
+
+Process the save file command line
+
+*****************************************************************************/
+HRESULT ProcessCommandSaveFile(LPTSTR szFileName, DWORD dwCreationDisposition, USBVIEW_SAVE_FILE_TYPE fileType)
+{
+ HRESULT hr = S_OK;
+ LPTSTR szErrorBuffer = NULL;
+
+ if (UsbViewNone == fileType || NULL == szFileName)
+ {
+ hr = E_INVALIDARG;
+ // Invalid arguments, return
+ return (hr);
+ }
+
+ // The UI is not created yet, open the UI, but HIDE it
+ CreateMainWindow(SW_HIDE);
+
+ if (UsbViewXmlFile == fileType)
+ {
+ hr = SaveAllInformationAsXml(szFileName, dwCreationDisposition);
+ }
+
+ if (UsbViewTxtFile == fileType)
+ {
+ hr = SaveAllInformationAsText(szFileName, dwCreationDisposition);
+ }
+
+ if (FAILED(hr))
+ {
+ if (GetLastError() == ERROR_FILE_EXISTS || hr == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS))
+ {
+ // The operation failed because the file we tried to write to already existed and '/f' option
+ // was not present. Display error message to user describing '/f' option
+ switch(fileType)
+ {
+ case UsbViewXmlFile:
+ DisplayMessage(IDS_USBVIEW_FILE_EXISTS_XML, szFileName);
+ break;
+ case UsbViewTxtFile:
+ DisplayMessage(IDS_USBVIEW_FILE_EXISTS_TXT, szFileName);
+ break;
+ default:
+ DisplayMessage(IDS_USBVIEW_INTERNAL_ERROR);
+ break;
+ }
+ }
+ else
+ {
+ // Try to obtain system error message
+ FormatMessage(
+ FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ hr,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &szErrorBuffer, // FormatMessage expects this buffer to be cast as LPTSTR
+ 0,
+ NULL);
+ PrintString("Unable to save file.\n");
+ PrintString(szErrorBuffer);
+ LocalFree(szErrorBuffer);
+ }
+ }
+ else
+ {
+ // Display file saved to message in console
+ DisplayMessage(IDS_USBVIEW_SAVED_TO, szFileName);
+ }
+
+ return (hr);
+}
+
+/*****************************************************************************
+
+InitializeConsole()
+
+Initializes the std output in console
+
+*****************************************************************************/
+HRESULT InitializeConsole()
+{
+ HRESULT hr = S_OK;
+
+ SetLastError(0);
+
+ // Find if STD_OUTPUT is a console or has been redirected to a File
+ gbConsoleFile = IsStdOutFile();
+
+ if (!gbConsoleFile)
+ {
+ // Output is not redirected and GUI application do not have console by default, create a console
+ if(AllocConsole())
+ {
+#pragma warning(disable:4996) // We don' need the FILE * returned by freopen
+ // Reopen STDOUT , STDIN and STDERR
+ if((freopen("conout$", "w", stdout) != NULL) &&
+ (freopen("conin$", "r", stdin) != NULL) &&
+ (freopen("conout$","w", stderr) != NULL))
+ {
+ gbConsoleInitialized = TRUE;
+ ghStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ }
+#pragma warning(default:4996)
+ }
+ }
+
+ if (INVALID_HANDLE_VALUE == ghStdOut || FALSE == gbConsoleInitialized)
+ {
+ hr = HRESULT_FROM_WIN32(GetLastError());
+ OOPS();
+ }
+ return hr;
+}
+
+/*****************************************************************************
+
+UnInitializeConsole()
+
+UnInitializes the console
+
+*****************************************************************************/
+VOID UnInitializeConsole()
+{
+ gbConsoleInitialized = FALSE;
+ FreeConsole();
+}
+
+/*****************************************************************************
+
+IsStdOutFile()
+
+Finds if the STD_OUTPUT has been redirected to a file
+*****************************************************************************/
+BOOL IsStdOutFile()
+{
+ unsigned htype;
+ HANDLE hFile;
+
+ // 1 = STDOUT
+ hFile = (HANDLE) _get_osfhandle(1);
+ htype = GetFileType(hFile);
+ htype &= ~FILE_TYPE_REMOTE;
+
+
+ // Check if file type is character file
+ if (FILE_TYPE_DISK == htype)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/*****************************************************************************
+
+DisplayMessage()
+
+Displays a message to standard output
+*****************************************************************************/
+VOID DisplayMessage(DWORD dwResId, ...)
+{
+ CHAR szFormat[4096];
+ HRESULT hr = S_OK;
+ LPTSTR lpszMessage = NULL;
+ DWORD dwLen = 0;
+ va_list ap;
+
+ va_start(ap, dwResId);
+
+ // Initialize console if needed
+ if (!gbConsoleInitialized)
+ {
+ hr = InitializeConsole();
+ if (FAILED(hr))
+ {
+ OOPS();
+ return;
+ }
+ }
+
+ // Load the string resource
+ dwLen = LoadString(GetModuleHandle(NULL),
+ dwResId,
+ szFormat,
+ ARRAYSIZE(szFormat)
+ );
+
+ if(0 == dwLen)
+ {
+ PrintString("Unable to find message for given resource ID");
+
+ // Return if resource ID could not be found
+ return;
+ }
+
+ dwLen = FormatMessage(
+ FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+ szFormat,
+ dwResId,
+ 0,
+ (LPTSTR) &lpszMessage,
+ ARRAYSIZE(szFormat),
+ &ap);
+
+ if (dwLen > 0)
+ {
+ PrintString(lpszMessage);
+ LocalFree(lpszMessage);
+ }
+ else
+ {
+ PrintString("Unable to find message for given ID");
+ }
+
+ va_end(ap);
+ return;
+}
+
+/*****************************************************************************
+
+WStringToAnsiString()
+
+Converts the Wide char string to ANSI string and returns the allocated ANSI string.
+*****************************************************************************/
+LPTSTR WStringToAnsiString(LPWSTR lpwszString)
+{
+ int strLen = 0;
+ LPTSTR szAnsiBuffer = NULL;
+
+ szAnsiBuffer = LocalAlloc(LPTR, (MAX_PATH + 1) * sizeof(CHAR));
+
+ // Convert string from from WCHAR to ANSI
+ if (NULL != szAnsiBuffer)
+ {
+ strLen = WideCharToMultiByte(
+ CP_ACP,
+ 0,
+ lpwszString,
+ -1,
+ szAnsiBuffer,
+ MAX_PATH + 1,
+ NULL,
+ NULL);
+
+ if (strLen > 0)
+ {
+ return szAnsiBuffer;
+ }
+ }
+ return NULL;
+}
+
+/*****************************************************************************
+
+PrintString()
+
+Displays a string to standard output
+*****************************************************************************/
+VOID PrintString(LPTSTR lpszString)
+{
+ DWORD dwBytesWritten = 0;
+ size_t Len = 0;
+ LPSTR lpOemString = NULL;
+
+ if (INVALID_HANDLE_VALUE == ghStdOut || NULL == lpszString)
+ {
+ OOPS();
+ // Return if invalid inputs
+ return;
+ }
+
+ if (FAILED(StringCchLength(lpszString, OUTPUT_MESSAGE_MAX_LENGTH, &Len)))
+ {
+ OOPS();
+ // Return if string is too long
+ return;
+ }
+
+ if (gbConsoleFile)
+ {
+ // Console has been redirected to a file, ex: `usbview /savexml:xx > test.txt`. We need to use WriteFile instead of
+ // WriteConsole for text output.
+ lpOemString = (LPSTR) LocalAlloc(LPTR, (Len + 1) * sizeof(CHAR));
+ if (lpOemString != NULL)
+ {
+ if (CharToOemBuff(lpszString, lpOemString, (DWORD) Len))
+ {
+ WriteFile(ghStdOut, (LPVOID) lpOemString, (DWORD) Len, &dwBytesWritten, NULL);
+ }
+ else
+ {
+ OOPS();
+ }
+ }
+ }
+ else
+ {
+ // Write to std out in console
+ WriteConsole(ghStdOut, (LPVOID) lpszString, (DWORD) Len, &dwBytesWritten, NULL);
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+WaitForKeyPress()
+
+Waits for key press in case of console
+*****************************************************************************/
+VOID WaitForKeyPress()
+{
+ // Wait for key press if console
+ if (!gbConsoleFile && gbConsoleInitialized)
+ {
+ DisplayMessage(IDS_USBVIEW_PRESSKEY);
+ (VOID) _getch();
+ }
+ return;
+}
+
+/*****************************************************************************
+
+CreateMainWindow()
+
+*****************************************************************************/
+
+BOOL
+CreateMainWindow (
+ int nCmdShow
+ )
+{
+ RECT rc;
+
+ InitCommonControls();
+
+ ghMainWnd = CreateDialog(ghInstance,
+ MAKEINTRESOURCE(IDD_MAINDIALOG),
+ NULL,
+ (DLGPROC) MainDlgProc);
+
+ if (ghMainWnd == NULL)
+ {
+ OOPS();
+ return FALSE;
+ }
+
+ GetWindowRect(ghMainWnd, &rc);
+
+ gBarLocation = (rc.right - rc.left) / 3;
+
+ ResizeWindows(FALSE, 0);
+
+ ShowWindow(ghMainWnd, nCmdShow);
+
+ UpdateWindow(ghMainWnd);
+
+ return TRUE;
+}
+
+
+/*****************************************************************************
+
+ResizeWindows()
+
+Handles resizing the two child windows of the main window. If
+bSizeBar is true, then the sizing is happening because the user is
+moving the bar. If bSizeBar is false, the sizing is happening
+because of the WM_SIZE or something like that.
+
+*****************************************************************************/
+
+VOID
+ResizeWindows (
+ BOOL bSizeBar,
+ int BarLocation
+ )
+{
+ RECT MainClientRect;
+ RECT MainWindowRect;
+ RECT TreeWindowRect;
+ RECT StatusWindowRect;
+ int right;
+
+ // Is the user moving the bar?
+ //
+ if (!bSizeBar)
+ {
+ BarLocation = gBarLocation;
+ }
+
+ GetClientRect(ghMainWnd, &MainClientRect);
+
+ GetWindowRect(ghStatusWnd, &StatusWindowRect);
+
+ // Make sure the bar is in a OK location
+ //
+ if (bSizeBar)
+ {
+ if (BarLocation <
+ GetSystemMetrics(SM_CXSCREEN)/WINDOWSCALEFACTOR)
+ {
+ return;
+ }
+
+ if ((MainClientRect.right - BarLocation) <
+ GetSystemMetrics(SM_CXSCREEN)/WINDOWSCALEFACTOR)
+ {
+ return;
+ }
+ }
+
+ // Save the bar location
+ //
+ gBarLocation = BarLocation;
+
+ // Move the tree window
+ //
+ MoveWindow(ghTreeWnd,
+ 0,
+ 0,
+ BarLocation,
+ MainClientRect.bottom - StatusWindowRect.bottom + StatusWindowRect.top,
+ TRUE);
+
+ // Get the size of the window (in case move window failed
+ //
+ GetWindowRect(ghTreeWnd, &TreeWindowRect);
+ GetWindowRect(ghMainWnd, &MainWindowRect);
+
+ right = TreeWindowRect.right - MainWindowRect.left;
+
+ // Move the edit window with respect to the tree window
+ //
+ MoveWindow(ghEditWnd,
+ right+SIZEBAR,
+ 0,
+ MainClientRect.right-(right+SIZEBAR),
+ MainClientRect.bottom - StatusWindowRect.bottom + StatusWindowRect.top,
+ TRUE);
+
+ // Move the Status window with respect to the tree window
+ //
+ MoveWindow(ghStatusWnd,
+ 0,
+ MainClientRect.bottom - StatusWindowRect.bottom + StatusWindowRect.top,
+ MainClientRect.right,
+ StatusWindowRect.bottom - StatusWindowRect.top,
+ TRUE);
+}
+
+
+/*****************************************************************************
+
+MainWndProc()
+
+*****************************************************************************/
+
+LRESULT CALLBACK
+MainDlgProc (
+ HWND hWnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+
+ switch (uMsg)
+ {
+
+ HANDLE_MSG(hWnd, WM_INITDIALOG, USBView_OnInitDialog);
+ HANDLE_MSG(hWnd, WM_CLOSE, USBView_OnClose);
+ HANDLE_MSG(hWnd, WM_COMMAND, USBView_OnCommand);
+ HANDLE_MSG(hWnd, WM_LBUTTONDOWN, USBView_OnLButtonDown);
+ HANDLE_MSG(hWnd, WM_LBUTTONUP, USBView_OnLButtonUp);
+ HANDLE_MSG(hWnd, WM_MOUSEMOVE, USBView_OnMouseMove);
+ HANDLE_MSG(hWnd, WM_SIZE, USBView_OnSize);
+ HANDLE_MSG(hWnd, WM_NOTIFY, USBView_OnNotify);
+ HANDLE_MSG(hWnd, WM_DEVICECHANGE, USBView_OnDeviceChange);
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+
+USBView_OnInitDialog()
+
+*****************************************************************************/
+
+BOOL
+USBView_OnInitDialog (
+ HWND hWnd,
+ HWND hWndFocus,
+ LPARAM lParam
+ )
+{
+ HFONT hFont;
+ HIMAGELIST himl;
+ HICON hicon;
+ DEV_BROADCAST_DEVICEINTERFACE broadcastInterface;
+
+ UNREFERENCED_PARAMETER(lParam);
+ UNREFERENCED_PARAMETER(hWndFocus);
+
+ // Register to receive notification when a USB device is plugged in.
+ broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+ broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+
+ memcpy( &(broadcastInterface.dbcc_classguid),
+ &(GUID_DEVINTERFACE_USB_DEVICE),
+ sizeof(struct _GUID));
+
+ gNotifyDevHandle = RegisterDeviceNotification(hWnd,
+ &broadcastInterface,
+ DEVICE_NOTIFY_WINDOW_HANDLE);
+
+ // Now register for Hub notifications.
+ memcpy( &(broadcastInterface.dbcc_classguid),
+ &(GUID_CLASS_USBHUB),
+ sizeof(struct _GUID));
+
+ gNotifyHubHandle = RegisterDeviceNotification(hWnd,
+ &broadcastInterface,
+ DEVICE_NOTIFY_WINDOW_HANDLE);
+
+ gHubList.DeviceInfo = INVALID_HANDLE_VALUE;
+ InitializeListHead(&gHubList.ListHead);
+ gDeviceList.DeviceInfo = INVALID_HANDLE_VALUE;
+ InitializeListHead(&gDeviceList.ListHead);
+
+ //end add
+
+ ghTreeWnd = GetDlgItem(hWnd, IDC_TREE);
+
+ //added
+ if ((himl = ImageList_Create(15, 15,
+ FALSE, 2, 0)) == NULL)
+ {
+ OOPS();
+ }
+
+ if(himl != NULL)
+ {
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_ICON));
+ giGoodDevice = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_BADICON));
+ giBadDevice = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_COMPUTER));
+ giComputer = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_HUB));
+ giHub = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_NODEVICE));
+ giNoDevice = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_SSICON));
+ giGoodSsDevice = ImageList_AddIcon(himl, hicon);
+
+ hicon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_NOSSDEVICE));
+ giNoSsDevice = ImageList_AddIcon(himl, hicon);
+
+ TreeView_SetImageList(ghTreeWnd, himl, TVSIL_NORMAL);
+ // end add
+ }
+
+ ghEditWnd = GetDlgItem(hWnd, IDC_EDIT);
+
+#ifdef H264_SUPPORT
+ // set the edit control to have a max text limit size
+ SendMessage(ghEditWnd, EM_LIMITTEXT, 0 /* USE DEFAULT MAX*/, 0);
+#endif
+
+ ghStatusWnd = GetDlgItem(hWnd, IDC_STATUS);
+ ghMainMenu = GetMenu(hWnd);
+ if (ghMainMenu == NULL)
+ {
+ OOPS();
+ }
+ {
+ CHAR pszFont[256];
+ CHAR pszHeight[8];
+
+ memset(pszFont, 0, sizeof(pszFont));
+ LoadString(ghInstance, IDS_STANDARD_FONT, pszFont, sizeof(pszFont) - 1);
+ memset(pszHeight, 0, sizeof(pszHeight));
+ LoadString(ghInstance, IDS_STANDARD_FONT_HEIGHT, pszHeight, sizeof(pszHeight) - 1);
+
+ hFont = CreateFont((int) pszHeight[0], 0, 0, 0,
+ 400, 0, 0, 0,
+ 0, 1, 2, 1,
+ 49, pszFont);
+ }
+ SendMessage(ghEditWnd,
+ WM_SETFONT,
+ (WPARAM) hFont,
+ 0);
+
+ RefreshTree();
+
+ return FALSE;
+}
+
+/*****************************************************************************
+
+USBView_OnClose()
+
+*****************************************************************************/
+
+VOID
+USBView_OnClose (
+ HWND hWnd
+ )
+{
+
+ UNREFERENCED_PARAMETER(hWnd);
+
+ DestroyTree();
+
+ PostQuitMessage(0);
+}
+
+
+/*****************************************************************************
+
+AddItemInformationToFile()
+
+Saves the information about the current item to the list
+*****************************************************************************/
+VOID
+AddItemInformationToFile(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ )
+{
+ HRESULT hr = S_OK;
+ HANDLE hf = NULL;
+ DWORD dwBytesWritten = 0;
+
+ hf = *((PHANDLE) pContext);
+
+ ResetTextBuffer();
+
+ hr = UpdateTreeItemDeviceInfo(hTreeWnd, hTreeItem);
+
+ if (FAILED(hr))
+ {
+ OOPS();
+ }
+ else
+ {
+ WriteFile(hf, GetTextBuffer(), GetTextBufferPos()*sizeof(CHAR), &dwBytesWritten, NULL);
+ }
+
+ ResetTextBuffer();
+}
+
+
+
+/*****************************************************************************
+
+SaveAllInformationAsText()
+
+Saves the entire USB tree as a text file
+*****************************************************************************/
+HRESULT
+SaveAllInformationAsText(
+ LPTSTR lpstrTextFileName,
+ DWORD dwCreationDisposition
+ )
+{
+ HRESULT hr = S_OK;
+ HANDLE hf = NULL;
+
+ hf = CreateFile(lpstrTextFileName,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ dwCreationDisposition,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (hf == INVALID_HANDLE_VALUE)
+ {
+ hr = HRESULT_FROM_WIN32(GetLastError());
+ OOPS();
+ }
+ else
+ {
+ if (GetLastError() == ERROR_ALREADY_EXISTS)
+ {
+ // CreateFile() sets this error if we are overwriting an existing file
+ // Reset this error to avoid false alarms
+ SetLastError(0);
+ }
+
+ if (ghTreeRoot == NULL)
+ {
+ // If tree has not been populated yet, try a refresh
+ RefreshTree();
+ }
+
+ if (ghTreeRoot)
+ {
+
+ LockFile(hf, 0, 0, 0, 0);
+ WalkTreeTopDown(ghTreeRoot, AddItemInformationToFile, &hf, NULL);
+ UnlockFile(hf, 0, 0, 0, 0);
+ CloseHandle(hf);
+
+ hr = S_OK;
+ }
+ else
+ {
+ hr = HRESULT_FROM_WIN32(GetLastError());
+ OOPS();
+ }
+ }
+
+ ResetTextBuffer();
+ return hr;
+}
+
+
+/*****************************************************************************
+
+USBView_OnCommand()
+
+*****************************************************************************/
+
+VOID
+USBView_OnCommand (
+ HWND hWnd,
+ int id,
+ HWND hwndCtl,
+ UINT codeNotify
+ )
+{
+ MENUITEMINFO menuInfo;
+ char szFile[MAX_PATH + 1];
+ OPENFILENAME ofn;
+ HANDLE hf = NULL;
+ DWORD dwBytesWritten = 0;
+ int nTextLength = 0;
+ size_t lengthToNull = 0;
+ HRESULT hr = S_OK;
+
+ UNREFERENCED_PARAMETER(hwndCtl);
+ UNREFERENCED_PARAMETER(codeNotify);
+
+ //initialize save dialog variables
+ memset(szFile, 0, sizeof(szFile));
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = hWnd;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = szFile;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.lpstrFileTitle = NULL;
+ ofn.nMaxFileTitle = 0;
+ ofn.lpstrInitialDir = 0;
+ ofn.lpstrTitle = NULL;
+ ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
+
+
+ switch (id)
+ {
+ case ID_AUTO_REFRESH:
+ gDoAutoRefresh = !gDoAutoRefresh;
+ menuInfo.cbSize = sizeof(menuInfo);
+ menuInfo.fMask = MIIM_STATE;
+ menuInfo.fState = gDoAutoRefresh ? MFS_CHECKED : MFS_UNCHECKED;
+ SetMenuItemInfo(ghMainMenu,
+ id,
+ FALSE,
+ &menuInfo);
+ break;
+
+ case ID_SAVE:
+ {
+ // initialize the save file name
+ StringCchCopy(szFile, MAX_PATH, "USBView.txt");
+ ofn.lpstrFilter = "Text\0*.TXT\0\0";
+ ofn.lpstrDefExt = "txt";
+
+ //call dialog box
+ if (! GetSaveFileName(&ofn))
+ {
+ OOPS();
+ break;
+ }
+
+ //create new file
+ hf = CreateFile((LPTSTR)ofn.lpstrFile,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (hf == INVALID_HANDLE_VALUE)
+ {
+ OOPS();
+ }
+ else
+ {
+ char *szText = NULL;
+
+ //get data from display window to transfer to file
+ nTextLength = GetWindowTextLength(ghEditWnd);
+ nTextLength++;
+
+ szText = ALLOC((DWORD)nTextLength);
+ if (NULL != szText)
+ {
+ GetWindowText(ghEditWnd, (LPSTR) szText, nTextLength);
+
+ //
+ // Constrain length to the first null, which should be at
+ // the end of the window text. This prevents writing extra
+ // null characters.
+ //
+ if (StringCchLength(szText, nTextLength, &lengthToNull) == S_OK)
+ {
+ nTextLength = (int) lengthToNull;
+
+ //lock the file, write to the file, unlock file
+ LockFile(hf, 0, 0, 0, 0);
+
+ WriteFile(hf, szText, nTextLength, &dwBytesWritten, NULL);
+
+ UnlockFile(hf, 0, 0, 0, 0);
+ }
+ else
+ {
+ OOPS();
+ }
+ CloseHandle(hf);
+ FREE(szText);
+ }
+ else
+ {
+ OOPS();
+ }
+ }
+
+ break;
+ }
+
+ case ID_SAVEALL:
+ {
+ // initialize the save file name
+ StringCchCopy(szFile, MAX_PATH, "USBViewAll.txt");
+ ofn.lpstrFilter = "Text\0*.txt\0\0";
+ ofn.lpstrDefExt = "txt";
+
+ //call dialog box
+ if (! GetSaveFileName(&ofn))
+ {
+ OOPS();
+ break;
+ }
+
+ // Save the file, overwrite in case of UI since UI gives popup for confirmation
+ hr = SaveAllInformationAsText(ofn.lpstrFile, CREATE_ALWAYS);
+ if (FAILED(hr))
+ {
+ OOPS();
+ }
+
+ break;
+ }
+
+ case ID_SAVEXML:
+ {
+ // initialize the save file name
+ StringCchCopy(szFile, MAX_PATH, "USBViewAll.xml");
+ ofn.lpstrFilter = "Xml\0*.xml\0\0";
+ ofn.lpstrDefExt = "xml";
+
+ //call dialog box
+ if (! GetSaveFileName(&ofn))
+ {
+ OOPS();
+ break;
+ }
+
+ // Save the file, overwrite in case of UI since UI gives popup for confirmation
+ hr = SaveAllInformationAsXml(ofn.lpstrFile, CREATE_ALWAYS);
+ if (FAILED(hr))
+ {
+ OOPS();
+ }
+
+ break;
+ }
+
+ case ID_CONFIG_DESCRIPTORS:
+ gDoConfigDesc = !gDoConfigDesc;
+ menuInfo.cbSize = sizeof(menuInfo);
+ menuInfo.fMask = MIIM_STATE;
+ menuInfo.fState = gDoConfigDesc ? MFS_CHECKED : MFS_UNCHECKED;
+ SetMenuItemInfo(ghMainMenu,
+ id,
+ FALSE,
+ &menuInfo);
+ break;
+
+ case ID_ANNOTATION:
+ gDoAnnotation = !gDoAnnotation;
+ menuInfo.cbSize = sizeof(menuInfo);
+ menuInfo.fMask = MIIM_STATE;
+ menuInfo.fState = gDoAnnotation ? MFS_CHECKED : MFS_UNCHECKED;
+ SetMenuItemInfo(ghMainMenu,
+ id,
+ FALSE,
+ &menuInfo);
+ break;
+
+ case ID_LOG_DEBUG:
+ gLogDebug = !gLogDebug;
+ menuInfo.cbSize = sizeof(menuInfo);
+ menuInfo.fMask = MIIM_STATE;
+ menuInfo.fState = gLogDebug ? MFS_CHECKED : MFS_UNCHECKED;
+ SetMenuItemInfo(ghMainMenu,
+ id,
+ FALSE,
+ &menuInfo);
+ break;
+
+ case ID_ABOUT:
+ DialogBox(ghInstance,
+ MAKEINTRESOURCE(IDD_ABOUT),
+ ghMainWnd,
+ (DLGPROC) AboutDlgProc);
+ break;
+
+ case ID_EXIT:
+ UnregisterDeviceNotification(gNotifyDevHandle);
+ UnregisterDeviceNotification(gNotifyHubHandle);
+ DestroyTree();
+ PostQuitMessage(0);
+ break;
+
+ case ID_REFRESH:
+ RefreshTree();
+ break;
+ }
+}
+
+/*****************************************************************************
+
+USBView_OnLButtonDown()
+
+*****************************************************************************/
+
+VOID
+USBView_OnLButtonDown (
+ HWND hWnd,
+ BOOL fDoubleClick,
+ int x,
+ int y,
+ UINT keyFlags
+ )
+{
+
+ UNREFERENCED_PARAMETER(fDoubleClick);
+ UNREFERENCED_PARAMETER(x);
+ UNREFERENCED_PARAMETER(y);
+ UNREFERENCED_PARAMETER(keyFlags);
+
+ gbButtonDown = TRUE;
+ SetCapture(hWnd);
+}
+
+/*****************************************************************************
+
+USBView_OnLButtonUp()
+
+*****************************************************************************/
+
+VOID
+USBView_OnLButtonUp (
+ HWND hWnd,
+ int x,
+ int y,
+ UINT keyFlags
+ )
+{
+
+ UNREFERENCED_PARAMETER(hWnd);
+ UNREFERENCED_PARAMETER(x);
+ UNREFERENCED_PARAMETER(y);
+ UNREFERENCED_PARAMETER(keyFlags);
+
+ gbButtonDown = FALSE;
+ ReleaseCapture();
+}
+
+/*****************************************************************************
+
+USBView_OnMouseMove()
+
+*****************************************************************************/
+
+VOID
+USBView_OnMouseMove (
+ HWND hWnd,
+ int x,
+ int y,
+ UINT keyFlags
+ )
+{
+ UNREFERENCED_PARAMETER(hWnd);
+ UNREFERENCED_PARAMETER(y);
+ UNREFERENCED_PARAMETER(keyFlags);
+
+ SetCursor(ghSplitCursor);
+
+ if (gbButtonDown)
+ {
+ ResizeWindows(TRUE, x);
+ }
+}
+
+/*****************************************************************************
+
+USBView_OnSize();
+
+*****************************************************************************/
+
+VOID
+USBView_OnSize (
+ HWND hWnd,
+ UINT state,
+ int cx,
+ int cy
+ )
+{
+ UNREFERENCED_PARAMETER(hWnd);
+ UNREFERENCED_PARAMETER(state);
+ UNREFERENCED_PARAMETER(cx);
+ UNREFERENCED_PARAMETER(cy);
+
+ ResizeWindows(FALSE, 0);
+}
+
+/*****************************************************************************
+
+USBView_OnNotify()
+
+*****************************************************************************/
+
+LRESULT
+USBView_OnNotify (
+ HWND hWnd,
+ int DlgItem,
+ LPNMHDR lpNMHdr
+ )
+{
+ UNREFERENCED_PARAMETER(hWnd);
+ UNREFERENCED_PARAMETER(DlgItem);
+
+ if (lpNMHdr->code == TVN_SELCHANGED)
+ {
+ HTREEITEM hTreeItem;
+
+ hTreeItem = ((NM_TREEVIEW *)lpNMHdr)->itemNew.hItem;
+
+ if (hTreeItem)
+ {
+ UpdateEditControl(ghEditWnd,
+ ghTreeWnd,
+ hTreeItem);
+ }
+ }
+
+ return 0;
+}
+
+
+/*****************************************************************************
+
+USBView_OnDeviceChange()
+
+*****************************************************************************/
+
+BOOL
+USBView_OnDeviceChange (
+ HWND hwnd,
+ UINT uEvent,
+ DWORD dwEventData
+ )
+{
+ UNREFERENCED_PARAMETER(hwnd);
+ UNREFERENCED_PARAMETER(dwEventData);
+
+ if (gDoAutoRefresh)
+ {
+ switch (uEvent)
+ {
+ case DBT_DEVICEARRIVAL:
+ case DBT_DEVICEREMOVECOMPLETE:
+ RefreshTree();
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+
+
+/*****************************************************************************
+
+DestroyTree()
+
+*****************************************************************************/
+
+VOID DestroyTree (VOID)
+{
+ // Clear the selection of the TreeView, so that when the tree is
+ // destroyed, the control won't try to constantly "shift" the
+ // selection to another item.
+ //
+ TreeView_SelectItem(ghTreeWnd, NULL);
+
+ // Destroy the current contents of the TreeView
+ //
+ if (ghTreeRoot)
+ {
+ WalkTree(ghTreeRoot, CleanupItem, NULL);
+
+ TreeView_DeleteAllItems(ghTreeWnd);
+
+ ghTreeRoot = NULL;
+ }
+
+ ClearDeviceList(&gDeviceList);
+ ClearDeviceList(&gHubList);
+}
+
+/*****************************************************************************
+
+RefreshTree()
+
+*****************************************************************************/
+
+VOID RefreshTree (VOID)
+{
+ CHAR statusText[128];
+ ULONG devicesConnected;
+
+ // Clear the edit control
+ //
+ SetWindowText(ghEditWnd, "");
+
+ // Destroy the current contents of the TreeView
+ //
+ DestroyTree();
+
+ // Create the root tree node
+ //
+ ghTreeRoot = AddLeaf(TVI_ROOT, 0, "My Computer", ComputerIcon);
+
+ if (ghTreeRoot != NULL)
+ {
+ // Enumerate all USB buses and populate the tree
+ //
+ EnumerateHostControllers(ghTreeRoot, &devicesConnected);
+
+ //
+ // Expand all tree nodes
+ //
+ WalkTree(ghTreeRoot, ExpandItem, NULL);
+
+ // Update Status Line with number of devices connected
+ //
+ memset(statusText, 0, sizeof(statusText));
+ StringCchPrintf(statusText, sizeof(statusText),
+#ifdef H264_SUPPORT
+ "UVC Spec Version: %d.%d Version: %d.%d Devices Connected: %d Hubs Connected: %d",
+ UVC_SPEC_MAJOR_VERSION, UVC_SPEC_MINOR_VERSION, USBVIEW_MAJOR_VERSION, USBVIEW_MINOR_VERSION,
+ devicesConnected, TotalHubs);
+#else
+ "Devices Connected: %d Hubs Connected: %d",
+ devicesConnected, TotalHubs);
+#endif
+
+ SetWindowText(ghStatusWnd, statusText);
+ }
+ else
+ {
+ OOPS();
+ }
+
+}
+
+/*****************************************************************************
+
+AboutDlgProc()
+
+*****************************************************************************/
+
+LRESULT CALLBACK
+AboutDlgProc (
+ HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ HRESULT hr;
+ char TextBuffer[TEXT_ITEM_LENGTH];
+ HWND hItem;
+
+ hItem = GetDlgItem(hwnd, IDC_VERSION);
+
+ if (hItem != NULL)
+ {
+ hr = StringCbPrintfA(TextBuffer,
+ sizeof(TextBuffer),
+ "USBView version: %d.%d",
+ USBVIEW_MAJOR_VERSION,
+ USBVIEW_MINOR_VERSION);
+ if (SUCCEEDED(hr))
+ {
+ SetWindowText(hItem,TextBuffer);
+ }
+ }
+
+ hItem = GetDlgItem(hwnd, IDC_UVCVERSION);
+
+ if (hItem != NULL)
+ {
+ hr = StringCbPrintfA(TextBuffer,
+ sizeof(TextBuffer),
+ "USB Video Class Spec version: %d.%d",
+ UVC_SPEC_MAJOR_VERSION,
+ UVC_SPEC_MINOR_VERSION);
+ if (SUCCEEDED(hr))
+ {
+ SetWindowText(hItem,TextBuffer);
+ }
+ }
+ }
+ break;
+ case WM_COMMAND:
+
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ case IDCANCEL:
+
+ EndDialog (hwnd, 0);
+ break;
+ }
+ break;
+
+ }
+
+ return FALSE;
+}
+
+
+/*****************************************************************************
+
+AddLeaf()
+
+*****************************************************************************/
+
+HTREEITEM
+AddLeaf (
+ HTREEITEM hTreeParent,
+ LPARAM lParam,
+ _In_ LPTSTR lpszText,
+ TREEICON TreeIcon
+ )
+{
+ TV_INSERTSTRUCT tvins;
+ HTREEITEM hti;
+
+ memset(&tvins, 0, sizeof(tvins));
+
+ // Set the parent item
+ //
+ tvins.hParent = hTreeParent;
+
+ tvins.hInsertAfter = TVI_LAST;
+
+ // pszText and lParam members are valid
+ //
+ tvins.item.mask = TVIF_TEXT | TVIF_PARAM;
+
+ // Set the text of the item.
+ //
+ tvins.item.pszText = lpszText;
+
+ // Set the user context item
+ //
+ tvins.item.lParam = lParam;
+
+ // Add the item to the tree-view control.
+ //
+ hti = TreeView_InsertItem(ghTreeWnd, &tvins);
+
+ // added
+ tvins.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+ tvins.item.hItem = hti;
+
+ // Determine which icon to display for the device
+ //
+ switch (TreeIcon)
+ {
+ case ComputerIcon:
+ tvins.item.iImage = giComputer;
+ tvins.item.iSelectedImage = giComputer;
+ break;
+
+ case HubIcon:
+ tvins.item.iImage = giHub;
+ tvins.item.iSelectedImage = giHub;
+ break;
+
+ case NoDeviceIcon:
+ tvins.item.iImage = giNoDevice;
+ tvins.item.iSelectedImage = giNoDevice;
+ break;
+
+ case GoodDeviceIcon:
+ tvins.item.iImage = giGoodDevice;
+ tvins.item.iSelectedImage = giGoodDevice;
+ break;
+
+ case GoodSsDeviceIcon:
+ tvins.item.iImage = giGoodSsDevice;
+ tvins.item.iSelectedImage = giGoodSsDevice;
+ break;
+
+ case NoSsDeviceIcon:
+ tvins.item.iImage = giNoSsDevice;
+ tvins.item.iSelectedImage = giNoSsDevice;
+ break;
+
+ case BadDeviceIcon:
+ default:
+ tvins.item.iImage = giBadDevice;
+ tvins.item.iSelectedImage = giBadDevice;
+ break;
+ }
+ TreeView_SetItem(ghTreeWnd, &tvins.item);
+
+ return hti;
+}
+
+
+/*****************************************************************************
+
+WalkTreeTopDown()
+
+*****************************************************************************/
+
+VOID
+WalkTreeTopDown(
+ _In_ HTREEITEM hTreeItem,
+ _In_ LPFNTREECALLBACK lpfnTreeCallback,
+ _In_opt_ PVOID pContext,
+ _In_opt_ LPFNTREENOTIFYCALLBACK lpfnTreeNotifyCallback
+ )
+{
+ if (hTreeItem)
+ {
+ HTREEITEM hTreeChild = TreeView_GetChild(ghTreeWnd, hTreeItem);
+ HTREEITEM hTreeSibling = TreeView_GetNextSibling(ghTreeWnd, hTreeItem);
+
+ //
+ // Call the lpfnCallBack on the node itself.
+ //
+ (*lpfnTreeCallback)(ghTreeWnd, hTreeItem, pContext);
+
+ //
+ // Recursively call WalkTree on the node's first child.
+ //
+
+ if (hTreeChild)
+ {
+ WalkTreeTopDown(hTreeChild,
+ lpfnTreeCallback,
+ pContext,
+ lpfnTreeNotifyCallback);
+ }
+
+ //
+ // Recursively call WalkTree on the node's first sibling.
+ //
+ if (hTreeSibling)
+ {
+ WalkTreeTopDown(hTreeSibling,
+ lpfnTreeCallback,
+ pContext,
+ lpfnTreeNotifyCallback);
+ }
+ else
+ {
+ // If there are no more siblings, we have reached the end of
+ // list of child nodes. Call notify function
+ if (lpfnTreeNotifyCallback != NULL)
+ {
+ (*lpfnTreeNotifyCallback)(pContext);
+ }
+ }
+ }
+}
+
+/*****************************************************************************
+
+WalkTree()
+
+*****************************************************************************/
+
+VOID
+WalkTree (
+ _In_ HTREEITEM hTreeItem,
+ _In_ LPFNTREECALLBACK lpfnTreeCallback,
+ _In_opt_ PVOID pContext
+ )
+{
+ if (hTreeItem)
+ {
+ // Recursively call WalkTree on the node's first child.
+ //
+ WalkTree(TreeView_GetChild(ghTreeWnd, hTreeItem),
+ lpfnTreeCallback,
+ pContext);
+
+ //
+ // Call the lpfnCallBack on the node itself.
+ //
+ (*lpfnTreeCallback)(ghTreeWnd, hTreeItem, pContext);
+
+ //
+ //
+ // Recursively call WalkTree on the node's first sibling.
+ //
+ WalkTree(TreeView_GetNextSibling(ghTreeWnd, hTreeItem),
+ lpfnTreeCallback,
+ pContext);
+ }
+}
+
+/*****************************************************************************
+
+ExpandItem()
+
+*****************************************************************************/
+
+VOID
+ExpandItem (
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ )
+{
+ //
+ // Make this node visible.
+ //
+ UNREFERENCED_PARAMETER(pContext);
+
+ TreeView_Expand(hTreeWnd, hTreeItem, TVE_EXPAND);
+}
+
+/*****************************************************************************
+
+SaveAllInformationAsXML()
+
+Saves the entire USB tree as an XML file
+*****************************************************************************/
+HRESULT
+SaveAllInformationAsXml(
+ LPTSTR lpstrTextFileName,
+ DWORD dwCreationDisposition
+ )
+{
+ HRESULT hr = S_OK;
+
+ if (ghTreeRoot == NULL)
+ {
+ // If tree has not been populated yet, try a refresh
+ RefreshTree();
+ }
+ if (ghTreeRoot)
+ {
+ WalkTreeTopDown(ghTreeRoot, AddItemInformationToXmlView, NULL, XmlNotifyEndOfNodeList);
+
+ hr = SaveXml(lpstrTextFileName, dwCreationDisposition);
+ }
+ else
+ {
+ hr = E_FAIL;
+ OOPS();
+ }
+ ResetTextBuffer();
+ return hr;
+}
+
+//*****************************************************************************
+//
+// AddItemInformationToXmlView
+//
+// hTreeItem - Handle of selected TreeView item for which information should
+// be added to the XML View
+//
+//*****************************************************************************
+VOID
+AddItemInformationToXmlView(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ )
+{
+ TV_ITEM tvi;
+ PVOID info;
+ PCHAR tviName = NULL;
+
+ UNREFERENCED_PARAMETER(pContext);
+
+#ifdef H264_SUPPORT
+ ResetErrorCounts();
+#endif
+
+ tviName = (PCHAR) ALLOC(256);
+
+ if (NULL == tviName)
+ {
+ return;
+ }
+
+ //
+ // Get the name of the TreeView item, along with the a pointer to the
+ // info we stored about the item in the item's lParam.
+ //
+
+ tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
+ tvi.hItem = hTreeItem;
+ tvi.pszText = (LPSTR) tviName;
+ tvi.cchTextMax = 256;
+
+ TreeView_GetItem(hTreeWnd,
+ &tvi);
+
+ info = (PVOID)tvi.lParam;
+
+ if (NULL != info)
+ {
+ //
+ // Add Item to XML object
+ //
+ switch (*(PUSBDEVICEINFOTYPE)info)
+ {
+ case HostControllerInfo:
+ XmlAddHostController(tviName, (PUSBHOSTCONTROLLERINFO) info);
+ break;
+
+ case RootHubInfo:
+ XmlAddRootHub(tviName, (PUSBROOTHUBINFO) info);
+ break;
+
+ case ExternalHubInfo:
+ XmlAddExternalHub(tviName, (PUSBEXTERNALHUBINFO) info);
+ break;
+
+ case DeviceInfo:
+ XmlAddUsbDevice(tviName, (PUSBDEVICEINFO) info);
+ break;
+ }
+
+ }
+ return;
+}
+
+/*****************************************************************************
+
+DisplayLastError()
+
+*****************************************************************************/
+
+DWORD
+DisplayLastError(
+ _Inout_updates_bytes_(count) char *szString,
+ int count)
+{
+ LPVOID lpMsgBuf;
+
+ // get the last error code
+ DWORD dwError = GetLastError();
+
+ // get the system message for this error code
+ if (FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dwError,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL ))
+ {
+ StringCchPrintf(szString, count, "Error: %s", (LPTSTR)lpMsgBuf );
+ }
+
+ // Free the local buffer
+ LocalFree( lpMsgBuf );
+
+ // return the error
+ return dwError;
+}
+
+#if DBG
+
+/*****************************************************************************
+
+Oops()
+
+*****************************************************************************/
+
+VOID
+Oops
+(
+ _In_ PCHAR File,
+ ULONG Line
+ )
+{
+ char szBuf[1024];
+ LPTSTR lpMsgBuf;
+ DWORD dwGLE = GetLastError();
+
+ memset(szBuf, 0, sizeof(szBuf));
+
+ // get the system message for this error code
+ if (FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ dwGLE,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL))
+ {
+ StringCchPrintf(szBuf, sizeof(szBuf),
+ "File: %s, Line %d\r\nGetLastError 0x%x %u %s\n",
+ File, Line, dwGLE, dwGLE, lpMsgBuf);
+ }
+ else
+ {
+ StringCchPrintf(szBuf, sizeof(szBuf),
+ "File: %s, Line %d\r\nGetLastError 0x%x %u\r\n",
+ File, Line, dwGLE, dwGLE);
+ }
+ OutputDebugString(szBuf);
+
+ // Free the system allocated local buffer
+ LocalFree(lpMsgBuf);
+
+ return;
+}
+
+#endif
diff --git a/tests/projects/winsdk/usbview/uvcview.h b/tests/projects/winsdk/usbview/uvcview.h new file mode 100644 index 000000000..d5c3f5786 --- /dev/null +++ b/tests/projects/winsdk/usbview/uvcview.h @@ -0,0 +1,675 @@ +/*++
+
+Copyright (c) 1997-2008 Microsoft Corporation
+
+Module Name:
+
+ UVCVIEW.H
+
+Abstract:
+
+ This is the header file for UVCVIEW
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 04-25-97 : created
+ 04/13/2005 : major bug fixing
+
+--*/
+
+/*****************************************************************************
+ I N C L U D E S
+*****************************************************************************/
+#include <windows.h>
+#include <windowsx.h>
+#include <initguid.h>
+#include <devioctl.h>
+#include <dbt.h>
+#include <stdio.h>
+#include <commctrl.h>
+#include <usbioctl.h>
+#include <usbiodef.h>
+#include <intsafe.h>
+#include <strsafe.h>
+#include <specstrings.h>
+#include <usb.h>
+#include <usbuser.h>
+#include <basetyps.h>
+#include <wtypes.h>
+#include <objbase.h>
+#include <io.h>
+#include <conio.h>
+#include <shellapi.h>
+#include <cfgmgr32.h>
+#include <shlwapi.h>
+#include <setupapi.h>
+#include <winioctl.h>
+#include <devpkey.h>
+#include <math.h>
+
+// This is mostly a private USB Audio descriptor header
+#include "usbdesc.h"
+
+// This is the inbox USBVideo driver descriptor header (copied locally)
+#include "uvcdesc.h"
+
+/*****************************************************************************
+ P R A G M A S
+*****************************************************************************/
+
+#pragma once
+
+/*****************************************************************************
+ D E F I N E S
+*****************************************************************************/
+
+// define H264_SUPPORT to add H.264 support to uvcview.exe
+#define H264_SUPPORT
+
+#define TEXT_ITEM_LENGTH 64
+
+#ifdef DEBUG
+#undef DBG
+#define DBG 1
+#endif
+
+#if DBG
+#define OOPS() Oops(__FILE__, __LINE__)
+#else
+#define OOPS()
+#endif
+
+#if DBG
+
+#define ALLOC(dwBytes) MyAlloc(__FILE__, __LINE__, (dwBytes))
+
+#define REALLOC(hMem, dwBytes) MyReAlloc((hMem), (dwBytes))
+
+#define FREE(hMem) MyFree((hMem))
+
+#define CHECKFORLEAKS() MyCheckForLeaks()
+
+#else
+
+#define ALLOC(dwBytes) GlobalAlloc(GPTR,(dwBytes))
+
+#define REALLOC(hMem, dwBytes) GlobalReAlloc((hMem), (dwBytes), (GMEM_MOVEABLE|GMEM_ZEROINIT))
+
+#define FREE(hMem) GlobalFree((hMem))
+
+#define CHECKFORLEAKS()
+
+#endif
+
+#define DEVICE_CONFIGURATION_TEXT_LENGTH 10240
+
+#define STR_INVALID_POWER_STATE "(invalid state) "
+#define STR_UNKNOWN_CONTROLLER_FLAVOR "Unknown"
+
+FORCEINLINE
+VOID
+InitializeListHead(
+ _Out_ PLIST_ENTRY ListHead
+ )
+{
+ ListHead->Flink = ListHead->Blink = ListHead;
+}
+
+//
+// BOOLEAN
+// IsListEmpty(
+// PLIST_ENTRY ListHead
+// );
+//
+
+#define IsListEmpty(ListHead) \
+ ((ListHead)->Flink == (ListHead))
+
+//
+// PLIST_ENTRY
+// RemoveHeadList(
+// PLIST_ENTRY ListHead
+// );
+//
+
+#define RemoveHeadList(ListHead) \
+ (ListHead)->Flink;\
+ {RemoveEntryList((ListHead)->Flink)}
+
+//
+// VOID
+// RemoveEntryList(
+// PLIST_ENTRY Entry
+// );
+//
+
+#define RemoveEntryList(Entry) {\
+ PLIST_ENTRY _EX_Blink;\
+ PLIST_ENTRY _EX_Flink;\
+ _EX_Flink = (Entry)->Flink;\
+ _EX_Blink = (Entry)->Blink;\
+ _EX_Blink->Flink = _EX_Flink;\
+ _EX_Flink->Blink = _EX_Blink;\
+ }
+
+//
+// VOID
+// InsertTailList(
+// PLIST_ENTRY ListHead,
+// PLIST_ENTRY Entry
+// );
+//
+
+#define InsertTailList(ListHead,Entry) {\
+ PLIST_ENTRY _EX_Blink;\
+ PLIST_ENTRY _EX_ListHead;\
+ _EX_ListHead = (ListHead);\
+ _EX_Blink = _EX_ListHead->Blink;\
+ (Entry)->Flink = _EX_ListHead;\
+ (Entry)->Blink = _EX_Blink;\
+ _EX_Blink->Flink = (Entry);\
+ _EX_ListHead->Blink = (Entry);\
+ }
+
+// global version for USB Video Class spec version (pre-release)
+#define BCDVDC 0x0083
+
+// A.2 Video Interface Subclass Codes
+#define SC_VIDEO_INTERFACE_COLLECTION 0x03
+
+// A.3 Video Interface Protocol Codes
+#define PC_PROTOCOL_UNDEFINED 0x00
+
+// USB Video Class spec version
+#define NOT_UVC 0x0
+#define UVC10 0x100
+#define UVC11 0x110
+
+#ifdef H264_SUPPORT
+#define UVC15 0x150
+#endif
+
+#define OUTPUT_MESSAGE_MAX_LENGTH 1024
+#define MAX_DEVICE_PROP 200
+#define MAX_DRIVER_KEY_NAME 256
+
+/*****************************************************************************
+ T Y P E D E F S
+*****************************************************************************/
+
+typedef enum _TREEICON
+{
+ ComputerIcon,
+ HubIcon,
+ NoDeviceIcon,
+ GoodDeviceIcon,
+ BadDeviceIcon,
+ GoodSsDeviceIcon,
+ NoSsDeviceIcon
+} TREEICON;
+
+// Callback function for walking TreeView items
+//
+typedef VOID
+(*LPFNTREECALLBACK)(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+);
+
+
+// Callback notification function called at end of every tree depth
+typedef VOID
+(*LPFNTREENOTIFYCALLBACK)(PVOID pContext);
+
+//
+// Structure used to build a linked list of String Descriptors
+// retrieved from a device.
+//
+
+typedef struct _STRING_DESCRIPTOR_NODE
+{
+ struct _STRING_DESCRIPTOR_NODE *Next;
+ UCHAR DescriptorIndex;
+ USHORT LanguageID;
+ USB_STRING_DESCRIPTOR StringDescriptor[1];
+} STRING_DESCRIPTOR_NODE, *PSTRING_DESCRIPTOR_NODE;
+
+//
+// A collection of device properties. The device can be hub, host controller or usb device
+//
+typedef struct _USB_DEVICE_PNP_STRINGS
+{
+ PCHAR DeviceId;
+ PCHAR DeviceDesc;
+ PCHAR HwId;
+ PCHAR Service;
+ PCHAR DeviceClass;
+ PCHAR PowerState;
+} USB_DEVICE_PNP_STRINGS, *PUSB_DEVICE_PNP_STRINGS;
+
+typedef struct _DEVICE_INFO_NODE {
+ HDEVINFO DeviceInfo;
+ LIST_ENTRY ListEntry;
+ SP_DEVINFO_DATA DeviceInfoData;
+ SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
+ PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceDetailData;
+ PSTR DeviceDescName;
+ ULONG DeviceDescNameLength;
+ PSTR DeviceDriverName;
+ ULONG DeviceDriverNameLength;
+ DEVICE_POWER_STATE LatestDevicePowerState;
+} DEVICE_INFO_NODE, *PDEVICE_INFO_NODE;
+
+//
+// Structures assocated with TreeView items through the lParam. When an item
+// is selected, the lParam is retrieved and the structure it which it points
+// is used to display information in the edit control.
+//
+
+typedef enum _USBDEVICEINFOTYPE
+{
+ HostControllerInfo,
+ RootHubInfo,
+ ExternalHubInfo,
+ DeviceInfo
+} USBDEVICEINFOTYPE, *PUSBDEVICEINFOTYPE;
+
+typedef struct _USBHOSTCONTROLLERINFO
+{
+ USBDEVICEINFOTYPE DeviceInfoType;
+ LIST_ENTRY ListEntry;
+ PCHAR DriverKey;
+ ULONG VendorID;
+ ULONG DeviceID;
+ ULONG SubSysID;
+ ULONG Revision;
+ USB_POWER_INFO USBPowerInfo[6];
+ BOOL BusDeviceFunctionValid;
+ ULONG BusNumber;
+ USHORT BusDevice;
+ USHORT BusFunction;
+ PUSB_CONTROLLER_INFO_0 ControllerInfo;
+ PUSB_DEVICE_PNP_STRINGS UsbDeviceProperties;
+} USBHOSTCONTROLLERINFO, *PUSBHOSTCONTROLLERINFO;
+
+typedef struct _USBROOTHUBINFO
+{
+ USBDEVICEINFOTYPE DeviceInfoType;
+ PUSB_NODE_INFORMATION HubInfo;
+ PUSB_HUB_INFORMATION_EX HubInfoEx;
+ PCHAR HubName;
+ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps;
+ PUSB_DEVICE_PNP_STRINGS UsbDeviceProperties;
+ PDEVICE_INFO_NODE DeviceInfoNode;
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx;
+
+} USBROOTHUBINFO, *PUSBROOTHUBINFO;
+
+typedef struct _USBEXTERNALHUBINFO
+{
+ USBDEVICEINFOTYPE DeviceInfoType;
+ PUSB_NODE_INFORMATION HubInfo;
+ PUSB_HUB_INFORMATION_EX HubInfoEx;
+ PCHAR HubName;
+ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo;
+ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps;
+ PUSB_DESCRIPTOR_REQUEST ConfigDesc;
+ PUSB_DESCRIPTOR_REQUEST BosDesc;
+ PSTRING_DESCRIPTOR_NODE StringDescs;
+ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2; // NULL if root HUB
+ PUSB_DEVICE_PNP_STRINGS UsbDeviceProperties;
+ PDEVICE_INFO_NODE DeviceInfoNode;
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx;
+} USBEXTERNALHUBINFO, *PUSBEXTERNALHUBINFO;
+
+
+// HubInfo, HubName may be in USBDEVICEINFOTYPE, so they can be removed
+typedef struct
+{
+ USBDEVICEINFOTYPE DeviceInfoType;
+ PUSB_NODE_INFORMATION HubInfo; // NULL if not a HUB
+ PUSB_HUB_INFORMATION_EX HubInfoEx; // NULL if not a HUB
+ PCHAR HubName; // NULL if not a HUB
+ PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo; // NULL if root HUB
+ PUSB_PORT_CONNECTOR_PROPERTIES PortConnectorProps;
+ PUSB_DESCRIPTOR_REQUEST ConfigDesc; // NULL if root HUB
+ PUSB_DESCRIPTOR_REQUEST BosDesc; // NULL if root HUB
+ PSTRING_DESCRIPTOR_NODE StringDescs;
+ PUSB_NODE_CONNECTION_INFORMATION_EX_V2 ConnectionInfoV2; // NULL if root HUB
+ PUSB_DEVICE_PNP_STRINGS UsbDeviceProperties;
+ PDEVICE_INFO_NODE DeviceInfoNode;
+ PUSB_HUB_CAPABILITIES_EX HubCapabilityEx; // NULL if not a HUB
+} USBDEVICEINFO, *PUSBDEVICEINFO;
+
+typedef struct _STRINGLIST
+{
+#ifdef H264_SUPPORT
+ ULONGLONG ulFlag;
+#else
+ ULONG ulFlag;
+#endif
+ PCHAR pszString;
+ PCHAR pszModifier;
+
+} STRINGLIST, * PSTRINGLIST;
+
+typedef struct _DEVICE_GUID_LIST {
+ HDEVINFO DeviceInfo;
+ LIST_ENTRY ListHead;
+} DEVICE_GUID_LIST, *PDEVICE_GUID_LIST;
+
+
+/*****************************************************************************
+ G L O B A L S
+*****************************************************************************/
+
+//
+// USBVIEW.C
+//
+
+BOOL gDoConfigDesc;
+BOOL gDoAnnotation;
+BOOL gLogDebug;
+int TotalHubs;
+
+//
+// ENUM.C
+//
+
+PCHAR ConnectionStatuses[];
+
+//
+// DISPVID.C
+//
+DEFINE_GUID(YUY2_Format,0x32595559L,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71);
+DEFINE_GUID(NV12_Format,0x3231564EL,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71);
+
+#ifdef H264_SUPPORT
+DEFINE_GUID(H264_Format,0x34363248, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
+#endif
+
+// The following flags/variables are all initialized in Display.c InitializePerDeviceSettings()
+//
+// Save the default frame from the MJPEG, Uncompressed, Vendor and Frame Based Format descriptor
+// Check for this when processing the individual Frame descriptors
+UCHAR g_chMJPEGFrameDefault;
+UCHAR g_chUNCFrameDefault;
+UCHAR g_chVendorFrameDefault;
+UCHAR g_chFrameBasedFrameDefault;
+
+// Spec version of UVC device
+UINT g_chUVCversion;
+
+// Base address of the USBDEVICEINFO for device we're parsing
+PUSBDEVICEINFO CurrentUSBDeviceInfo;
+
+// Base address of the Configuration descriptor we're parsing
+PUSB_CONFIGURATION_DESCRIPTOR CurrentConfigDesc;
+
+// Length of the current configuration descriptor
+DWORD dwConfigLength;
+// Our current position from the beginning of the config descriptor
+DWORD dwConfigIndex;
+
+//
+// DISPLAY.C
+//
+int gDeviceSpeed;
+
+// Save the current Configuration starting and ending addresses
+// Used in ValidateDescAddress()
+//
+PUSB_CONFIGURATION_DESCRIPTOR g_pConfigDesc;
+PSTRING_DESCRIPTOR_NODE g_pStringDescs;
+PUCHAR g_descEnd;
+
+/*****************************************************************************
+ F U N C T I O N P R O T O T Y P E S
+*****************************************************************************/
+
+//
+// USBVIEW.C
+//
+
+HTREEITEM
+AddLeaf (
+ HTREEITEM hTreeParent,
+ LPARAM lParam,
+ _In_ LPTSTR lpszText,
+ TREEICON TreeIcon
+);
+
+VOID
+Oops
+(
+ _In_ PCHAR File,
+ ULONG Line
+);
+
+//
+// DISPLAY.C
+//
+
+EXTERN_C UINT IsIADDevice (PUSBDEVICEINFO info);
+EXTERN_C UINT IsUVCDevice (PUSBDEVICEINFO info);
+EXTERN_C PCHAR GetVendorString(USHORT idVendor);
+EXTERN_C PCHAR GetLangIDString(USHORT idLang);
+EXTERN_C UINT GetConfigurationSize (PUSBDEVICEINFO info);
+EXTERN_C PUSB_COMMON_DESCRIPTOR
+GetNextDescriptor(
+ _In_reads_bytes_(TotalLength)
+ PUSB_COMMON_DESCRIPTOR FirstDescriptor,
+ _In_
+ ULONG TotalLength,
+ _In_
+ PUSB_COMMON_DESCRIPTOR StartDescriptor,
+ _In_ long
+ DescriptorType
+ );
+
+HRESULT
+UpdateTreeItemDeviceInfo(
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem
+ );
+
+PCHAR
+GetTextBuffer(
+);
+
+BOOL
+ResetTextBuffer(
+);
+
+BOOL
+CreateTextBuffer (
+);
+
+VOID
+DestroyTextBuffer (
+);
+
+UINT
+GetTextBufferPos (
+);
+
+VOID
+UpdateEditControl (
+ HWND hEditWnd,
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem
+);
+
+
+VOID __cdecl
+AppendBuffer (
+ LPCTSTR lpFormat,
+ ...
+);
+
+VOID __cdecl
+AppendTextBuffer (
+ LPCTSTR lpFormat,
+ ...
+);
+
+VOID
+DisplayStringDescriptor (
+ UCHAR Index,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+);
+
+PCHAR
+GetStringFromList(
+ PSTRINGLIST slPowerState,
+ ULONG ulNumElements,
+
+#ifdef H264_SUPPORT
+ ULONGLONG ulFlag,
+#else
+ ULONG ulFlag,
+#endif
+ _In_ PCHAR szDefault
+ );
+
+EXTERN_C PCHAR GetPowerStateString(
+ WDMUSB_POWER_STATE powerState
+ );
+
+EXTERN_C PCHAR GetControllerFlavorString(
+ USB_CONTROLLER_FLAVOR flavor
+ );
+
+EXTERN_C ULONG GetEhciDebugPort(
+ ULONG vendorId,
+ ULONG deviceId
+ );
+
+VOID
+WalkTreeTopDown(
+ _In_ HTREEITEM hTreeItem,
+ _In_ LPFNTREECALLBACK lpfnTreeCallback,
+ _In_opt_ PVOID pContext,
+ _In_opt_ LPFNTREENOTIFYCALLBACK lpfnTreeNotifyCallback
+ );
+
+VOID RefreshTree (VOID);
+
+//
+// ENUM.C
+//
+
+VOID
+EnumerateHostControllers (
+ HTREEITEM hTreeParent,
+ ULONG *DevicesConnected
+ );
+
+
+VOID
+CleanupItem (
+ HWND hTreeWnd,
+ HTREEITEM hTreeItem,
+ PVOID pContext
+ );
+
+DEVICE_POWER_STATE
+AcquireDevicePowerState(
+ _Inout_ PDEVICE_INFO_NODE pNode
+ );
+
+_Success_(return == TRUE)
+BOOL
+GetDeviceProperty(
+ _In_ HDEVINFO DeviceInfoSet,
+ _In_ PSP_DEVINFO_DATA DeviceInfoData,
+ _In_ DWORD Property,
+ _Outptr_ LPTSTR *ppBuffer
+ );
+
+void
+ClearDeviceList(
+ PDEVICE_GUID_LIST DeviceList
+ );
+
+//
+// DEBUG.C
+//
+
+_Success_(return != NULL)
+_Post_writable_byte_size_(dwBytes)
+HGLOBAL
+MyAlloc (
+ _In_ PCHAR File,
+ ULONG Line,
+ DWORD dwBytes
+ );
+
+_Success_(return != NULL)
+_Post_writable_byte_size_(dwBytes)
+HGLOBAL
+MyReAlloc (
+ HGLOBAL hMem,
+ DWORD dwBytes
+ );
+
+HGLOBAL
+MyFree (
+ HGLOBAL hMem
+ );
+
+VOID
+MyCheckForLeaks (
+ VOID
+ );
+
+//
+// DEVNODE.C
+//
+
+
+PUSB_DEVICE_PNP_STRINGS
+DriverNameToDeviceProperties(
+ _In_reads_bytes_(cbDriverName) PCHAR DriverName,
+ _In_ size_t cbDriverName
+ );
+
+VOID FreeDeviceProperties(
+ _In_ PUSB_DEVICE_PNP_STRINGS *ppDevProps
+ );
+//
+// DISPAUD.C
+//
+
+BOOL
+DisplayAudioDescriptor (
+ PUSB_AUDIO_COMMON_DESCRIPTOR CommonDesc,
+ UCHAR bInterfaceSubClass
+ );
+
+//
+// DISPVID.C
+//
+
+BOOL
+DisplayVideoDescriptor (
+ PVIDEO_SPECIFIC VidCommonDesc,
+ UCHAR bInterfaceSubClass,
+ PSTRING_DESCRIPTOR_NODE StringDescs,
+ DEVICE_POWER_STATE LatestDevicePowerState
+ );
+
+//
+// DISPLAY.C
+//
+
+BOOL
+ValidateDescAddress (
+ PUSB_COMMON_DESCRIPTOR commonDesc
+ );
diff --git a/tests/projects/winsdk/usbview/uvcview.rc b/tests/projects/winsdk/usbview/uvcview.rc new file mode 100644 index 000000000..6c7642ce3 --- /dev/null +++ b/tests/projects/winsdk/usbview/uvcview.rc @@ -0,0 +1,152 @@ +#include <windows.h>
+#include <commctrl.h>
+#include "resource.h"
+#include <ntverp.h>
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// VERSION
+//
+#define VER_FILEDESCRIPTION_STR "Microsoft\256 Windows(TM) USB device viewer"
+#define VER_INTERNALNAME_STR "USBView"
+#define VER_ORIGINALFILENAME_STR VER_INTERNALNAME_STR
+#define VER_LEGALCOPYRIGHT_STR "Copyright \251 Microsoft Corporation 1996-2011 All Rights Reserved."
+
+#define VER_FILETYPE VFT_APP
+#define VER_FILESUBTYPE VFT2_UNKNOWN
+
+#include <common.ver>
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// ICON
+//
+IDI_ICON ICON DISCARDABLE "USB.ICO"
+IDI_BADICON ICON DISCARDABLE "BANG.ICO"
+IDI_COMPUTER ICON DISCARDABLE "MONITOR.ICO"
+IDI_HUB ICON DISCARDABLE "HUB.ICO"
+IDI_NODEVICE ICON DISCARDABLE "PORT.ICO"
+IDI_NOSSDEVICE ICON DISCARDABLE "SSPORT.ICO"
+IDI_SSICON ICON DISCARDABLE "SSUSB.ICO"
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+IDC_SPLIT CURSOR DISCARDABLE "SPLIT.CUR"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_MAINDIALOG DIALOGEX 0, 0, 415, 243
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU |
+ WS_THICKFRAME
+CAPTION "USB Device Viewer"
+MENU IDR_MENU
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Tree1",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS |
+ TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+ 0,0,120,234,WS_EX_CLIENTEDGE
+ EDITTEXT IDC_EDIT,120,0,295,234,ES_MULTILINE | ES_READONLY |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Devices Connected: 0",IDC_STATUS,"msctls_statusbar32",
+ SBARS_SIZEGRIP,
+ 0,235,415,8
+END
+
+
+IDD_ABOUT DIALOG DISCARDABLE 0, 0, 230, 117
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About USBView"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,90,100,50,14
+ LTEXT "USB Device Viewer",IDC_STATIC,54,15,104,8
+ LTEXT VER_LEGALCOPYRIGHT_STR,IDC_STATIC,54,45,145,8
+ EDITTEXT IDC_VERSION,54,60,110,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_UVCVERSION,54,75,110,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ ICON IDI_ICON,IDC_STATIC,15,15,21,20
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_MENU MENU DISCARDABLE
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Refresh\tF5", ID_REFRESH
+ MENUITEM SEPARATOR
+ MENUITEM "Save Current &View ..." ID_SAVE
+ MENUITEM "Save As (&txt) ...", ID_SAVEALL
+ MENUITEM "Save As (&xml) ...\tF2", ID_SAVEXML
+ MENUITEM SEPARATOR
+
+ MENUITEM "E&xit", ID_EXIT
+ END
+ POPUP "&Options"
+ BEGIN
+ MENUITEM "&Auto Refresh", ID_AUTO_REFRESH, CHECKED
+ MENUITEM "Show &Config Descriptors", ID_CONFIG_DESCRIPTORS, CHECKED
+ MENUITEM SEPARATOR
+// MENUITEM "&Show Description Annotations", ID_ANNOTATION, CHECKED
+ MENUITEM "&Log to debugger", ID_LOG_DEBUG
+ END
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&About", ID_ABOUT
+ END
+END
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDACCEL ACCELERATORS DISCARDABLE
+BEGIN
+ VK_F5, ID_REFRESH, VIRTKEY,NOINVERT
+ VK_F2, ID_SAVEXML, VIRTKEY,NOINVERT
+END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_STRINGBASE "Base string"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STANDARD_FONT "Courier"
+ IDS_STANDARD_FONT_HEIGHT "\13"
+ IDS_STANDARD_FONT_WIDTH "\8"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_USBVIEW_USAGE "usbview usage:\nusbview [/?]\n\t/? - this usage message.\
+ \n\t/q quiet mode, does not display 'Press any key to continue ...\n\t\
+ \nusbview [/q] [/f] /saveall:<filename.txt>\
+ \n\tsaveall - saves the USB tree view as a text file\
+ \n\t/f - overwrite file if it already exists\n\nusbview [/q] [/f] /savexml:<filename.xml>\
+ \n\tsavexml - saves the USB tree view as a xml file\n\t/f - overwrite file if it already exists\n\n"
+ IDS_USBVIEW_PRESSKEY "Press any key to continue ...\n"
+ IDS_USBVIEW_INVALIDARG "Invalid argument: [%1]\n"
+ IDS_USBVIEW_FILE_EXISTS_TXT "File: [%1] already exists, try `usbview /f /saveall:[%1]` to force overwrite\n"
+ IDS_USBVIEW_FILE_EXISTS_XML "File: [%1] already exists, try `usbview /f /savexml:[%1]` to force overwrite\n"
+ IDS_USBVIEW_INTERNAL_ERROR "An internal error occured, please report this as a bug\n"
+ IDS_USBVIEW_SAVED_TO "Usbview information saved to file : [%1]\n"
+ IDS_USBVIEW_INVALID_FILENAME "The argument : [%1] is invalid or incomplete.\n"
+END
+
diff --git a/tests/projects/winsdk/usbview/vndrlist.h b/tests/projects/winsdk/usbview/vndrlist.h new file mode 100644 index 000000000..ccf21267b --- /dev/null +++ b/tests/projects/winsdk/usbview/vndrlist.h @@ -0,0 +1,11036 @@ +/*++
+
+Copyright (c) 1997-2008 Microsoft Corporation
+
+Module Name:
+
+ VNDRLIST.H
+
+Abstract:
+
+ This header file contains a list of all currently known USB Vendor IDs
+ and the vendor name associated with each Vendor ID.
+
+Source:
+
+ http://www.usb.org
+
+Environment:
+
+ Kernel & user mode
+
+Revision History:
+
+ 04-25-97 : created
+ 03-28-03 : refreshed with latest list from usb.org
+ 05-04-05 : refreshed with latest list from usb.org
+ 05-02-07 : refreshed with latest list from usb.org
+ 03-19-08 : refreshed with latest list from usb.org
+
+--*/
+
+#ifndef __VNDRLIST_H__
+#define __VNDRLIST_H__
+
+//
+// Vendor ID structure
+//
+typedef struct _VENDOR_ID {
+ USHORT usVendorID;
+ PCHAR szVendor;
+} VENDOR_ID, *PVENDOR_ID;
+
+//
+// This list built from information obtained from
+// http://www.usb.org/developers/tools/
+//
+// This information has not been independently verified and no claims
+// are made here as to its accuracy.
+//
+// 10978 total
+//
+VENDOR_ID USBVendorIDs[] =
+{
+ { 0x0079, "Shenzhen Longshengwei Technology, Co., Ltd." },
+ { 0x013A, "Aimgene Technology Co., Ltd" },
+ { 0x03CC, "GN OTOMETRICS" },
+ { 0x03E8, "EndPoints Inc." },
+ { 0x03E9, "Thesys Microelectronics" },
+ { 0x03EA, "Data Broadcasting Corp." },
+ { 0x03EB, "Atmel Corporation" },
+ { 0x03EC, "Iwatsu America Inc." },
+ { 0x03ED, "Mitel Corporation" },
+ { 0x03EE, "Mitsumi" },
+ { 0x03F0, "HP Inc." },
+ { 0x03F1, "Genoa Technology" },
+ { 0x03F2, "Oak Technology, Inc" },
+ { 0x03F3, "Adaptec, Inc." },
+ { 0x03F4, "Diebold, Inc." },
+ { 0x03F5, "Siemens Electromechanical" },
+ { 0x03F7, "Tulip Computers International" },
+ { 0x03F8, "Epson Imaging Technology Center" },
+ { 0x03F9, "KeyTronic Corp." },
+ { 0x03FB, "OPTi Inc." },
+ { 0x03FC, "Elitegroup Computer Systems" },
+ { 0x03FD, "Xilinx Inc." },
+ { 0x03FE, "Farallon Comunications" },
+ { 0x03FF, "Weitek Corporation" },
+ { 0x0400, "National Semiconductor" },
+ { 0x0401, "National Registry Inc." },
+ { 0x0402, "ALi Corporation" },
+ { 0x0403, "Future Technology Devices International Limited" },
+ { 0x0404, "NCR Corporation" },
+ { 0x0405, "inSilicon" },
+ { 0x0406, "Fujitsu-ICL Computers" },
+ { 0x0407, "Fujitsu Personal Systems, Inc." },
+ { 0x0408, "Quanta Computer Inc." },
+ { 0x0409, "NEC Corporation" },
+ { 0x040A, "Eastman Kodak Company" },
+ { 0x040B, "Weltrend Semiconductor" },
+ { 0x040C, "VTech Computers Ltd" },
+ { 0x040D, "VIA Technologies, Inc." },
+ { 0x040E, "MCCI Corporation" },
+ { 0x040F, "Echo Speech Corporation" },
+ { 0x0410, "Isis Distributed Systems, Inc." },
+ { 0x0411, "BUFFALO INC." },
+ { 0x0412, "Award Software International" },
+ { 0x0413, "Leadtek Research Inc." },
+ { 0x0414, "Giga-Byte Technology Co., Ltd." },
+ { 0x0416, "Nuvoton Technology Corp." },
+ { 0x0417, "Symbios, Inc." },
+ { 0x0418, "AST Research" },
+ { 0x0419, "Samsung Info. Systems America Inc." },
+ { 0x041A, "Phoenix Technologies Ltd." },
+ { 0x041B, "d'TV" },
+ { 0x041D, "S3 Incorporated" },
+ { 0x041E, "Creative Labs" },
+ { 0x041F, "LCS Telegraphics" },
+ { 0x0420, "Chips and Technologies" },
+ { 0x0421, "Nokia Corporation" },
+ { 0x0422, "ADI Systems Inc." },
+ { 0x0423, "CATC" },
+ { 0x0424, "Microchip-SMSC" },
+ { 0x0425, "Freescale Semiconductor Hong Kong Limited" },
+ { 0x0426, "Integrated Device Technology" },
+ { 0x0427, "Motorola Electronics Taiwan Ltd." },
+ { 0x0428, "Advanced Gravis Computer Ltd." },
+ { 0x0429, "Cirrus Logic Inc." },
+ { 0x042A, "Ericsson Austrian, AG" },
+ { 0x042C, "Innovative Semiconductors, Inc." },
+ { 0x042D, "Micronics" },
+ { 0x042E, "Acer, Inc.(2)" },
+ { 0x042F, "Molex Inc." },
+ { 0x0430, "Fujitsu Component Limited" },
+ { 0x0431, "ITAC Systems, Inc." },
+ { 0x0432, "Unisys Corp." },
+ { 0x0433, "Alps Electric Inc." },
+ { 0x0434, "Samsung Info. Systems America Inc.(2)" },
+ { 0x0435, "Hyundai Electronics America" },
+ { 0x0436, "Taugagreining HF" },
+ { 0x0437, "Framatome Connectors USA" },
+ { 0x0438, "Advanced Micro Devices" },
+ { 0x0439, "Voice Technologies Group" },
+ { 0x043C, "Lucid Designs" },
+ { 0x043D, "Lexmark International Inc." },
+ { 0x043E, "LG Electronics USA Inc." },
+ { 0x043F, "RadiSys Corporation" },
+ { 0x0440, "EIZO NANAO CORPORATION" },
+ { 0x0441, "Winbond Systems Lab." },
+ { 0x0442, "Cygnion Corp." },
+ { 0x0443, "Gateway 2000" },
+ { 0x0445, "Agere Systems" },
+ { 0x0446, "NMB Technologies Corporation" },
+ { 0x0447, "Momentum Microsystems" },
+ { 0x0449, "Eldim" },
+ { 0x044A, "Shamrock Technology Co., Ltd." },
+ { 0x044B, "WSI" },
+ { 0x044C, "CCL/ITRI" },
+ { 0x044D, "Siemens Nixdorf AG" },
+ { 0x044E, "Alps Electric Co., Ltd." },
+ { 0x044F, "ThrustMaster, Inc." },
+ { 0x0450, "DFI Inc." },
+ { 0x0451, "Texas Instruments" },
+ { 0x0452, "Mitsubishi Electric & Electronics US, Inc." },
+ { 0x0453, "CMD Technology" },
+ { 0x0454, "Vobis Microcomputer AGO" },
+ { 0x0455, "Telematics International, Inc." },
+ { 0x0456, "Analog Devices, Inc." },
+ { 0x0457, "Silicon Integrated Systems Corp." },
+ { 0x0458, "KYE Systems Corp." },
+ { 0x0459, "Adobe Systems, Inc." },
+ { 0x045A, "SONICblue Incorporated" },
+ { 0x045B, "Renesas Electronics Corp." },
+ { 0x045D, "Nortel Networks" },
+ { 0x045E, "Microsoft Corporation" },
+ { 0x0460, "Ace Cad Enterprise Co., Ltd." },
+ { 0x0461, "Primax Electronics" },
+ { 0x0463, "EATON" },
+ { 0x0464, "AMP/Tycoelectronics" },
+ { 0x0465, "Pacific Micro Computing" },
+ { 0x0467, "AT&T Paradyne" },
+ { 0x0468, "Wieson Technologies Co., Ltd." },
+ { 0x046A, "CHERRY" },
+ { 0x046B, "American Megatrends" },
+ { 0x046C, "Toshiba Corporation, Digital Media Network Company" },
+ { 0x046D, "Logitech Inc." },
+ { 0x046E, "Behavior Tech Computer Corporation" },
+ { 0x046F, "Crystal Semiconductor" },
+ { 0x0471, "Philips Consumer Lifestyle BV" },
+ { 0x0472, "Oracle" },
+ { 0x0473, "Sanyo Information Business Co., Ltd." },
+ { 0x0474, "Sanyo Electric Co. Ltd." },
+ { 0x0475, "TECO Electric & Machinery Co., Ltd." },
+ { 0x0476, "AESP" },
+ { 0x0477, "Seagate Technology" },
+ { 0x0478, "Connectix Corp." },
+ { 0x0479, "Advanced Peripheral Laboratories" },
+ { 0x047A, "Semtech Corporation" },
+ { 0x047B, "Silitek Corp." },
+ { 0x047D, "Kensington" },
+ { 0x047E, "Avago Technologies Inc." },
+ { 0x047F, "Plantronics, Inc." },
+ { 0x0480, "Toshiba America Info. Systems, Inc." },
+ { 0x0481, "Zenith Data Systems" },
+ { 0x0482, "Kyocera Corporation" },
+ { 0x0483, "STMicroelectronics" },
+ { 0x0484, "Specialix" },
+ { 0x0485, "Nokia Monitors" },
+ { 0x0486, "ASUS Computers Inc." },
+ { 0x0487, "Stewart Connector" },
+ { 0x0488, "Cirque Corporation" },
+ { 0x0489, "Foxconn - Hon Hai" },
+ { 0x048A, "S-MOS Systems, Inc." },
+ { 0x048C, "Alps Electric Ireland Ltd." },
+ { 0x048D, "ITE Tech Inc." },
+ { 0x048F, "Eicon Tech." },
+ { 0x0490, "United Microelectronic Corporation (UMC)" },
+ { 0x0491, "Capetronic Kaohsiung Corp." },
+ { 0x0492, "Samsung Semiconductor, Inc." },
+ { 0x0493, "MAG Technology Co., Ltd." },
+ { 0x0495, "ESS Technology, Inc." },
+ { 0x0496, "Micron Electronics" },
+ { 0x0497, "Smile International, Inc." },
+ { 0x0498, "Capetronic (Kaohsiung) Corp." },
+ { 0x0499, "Yamaha Corporation" },
+ { 0x049A, "Gandalf Technologies Ltd." },
+ { 0x049B, "Curtis Computer Products" },
+ { 0x049C, "Acer Advanced Labs, Inc." },
+ { 0x049D, "VLSI Technology, Inc." },
+ { 0x049F, "Compaq Computer Corporation" },
+ { 0x04A0, "Digital Equipment Corp." },
+ { 0x04A1, "SystemSoft Corporation" },
+ { 0x04A2, "FirePower Systems" },
+ { 0x04A3, "Trident Microsystems Inc." },
+ { 0x04A4, "Hitachi, Ltd." },
+ { 0x04A5, "BenQ Corporation" },
+ { 0x04A6, "Nokia Display Products" },
+ { 0x04A7, "Visioneer" },
+ { 0x04A8, "Multivideo Labs, Inc." },
+ { 0x04A9, "Canon Inc." },
+ { 0x04AA, "Daewoo Teletech Co., Ltd." },
+ { 0x04AB, "Chromatic Research" },
+ { 0x04AC, "Micro Audiometrics Corp." },
+ { 0x04AD, "Dooin Electronics" },
+ { 0x04AE, "Brooktree Corporation" },
+ { 0x04AF, "Winnov L.P." },
+ { 0x04B0, "Nikon Corporation" },
+ { 0x04B1, "Pan International" },
+ { 0x04B3, "IBM Corporation" },
+ { 0x04B4, "Cypress Semiconductor" },
+ { 0x04B5, "ROHM Co., Ltd." },
+ { 0x04B6, "Hint Corporation" },
+ { 0x04B7, "Compal Electronics, Inc." },
+ { 0x04B8, "Seiko Epson Corp." },
+ { 0x04B9, "SafeNet, Inc." },
+ { 0x04BA, "Toucan Systems Limited" },
+ { 0x04BB, "I-O Data Device, Inc." },
+ { 0x04BC, "Digital Systems Associates" },
+ { 0x04BD, "Toshiba Electronics Taiwan Corp." },
+ { 0x04BE, "Telia Research AB" },
+ { 0x04BF, "TDK Corporation" },
+ { 0x04C2, "Methode Electronics Far East Pte Ltd." },
+ { 0x04C3, "Maxi Switch, Inc." },
+ { 0x04C4, "Lockheed Martin Energy Research" },
+ { 0x04C5, "Fujitsu Ltd." },
+ { 0x04C6, "Toshiba America Electronic Components" },
+ { 0x04C7, "Micro Macro Technologies" },
+ { 0x04C8, "Konica Corporation" },
+ { 0x04CA, "Lite-On Technology Corp." },
+ { 0x04CB, "FUJIFILM Corporation" },
+ { 0x04CC, "ST-Ericsson" },
+ { 0x04CD, "Tatung Company of America, Inc." },
+ { 0x04CE, "ScanLogic Corporation" },
+ { 0x04CF, "Myson Century, Inc." },
+ { 0x04D0, "Digi International" },
+ { 0x04D1, "ITT Cannon" },
+ { 0x04D2, "Altec Lansing Technologies, Inc." },
+ { 0x04D3, "VidUS, Inc." },
+ { 0x04D4, "LSI Logic Inc." },
+ { 0x04D5, "Forte Technologies, Inc." },
+ { 0x04D6, "Mentor Graphics" },
+ { 0x04D7, "Oki Semiconductor" },
+ { 0x04D8, "Microchip Technology Inc." },
+ { 0x04D9, "Holtek Semiconductor, Inc." },
+ { 0x04DA, "Panasonic Corporation" },
+ { 0x04DB, "Hypertec Ltd." },
+ { 0x04DC, "Huan Hsin Holdings Ltd." },
+ { 0x04DD, "Sharp Corporation" },
+ { 0x04DE, "MindShare, Inc." },
+ { 0x04DF, "ePadLink" },
+ { 0x04E1, "Iiyama Corporation" },
+ { 0x04E2, "Exar Corporation" },
+ { 0x04E3, "Zilog" },
+ { 0x04E4, "ACC Microelectronics" },
+ { 0x04E5, "Promise Technology" },
+ { 0x04E6, "Identiv, Inc." },
+ { 0x04E7, "Elo TouchSystems" },
+ { 0x04E8, "Samsung Electronics Co., Ltd." },
+ { 0x04E9, "PC-Tel, Inc." },
+ { 0x04EA, "Sipex Corporation" },
+ { 0x04EB, "Northstar Systems Corp." },
+ { 0x04EC, "Tokyo Electron Device Limited" },
+ { 0x04ED, "Annabooks" },
+ { 0x04EF, "Pacific Electronic International, Inc." },
+ { 0x04F0, "Daewoo Electronics Co., Ltd." },
+ { 0x04F1, "Victor Company of Japan, Limited" },
+ { 0x04F2, "Chicony Electronics Co., Ltd." },
+ { 0x04F3, "ELAN Microelectronics Corportation" },
+ { 0x04F4, "Harting Elektronik Inc." },
+ { 0x04F5, "Fujitsu-ICL Systems, Inc." },
+ { 0x04F6, "Norand Corporation" },
+ { 0x04F7, "Newnex Technology Corp." },
+ { 0x04F8, "FuturePlus Systems" },
+ { 0x04F9, "Brother Industries, Ltd." },
+ { 0x04FA, "Dallas Semiconductor" },
+ { 0x04FB, "Biostar Microtech Int'l Corp." },
+ { 0x04FC, "SUNPLUS TECHNOLOGY CO., LTD." },
+ { 0x04FD, "Soliton Systems K.K." },
+ { 0x04FE, "PFU Limited" },
+ { 0x04FF, "E-CMOS Corp." },
+ { 0x0500, "Siam United Hi-Tech" },
+ { 0x0501, "Fujikura/DDK" },
+ { 0x0502, "Acer, Inc." },
+ { 0x0503, "Hitachi America Ltd." },
+ { 0x0504, "Hayes Microcomputer Products" },
+ { 0x0505, "Digital Home Corporation" },
+ { 0x0506, "3Com Corporation" },
+ { 0x0507, "Hosiden Corporation" },
+ { 0x0508, "Clarion Co., Ltd." },
+ { 0x0509, "Aztech Systems Ltd" },
+ { 0x050A, "Cinch Connectors" },
+ { 0x050B, "Cable System International" },
+ { 0x050C, "InnoMedia, Inc." },
+ { 0x050D, "Belkin International, Inc." },
+ { 0x050E, "Neon Technology, Inc." },
+ { 0x050F, "KC Technology Inc." },
+ { 0x0510, "Sejin Electron Inc." },
+ { 0x0511, "N*ABLE Technologies, Inc (Data Book)" },
+ { 0x0512, "Hualon Microelectronics Corp." },
+ { 0x0513, "digital-X, Inc." },
+ { 0x0514, "FCI Electronics" },
+ { 0x0515, "ACTC" },
+ { 0x0516, "Longwell Electronics/Longwell Company" },
+ { 0x0517, "Butterfly Communications" },
+ { 0x0518, "EzKEY Corp." },
+ { 0x0519, "Star Micronics Co., LTD" },
+ { 0x051A, "WYSE Technology" },
+ { 0x051C, "Shuttle Inc." },
+ { 0x051D, "American Power Conversion" },
+ { 0x051E, "Scientific Atlanta, Inc." },
+ { 0x051F, "IO Systems Inc." },
+ { 0x0520, "Taiwan Semiconductor Manufacturing Co." },
+ { 0x0521, "Airborn Connectors" },
+ { 0x0522, "ACON, Advanced-Connectek, Inc." },
+ { 0x0523, "ATEN GMBH" },
+ { 0x0524, "Sola Electronics" },
+ { 0x0525, "PLX Technology, Inc." },
+ { 0x0526, "Temic MHS S.A." },
+ { 0x0527, "ALTRA" },
+ { 0x0528, "ATI Technologies, Inc." },
+ { 0x0529, "SafeNet Data Security (Israel) Ltd." },
+ { 0x052A, "Crescent Heart Software" },
+ { 0x052B, "Tekom Technologies, Inc" },
+ { 0x052C, "Canon Development Americas" },
+ { 0x052D, "Avid Electronics Corp." },
+ { 0x052E, "Standard Microsystems Corp. (1)" },
+ { 0x052F, "Unicore Software, Inc." },
+ { 0x0530, "American Microsystems Inc." },
+ { 0x0531, "Wacom Technology Corp." },
+ { 0x0532, "Systech Corporation" },
+ { 0x0533, "Alcatel Mobile Phones" },
+ { 0x0534, "Motorola" },
+ { 0x0535, "LIH TZU Electric Co., Ltd." },
+ { 0x0536, "Hand Held Products (Honeywell International Inc.)" },
+ { 0x0537, "Inventec Corporation" },
+ { 0x0538, "The SCO Group" },
+ { 0x0539, "Shyh Shiun Terminals Co. LTD" },
+ { 0x053A, "Preh KeyTec GmbH" },
+ { 0x053B, "Global Village Communication" },
+ { 0x053C, "Institut of Microelectronic & Mechatronic Systems" },
+ { 0x053D, "Silicon Architect" },
+ { 0x053E, "Mobility Electronics" },
+ { 0x053F, "Synopsys, Inc." },
+ { 0x0540, "UniAccess AB" },
+ { 0x0541, "Sirf Technology, Inc" },
+ { 0x0542, "MICOM Communications Corp." },
+ { 0x0543, "ViewSonic Corporation" },
+ { 0x0544, "Cristie Electronics Ltd." },
+ { 0x0545, "Veo" },
+ { 0x0546, "Polaroid Corporation" },
+ { 0x0547, "Anchor Chips Inc." },
+ { 0x0548, "Tyan Computer Corp." },
+ { 0x0549, "Pixera Corporation" },
+ { 0x054A, "Fujitsu Microelectronics, Inc." },
+ { 0x054B, "New Media Corporation" },
+ { 0x054C, "Sony Corporation" },
+ { 0x054D, "Try Corporation" },
+ { 0x054E, "Proside Corporation" },
+ { 0x054F, "WYSE Technology Taiwan" },
+ { 0x0550, "Fuji Xerox Co., Ltd." },
+ { 0x0551, "CompuTrend Systems, Inc." },
+ { 0x0552, "Philips Monitors" },
+ { 0x0553, "STMicroelectronics Imaging Division" },
+ { 0x0554, "Dictaphone Corp." },
+ { 0x0555, "ANAM S&T Co., Ltd." },
+ { 0x0556, "Asahi Kasei Microdevices Corporation" },
+ { 0x0557, "ATEN International Co. Ltd." },
+ { 0x0558, "Truevision, Inc." },
+ { 0x0559, "Cadence Design Systems, Inc." },
+ { 0x055A, "Kenwood USA" },
+ { 0x055B, "KnowledgeTek, Inc." },
+ { 0x055C, "Proton Electronic Ind." },
+ { 0x055D, "Samsung Electro-Mechanics Co." },
+ { 0x055E, "Optoma Corporation" },
+ { 0x055F, "Mustek Systems Inc." },
+ { 0x0560, "Interface Corporation" },
+ { 0x0561, "Oasis Design, Inc." },
+ { 0x0562, "Telex Communications Inc." },
+ { 0x0563, "Immersion Corporation" },
+ { 0x0564, "Kodak Digital Product Center, Japan Ltd." },
+ { 0x0565, "Peracom Networks, Inc." },
+ { 0x0566, "Monterey International Corp." },
+ { 0x0567, "Xyratex" },
+ { 0x0568, "Quartz Ingenierie" },
+ { 0x0569, "SegaSoft" },
+ { 0x056A, "WACOM Co., Ltd." },
+ { 0x056B, "Decicon Incorporated" },
+ { 0x056C, "Belkin Research & Development" },
+ { 0x056D, "EIZO Corporation" },
+ { 0x056E, "Elecom Co., Ltd." },
+ { 0x056F, "Korea Data Systems Co., Ltd." },
+ { 0x0570, "Epson America" },
+ { 0x0571, "XLR8, Inc." },
+ { 0x0572, "Conexant Systems, Inc." },
+ { 0x0573, "Zoran Corporation" },
+ { 0x0574, "City University of Hong Kong" },
+ { 0x0575, "Philips Creative Display Solutions" },
+ { 0x0576, "BAFO/Quality Computer Accessories" },
+ { 0x0577, "ELSA" },
+ { 0x0578, "Intrinsix Corp." },
+ { 0x0579, "GVC Corporation" },
+ { 0x057A, "Samsung Electronics America" },
+ { 0x057B, "Y-E Data, Inc." },
+ { 0x057C, "AVM GmbH" },
+ { 0x057D, "Shark Multimedia Inc." },
+ { 0x057E, "Nintendo Co., Ltd." },
+ { 0x057F, "QuickShot Limited" },
+ { 0x0580, "Denron Inc." },
+ { 0x0581, "Racal Data Group" },
+ { 0x0582, "Roland Corporation" },
+ { 0x0583, "Padix Co., Ltd." },
+ { 0x0584, "RATOC Systems, Inc." },
+ { 0x0585, "FlashPoint Technology, Inc." },
+ { 0x0586, "ZyXEL Communications Corp" },
+ { 0x0587, "Matsushita Kotobuki Electronics Industries America" },
+ { 0x0588, "Sapien Design" },
+ { 0x0589, "Victron" },
+ { 0x058A, "Nohau Corporation" },
+ { 0x058B, "Infineon Technologies" },
+ { 0x058C, "In Focus Systems" },
+ { 0x058D, "Micrel Semiconductor" },
+ { 0x058E, "Tripath Technology Inc." },
+ { 0x058F, "Alcor Micro, Corp." },
+ { 0x0590, "OMRON Corporation" },
+ { 0x0591, "Questra Consulting" },
+ { 0x0592, "Powerware Corporation" },
+ { 0x0593, "Incite" },
+ { 0x0594, "Princeton Graphic Systems" },
+ { 0x0595, "Zoran Microelectronics Ltd." },
+ { 0x0596, "3M Touch Systems" },
+ { 0x0597, "Trisignal Communications" },
+ { 0x0598, "Niigata Canotec Co., Inc." },
+ { 0x0599, "Brilliance Semiconductor Inc." },
+ { 0x059A, "Spectrum Signal Processing Inc." },
+ { 0x059B, "Iomega Corporation" },
+ { 0x059C, "A-Trend Technology Co., Ltd." },
+ { 0x059D, "Advanced Input Devices" },
+ { 0x059E, "Intelligent Instrumentation" },
+ { 0x059F, "LaCie" },
+ { 0x05A0, "Vetronix Corporation" },
+ { 0x05A1, "UKC Electronics Corporation" },
+ { 0x05A2, "Fuji Film Microdevices Co. Ltd." },
+ { 0x05A3, "TransDimension-NH LLC" },
+ { 0x05A4, "Ortek Technology, Inc." },
+ { 0x05A5, "Sampo Technology Corp." },
+ { 0x05A6, "Cisco Systems, Inc." },
+ { 0x05A7, "Bose Corporation" },
+ { 0x05A8, "Spacetec IMC Corporation" },
+ { 0x05A9, "OmniVision Technologies, Inc." },
+ { 0x05AA, "Utilux South China Ltd." },
+ { 0x05AB, "In-System Design" },
+ { 0x05AC, "Apple" },
+ { 0x05AD, "Y.C. Cable U.S.A., Inc" },
+ { 0x05AE, "Synopsys, Inc.(2)" },
+ { 0x05AF, "Sunrex Technology Corp." },
+ { 0x05B0, "Fountain Technologies, Inc" },
+ { 0x05B1, "First International Computer, Inc." },
+ { 0x05B2, "Focus Electronics" },
+ { 0x05B4, "HYUNDAI Electronics Industries Co., Ltd." },
+ { 0x05B5, "Dialogic Corp" },
+ { 0x05B6, "Proxima Corporation" },
+ { 0x05B7, "Medianix Semiconductor, Inc." },
+ { 0x05B8, "Sysgration" },
+ { 0x05B9, "Philips Research Laboratories" },
+ { 0x05BA, "DigitalPersona, Inc." },
+ { 0x05BB, "Grey Cell Systems" },
+ { 0x05BD, "RAFI GmbH & Co. KG" },
+ { 0x05BE, "Tyco Electronics Corp., a TE Connectivity Ltd. company" },
+ { 0x05BF, "S & S Research" },
+ { 0x05C0, "Keil Software" },
+ { 0x05C1, "MegaChips Corporation" },
+ { 0x05C2, "Media Phonics (Suisse) S.A." },
+ { 0x05C3, "VME Microsystems" },
+ { 0x05C5, "Digi International Inc." },
+ { 0x05C6, "Qualcomm, Inc" },
+ { 0x05C7, "Qtronix Corp" },
+ { 0x05C8, "Foxlink/Cheng Uei Precision Industry Co., Ltd" },
+ { 0x05C9, "Semtech" },
+ { 0x05CA, "Ricoh Company Ltd." },
+ { 0x05CB, "PowerVision Technologies Inc." },
+ { 0x05CC, "Neue ELSA GmbH" },
+ { 0x05CD, "Silicom LTD." },
+ { 0x05CE, "sci-worx GmbH" },
+ { 0x05CF, "Sung Forn Co. LTD." },
+ { 0x05D0, "GE Medical Systems Lunar" },
+ { 0x05D1, "Brainboxes Limited" },
+ { 0x05D2, "Wave Systems Corp." },
+ { 0x05D3, "Tohoku Ricoh Co., Ltd." },
+ { 0x05D5, "Super Gate Technology Co., LTD" },
+ { 0x05D6, "Philips Semiconductors, CICT" },
+ { 0x05D7, "Thomas & Betts" },
+ { 0x05D8, "Ultima Electronics Corp." },
+ { 0x05D9, "TPG IPB, Inc." },
+ { 0x05DA, "Microtek International Inc." },
+ { 0x05DB, "Sun Corporation" },
+ { 0x05DC, "Lexar Media, Inc." },
+ { 0x05DD, "Delta Electronics Inc." },
+ { 0x05DE, "Crucial Technology" },
+ { 0x05DF, "Silicon Vision Inc." },
+ { 0x05E0, "Symbol Technologies" },
+ { 0x05E1, "Syntek Semiconductor Co., Ltd." },
+ { 0x05E2, "ElecVision Inc." },
+ { 0x05E3, "Genesys Logic, Inc." },
+ { 0x05E4, "Red Wing Corporation" },
+ { 0x05E5, "Fuji Electric Co., Ltd." },
+ { 0x05E6, "Keithley Instruments" },
+ { 0x05E7, "EIZO Nanao Technologies Inc." },
+ { 0x05E8, "ICC, Inc." },
+ { 0x05E9, "Kawasaki Microelectronics America, Inc." },
+ { 0x05EA, "Evergreen Systems International" },
+ { 0x05EB, "FFC Limited" },
+ { 0x05EC, "COM21, Inc." },
+ { 0x05EE, "Cytechinfo Inc." },
+ { 0x05EF, "Anko Electronic Co., Ltd." },
+ { 0x05F0, "Canopus Co., Ltd." },
+ { 0x05F2, "Dexin Corporation, Ltd." },
+ { 0x05F3, "PI Engineering, Inc." },
+ { 0x05F4, "Davis AS" },
+ { 0x05F5, "Unixtar Technology Inc." },
+ { 0x05F6, "Envision Peripherals, Inc." },
+ { 0x05F7, "Silicon Portals Inc." },
+ { 0x05F8, "Phase Metrics" },
+ { 0x05F9, "Datalogic ADC" },
+ { 0x05FA, "Siemens Telecommunications Systems Limited" },
+ { 0x05FC, "Harman Multimedia" },
+ { 0x05FD, "STD Manufacturing Ltd." },
+ { 0x05FE, "CHIC TECHNOLOGY CORP" },
+ { 0x05FF, "LeCroy Corporation" },
+ { 0x0600, "Barco" },
+ { 0x0601, "Jazz Hipster Corporation" },
+ { 0x0602, "Vista Imaging Inc." },
+ { 0x0603, "Novatek Microelectronics Corp." },
+ { 0x0604, "Jean Co, Ltd." },
+ { 0x0605, "Anchor C&C Co., Ltd." },
+ { 0x0606, "Royal Information Electronics Co., Ltd." },
+ { 0x0607, "Bridge Information Co., Ltd." },
+ { 0x0608, "Genrad Ads" },
+ { 0x0609, "SMK Manufacturing Inc." },
+ { 0x060A, "Worth Data, Inc." },
+ { 0x060B, "Solid Year Co., LTD." },
+ { 0x060C, "EEH Datalink Gmbh" },
+ { 0x060D, "Auctor Corporation" },
+ { 0x060E, "Transmonde Technologies, Inc." },
+ { 0x060F, "Joinsoon Electronics Mfg. Co., Ltd." },
+ { 0x0610, "Costar Electronics Inc." },
+ { 0x0611, "JVCKENWOOD Nagaoka Corp." },
+ { 0x0612, "TV Interactive Corp." },
+ { 0x0613, "TransAct Technologies Incorporated" },
+ { 0x0614, "Bio-Rad Laboratories" },
+ { 0x0615, "Quabbin Wire & Cable Co., INC." },
+ { 0x0616, "Future Techno Designs PVT. LTD." },
+ { 0x0617, "Swiss Federal Institute of Technology" },
+ { 0x0618, "Chia Shin Technology Corp." },
+ { 0x0619, "Seiko Instruments Inc." },
+ { 0x061A, "Veridicom2" },
+ { 0x061B, "Promptus Communications, Inc." },
+ { 0x061C, "Act Labs, Ltd." },
+ { 0x061D, "Quatech, Inc." },
+ { 0x061E, "Nissei Electric Co." },
+ { 0x0620, "Alaris, Inc." },
+ { 0x0621, "ODU-Steckverbindungssysteme GmbH & Co. KG" },
+ { 0x0622, "Iotech, Inc." },
+ { 0x0623, "Littelfuse, Inc." },
+ { 0x0624, "Avocent Corporation" },
+ { 0x0625, "TiMedia Technology Co., Ltd." },
+ { 0x0626, "Nippon Systems Development Co., Ltd." },
+ { 0x0627, "Adomax Technology Co., Ltd." },
+ { 0x0628, "Tasking Software Inc." },
+ { 0x0629, "Zida Technologies Limited" },
+ { 0x062A, "MosArt Semiconductor Corp." },
+ { 0x062B, "Greatlink Electronics Taiwan Ltd." },
+ { 0x062C, "Institute for Information Industry" },
+ { 0x062D, "Taiwan Tai-Hao Enterprises Co. Ltd." },
+ { 0x062E, "JPC-MAIN SUPER Inc." },
+ { 0x062F, "Sin Sheng Terminal & Machine Inc." },
+ { 0x0630, "ORL" },
+ { 0x0631, "JUJO Electronics Corporation" },
+ { 0x0632, "Marquette Medical Systems, Inc." },
+ { 0x0633, "Cyrix Corporation" },
+ { 0x0634, "Micron Technology, Inc." },
+ { 0x0635, "Methode Electronics, Inc." },
+ { 0x0636, "Sierra Imaging, Inc." },
+ { 0x0637, "Gunz Limited" },
+ { 0x0638, "Avision, Inc." },
+ { 0x0639, "Chrontel, Inc." },
+ { 0x063A, "Techwin Corporation" },
+ { 0x063B, "Taugagreining HF (2)" },
+ { 0x063C, "Yamaichi Electronics Co., Ltd. (Sakura)" },
+ { 0x063D, "Fong Kai Industrial Co., Ltd." },
+ { 0x063E, "RealMedia Technology, Inc." },
+ { 0x063F, "New Technology Cable Ltd." },
+ { 0x0640, "Hitex Development Tools" },
+ { 0x0641, "Woods Industries, Inc." },
+ { 0x0642, "VIA Medical Corporation" },
+ { 0x0643, "NOVATUS, Inc." },
+ { 0x0644, "TEAC Corporation" },
+ { 0x0645, "Ethentica Inc." },
+ { 0x0647, "Acton Research Corporation" },
+ { 0x0649, "Weli Science Co., Ltd" },
+ { 0x064A, "Technical Corp." },
+ { 0x064B, "Analog Devices, Inc. Development Tools" },
+ { 0x064C, "Ji-Haw Industrial Co., Ltd" },
+ { 0x064D, "TriTech Microelectronics Ltd" },
+ { 0x064E, "Suyin Corporation" },
+ { 0x064F, "WIBU-Systems AG" },
+ { 0x0650, "Dynapro Systems" },
+ { 0x0651, "Likom Technology Sdn. Bhd." },
+ { 0x0652, "Stargate Solutions, Inc." },
+ { 0x0653, "CNF Inc." },
+ { 0x0654, "Granite Microsystems, Inc." },
+ { 0x0655, "Space Shuttle Hi-Tech Co.,Ltd." },
+ { 0x0656, "Glory Mark Electronic Ltd." },
+ { 0x0657, "Tekcon Electronics Corp." },
+ { 0x0658, "Sigma Designs, Inc." },
+ { 0x0659, "AETHRA" },
+ { 0x065A, "Optoelectronics Co., Ltd." },
+ { 0x065B, "Tracewell Systems" },
+ { 0x065C, "Brentwood Medical Technology Corp." },
+ { 0x065D, "ATTO Technology, Inc." },
+ { 0x065E, "Silicon Graphics" },
+ { 0x065F, "Good Way Technology Co., Ltd. & GWC technology Inc" },
+ { 0x0660, "TSAY-E (BVI) International Inc." },
+ { 0x0661, "Hamamatsu Photonics K.K." },
+ { 0x0662, "Kansai Electric Co., Ltd." },
+ { 0x0663, "Topmax Electronic Co., Ltd." },
+ { 0x0664, "ET&T" },
+ { 0x0665, "WayTech Development, Inc." },
+ { 0x0667, "Antona Corporation" },
+ { 0x0668, "WordWand" },
+ { 0x0669, "Oce' Printing Systems GmbH" },
+ { 0x066A, "Total Technologies, Ltd." },
+ { 0x066B, "SCM Microsystems Japan, Inc." },
+ { 0x066C, "ASK ASA" },
+ { 0x066D, "Entrega Technologies Inc." },
+ { 0x066E, "Acer Semiconductor America, Inc." },
+ { 0x066F, "Freescale Semiconductor, Inc. - Sigmatel" },
+ { 0x0670, "Sequel Imaging, Inc." },
+ { 0x0671, "Keisoku Giken Co., Ltd." },
+ { 0x0672, "Labtec Inc." },
+ { 0x0673, "HCL Peripherals Limited" },
+ { 0x0674, "Key Mouse Electronic Enterprise Co., Ltd." },
+ { 0x0675, "DrayTek Corp." },
+ { 0x0676, "Teles AG" },
+ { 0x0677, "Aiwa Co., Ltd." },
+ { 0x0678, "ACARD Technology Corp." },
+ { 0x0679, "WaterGate Software, Inc." },
+ { 0x067A, "ADS ANKER GmbH" },
+ { 0x067B, "Prolific Technology, Inc." },
+ { 0x067C, "Efficient Networks, Inc." },
+ { 0x067D, "Hohner Corp." },
+ { 0x067E, "Intermec Technologies (S) Pte Ltd." },
+ { 0x067F, "Virata Ltd." },
+ { 0x0680, "Realtek Semiconductor Corp., CPP Div." },
+ { 0x0681, "Siemens Information and Communication Products" },
+ { 0x0683, "Dataq Instruments, Inc." },
+ { 0x0684, "Cytec Corporation" },
+ { 0x0685, "ISDN*tek" },
+ { 0x0686, "KONICA MINOLTA TECHNOLOGY CENTER, INC." },
+ { 0x0687, "Sycard Technology" },
+ { 0x0688, "Microprocess Ingenierie" },
+ { 0x0689, "Elesys Inc." },
+ { 0x068A, "Pertech Inc." },
+ { 0x068B, "Potrans International, Inc." },
+ { 0x068C, "Tokin Corporation, Card Media Systems Department" },
+ { 0x068D, "Medical Measurement Systems B.V." },
+ { 0x068E, "CH Products" },
+ { 0x068F, "Nihon Kohden Corporation" },
+ { 0x0690, "Golden Bridge Electech Inc." },
+ { 0x0691, "Denter System Co., Ltd." },
+ { 0x0692, "Klippel GmbH" },
+ { 0x0693, "Hagiwara Solutions Co., Ltd." },
+ { 0x0694, "The LEGO Company" },
+ { 0x0695, "ODU-USA, Inc." },
+ { 0x0696, "Carroll Touch" },
+ { 0x0697, "Oxford Instruments (Medical Systems Division)" },
+ { 0x0698, "Chuntex (CTX)" },
+ { 0x0699, "Tektronix, Inc." },
+ { 0x069A, "Askey Computer Corporation" },
+ { 0x069B, "Technicolor SA" },
+ { 0x069C, "HST High Soft Tech GmbH" },
+ { 0x069D, "Hughes Network Systems (HNS)" },
+ { 0x069E, "Welcat Inc." },
+ { 0x069F, "Tron b.v." },
+ { 0x06A0, "USB Systems Design" },
+ { 0x06A1, "Alexon Co., Ltd." },
+ { 0x06A2, "Topro Technology Inc." },
+ { 0x06A3, "Logitech Europe S.A." },
+ { 0x06A4, "Xiamen Doowell Electron Co., Ltd." },
+ { 0x06A5, "Divio" },
+ { 0x06A7, "MicroStore, Inc." },
+ { 0x06A8, "Topaz Systems, Inc." },
+ { 0x06A9, "Westell" },
+ { 0x06AA, "Sysgration Ltd." },
+ { 0x06AB, "Johnathon Freeman Technologies" },
+ { 0x06AC, "Fujitsu Laboratories of America, Inc." },
+ { 0x06AD, "Greatland Electronics Taiwan Ltd." },
+ { 0x06AE, "Eurofins Digital Testing Belgium" },
+ { 0x06AF, "Harting, Inc. of North America" },
+ { 0x06B0, "Alva B.V." },
+ { 0x06B1, "Signtech USA, Ltd." },
+ { 0x06B2, "N*ABLE Technologies, Inc." },
+ { 0x06B3, "Galil Motion Control" },
+ { 0x06B4, "Citron GmbH" },
+ { 0x06B5, "Stanford Research Systems" },
+ { 0x06B6, "Leda Media Products" },
+ { 0x06B8, "Pixela Corporation" },
+ { 0x06B9, "Thomson Telecom" },
+ { 0x06BA, "Smooth Cord & Connector Co., Ltd." },
+ { 0x06BB, "EDA Inc." },
+ { 0x06BC, "Oki Data Corporation" },
+ { 0x06BD, "AGFA-Gevaert NV" },
+ { 0x06BE, "AME Optimedia Technology Co. Ltd." },
+ { 0x06BF, "Leoco Corporation" },
+ { 0x06C0, "AllSpirit Co., Ltd." },
+ { 0x06C2, "Microlynx Systems Ltd." },
+ { 0x06C3, "Foss Tecator AB" },
+ { 0x06C4, "Bizlink Technology, Inc." },
+ { 0x06C5, "Hagenuk, GmbH" },
+ { 0x06C6, "Infowave Software Inc." },
+ { 0x06C7, "Storm Technology Inc." },
+ { 0x06C8, "SIIG, Inc." },
+ { 0x06C9, "Taxan (Europe) Ltd." },
+ { 0x06CA, "Newer Technology, Inc." },
+ { 0x06CB, "Synaptics Inc." },
+ { 0x06CC, "Terayon Communication Systems" },
+ { 0x06CD, "Keyspan" },
+ { 0x06CE, "Contec Co., Ltd." },
+ { 0x06CF, "Spheron VR- Bonnet und Steuerwald GdbR" },
+ { 0x06D0, "LapLink, Inc." },
+ { 0x06D1, "Daewoo Electronics Co Ltd" },
+ { 0x06D2, "Pioneer Microsystems" },
+ { 0x06D3, "Mitsubishi Electric Corporation" },
+ { 0x06D4, "Cisco Systems(2)" },
+ { 0x06D5, "Toshiba America Electronic Components, Inc." },
+ { 0x06D6, "Aashima Technology B.V." },
+ { 0x06D7, "Network Computing Devices (NCD)" },
+ { 0x06D8, "Technical Marketing Research, Inc." },
+ { 0x06D9, "Atmel-TEMIC Semiconductor GmbH" },
+ { 0x06DA, "Phoenixtec Power Co., Ltd." },
+ { 0x06DB, "Paradyne" },
+ { 0x06DC, "Foxlink Image Technology Co., Ltd." },
+ { 0x06DD, "Impact Technologies" },
+ { 0x06DE, "Heisei Technology Co., Ltd." },
+ { 0x06E0, "Multi-Tech Systems, Inc." },
+ { 0x06E1, "ADS Technologies, Inc." },
+ { 0x06E2, "Trio Motion Technology Limited" },
+ { 0x06E4, "Alcatel Microelectronics" },
+ { 0x06E5, "Lusher Technologies" },
+ { 0x06E6, "Tiger Jet Network, Inc." },
+ { 0x06E7, "Universal Electronics Inc." },
+ { 0x06E8, "Braemar Inc." },
+ { 0x06E9, "Nippon Electric Industry Co., Ltd." },
+ { 0x06EA, "Sirius Technologies Limited" },
+ { 0x06EB, "PC Expert Tech. Co., Ltd." },
+ { 0x06EC, "ADInstruments Ltd." },
+ { 0x06ED, "Datastor Technology" },
+ { 0x06EF, "I.A.C. Geometrische Ingenieurs B.V." },
+ { 0x06F0, "T.N.C Industrial Co., Ltd." },
+ { 0x06F1, "Opcode Systems Inc." },
+ { 0x06F2, "Emine Technology Company" },
+ { 0x06F3, "Flexion Systems Ltd." },
+ { 0x06F4, "First Person Gaming" },
+ { 0x06F5, "Midian Production Distribution" },
+ { 0x06F6, "Wintrend Technology Co., Ltd." },
+ { 0x06F7, "Wish Technologies" },
+ { 0x06F8, "Guillemot Corporation" },
+ { 0x06F9, "Asyst Electronic" },
+ { 0x06FA, "HSD S.r.L" },
+ { 0x06FB, "Hitachi Device Engineering Ltd." },
+ { 0x06FC, "Motorola Semiconductor Products Sector/US" },
+ { 0x06FD, "Boston Acoustics" },
+ { 0x06FE, "Gallant Computer, Inc." },
+ { 0x06FF, "Mediacom Technologies Pte Ltd." },
+ { 0x0701, "Supercomal Wire & Cable SDN. BHD." },
+ { 0x0702, "PixStream Incorporated" },
+ { 0x0703, "Bvtech Industry Inc." },
+ { 0x0704, "Vorum Research Corporation" },
+ { 0x0705, "NKK Corporation" },
+ { 0x0706, "Ariel Corporation" },
+ { 0x0707, "SMC Networks, Inc." },
+ { 0x0708, "Putercom Co., Ltd." },
+ { 0x0709, "Parthus Technologies" },
+ { 0x070A, "Oki Electric Industry Co., Ltd." },
+ { 0x070B, "Hasco Int., Inc." },
+ { 0x070C, "Titan Electronics Inc." },
+ { 0x070D, "Comoss Electronic Co., Ltd." },
+ { 0x070E, "Excel Cell Electronic Co., Ltd." },
+ { 0x070F, "Oce' -Technologies B.V." },
+ { 0x0710, "Connect Tech Inc." },
+ { 0x0711, "Magic Control Technology Corp." },
+ { 0x0712, "Verity Instruments, Inc." },
+ { 0x0713, "Interval Research Corp." },
+ { 0x0714, "New Motion International Co., Ltd" },
+ { 0x0715, "Liang Tei Co., Ltd." },
+ { 0x0716, "Oxus Research S.A." },
+ { 0x0717, "ZNK Corporation" },
+ { 0x0718, "Imation Corp." },
+ { 0x0719, "Tremon Enterprises Co., Ltd." },
+ { 0x071A, "FLIR Explosives" },
+ { 0x071B, "Domain Technologies, Inc." },
+ { 0x071C, "Xionics Document Technologies, Inc." },
+ { 0x071D, "Dialogic Corporation" },
+ { 0x071E, "Ariston Technologies" },
+ { 0x071F, "ARS Technologies Ltd." },
+ { 0x0720, "Keyence Corporation" },
+ { 0x0721, "HMedia Technology Inc." },
+ { 0x0722, "Consero" },
+ { 0x0723, "Centillium Communications Corporation" },
+ { 0x0724, "Lawson Labs, Inc." },
+ { 0x0725, "Applied Precision Inc." },
+ { 0x0726, "Vanguard International Semiconductor-America" },
+ { 0x0727, "C&H Technologies, Inc." },
+ { 0x0728, "Avermedia" },
+ { 0x0729, "CY&S Industrial Co., Ltd." },
+ { 0x072A, "Luminex Corporation" },
+ { 0x072B, "Dnova Corporation" },
+ { 0x072C, "OTSO" },
+ { 0x072D, "Able Communications, Inc." },
+ { 0x072E, "Sunix Co., Ltd." },
+ { 0x072F, "Advanced Card Systems Ltd." },
+ { 0x0730, "Indus Instruments" },
+ { 0x0731, "Susteen, Inc." },
+ { 0x0732, "Goldfull Electronics & Telecommunications Corp." },
+ { 0x0733, "ViewQuest Technologies, Inc." },
+ { 0x0734, "LASAT Communications A/S" },
+ { 0x0735, "Asuscom Network, Inc." },
+ { 0x0736, "Lorom Industrial Co., Ltd." },
+ { 0x0737, "Snap-on Diagnostics" },
+ { 0x0738, "Mad Catz, Inc." },
+ { 0x0739, "Cue Network Corporation" },
+ { 0x073A, "Chaplet Systems, Inc." },
+ { 0x073B, "Suncom Technologies" },
+ { 0x073C, "Industrial Electronic Engineers, Inc." },
+ { 0x073D, "Eutronsec Spa" },
+ { 0x073E, "Sigma Itec, Inc." },
+ { 0x073F, "Data Electronics (Aust) Pty, Ltd." },
+ { 0x0740, "Full Enterprise Corp." },
+ { 0x0741, "Momentum US Inc." },
+ { 0x0742, "Stollmann EtV GmbH" },
+ { 0x0743, "Bonig und Kallenback oHG" },
+ { 0x0744, "GMK Electronic Design GmbH" },
+ { 0x0745, "Syntech Information Co., Ltd." },
+ { 0x0746, "ONKYO Corporation" },
+ { 0x0747, "Labway Corporation" },
+ { 0x0748, "Strong Man Enterprise Co., Ltd." },
+ { 0x0749, "EVer Electronics Corp." },
+ { 0x074A, "Ming Fortune Industry Co., Ltd." },
+ { 0x074B, "Polestar Tech. Corp." },
+ { 0x074C, "C-C-C Group PLC" },
+ { 0x074D, "Micronas GmbH" },
+ { 0x074E, "Digital Stream Corporation" },
+ { 0x074F, "Microflip, Inc" },
+ { 0x0750, "Innovative Integration" },
+ { 0x0751, "Info Network Systems" },
+ { 0x0752, "Non-Standard, TSG" },
+ { 0x0753, "Mocom Softeare GmbH & Co. KG" },
+ { 0x0754, "SyQuest Technology" },
+ { 0x0755, "Aureal Semiconductor" },
+ { 0x0756, "RSI Systems" },
+ { 0x0757, "Network Technologies, Inc." },
+ { 0x0758, "Carl Zeiss Jena GmbH" },
+ { 0x0759, "Cellvision Systems, Inc." },
+ { 0x075A, "SEL Inc." },
+ { 0x075B, "Sophisticated Circuits, Inc." },
+ { 0x075C, "Ulan Co., Ltd." },
+ { 0x075D, "Microdowell SRL" },
+ { 0x075E, "ABIT Corporation" },
+ { 0x075F, "CITEL Technologies, Ltd." },
+ { 0x0760, "JL Cooper Electronics" },
+ { 0x0761, "MasTech, Inc." },
+ { 0x0762, "Coretex Corporation" },
+ { 0x0763, "M-Audio" },
+ { 0x0764, "Cyber Power Systems, Inc." },
+ { 0x0765, "X-Rite Incorporated" },
+ { 0x0766, "Jess-Link Products Co., Ltd. (JPC)" },
+ { 0x0767, "Tokheim Corporation" },
+ { 0x0768, "Camtel Technology Corp." },
+ { 0x0769, "SURECOM Technology Corp." },
+ { 0x076A, "Conceptual Systems" },
+ { 0x076B, "HID Global GmbH" },
+ { 0x076C, "Partner Tech" },
+ { 0x076D, "Denso Corporation" },
+ { 0x076E, "Kuan Tech Enterprise Co., Ltd." },
+ { 0x076F, "Jhen Vei Electronic Co., Ltd." },
+ { 0x0770, "Welch Allyn, Inc - Medical Division" },
+ { 0x0771, "MicroCraft" },
+ { 0x0772, "TFL LAN, Inc" },
+ { 0x0773, "Spital Sangyo Co., Ltd." },
+ { 0x0774, "AmTRAN Technology Co., Ltd." },
+ { 0x0775, "Longshine Electronics Corp." },
+ { 0x0776, "Inalways Corporation" },
+ { 0x0777, "Comda Advanced Technology Corporation" },
+ { 0x0778, "Volex, Inc." },
+ { 0x0779, "Fairchild Semiconductor" },
+ { 0x077A, "NIDEC SANKYO CORPORATION" },
+ { 0x077B, "Linksys" },
+ { 0x077C, "Forward Electronics Co., Ltd." },
+ { 0x077D, "Griffin Technology LLC" },
+ { 0x077E, "Softing GmbH" },
+ { 0x077F, "Well Excellent & Most Corp." },
+ { 0x0780, "ORGA Kartensysteme GmbH" },
+ { 0x0781, "Western Digital, Sandisk" },
+ { 0x0782, "Trackerball" },
+ { 0x0783, "C3PO, S.L." },
+ { 0x0784, "Pretec Corporation" },
+ { 0x0785, "Willnet Inc." },
+ { 0x0786, "Jeil Data Systems Co., Ltd." },
+ { 0x0787, "Abera System Corp" },
+ { 0x0788, "3Cam Technology, Inc" },
+ { 0x0789, "Logitec Corporation" },
+ { 0x078A, "Tandy Electronics (China) Ltd." },
+ { 0x078B, "Happ Controls" },
+ { 0x078C, "CalComp" },
+ { 0x078D, "Presto Technologies Inc." },
+ { 0x078E, "San Shih Electrical Enterprise Co. Ltd." },
+ { 0x078F, "Troy XCD, Inc." },
+ { 0x0790, "Pro-Image Manufacturing Co., Ltd" },
+ { 0x0791, "Copartner Technology Corporation" },
+ { 0x0792, "Axis Communications AB" },
+ { 0x0793, "Wha Yu Industrial Co., Ltd." },
+ { 0x0794, "ABL Electronics Corporation" },
+ { 0x0795, "RealChip Inc." },
+ { 0x0796, "Certicom Corp." },
+ { 0x0797, "Grandtech Semiconductor Corporation" },
+ { 0x0798, "F.J. Tieman BV" },
+ { 0x0799, "Boulder Creek Engineering" },
+ { 0x079A, "Aptec Instruments" },
+ { 0x079B, "Sagem SA" },
+ { 0x079C, "Sun Communications Inc." },
+ { 0x079D, "Alfadata Computer Corp." },
+ { 0x079E, "Tokin Corporation" },
+ { 0x079F, "VMETRO asa" },
+ { 0x07A0, "Leiderdorp Instruments" },
+ { 0x07A1, "Digicom Spa" },
+ { 0x07A2, "National Technical Systems" },
+ { 0x07A3, "ONNTO Corp." },
+ { 0x07A4, "Be Incorporated" },
+ { 0x07A5, "Tietech Co., Ltd." },
+ { 0x07A6, "Infineon-ADMtek Co., Ltd." },
+ { 0x07A7, "Mediatronix BV" },
+ { 0x07A8, "Home Office PSDB" },
+ { 0x07A9, "Sandmartin Company Ltd." },
+ { 0x07AA, "Corega Inc." },
+ { 0x07AB, "Freecom Technologies" },
+ { 0x07AC, "Fortress U&T Ltd." },
+ { 0x07AD, "ECO Chemie" },
+ { 0x07AE, "C&C Technic Taiwan Co., Ltd." },
+ { 0x07AF, "Microtech International, Inc." },
+ { 0x07B0, "Billion Electric Co., Ltd" },
+ { 0x07B1, "IMP, Inc." },
+ { 0x07B2, "Motorola BCS" },
+ { 0x07B3, "Plustek, Inc." },
+ { 0x07B4, "OLYMPUS CORPORATION" },
+ { 0x07B5, "Mega World International Ltd." },
+ { 0x07B6, "Marubun Corp." },
+ { 0x07B7, "TIME Interconnect Ltd." },
+ { 0x07B8, "AboCom Systems, Inc." },
+ { 0x07B9, "Reynolds Medical" },
+ { 0x07BA, "Accurate Technologies, Inc." },
+ { 0x07BB, "Intelogis Inc" },
+ { 0x07BC, "Canon Computer Systems, Inc." },
+ { 0x07BD, "Webgear Inc." },
+ { 0x07BE, "Veridicom" },
+ { 0x07BF, "TestQuest, Inc." },
+ { 0x07C0, "Code Mercenaries" },
+ { 0x07C1, "Keisokugiken Corporation" },
+ { 0x07C2, "Varatouch Technology Inc." },
+ { 0x07C3, "J-Works, Inc." },
+ { 0x07C4, "Datafab Systems Inc." },
+ { 0x07C5, "APG Cash Drawer" },
+ { 0x07C6, "ShareWave, Inc." },
+ { 0x07C7, "Powertech Industrial Co., Ltd." },
+ { 0x07C8, "B.U.G., Inc." },
+ { 0x07C9, "Allied Telesis Inc" },
+ { 0x07CA, "AVerMedia Technologies, Inc." },
+ { 0x07CB, "Kingmax Technology Inc." },
+ { 0x07CC, "LIWANLI Innovation Co., Ltd" },
+ { 0x07CD, "Hteck Corp." },
+ { 0x07CE, "Nidec-Shimpo Corp." },
+ { 0x07CF, "Casio Computer Co., Ltd." },
+ { 0x07D0, "Dazzle Multimedia" },
+ { 0x07D2, "Aptio Products Inc." },
+ { 0x07D3, "Cyberdata Corp." },
+ { 0x07D4, "Aloka Co., Ltd." },
+ { 0x07D5, "Radiant Systems, Inc." },
+ { 0x07D6, "MENICX International Co., Ltd." },
+ { 0x07D7, "GCC Technologies, Inc." },
+ { 0x07D8, "Network Suginami Kokoto" },
+ { 0x07D9, "Compuapps" },
+ { 0x07DA, "Arasan Chip Systems Inc." },
+ { 0x07DB, "Mental Models, Inc." },
+ { 0x07DC, "OCTAL-Engenharia de Sistemas S.A." },
+ { 0x07DD, "Hampshire Company, Inc." },
+ { 0x07DE, "Best Data Products" },
+ { 0x07DF, "David Electronics Company, Ltd." },
+ { 0x07E0, "NCP Engineering" },
+ { 0x07E1, "Acer Netxus Incorporated" },
+ { 0x07E2, "Elmeg GmbH & Co., Ltd." },
+ { 0x07E3, "Planex Communications, Inc." },
+ { 0x07E4, "Movado Enterprise Co., Ltd." },
+ { 0x07E5, "QPS, Inc." },
+ { 0x07E6, "Allied Cable Corporation" },
+ { 0x07E7, "Mirvo Toys, Inc." },
+ { 0x07E8, "Labsystems" },
+ { 0x07E9, "Sanyo Technosound Co., Ltd." },
+ { 0x07EA, "Iwatsu Electric Co., Ltd." },
+ { 0x07EB, "Double-H Technology Co., Ltd." },
+ { 0x07EC, "Taiyo Electric Wire & Cable Co., Ltd." },
+ { 0x07ED, "Precision MicroDynamics, Inc." },
+ { 0x07EE, "Logware GmbH" },
+ { 0x07EF, "Suite Technology Systems" },
+ { 0x07F0, "PS Communications Ltd." },
+ { 0x07F1, "Picostar, Inc." },
+ { 0x07F2, "BPT Enterprises" },
+ { 0x07F3, "L3 Systems" },
+ { 0x07F4, "Joritel International B.V." },
+ { 0x07F5, "Amiable Technologies, Inc." },
+ { 0x07F6, "Circuit Assembly Corp." },
+ { 0x07F7, "Century Corporation" },
+ { 0x07F8, "Eskape Labs" },
+ { 0x07F9, "Dotop Technology, Inc." },
+ { 0x07FA, "FHLP" },
+ { 0x07FB, "Digi-Tek, Inc." },
+ { 0x07FC, "Protec Microsystems" },
+ { 0x07FD, "Mark of the Unicorn, Inc." },
+ { 0x07FE, "Net Eyes, Inc." },
+ { 0x07FF, "Sectra AB" },
+ { 0x0800, "Kortex International" },
+ { 0x0801, "Mag-Tek" },
+ { 0x0802, "Mako Technologies, LLC" },
+ { 0x0803, "Zoom Telephonics, Inc." },
+ { 0x0804, "Neuron Corporation" },
+ { 0x0805, "Iruma Soft Co., Ltd." },
+ { 0x0806, "Clinton Electronics Corp." },
+ { 0x0807, "SIIX Corporation" },
+ { 0x0808, "InfiMed, Inc." },
+ { 0x0809, "Genicom LP" },
+ { 0x080A, "Evermuch Technology Co., Ltd." },
+ { 0x080B, "Cross Match Technologies, Inc." },
+ { 0x080C, "Datalogic S.p.A." },
+ { 0x080D, "TECO Image Systems Co., Ltd." },
+ { 0x080E, "Sound Technology, Inc." },
+ { 0x080F, "Deschutes Corporation" },
+ { 0x0810, "Personal Communication Systems, Inc." },
+ { 0x0811, "Fimet" },
+ { 0x0812, "E-Tech, Inc." },
+ { 0x0813, "Mattel, Inc." },
+ { 0x0814, "EBI Systems, Inc." },
+ { 0x0815, "Scintrex" },
+ { 0x0816, "ABB Automation Products AB" },
+ { 0x0817, "Interzeag Medical Technology" },
+ { 0x0818, "NTT Electronics Corporation" },
+ { 0x0819, "Syncrosoft GMBH" },
+ { 0x081A, "MG Logic Pte Ltd." },
+ { 0x081B, "Indigita Corporation" },
+ { 0x081C, "MIPSYS" },
+ { 0x081D, "VlerZwo Software GbR" },
+ { 0x081E, "AlphaSmart, Inc." },
+ { 0x081F, "Totsu Engineering, Inc." },
+ { 0x0820, "Verax Engineering" },
+ { 0x0821, "A.T. Cross" },
+ { 0x0822, "REUDO Corporation" },
+ { 0x0823, "Tactex Controls, Inc." },
+ { 0x0824, "M.S.E. GmbH" },
+ { 0x0825, "GC Protronics" },
+ { 0x0826, "Data Transit" },
+ { 0x0827, "BroadLogic, Inc." },
+ { 0x0828, "Sato Corporation" },
+ { 0x0829, "DirecTV Broadband" },
+ { 0x082A, "Object Co., Ltd." },
+ { 0x082B, "TrophyTrex" },
+ { 0x082C, "Japan Digital Laboratory Co., Ltd." },
+ { 0x082D, "Handspring, Inc." },
+ { 0x082E, "Suni Imaging Microsystems, Inc." },
+ { 0x082F, "ACACIA" },
+ { 0x0830, "Palm Inc." },
+ { 0x0831, "Chong Tsi Su Enterprise Co., Ltd" },
+ { 0x0832, "Kouwell Electronics Corp." },
+ { 0x0833, "Sourcenext Corporation" },
+ { 0x0834, "Ciponic Technology Co., Ltd." },
+ { 0x0835, "Action Star Technology Co., Ltd." },
+ { 0x0836, "Evertz Microsystems Ltd." },
+ { 0x0837, "Renishaw PLC" },
+ { 0x0838, "Precision MicroControl Corporation" },
+ { 0x0839, "Samsung Techwin" },
+ { 0x083A, "Accton Technology Corporation" },
+ { 0x083B, "Dr. Neuhaus Telekommunikation GmbH" },
+ { 0x083C, "Jaeger Messtechnik GmbH" },
+ { 0x083D, "Nakayo Telecommunication, Inc." },
+ { 0x083E, "2-Tel B.V." },
+ { 0x083F, "Boca Global, Inc." },
+ { 0x0840, "Argosy Research Inc." },
+ { 0x0841, "Rioport.com Inc." },
+ { 0x0842, "ESA MESSTECHNIK GMBH" },
+ { 0x0843, "Mcom As" },
+ { 0x0844, "Welland Industrial Co., Ltd." },
+ { 0x0845, "EES Technik fur Musik" },
+ { 0x0846, "NETGEAR, Inc." },
+ { 0x0847, "Interack Communications Inc." },
+ { 0x0848, "Accton Technology Co., Ltd." },
+ { 0x0849, "SC&T International, Inc." },
+ { 0x084A, "Wipro Limited" },
+ { 0x084B, "Castlewood Systems" },
+ { 0x084C, "The Japan Steel Works, Ltd." },
+ { 0x084D, "Minton Optic Industry Co., Ltd." },
+ { 0x084E, "KidBoard, Inc. dba KBGear Interactive" },
+ { 0x084F, "EMPEG Ltd" },
+ { 0x0850, "FastPoint Technologies, Inc." },
+ { 0x0851, "Macronix International Co., Ltd." },
+ { 0x0852, "CSEM" },
+ { 0x0853, "Topre Corporation" },
+ { 0x0854, "Active Wire, Inc." },
+ { 0x0855, "JMBS Developpements" },
+ { 0x0856, "B&B Electronics" },
+ { 0x0857, "Gerber Scientific Products, Inc." },
+ { 0x0858, "Hitachi Maxell Ltd." },
+ { 0x0859, "Minolta Systems Laboratory, Inc." },
+ { 0x085A, "Xircom" },
+ { 0x085B, "Kurt Manufacturing" },
+ { 0x085C, "Color Vision Inc." },
+ { 0x085D, "Ambient Technologies, Inc." },
+ { 0x085E, "NaftEL Technologies LTD." },
+ { 0x085F, "Canberra Industries" },
+ { 0x0860, "Momentum Data System" },
+ { 0x0861, "Cambridge Research Systems Ltd." },
+ { 0x0862, "Teletrol Systems, Inc." },
+ { 0x0863, "Filanet Corporation" },
+ { 0x0864, "Roper International Ltd." },
+ { 0x0865, "MICROLAB" },
+ { 0x0866, "PEI Electronics, Inc." },
+ { 0x0867, "Data Translation, Inc." },
+ { 0x0868, "Electrical Geodesics, Inc." },
+ { 0x0869, "Visual Interaction" },
+ { 0x086A, "Emagic Soft-und Hardware Gmbh" },
+ { 0x086B, "ROHM Co. Ltd." },
+ { 0x086C, "DeTeWe" },
+ { 0x086D, "ICE Technology" },
+ { 0x086E, "System TALKS Inc." },
+ { 0x086F, "MEC IMEX INC-HPT" },
+ { 0x0870, "Metricom, Inc." },
+ { 0x0871, "Merge Technologies Inc." },
+ { 0x0872, "Broadxent, Inc." },
+ { 0x0873, "Xpeed Inc." },
+ { 0x0874, "A-Tec Subsystem, Inc." },
+ { 0x0875, "Mecel AB" },
+ { 0x0876, "3M Home Health Systems" },
+ { 0x0877, "Lew Engineering" },
+ { 0x0878, "SYSTEC Computer Gmbh" },
+ { 0x0879, "Comtrol Corporation" },
+ { 0x087A, "Getemed GmbH" },
+ { 0x087B, "Cornerstone Peripherals Technology" },
+ { 0x087C, "ADESSO/Kbtek America Inc." },
+ { 0x087D, "JATON Corporation" },
+ { 0x087E, "Fujitsu Computer Products of America" },
+ { 0x087F, "QualCore Logic Inc" },
+ { 0x0880, "APT Technologies Inc." },
+ { 0x0881, "Sistemas Y Redes Telematicas, Sire S.L." },
+ { 0x0882, "Rightec Research" },
+ { 0x0883, "Recording Industry Association of America (RIAA)" },
+ { 0x0884, "USB Systems" },
+ { 0x0885, "Boca Research, Inc." },
+ { 0x0887, "Hannstar Electronics Corp." },
+ { 0x0889, "Current Works, Inc." },
+ { 0x088A, "TechTools" },
+ { 0x088B, "MassWorks" },
+ { 0x088C, "Swecoin AB" },
+ { 0x088D, "Engineering Spirit" },
+ { 0x088E, "Pace Anti-Piracy, Inc." },
+ { 0x088F, "Husky Computers Limited" },
+ { 0x0890, "Consultronics Ltd." },
+ { 0x0891, "Drager Medizintechnik Gmbh." },
+ { 0x0892, "DioGraphy Inc." },
+ { 0x0893, "Bartec" },
+ { 0x0894, "TSI Incorporated" },
+ { 0x0895, "Kanitech A/S" },
+ { 0x0896, "Starseed Enterprises AG" },
+ { 0x0897, "Lauterbach GmbH" },
+ { 0x0898, "3M Canada" },
+ { 0x0899, "Grieshaber & Co. AG" },
+ { 0x089A, "Koepruelue Engineering" },
+ { 0x089B, "Digital-3, LLC." },
+ { 0x089C, "United Technologies Research Cntr." },
+ { 0x089D, "Icron Technologies Corporation" },
+ { 0x089E, "NST Co., Ltd." },
+ { 0x089F, "Primex Aerospace Co." },
+ { 0x08A0, "Logic Meca Co., Ltd." },
+ { 0x08A1, "Studio Zee" },
+ { 0x08A2, "Millennia Systems, Inc." },
+ { 0x08A3, "Hyowon Software" },
+ { 0x08A4, "YTG Smartech Inc." },
+ { 0x08A5, "e9 Inc." },
+ { 0x08A6, "Toshiba Tec Corporation" },
+ { 0x08A7, "General Cybernetics Inc." },
+ { 0x08A8, "Andrea Electronics" },
+ { 0x08A9, "CWAV" },
+ { 0x08AA, "Kernel Productions, Inc." },
+ { 0x08AB, "Innolab Pte. Ltd." },
+ { 0x08AC, "Macraigor Systems LLC" },
+ { 0x08AD, "Toyota Technical Development Corporation (TTDC)" },
+ { 0x08AE, "Macally (Mace Group, Inc.)" },
+ { 0x08AF, "Hamilton Co." },
+ { 0x08B0, "Metrohm Ltd." },
+ { 0x08B1, "High Technology Laboratory s.r.l" },
+ { 0x08B2, "BIOTRONIK GmbH & Co." },
+ { 0x08B3, "Voice It Worldwide, Inc." },
+ { 0x08B4, "Sorenson Communications" },
+ { 0x08B5, "Correlator.com" },
+ { 0x08B6, "Imagek, Inc." },
+ { 0x08B7, "NATSU Corporation Limited" },
+ { 0x08B8, "J. Gordon Electronic Design, Inc." },
+ { 0x08B9, "General Wireless Operations Inc" },
+ { 0x08BA, "Fujitsu General Limited" },
+ { 0x08BB, "Texas Instruments Japan" },
+ { 0x08BC, "Dr. G. Schuhfried GmbH" },
+ { 0x08BD, "Citizen Watch Co., Ltd." },
+ { 0x08BE, "Meilenstein GmbH" },
+ { 0x08BF, "Nova Engineering, Inc." },
+ { 0x08C0, "Braintronics B.V." },
+ { 0x08C1, "Timestep Electronics Ltd." },
+ { 0x08C2, "ArgoCraft Co., Ltd." },
+ { 0x08C3, "Precise Biometrics" },
+ { 0x08C4, "Proxim CBU" },
+ { 0x08C5, "Moreton Bay" },
+ { 0x08C6, "Scalex Corporation" },
+ { 0x08C7, "TAI TWUN ENTERPRISE CO., LTD." },
+ { 0x08C8, "2Wire, Inc" },
+ { 0x08C9, "Nippon Telegraph and Telephone Corp." },
+ { 0x08CA, "AIPTEK International Inc." },
+ { 0x08CB, "Cyber Innovate, Inc." },
+ { 0x08CC, "ifak system GmbH" },
+ { 0x08CD, "Jue Hsun Ind. Corp." },
+ { 0x08CE, "Long Well Electronics Corp." },
+ { 0x08CF, "Productivity Enhancement Products" },
+ { 0x08D0, "Tasco Electronics Co., Inc." },
+ { 0x08D1, "Smartbridges Pte. Ltd." },
+ { 0x08D2, "Dialog4 System Engineering Gmbh." },
+ { 0x08D3, "Virtual Ink" },
+ { 0x08D4, "Siemens PC Systeme GmbH" },
+ { 0x08D5, "Cambridge Heart, Inc." },
+ { 0x08D6, "Itautec Philco S.A." },
+ { 0x08D7, "Opticon, Inc." },
+ { 0x08D8, "Huntsville Microsystems, Inc." },
+ { 0x08D9, "Increment P Corporation" },
+ { 0x08DA, "A W Electronics, Inc." },
+ { 0x08DB, "IXXAT Automation GmbH" },
+ { 0x08DC, "Animo Limited" },
+ { 0x08DD, "Billionton Systems, Inc." },
+ { 0x08DE, "Touchstone Software" },
+ { 0x08DF, "Spyrus Inc." },
+ { 0x08E0, "Geodesic Designs, Inc." },
+ { 0x08E1, "LSI JAPAN Co., Ltd" },
+ { 0x08E2, "SafeNet China Ltd." },
+ { 0x08E3, "OLITEC" },
+ { 0x08E4, "Pioneer Corporation" },
+ { 0x08E5, "LITRONIC" },
+ { 0x08E6, "Gemalto SA" },
+ { 0x08E7, "PAN-INTERNATIONAL WIRE & CABLE (M) SDN BHD" },
+ { 0x08E8, "Integrated Memory Logic" },
+ { 0x08E9, "Extended Systems, Inc." },
+ { 0x08EA, "Ericsson Inc." },
+ { 0x08EB, "Asulab SA" },
+ { 0x08EC, "M-Systems Flash Disk Pioneers" },
+ { 0x08ED, "Instrumentation Metrics, Inc." },
+ { 0x08EE, "CCSI/HESSO" },
+ { 0x08EF, "PixelVision" },
+ { 0x08F0, "CardScan Inc." },
+ { 0x08F1, "CTI Electronics Corporation" },
+ { 0x08F2, "Constance Technology Co., Ltd." },
+ { 0x08F3, "Wintime Electronics Corp." },
+ { 0x08F4, "Telia ProSoft AB" },
+ { 0x08F5, "SYSTEC Co., Ltd." },
+ { 0x08F6, "Logic 3 International Limited" },
+ { 0x08F7, "Vernier Software" },
+ { 0x08F8, "Keen Top International Enterprise Co., Ltd." },
+ { 0x08F9, "Wipro Technologies" },
+ { 0x08FA, "CAERE" },
+ { 0x08FB, "Socket Mobile, Inc." },
+ { 0x08FC, "Sicon International" },
+ { 0x08FD, "Digianswer A/S" },
+ { 0x08FE, "GDSYSTEMS" },
+ { 0x08FF, "AuthenTec, Inc." },
+ { 0x0901, "VST Technologies" },
+ { 0x0902, "iDream Technologies Pte Ltd" },
+ { 0x0903, "Infolibria" },
+ { 0x0904, "Frank Audiodata" },
+ { 0x0905, "ISDG" },
+ { 0x0906, "FARADAY Technology Corp." },
+ { 0x0907, "Addison Technology Europe B.V." },
+ { 0x0908, "Siemens Automation & Drives" },
+ { 0x0909, "Audio-Technica Corp." },
+ { 0x090A, "Trumpion Microelectronics Inc" },
+ { 0x090B, "Neurosmith" },
+ { 0x090C, "Silicon Motion, Inc. - Taiwan" },
+ { 0x090D, "MULTIPORT Computer Vertriebs GmbH" },
+ { 0x090E, "Shining Technology, Inc." },
+ { 0x090F, "Fujitsu Devices Inc." },
+ { 0x0910, "Alation Systems, Inc." },
+ { 0x0911, "Philips Speech Processing" },
+ { 0x0912, "Voquette, Inc." },
+ { 0x0913, "Asante' Technologies, Inc." },
+ { 0x0914, "Bally Gaming, Inc." },
+ { 0x0915, "GlobespanVirata, Inc." },
+ { 0x0916, "DH electronics GmbH" },
+ { 0x0917, "SmartDisk Corporation" },
+ { 0x0918, "Planet Portal.com" },
+ { 0x0919, "Sound Vision Inc." },
+ { 0x091A, "Inter-Cable Systems, Inc." },
+ { 0x091B, "Raleigh Technology Corporation" },
+ { 0x091C, "Bormann EDV + Zubehoer GmbH" },
+ { 0x091D, "A. K. Barns Ltd." },
+ { 0x091E, "Garmin International" },
+ { 0x091F, "U-JIN Mesco Co., Ltd." },
+ { 0x0920, "Echelon Corporation" },
+ { 0x0921, "GoHubs, inc." },
+ { 0x0922, "Dymo Corporation" },
+ { 0x0923, "IC Media Corporation" },
+ { 0x0924, "Xerox Corporation" },
+ { 0x0925, "Lakeview Research" },
+ { 0x0926, "Sound Devices, LLC" },
+ { 0x0927, "Summus, Ltd." },
+ { 0x0928, "Oxford Semiconductor Ltd." },
+ { 0x0929, "American Biometric Company" },
+ { 0x092A, "Toshiba Information & Industrial Sys. And Services" },
+ { 0x092B, "Sena Technologies, Inc." },
+ { 0x092C, "Shanghai Bell Company Limited" },
+ { 0x092D, "OYO Instruments" },
+ { 0x092E, "Markpoint AB" },
+ { 0x092F, "Northern Embedded Science" },
+ { 0x0930, "Toshiba Corporation" },
+ { 0x0931, "Harmonic Data Systems Ltd." },
+ { 0x0932, "Crescentec Corporation" },
+ { 0x0933, "Quantum Corp." },
+ { 0x0934, "Spirent Communications" },
+ { 0x0935, "Accurite Technologies, Inc." },
+ { 0x0936, "DynamicNakedAudio Inc." },
+ { 0x0937, "Scania CV AB" },
+ { 0x0938, "Virtual DSP Corporation" },
+ { 0x0939, "Lumberg, Inc." },
+ { 0x093A, "Pixart Imaging, Inc." },
+ { 0x093B, "Plextor LLC" },
+ { 0x093C, "Intrepid Control Systems, Inc." },
+ { 0x093D, "InnoSync, Inc." },
+ { 0x093E, "J.S.T. Mfg. Co., Ltd." },
+ { 0x093F, "OLYMPIA Telecom Vertriebs GmbH" },
+ { 0x0940, "Japan Storage Battery Co., Ltd." },
+ { 0x0941, "Photobit Corporation" },
+ { 0x0942, "i2Go.com, LLC" },
+ { 0x0943, "HCL Technologies Ltd." },
+ { 0x0944, "KORG, Inc." },
+ { 0x0945, "PASCO Scientific" },
+ { 0x0946, "GEMSTAR TECHOLOGY DEVELOPMENT LIMITED" },
+ { 0x0947, "Videonics, Inc." },
+ { 0x0948, "Kronauer Music In Digital" },
+ { 0x0949, "Hitachi Kokusai Electric Inc." },
+ { 0x094A, "Luckytech Technology Co., Ltd" },
+ { 0x094B, "Linkup Systems Corporation" },
+ { 0x094C, "Metanetics Corporation" },
+ { 0x094D, "Cable Television Laboratories" },
+ { 0x094E, "Head Acoustics" },
+ { 0x094F, "Yano Electric Co., Ltd." },
+ { 0x0950, "TechniSat Sateliltenfernsehprodukte Gmbh" },
+ { 0x0951, "Kingston Technology Company" },
+ { 0x0952, "DCOM Enterprise Co., Ltd." },
+ { 0x0953, "PLG" },
+ { 0x0954, "RPM Systems Corporation" },
+ { 0x0955, "NVIDIA" },
+ { 0x0956, "BSquare Corporation" },
+ { 0x0957, "Agilent Technologies, Inc." },
+ { 0x0958, "BioLink Technologies International, Inc." },
+ { 0x0959, "Cologne Chip AG" },
+ { 0x095A, "Portsmith" },
+ { 0x095B, "Medialogic Corporation" },
+ { 0x095C, "K-Tec Electronics" },
+ { 0x095D, "Polycom, Inc." },
+ { 0x095E, "USB Design Labs" },
+ { 0x095F, "TTO Engineering" },
+ { 0x0960, "Bcom Electronics, Inc." },
+ { 0x0961, "Portatec Corporation" },
+ { 0x0962, "SAMx" },
+ { 0x0963, "Instrument Solutions" },
+ { 0x0964, "Bitran Corporation" },
+ { 0x0965, "PAR Technologies, Inc." },
+ { 0x0966, "HanGo Electronics Co., Ltd." },
+ { 0x0967, "Acer NeWeb Corporation" },
+ { 0x0969, "Magellan Corp." },
+ { 0x096A, "Koizumi Computer, Inc." },
+ { 0x096B, "ML Electronics Ltd." },
+ { 0x096C, "GOPEL electronic GmbH" },
+ { 0x096D, "PennyLan" },
+ { 0x096E, "Feitian Technologies Co., Ltd." },
+ { 0x096F, "Memory Link" },
+ { 0x0970, "K.S. Vector Co., Ltd." },
+ { 0x0971, "GretagMacbeth AG" },
+ { 0x0972, "Musicbird" },
+ { 0x0973, "Axalto" },
+ { 0x0974, "Eye Communication Systems, Inc" },
+ { 0x0975, "OL'E Communications, Inc." },
+ { 0x0976, "Adirondack Wire & Cable" },
+ { 0x0977, "Lightsurf Technologies" },
+ { 0x0978, "Beckhoff Gmbh" },
+ { 0x0979, "Jeilin Technology Corp., Ltd." },
+ { 0x097A, "Minds At Work LLC" },
+ { 0x097B, "Knudsen Engineering Limited" },
+ { 0x097C, "Marunix Co., Ltd." },
+ { 0x097D, "Rosun Technologies, Inc." },
+ { 0x097E, "Biopac Systems Inc." },
+ { 0x097F, "Barun Electronics Co. Ltd." },
+ { 0x0980, "Posh Mfg. Ltd." },
+ { 0x0981, "Oak Technology Ltd." },
+ { 0x0982, "Covadis S.A." },
+ { 0x0983, "Nissha Printing Co., Ltd." },
+ { 0x0984, "Apricorn" },
+ { 0x0985, "Cab Produkttechnik" },
+ { 0x0986, "Panasonic Electric Works Co., Ltd." },
+ { 0x0987, "MicroSpeed Inc" },
+ { 0x0988, "Teraoka Seiko Co. Ltd" },
+ { 0x0989, "Digitel Co. LTD" },
+ { 0x098A, "Neopost" },
+ { 0x098B, "Kingtel Telecommunication Corp." },
+ { 0x098C, "Vitana Corporation" },
+ { 0x098D, "INDesign" },
+ { 0x098E, "Integrated Intellectual Property Inc." },
+ { 0x098F, "TEXIO CORPORATION" },
+ { 0x0990, "General Instrument Corp." },
+ { 0x0992, "Bandai Co., Ltd." },
+ { 0x0993, "NuvoMedia, Inc." },
+ { 0x0994, "Dionex Softron GmbH" },
+ { 0x0995, "Simple Jet Technology Co., Ltd." },
+ { 0x0996, "Integrated Telecom Express, Inc." },
+ { 0x0997, "Xerox Corporation/Non-Networked Products" },
+ { 0x0998, "Atech Totalsolution Co., Ltd." },
+ { 0x0999, "Ocean Optics, Inc." },
+ { 0x099A, "ZIPPY TECHNOLOGY CORP." },
+ { 0x099B, "HIROTA SEISAKUSHO LTD." },
+ { 0x099C, "Florida Probe, Inc." },
+ { 0x099D, "NEC San-ei Instruments, Ltd." },
+ { 0x099E, "Trimble" },
+ { 0x099F, "Summa N.V." },
+ { 0x09A0, "Altec Computersysteme GmbH" },
+ { 0x09A1, "ELMO COMPANY, LIMITED" },
+ { 0x09A2, "Telemann Co., Ltd." },
+ { 0x09A3, "PairGain Technologies" },
+ { 0x09A4, "Contech Research, Inc." },
+ { 0x09A5, "VCON Telecommunications" },
+ { 0x09A6, "Poinchips" },
+ { 0x09A7, "Data Transmission Network Corp." },
+ { 0x09A8, "Lin Shiung Enterprise Co., Ltd." },
+ { 0x09A9, "Smart Card Technologies Co., Ltd." },
+ { 0x09AA, "Intersil Corporation" },
+ { 0x09AB, "Japan Cash Machine Co., Ltd." },
+ { 0x09AC, "DIGIGRAM" },
+ { 0x09AD, "The MITRE Corporation" },
+ { 0x09AE, "Tripp Lite" },
+ { 0x09AF, "G.i.N. mbH" },
+ { 0x09B0, "Fargo Electronics, Inc." },
+ { 0x09B1, "Ositech Communications Incorporated" },
+ { 0x09B2, "Franklin Electronic Publishers" },
+ { 0x09B3, "Simplex Solution Inc." },
+ { 0x09B4, "MDS Gateways" },
+ { 0x09B5, "Celltrix Technology Co., Ltd." },
+ { 0x09B6, "SmithMyers Communications Limited" },
+ { 0x09B7, "FAIRLIGHT ESP" },
+ { 0x09B8, "PhoeniX . Incorporated" },
+ { 0x09B9, "CentLand inc." },
+ { 0x09BA, "Chumtronix N.V." },
+ { 0x09BB, "Eule Industrie- & Datentechnik GmbH & Co. KG" },
+ { 0x09BC, "Audivo GmbH" },
+ { 0x09BD, "Haptix Creation Pte Ltd" },
+ { 0x09BE, "Prosisa Overseas LLC" },
+ { 0x09BF, "Auerswald GmbH & Co. KG" },
+ { 0x09C0, "Molecular Devices LLC" },
+ { 0x09C1, "ARRIS International" },
+ { 0x09C2, "NISCA Corporation" },
+ { 0x09C3, "ACTIVCARD, INC." },
+ { 0x09C4, "ACTiSYS Corporation" },
+ { 0x09C5, "Memory Corporation" },
+ { 0x09C6, "Inovatec S.p.A." },
+ { 0x09C7, "PUBCOMPANY s.r.l." },
+ { 0x09C8, "Carrot Systems Inc." },
+ { 0x09C9, "U.S. Digital Corp." },
+ { 0x09CA, "BMC Messsysteme GmbH" },
+ { 0x09CB, "Flir Systems" },
+ { 0x09CC, "Workbit Corporation" },
+ { 0x09CD, "Psion Connect Ltd." },
+ { 0x09CE, "City Electronics Ltd." },
+ { 0x09CF, "Electronics Testing Center, Taiwan" },
+ { 0x09D1, "NeoMagic Inc." },
+ { 0x09D2, "Vreelin Engineering Inc." },
+ { 0x09D3, "COM ONE" },
+ { 0x09D4, "Asahi Engineering Co., Ltd." },
+ { 0x09D5, "DigiTech" },
+ { 0x09D6, "Berkeley Varitronics Systems" },
+ { 0x09D7, "NovAtel Inc." },
+ { 0x09D8, "Elatec GmbH" },
+ { 0x09D9, "Jungo" },
+ { 0x09DA, "A-FOUR TECH CO., LTD." },
+ { 0x09DB, "Measurement Computing Corporation" },
+ { 0x09DC, "AIMEX Corporation" },
+ { 0x09DD, "Fellowes Inc." },
+ { 0x09DE, "ViQuest Technology" },
+ { 0x09DF, "Addonics Technologies Corp." },
+ { 0x09E0, "Johnson Matthey PLC, Trading as Tracerco" },
+ { 0x09E1, "Intellon Corporation" },
+ { 0x09E2, "Surface Imaging Systems (S.I.S.)" },
+ { 0x09E3, "WIZnet" },
+ { 0x09E4, "Unidata" },
+ { 0x09E5, "Jo-Dan International, Inc." },
+ { 0x09E6, "Silutia, Inc." },
+ { 0x09E7, "Real 3D, Inc." },
+ { 0x09E8, "AKAI professional M.I. Corp." },
+ { 0x09E9, "CHEN-SOURCE INC." },
+ { 0x09EA, "ShareCall Technologies" },
+ { 0x09EB, "Sonicbox, Inc." },
+ { 0x09EC, "COINT Multimedia Systems" },
+ { 0x09ED, "Viking Sewing Machines AB" },
+ { 0x09EE, "Jesmay Electronics Co., Ltd." },
+ { 0x09EF, "XITEL PTY Limited" },
+ { 0x09F0, "Perpetual Technologies, LLC" },
+ { 0x09F1, "Eshed Robotec" },
+ { 0x09F2, "hema Elektronik GmbH" },
+ { 0x09F3, "GoFlight, Inc." },
+ { 0x09F4, "Microlink Corporation" },
+ { 0x09F5, "ARESCOM" },
+ { 0x09F6, "RocketChips, Inc." },
+ { 0x09F7, "EDU-SCIENCE (H.K.) LIMITED" },
+ { 0x09F8, "SoftConnex Technologies, Inc." },
+ { 0x09F9, "Bay Associates" },
+ { 0x09FA, "Mtek Vision" },
+ { 0x09FB, "Altera" },
+ { 0x09FC, "Silicon Mountain Design" },
+ { 0x09FD, "MM - Manager Memory" },
+ { 0x09FE, "Goldteck International Inc." },
+ { 0x09FF, "Gain Technology Corp." },
+ { 0x0A00, "Liquid Audio" },
+ { 0x0A01, "ViA, Inc." },
+ { 0x0A02, "DIATECNIC" },
+ { 0x0A03, "Globe Wireless, Inc." },
+ { 0x0A04, "Star, Inc." },
+ { 0x0A05, "University of Kansas" },
+ { 0x0A06, "BSQUARE Slicon Valley" },
+ { 0x0A07, "Ontrak Control Systems Inc." },
+ { 0x0A08, "Lorenz GmbH" },
+ { 0x0A09, "Datadesk Technologies Inc." },
+ { 0x0A0A, "LIEWENTHAL ELECTRONICS LTD." },
+ { 0x0A0B, "Cybex Computer Products Corporation" },
+ { 0x0A0C, "MIRAD" },
+ { 0x0A0D, "VIPS France" },
+ { 0x0A0E, "AGFEO" },
+ { 0x0A0F, "Liesegang" },
+ { 0x0A10, "Combinova AB" },
+ { 0x0A11, "Xentec Incorporated" },
+ { 0x0A12, "Cambridge Silicon Radio Ltd." },
+ { 0x0A13, "Telebyte Inc." },
+ { 0x0A14, "Spacelabs Healthcare" },
+ { 0x0A15, "Scalar Corporation" },
+ { 0x0A16, "Trek Technology (S) Pte Ltd" },
+ { 0x0A17, "HOYA Corporation" },
+ { 0x0A18, "Heidelberger Druckmaschinen AG" },
+ { 0x0A19, "Hua Geng Technologies Inc." },
+ { 0x0A1A, "Astro-Med, Inc." },
+ { 0x0A1B, "Wolfvision GmbH" },
+ { 0x0A1C, "Micro Systemation AB" },
+ { 0x0A1D, "T-Nova Deutsche Telekom Innovationsgesellschaft" },
+ { 0x0A1E, "Netcraft (Pty) Ltd." },
+ { 0x0A1F, "Tesco Co." },
+ { 0x0A20, "SystemBase Co., Ltd." },
+ { 0x0A21, "Physio-Control, Inc." },
+ { 0x0A22, "Century Semiconductor USA, Inc." },
+ { 0x0A23, "NDS Technologies Israel Ltd." },
+ { 0x0A24, "Boca Design, Inc." },
+ { 0x0A25, "3M Germany" },
+ { 0x0A26, "Cyberware" },
+ { 0x0A27, "Datacard Group" },
+ { 0x0A28, "Ensure Technologies, Inc." },
+ { 0x0A29, "Marketcast" },
+ { 0x0A2A, "Fortune Electronics & Plastic (International) Ltd." },
+ { 0x0A2B, "Muller & Sebastiani Elektronik GmbH" },
+ { 0x0A2C, "Ak Modul Bus Computer GmbH" },
+ { 0x0A2D, "Advanced Measurement Technology" },
+ { 0x0A2E, "ONE-O-ONE iSOLUTIONS" },
+ { 0x0A2F, "Prime Systems, Inc." },
+ { 0x0A30, "WAW-Tronics" },
+ { 0x0A31, "Data System Co., Ltd." },
+ { 0x0A32, "Addatel ApS" },
+ { 0x0A33, "Intermind Inc." },
+ { 0x0A34, "TG3 Electronics, Inc." },
+ { 0x0A35, "Radikal Technologies" },
+ { 0x0A36, "GS Technical Support Center" },
+ { 0x0A37, "Concept Development" },
+ { 0x0A38, "I.R.I.S." },
+ { 0x0A39, "Gilat Satellite Networks Ltd." },
+ { 0x0A3A, "PentaMedia Co., Ltd." },
+ { 0x0A3B, "Hitachi Information Technology Co., Ltd." },
+ { 0x0A3C, "NTT DoCoMo,Inc." },
+ { 0x0A3D, "Varo Vision" },
+ { 0x0A3E, "REINHARDT System- und Messelectronic GmbH" },
+ { 0x0A3F, "Swissonic AG" },
+ { 0x0A40, "PaloDEx Group Oy" },
+ { 0x0A41, "SEKONIC corporation" },
+ { 0x0A42, "Medtronic Functional Diagnostics" },
+ { 0x0A43, "Boca Systems Inc." },
+ { 0x0A44, "TurboLinux" },
+ { 0x0A45, "Look&Say co., Ltd." },
+ { 0x0A46, "Davicom Semiconductor, Inc." },
+ { 0x0A47, "Hirose Electric Co., Ltd." },
+ { 0x0A48, "I/O Interconnect" },
+ { 0x0A4A, "propagamma kommunikation" },
+ { 0x0A4B, "Fujitsu Media Devices Limited" },
+ { 0x0A4C, "COMPUTEX Co., Ltd." },
+ { 0x0A4D, "Evolution Electronics Ltd." },
+ { 0x0A4E, "Steinberg Soft-und Hardware GmbH" },
+ { 0x0A4F, "Litton Systems Inc." },
+ { 0x0A50, "Mimaki Engineering Co., Ltd." },
+ { 0x0A51, "Sony Electronics Inc." },
+ { 0x0A52, "JEBSEE ELECTRONICS CO., LTD." },
+ { 0x0A53, "Portable Peripheral Co., Ltd." },
+ { 0x0A54, "Applied Signal Technology, Inc." },
+ { 0x0A55, "ThermoQuest Corporation" },
+ { 0x0A56, "EAE electronics GmbH" },
+ { 0x0A57, "Joachim Koopmann Software" },
+ { 0x0A58, "DIGIDENT LTD." },
+ { 0x0A59, "Convergence Instruments" },
+ { 0x0A5B, "EASICS NV" },
+ { 0x0A5C, "Broadcom Corp." },
+ { 0x0A5D, "Diatrend Corporation" },
+ { 0x0A5E, "Spinnaker Systems Inc." },
+ { 0x0A5F, "Zebra Technologies" },
+ { 0x0A60, "Future Networks, Inc." },
+ { 0x0A61, "DTI sa" },
+ { 0x0A62, "MPMan.com, Inc." },
+ { 0x0A63, "Prism Media Products Ltd." },
+ { 0x0A64, "Padcom Inc." },
+ { 0x0A65, "FullAudio, Inc." },
+ { 0x0A66, "ClearCube Technology" },
+ { 0x0A67, "Medeli Electronics Co, Ltd." },
+ { 0x0A68, "COMAIDE Corporation" },
+ { 0x0A69, "Chroma ate Inc." },
+ { 0x0A6A, "Newcom Inc." },
+ { 0x0A6B, "Green House Co., Ltd." },
+ { 0x0A6C, "Integrated Circuit Systems Inc." },
+ { 0x0A6D, "UPS Manufacturing" },
+ { 0x0A6E, "Benwin" },
+ { 0x0A6F, "Core Technology, Inc." },
+ { 0x0A70, "International Game Technology" },
+ { 0x0A71, "VIPColor Technologies USA, Inc." },
+ { 0x0A72, "Sanwa Denshi" },
+ { 0x0A73, "SYDEC N.V." },
+ { 0x0A74, "Adaptive Networks, Inc." },
+ { 0x0A75, "Jeol USA, Inc." },
+ { 0x0A76, "I-Jam Multi-Media, LLC" },
+ { 0x0A77, "Janome Sewing Machine Co., Ltd." },
+ { 0x0A78, "GREATSUN" },
+ { 0x0A79, "Geocast Network Systems, Inc." },
+ { 0x0A7A, "Towitoko AG" },
+ { 0x0A7B, "R & D Co., Ltd." },
+ { 0x0A7C, "QUANCOM Informationssysteme GmbH" },
+ { 0x0A7D, "Intertek NSTL" },
+ { 0x0A7E, "Octagon Systems Corporation" },
+ { 0x0A7F, "AVerMedia MicroSystems" },
+ { 0x0A80, "Rexon Technology Corp., Ltd" },
+ { 0x0A81, "CHESEN ELECTRONICS CORP." },
+ { 0x0A82, "SYSCAN" },
+ { 0x0A83, "NextComm, Inc." },
+ { 0x0A84, "Maui Innovative Peripherals" },
+ { 0x0A85, "IDEXX LABS" },
+ { 0x0A86, "NITGen Co., Ltd." },
+ { 0x0A87, "Tucker-Davis Technologies, Inc." },
+ { 0x0A88, "PAH-RAN TECH., INC." },
+ { 0x0A89, "Active Company" },
+ { 0x0A8A, "American Magnetics" },
+ { 0x0A8B, "Intelliworxx Inc." },
+ { 0x0A8C, "Tecmar" },
+ { 0x0A8D, "Picturetel" },
+ { 0x0A8E, "Japan Aviation Electronics Industry Ltd. (JAE)" },
+ { 0x0A8F, "Young Chang Co. Ltd." },
+ { 0x0A90, "Candy Technology Co., Ltd." },
+ { 0x0A91, "Globlink Technology Inc." },
+ { 0x0A92, "EGO SYStems Inc." },
+ { 0x0A93, "C Technologies AB (publ)" },
+ { 0x0A94, "Intersense" },
+ { 0x0A95, "Origin Instruments Corporation" },
+ { 0x0A96, "Evation.com" },
+ { 0x0A97, "Guardware Systems Ltd." },
+ { 0x0A98, "TECHNO ART CO., LTD" },
+ { 0x0A99, "Talon Technology" },
+ { 0x0A9A, "Business Navigator" },
+ { 0x0A9B, "Input/Output Inc." },
+ { 0x0A9C, "Applied Cytometry Systems" },
+ { 0x0A9D, "Jung & Dusch GmbH" },
+ { 0x0A9E, "Performance Concepts, Inc." },
+ { 0x0A9F, "Sim-Addicts Design Group" },
+ { 0x0AA0, "Vtech Communications Ltd." },
+ { 0x0AA1, "Amer.com" },
+ { 0x0AA2, "Delta Tau Data Systems, Inc." },
+ { 0x0AA3, "Lava Computer Mfg. Inc." },
+ { 0x0AA4, "Develco Elektronik" },
+ { 0x0AA5, "First International Digital" },
+ { 0x0AA6, "Perception Digital Limited" },
+ { 0x0AA7, "Wincor Nixdorf GmbH & Co KG" },
+ { 0x0AA8, "TriGem Computer, Inc." },
+ { 0x0AA9, "Baromtec Co." },
+ { 0x0AAA, "Japan CBM Corporation" },
+ { 0x0AAB, "Vision Shape Europe SA." },
+ { 0x0AAC, "iCompression Inc." },
+ { 0x0AAD, "Rohde & Schwarz GmbH & Co. KG" },
+ { 0x0AAE, "NEC infrontia Corporation" },
+ { 0x0AAF, "digitalway co., ltd." },
+ { 0x0AB0, "Arrow Strong Electronics CO. LTD" },
+ { 0x0AB1, "Feig Electronic GmbH" },
+ { 0x0AB2, "Sintefex Audio LDA" },
+ { 0x0AB3, "CANON FINETECH INC." },
+ { 0x0AB4, "esd electronic system design gmbh" },
+ { 0x0AB5, "Beckman Coulter, Inc." },
+ { 0x0AB6, "Labsystems Oy" },
+ { 0x0AB7, "Cross electronics, inc." },
+ { 0x0AB8, "TelePhotogenics, Inc." },
+ { 0x0AB9, "Identcode Ltd." },
+ { 0x0ABA, "University of Geneva" },
+ { 0x0ABB, "Travsys BV" },
+ { 0x0ABC, "Life-Tech, Inc." },
+ { 0x0ABD, "Wako Rubber Industries Co., Ltd." },
+ { 0x0ABE, "STEREOLINK.COM" },
+ { 0x0ABF, "DeVaSys" },
+ { 0x0AC0, "Nidek Co., Ltd." },
+ { 0x0AC1, "MicroDatec GmbH" },
+ { 0x0AC2, "BrainMaster Technologies, Inc." },
+ { 0x0AC3, "ON Semiconductor (System Solutions Co., Ltd)" },
+ { 0x0AC4, "LECO CORPORATION" },
+ { 0x0AC5, "I & C Corporation" },
+ { 0x0AC6, "Singing Electrons, Inc." },
+ { 0x0AC7, "Panwest Corporation" },
+ { 0x0AC8, "Vimicro Corporation" },
+ { 0x0AC9, "Micro Solutions, Inc." },
+ { 0x0ACA, "The Open Group" },
+ { 0x0ACB, "DEICY CORPORATION" },
+ { 0x0ACC, "Koga Electronics Co." },
+ { 0x0ACD, "ID Tech" },
+ { 0x0ACE, "ZyDAS Technology Corporation" },
+ { 0x0ACF, "Intoto, Inc." },
+ { 0x0AD0, "Intellix Corp." },
+ { 0x0AD1, "Remotec Technology Ltd." },
+ { 0x0AD2, "Service & Quality Technology Co., Ltd." },
+ { 0x0AD3, "Bolton Engineering, Inc." },
+ { 0x0AD4, "TIGEREX ENTERPRISE CO., LTD." },
+ { 0x0AD5, "kuwatec, Inc." },
+ { 0x0AD6, "Vir A/S" },
+ { 0x0AD7, "Lynium L.L.C." },
+ { 0x0AD8, "Aidonic Corporation" },
+ { 0x0AD9, "Avolites Ltd." },
+ { 0x0ADA, "Data Encryption Systems Ltd" },
+ { 0x0ADB, "T.A.M. Co., Ltd." },
+ { 0x0ADC, "KE Knestel Elektronik GmbH" },
+ { 0x0ADD, "Alliance Distribution" },
+ { 0x0ADE, "Microft Co., Ltd." },
+ { 0x0ADF, "Arial Phone L.L.C." },
+ { 0x0AE0, "Collins Medical" },
+ { 0x0AE1, "Protein Solutions, Inc." },
+ { 0x0AE2, "NERA SATCOM ASA" },
+ { 0x0AE3, "Allion Labs, Inc." },
+ { 0x0AE4, "Taito Corporation" },
+ { 0x0AE5, "MacroSystem Digital Video AG" },
+ { 0x0AE6, "EVI, Inc." },
+ { 0x0AE7, "Neodym Systems Inc." },
+ { 0x0AE8, "System Support Co., Ltd." },
+ { 0x0AE9, "North Shore Circuit Design L.L.P." },
+ { 0x0AEA, "SciEssence, LLC" },
+ { 0x0AEB, "TTP Communications Ltd." },
+ { 0x0AEC, "Neodio Technologies Corporation" },
+ { 0x0AED, "ScottCare Corporation" },
+ { 0x0AEE, "Max Co., Ltd." },
+ { 0x0AEF, "Simple Systems, Ltd." },
+ { 0x0AF0, "Option NV" },
+ { 0x0AF1, "KYOEI Co., Ltd." },
+ { 0x0AF2, "CARTS, LLC" },
+ { 0x0AF3, "Scale Master Technology, LLC." },
+ { 0x0AF4, "ARTRONICS CO. LTD" },
+ { 0x0AF5, "Nakamichi" },
+ { 0x0AF6, "SILVER I CO., LTD." },
+ { 0x0AF7, "B2C2, Inc." },
+ { 0x0AF8, "Taiwan Regular Electronics Co., Ltd." },
+ { 0x0AF9, "NEW AFA TECHNOLOGY CO., LTD" },
+ { 0x0AFA, "DMC Co., Ltd." },
+ { 0x0AFB, "OO-ALC/TISMD-CAPRE" },
+ { 0x0AFC, "Zaptronix Ltd" },
+ { 0x0AFD, "Tateno Dennou, Inc." },
+ { 0x0AFE, "Cummins Engine Company" },
+ { 0x0AFF, "Jump Zone Network Products, Inc." },
+ { 0x0B00, "INGENICO" },
+ { 0x0B01, "Techno-Holon Corporation" },
+ { 0x0B02, "Avery Weigh-Tronix" },
+ { 0x0B03, "ARCA TECHNOLOGIES, LTD." },
+ { 0x0B04, "EURESYS S.A." },
+ { 0x0B05, "ASUSTek Computer Inc." },
+ { 0x0B06, "Digital Ink, Inc." },
+ { 0x0B07, "Telebau GmbH" },
+ { 0x0B08, "Lightwell Co., Ltd ZAX Division" },
+ { 0x0B09, "Allophonic Electronics L.t.d." },
+ { 0x0B0A, "FARO Technologies INC." },
+ { 0x0B0B, "Datamax Corporation" },
+ { 0x0B0C, "Todos Data System AB" },
+ { 0x0B0D, "Project Lab" },
+ { 0x0B0E, "GN Audio" },
+ { 0x0B0F, "AVID Technology" },
+ { 0x0B10, "Pcally" },
+ { 0x0B11, "I Tech Solutions Co., Ltd." },
+ { 0x0B12, "T-Metrics, Inc." },
+ { 0x0B13, "Practical Micro Design, Inc." },
+ { 0x0B14, "Real Sport, Inc." },
+ { 0x0B15, "Actia Do Brasil Ind. E. Com. Ltda." },
+ { 0x0B16, "onscreen24" },
+ { 0x0B17, "Scantron Corporation" },
+ { 0x0B18, "Shimizu Works, Hitachi Air Conditioning Systems Co" },
+ { 0x0B19, "Color Kinetics Inc." },
+ { 0x0B1B, "Bematech Ind. Com. Equip. Elect. S.A." },
+ { 0x0B1C, "York Electronics Centre" },
+ { 0x0B1D, "Erich Jaeger GmbH" },
+ { 0x0B1E, "Electronic Warfare Associates, Inc. (EWA)" },
+ { 0x0B1F, "Insyde Software Corp." },
+ { 0x0B20, "TransDimension Inc." },
+ { 0x0B21, "Yokogawa Electric Corporation" },
+ { 0x0B22, "Japan System Development Co. Ltd." },
+ { 0x0B23, "Pan-Asia Electronics Co., Ltd." },
+ { 0x0B24, "ITX E-Globaledge Corporation" },
+ { 0x0B25, "Advanced Programming Concepts, Inc." },
+ { 0x0B26, "Applied Scientific Instrumentation Inc." },
+ { 0x0B27, "Ritek Corporation" },
+ { 0x0B28, "Kenwood Corporation" },
+ { 0x0B29, "Intertex Data AB" },
+ { 0x0B2A, "Glotrex Co., Ltd." },
+ { 0x0B2C, "Village Center, Inc." },
+ { 0x0B2D, "Akatsuki Electronic work & study Corp." },
+ { 0x0B2E, "CTL Inc." },
+ { 0x0B2F, "Clarkspur Design, Inc." },
+ { 0x0B30, "NewHeights Software" },
+ { 0x0B31, "Kyowa Electronic Instruments Co., Ltd." },
+ { 0x0B32, "Utrecht University MBF" },
+ { 0x0B33, "Contour Design, Inc." },
+ { 0x0B34, "KNP Technologies" },
+ { 0x0B35, "Solutions Cubed" },
+ { 0x0B36, "Iizuna Signal Processing Lab Inc." },
+ { 0x0B37, "Hitachi ULSI Systems Co., Ltd." },
+ { 0x0B39, "Omnidirectional Control Technology Inc." },
+ { 0x0B3A, "IPaxess" },
+ { 0x0B3B, "Bromax Communications, Inc." },
+ { 0x0B3C, "Olivetti S.p.A" },
+ { 0x0B3E, "Kikusui Electronics Corporation" },
+ { 0x0B3F, "Mitec Systems, Inc." },
+ { 0x0B40, "RF Solutions Ltd." },
+ { 0x0B41, "Hal Corporation" },
+ { 0x0B42, "LENZE GmbH & Co KG" },
+ { 0x0B43, "Sixth Avenue Designs" },
+ { 0x0B44, "Programa Tools, Inc." },
+ { 0x0B45, "Event Electronics, LLC" },
+ { 0x0B46, "Nuark Co., Ltd." },
+ { 0x0B47, "Sportbug.com, Inc" },
+ { 0x0B48, "TechnoTrend AG" },
+ { 0x0B49, "ASCII Corporation" },
+ { 0x0B4A, "Pocket Pyro, Inc." },
+ { 0x0B4B, "XFX Creation Inc." },
+ { 0x0B4C, "Comvurgent" },
+ { 0x0B4D, "Graphtec" },
+ { 0x0B4E, "Musical Electronics Ltd." },
+ { 0x0B4F, "Neuralog, Inc." },
+ { 0x0B50, "Starlight Marketing (H.K.) Ltd." },
+ { 0x0B51, "USB KITS" },
+ { 0x0B52, "Zight Corporation" },
+ { 0x0B54, "Sinbon Electronics Co., Ltd." },
+ { 0x0B55, "Sendtek Corporation" },
+ { 0x0B56, "TYI Systems Ltd." },
+ { 0x0B57, "Hanwang Technology Co., LTD." },
+ { 0x0B59, "Lake Communications Ltd." },
+ { 0x0B5A, "Corel Corporation" },
+ { 0x0B5B, "Anritsu Corporation" },
+ { 0x0B5C, "IDEAL Industries Inc." },
+ { 0x0B5D, "Music Playground Inc." },
+ { 0x0B5E, "Luciol Instruments" },
+ { 0x0B5F, "Green Electronics Co., Ltd." },
+ { 0x0B60, "SiConnect Ltd." },
+ { 0x0B61, "NEC Display Solutions, Ltd." },
+ { 0x0B62, "Orange Micro, Inc." },
+ { 0x0B63, "ADLink Technology Inc." },
+ { 0x0B64, "Wonderful Wire Cable Co., Ltd" },
+ { 0x0B65, "Expert Magnetics Corp." },
+ { 0x0B66, "Cybiko Inc." },
+ { 0x0B67, "Fairbanks Scales" },
+ { 0x0B68, "SenDEC Corporation" },
+ { 0x0B69, "CacheVision" },
+ { 0x0B6A, "Maxim Integrated Products" },
+ { 0x0B6B, "Ashling Microsystems Ltd." },
+ { 0x0B6C, "FreeSystems Pte Ltd" },
+ { 0x0B6D, "The Graphics Network Limited" },
+ { 0x0B6E, "Neurosoft, Inc." },
+ { 0x0B6F, "Nagano Japan Radio Co., Ltd" },
+ { 0x0B70, "PortalPlayer, Inc." },
+ { 0x0B71, "SHIN-EI Sangyo Co., Ltd." },
+ { 0x0B72, "Embedded Wireless Technology Co. Ltd." },
+ { 0x0B73, "Computone Corp." },
+ { 0x0B75, "Roland DG Corporation" },
+ { 0x0B76, "Pro-Tech Services Inc." },
+ { 0x0B77, "RJS, Inc." },
+ { 0x0B78, "ATSKY" },
+ { 0x0B79, "Sunrise Telecom, Inc." },
+ { 0x0B7A, "Zeevo, Inc." },
+ { 0x0B7B, "Taiko Denki Co., Ltd." },
+ { 0x0B7C, "ITRAN Communications Ltd." },
+ { 0x0B7D, "Astrodesign, Inc." },
+ { 0x0B7E, "Kurusugawa Electronics Incorporate" },
+ { 0x0B7F, "Scantech BV" },
+ { 0x0B80, "Omtronix Engineering Corp." },
+ { 0x0B81, "id3 Semiconductors" },
+ { 0x0B82, "TravRoute, a division of ALK Associates, Inc." },
+ { 0x0B83, "OCTAX Microscience" },
+ { 0x0B84, "Rextron Technology, Inc." },
+ { 0x0B85, "Elkat Electronics (M) SDN. BHD." },
+ { 0x0B86, "Exputer Systems, Inc." },
+ { 0x0B87, "Plus-One I & T Inc." },
+ { 0x0B88, "Sigma Koki Co., Ltd. Technology Center" },
+ { 0x0B89, "Advanced Digital Broadcast Ltd." },
+ { 0x0B8A, "YARC Systems Corporation" },
+ { 0x0B8B, "American Microsystems, Ltd." },
+ { 0x0B8C, "SMART Technologies Inc." },
+ { 0x0B8D, "Microsystems Development Technologies, Inc." },
+ { 0x0B8E, "Dartcom" },
+ { 0x0B8F, "Visual Environment" },
+ { 0x0B90, "DACTRON INC." },
+ { 0x0B91, "DesignTech International, Inc." },
+ { 0x0B92, "SINAR AG" },
+ { 0x0B93, "Marantz Japan, Inc." },
+ { 0x0B94, "NEOREX Co., Ltd." },
+ { 0x0B95, "ASIX Electronics Corporation" },
+ { 0x0B96, "SEWON TELECOM" },
+ { 0x0B97, "O2Micro, Inc." },
+ { 0x0B98, "Playmates Toys Inc." },
+ { 0x0B99, "Audio International, Inc." },
+ { 0x0B9A, "Namco Limited" },
+ { 0x0B9B, "Dipl.-Ing. Stefan Kunde" },
+ { 0x0B9C, "Melco Embroidery Systems" },
+ { 0x0B9D, "Softprotec Co." },
+ { 0x0B9E, "Asylum Research" },
+ { 0x0B9F, "Chippo Technologies" },
+ { 0x0BA0, "Turtle Industry Co., Ltd." },
+ { 0x0BA1, "Jowit Company Limited" },
+ { 0x0BA2, "Line Media Research CO., LTD." },
+ { 0x0BA3, "Taiko Electric Works, Ltd." },
+ { 0x0BA4, "Nagano Oki Electric Co., Ltd." },
+ { 0x0BA5, "Clemex Technologies Inc." },
+ { 0x0BA6, "3DM Devices Inc" },
+ { 0x0BA7, "CVC Networks Co., Ltd." },
+ { 0x0BA8, "CastleNet Technology Inc." },
+ { 0x0BA9, "Misawa Homes Co., Ltd." },
+ { 0x0BAA, "Dr. Gerhard Schmidt GmbH" },
+ { 0x0BAB, "House Ear Institute" },
+ { 0x0BAC, "Biometric Access Corporation" },
+ { 0x0BAD, "Festo Didactic Ltd/Ltee" },
+ { 0x0BAE, "IGEN International, Inc." },
+ { 0x0BAF, "U.S. Robotics" },
+ { 0x0BB0, "Concord Camera Corp." },
+ { 0x0BB1, "Infinilink Corporation" },
+ { 0x0BB2, "Ambit Microsystems Corporation" },
+ { 0x0BB3, "Ofuji Technology" },
+ { 0x0BB4, "HTC Corporation" },
+ { 0x0BB5, "Murata Manufacturing Co., Ltd." },
+ { 0x0BB6, "Network Alchemy" },
+ { 0x0BB7, "Joytech Computer Company Limited" },
+ { 0x0BB8, "Renesas Technology Sales Co., Ltd." },
+ { 0x0BB9, "Eiger M & C CO., LTD." },
+ { 0x0BBA, "ZACCESS Systems" },
+ { 0x0BBB, "General Meters Corporation" },
+ { 0x0BBC, "Assistive Technology, Inc." },
+ { 0x0BBD, "System Connection, Inc" },
+ { 0x0BBE, "ShibaSoku Co., Ltd." },
+ { 0x0BBF, "Algo Communication Products Ltd." },
+ { 0x0BC0, "Knilink Technology Inc." },
+ { 0x0BC1, "FUW YNG ELECTRONICS COMPANY LTD" },
+ { 0x0BC2, "Seagate Technology LLC" },
+ { 0x0BC3, "IPWireless, Inc." },
+ { 0x0BC4, "Microcube Corp." },
+ { 0x0BC5, "JCN Co., Ltd." },
+ { 0x0BC6, "ExWAY Inc." },
+ { 0x0BC7, "X10 Wireless Technology, Inc." },
+ { 0x0BC8, "Telmax Communications" },
+ { 0x0BC9, "ECI Telecom Ltd" },
+ { 0x0BCA, "Startek Engineering Incorporated" },
+ { 0x0BCB, "Perfect Technic Enterprise Co. LTD" },
+ { 0x0BCC, "Dolphin Interactive" },
+ { 0x0BCD, "Mbeware Inc." },
+ { 0x0BCE, "I-TEC hanshin Incorporated Company" },
+ { 0x0BCF, "Chuo-Engineering Ltd." },
+ { 0x0BD0, "Trenz Electronic" },
+ { 0x0BD1, "Blue Sky Labs, Inc." },
+ { 0x0BD2, "Union Biometrica" },
+ { 0x0BD3, "OPHIR OPTRONICS LTD" },
+ { 0x0BD4, "NISSIN INC." },
+ { 0x0BD5, "Rabbit House Corporation" },
+ { 0x0BD6, "Renaissance Learning Inc." },
+ { 0x0BD7, "Andrew Pargeter & Associates" },
+ { 0x0BD8, "Gamry Instruments, Inc." },
+ { 0x0BD9, "Liberty Instruments, Inc." },
+ { 0x0BDA, "Realtek Semiconductor Corp." },
+ { 0x0BDB, "Ericsson AB" },
+ { 0x0BDC, "Y Media Corporation" },
+ { 0x0BDD, "Orange PCS" },
+ { 0x0BDE, "Thuris Corporation" },
+ { 0x0BDF, "PopcomNet Co., Ltd" },
+ { 0x0BE0, "Silicon Magic Co., LTD" },
+ { 0x0BE1, "COM DEV Wireless" },
+ { 0x0BE2, "Kanda Tsushin Kogyo Co., LTD" },
+ { 0x0BE3, "TOYO Corporation" },
+ { 0x0BE4, "Elka International Ltd." },
+ { 0x0BE5, "DOME Imaging Systems, Inc" },
+ { 0x0BE6, "Wonderful Photoelectricity (DongGuan), Co., Ltd." },
+ { 0x0BE7, "Zanthic Technologies Inc." },
+ { 0x0BE8, "M@inNet Communication" },
+ { 0x0BE9, "Realistic Interactive, Inc." },
+ { 0x0BEA, "Bryce Office Systems" },
+ { 0x0BEB, "RPA Electronics Design, LLC" },
+ { 0x0BEC, "Idaho Technology" },
+ { 0x0BED, "MEI, Inc." },
+ { 0x0BEE, "LTK International Limited" },
+ { 0x0BEF, "Way2Call Communications" },
+ { 0x0BF0, "Pace Micro Technology PLC" },
+ { 0x0BF1, "Intracom S.A." },
+ { 0x0BF2, "Konexx" },
+ { 0x0BF3, "CTI Co., Ltd." },
+ { 0x0BF4, "Kuraya-Sanseido Co., Ltd." },
+ { 0x0BF5, "Xactex Corporation" },
+ { 0x0BF6, "Addonics Technologies, Inc." },
+ { 0x0BF7, "Sunny Giken Inc." },
+ { 0x0BF8, "Fujitsu Technology Solutions GmbH" },
+ { 0x0BF9, "QPICT, Inc." },
+ { 0x0BFA, "NKE Corporation" },
+ { 0x0BFB, "Grass Valley Group" },
+ { 0x0BFC, "Zero Mass Products Inc." },
+ { 0x0BFD, "KVASER AB" },
+ { 0x0BFE, "Morphy Planning & Co., Ltd" },
+ { 0x0BFF, "Damotech Inc." },
+ { 0x0C00, "ATM Computer" },
+ { 0x0C01, "K-One Telecom Co., Ltd." },
+ { 0x0C02, "Shinko Seisakusho Co., LTD" },
+ { 0x0C03, "SAXA Inc." },
+ { 0x0C04, "MOTO Development Group, Inc." },
+ { 0x0C05, "Appian Graphics" },
+ { 0x0C06, "Hasbro, Inc." },
+ { 0x0C07, "Infinite Data Storage LTD" },
+ { 0x0C08, "ei Corporation" },
+ { 0x0C09, "Comjet Information System" },
+ { 0x0C0A, "Highpoint Technologies, Inc." },
+ { 0x0C0B, "Dura Micro, Inc." },
+ { 0x0C0C, "OPTIKON 2000 S.P.A." },
+ { 0x0C0D, "Callify Communications & Software Ltd." },
+ { 0x0C0E, "Korea eBook Inc." },
+ { 0x0C0F, "IDS Innomic GmbH" },
+ { 0x0C10, "Silicon Wave" },
+ { 0x0C11, "Multigon Industries" },
+ { 0x0C12, "Zeroplus Technology Co; LTD" },
+ { 0x0C13, "Orion Electronics International" },
+ { 0x0C14, "Parallel Technologies, Inc." },
+ { 0x0C15, "Iris Graphics" },
+ { 0x0C16, "Gyration, Inc." },
+ { 0x0C17, "Cyberboard A/S" },
+ { 0x0C18, "SynerTek Korea, Inc." },
+ { 0x0C19, "cyberPIXIE, Inc." },
+ { 0x0C1A, "Silicon Motion, Inc." },
+ { 0x0C1B, "MIPS TECHNOLOGIES" },
+ { 0x0C1C, "Hang Zhou Silan Microelectronics Co. Ltd" },
+ { 0x0C1D, "Digital Audio Corporation" },
+ { 0x0C1E, "TAKAYA CORP." },
+ { 0x0C1F, "Magicard Ltd" },
+ { 0x0C20, "Viditec Inc." },
+ { 0x0C21, "Lunatronic" },
+ { 0x0C22, "TallyGenicom LP" },
+ { 0x0C23, "Lernout + Hauspie (L + H)" },
+ { 0x0C24, "Taiyo Yuden Co., Ltd." },
+ { 0x0C25, "Sampo Corporation" },
+ { 0x0C26, "Icom Inc." },
+ { 0x0C27, "RF Ideas" },
+ { 0x0C28, "ICCC" },
+ { 0x0C29, "SOGECLAIR aerospace" },
+ { 0x0C2A, "AFP Imaging Corp." },
+ { 0x0C2B, "AT system" },
+ { 0x0C2C, "Controller Technologies Corporation" },
+ { 0x0C2D, "Scientific Data Systems, Inc." },
+ { 0x0C2E, "Honeywell Scanning & Mobility" },
+ { 0x0C2F, "Starcover GmbH" },
+ { 0x0C30, "MUTOH EUROPE N.V." },
+ { 0x0C31, "Cosmo Techs Co., Ltd." },
+ { 0x0C32, "Weibel Scientific A/S" },
+ { 0x0C33, "GN Otometrics A/S" },
+ { 0x0C34, "Interisa Electronica" },
+ { 0x0C35, "Eagletron Inc." },
+ { 0x0C36, "E INK CORPORATION" },
+ { 0x0C37, "e.Digital" },
+ { 0x0C38, "Der An Electric Wire & Cable Co. Ltd." },
+ { 0x0C39, "Aeroflex" },
+ { 0x0C3A, "Furui Precise Component (Kunshan) Co., Ltd" },
+ { 0x0C3B, "Komatsu Ltd." },
+ { 0x0C3C, "Radius Co., Ltd." },
+ { 0x0C3D, "Innocom, Inc." },
+ { 0x0C3E, "NEXTCELL INC." },
+ { 0x0C3F, "Street Smart Security" },
+ { 0x0C40, "Navini Networks, Inc" },
+ { 0x0C41, "findtheDOT" },
+ { 0x0C42, "OMAX Corporation" },
+ { 0x0C43, "BIOMETRIKA" },
+ { 0x0C44, "Motorola iDEN" },
+ { 0x0C45, "Sonix Technology Co., Ltd." },
+ { 0x0C46, "WaveRider Communications, Inc" },
+ { 0x0C47, "TECAN Group AG" },
+ { 0x0C48, "MARPOSS S.p.A." },
+ { 0x0C49, "Gigahertz-Optik GmbH" },
+ { 0x0C4A, "ALGE-TIMING GmbH & Co" },
+ { 0x0C4B, "REINER Kartengeraete GmbH & Co.KG" },
+ { 0x0C4C, "Needham's Electronics Inc" },
+ { 0x0C4D, "ICHIRO.ORG" },
+ { 0x0C4E, "Sonic Innovations, Inc." },
+ { 0x0C4F, "01dB-Stell" },
+ { 0x0C50, "Forvus Research Inc." },
+ { 0x0C51, "Trax Softworks, Inc." },
+ { 0x0C52, "Sealevel Systems, Inc." },
+ { 0x0C53, "ViewPLUS Inc." },
+ { 0x0C54, "GLORY LTD." },
+ { 0x0C55, "Spectrum Digital Inc." },
+ { 0x0C56, "Billion Bright (HK) Corporation Limited" },
+ { 0x0C57, "Imaginative Design Operation Co. Ltd." },
+ { 0x0C58, "Vidar Systems Corporation" },
+ { 0x0C59, "Dong Guan Shinko Wire Co., Ltd." },
+ { 0x0C5A, "TRS International Mfg., Inc." },
+ { 0x0C5B, "EDEC Co., Ltd." },
+ { 0x0C5C, "Obbligato Objectives" },
+ { 0x0C5D, "Musitronics GmbH" },
+ { 0x0C5E, "Xytronix Research & Design" },
+ { 0x0C5F, "WAVESYSTEMS" },
+ { 0x0C60, "Apogee Electronics Corporation" },
+ { 0x0C61, "Network Security Technology Co." },
+ { 0x0C62, "Chant Sincere Co., Ltd" },
+ { 0x0C63, "Toko, Inc." },
+ { 0x0C64, "Signality System Engineering Co., Ltd." },
+ { 0x0C65, "Eminence Enterprise Co., Ltd." },
+ { 0x0C66, "REXON ELECTRONICS CORP." },
+ { 0x0C67, "Concept Telecom Ltd" },
+ { 0x0C68, "Whanam Electronics Co., Ltd." },
+ { 0x0C69, "COMPUTechnic AG" },
+ { 0x0C6A, "Ackerman Computer Sciences" },
+ { 0x0C6B, "Spectrum Techniques, Inc" },
+ { 0x0C6C, "JETI Technische Instrumente GmbH" },
+ { 0x0C6D, "Aardvark" },
+ { 0x0C6E, "Zaxus Limited" },
+ { 0x0C6F, "SCC Research" },
+ { 0x0C70, "MCT Elektronikladen" },
+ { 0x0C71, "Fa. Hydrotechnik" },
+ { 0x0C72, "PEAK-System-Technik" },
+ { 0x0C73, "Omega Well Monitoring" },
+ { 0x0C74, "Optronic Laboratories, Inc." },
+ { 0x0C75, "Ripmax Plc" },
+ { 0x0C76, "Solid State System Co., Ltd." },
+ { 0x0C77, "SIPIX GROUP LIMITED" },
+ { 0x0C78, "Detto Corporation" },
+ { 0x0C79, "NuConnex Technologies PTE LTD" },
+ { 0x0C7A, "Wing-Span Enterprise Co., Ltd." },
+ { 0x0C7B, "Link Instruments, Inc." },
+ { 0x0C7C, "TMS International BV" },
+ { 0x0C7E, "KIRK telecom" },
+ { 0x0C7F, "SoftBaugh, Inc." },
+ { 0x0C80, "Optim Electronics" },
+ { 0x0C81, "Dragon State Ltd." },
+ { 0x0C82, "Impeccable Instruments, LLC" },
+ { 0x0C83, "Cylink" },
+ { 0x0C84, "Howell Instruments, Inc." },
+ { 0x0C85, "Lectra Systemes" },
+ { 0x0C86, "NDA Technologies, Inc." },
+ { 0x0C87, "Aubit, Ltd." },
+ { 0x0C88, "Kyocera Wireless Inc." },
+ { 0x0C89, "Honda Tsushin Kogyo Co., Ltd" },
+ { 0x0C8A, "Cast Lighting Limited" },
+ { 0x0C8B, "Wavefly Corporation" },
+ { 0x0C8C, "Coactive Networks" },
+ { 0x0C8D, "Greenlee Textron, Inc." },
+ { 0x0C8E, "Cesscom Co., Ltd." },
+ { 0x0C8F, "Applied Microsystems" },
+ { 0x0C90, "American Arium" },
+ { 0x0C91, "FPGA Information" },
+ { 0x0C92, "Nixvue Systems PTE LTD" },
+ { 0x0C93, "Alara Inc." },
+ { 0x0C94, "SAGEM Denmark" },
+ { 0x0C95, "Kyushu-Kyohan Co., Ltd." },
+ { 0x0C96, "TOPCON Positioning Systems" },
+ { 0x0C97, "GRE America, Inc." },
+ { 0x0C98, "Berkshire Products, Inc." },
+ { 0x0C99, "Innochips Co., Ltd." },
+ { 0x0C9A, "Hanool Robotics Corp" },
+ { 0x0C9B, "Jobin Yvon, Inc." },
+ { 0x0C9C, "Brand Innovators" },
+ { 0x0C9D, "DyOcean" },
+ { 0x0C9E, "PLEXUS MULTIMEDIA PTE LTD" },
+ { 0x0C9F, "Extenex Corporation" },
+ { 0x0CA0, "Robert Bosch GmbH - Automotive Aftermarket" },
+ { 0x0CA1, "Mentor Engineering, Inc." },
+ { 0x0CA2, "Zyfer" },
+ { 0x0CA3, "SEGA CORPORATION" },
+ { 0x0CA4, "ST&T INSTRUMENT CORP." },
+ { 0x0CA5, "BAE SYSTEMS CANADA INC." },
+ { 0x0CA6, "Castles Technology Co. Ltd." },
+ { 0x0CA7, "Information Systems Laboratories" },
+ { 0x0CA8, "Digital Audio Labs, Inc." },
+ { 0x0CA9, "Institut fuer Rundfunktechnik" },
+ { 0x0CAA, "Allied Telesis K.K." },
+ { 0x0CAB, "Melon Technos Co., Ltd." },
+ { 0x0CAC, "NEC Electronics (Europe) GmbH" },
+ { 0x0CAD, "Motorola Solutions" },
+ { 0x0CAE, "swissvoice ag" },
+ { 0x0CAF, "Buslink" },
+ { 0x0CB0, "Flying Pig Systems" },
+ { 0x0CB1, "Innovonics, Inc." },
+ { 0x0CB2, "Softmark" },
+ { 0x0CB3, "FitzSimons Automation" },
+ { 0x0CB4, "PalmMicro Communications, Inc." },
+ { 0x0CB5, "Esel International Company Ltd." },
+ { 0x0CB6, "Celestix Networks PTE LTD" },
+ { 0x0CB7, "Singatron Enterprise Co. Ltd." },
+ { 0x0CB8, "Opticis Co., Ltd." },
+ { 0x0CB9, "VTECH INFORMATIONS LTD." },
+ { 0x0CBA, "Trust Electronic (Shanghai) Co., Ltd." },
+ { 0x0CBB, "Shanghai Darong Electronics Co., Ltd." },
+ { 0x0CBC, "PALMAX Technology Co., Ltd." },
+ { 0x0CBD, "Pentel Co., Ltd. (Electronics Equipment Div.)" },
+ { 0x0CBE, "Keryx Technologies, Inc." },
+ { 0x0CBF, "Union Genius Computer Co., Ltd" },
+ { 0x0CC0, "Kuon Yi Industrial Corp." },
+ { 0x0CC2, "Timex Corporation" },
+ { 0x0CC3, "Rimage Corporation" },
+ { 0x0CC4, "emsys Embedded Systems GmbH" },
+ { 0x0CC5, "SENDO" },
+ { 0x0CC6, "INTERMAGIC CORP." },
+ { 0x0CC7, "Kontron Medical AG" },
+ { 0x0CC8, "Technotools Corporation" },
+ { 0x0CC9, "BroadMAX Technologies, Inc." },
+ { 0x0CCA, "Amphenol Corporation" },
+ { 0x0CCB, "SKNET CORPORATION LTD." },
+ { 0x0CCC, "DOMEX TECHNOLOGY CORPORATION" },
+ { 0x0CCD, "TerraTec Electronic GmbH" },
+ { 0x0CCE, "Optical Imaging Inc." },
+ { 0x0CCF, "T&D CORPORATION" },
+ { 0x0CD0, "Art Haven 9 Co., Ltd" },
+ { 0x0CD1, "Premier Technologies, Inc." },
+ { 0x0CD2, "C-MAP SRL" },
+ { 0x0CD3, "Pretorian Manufacturing Ltd" },
+ { 0x0CD4, "Amplex" },
+ { 0x0CD5, "Colorado Circuitworks, Inc." },
+ { 0x0CD6, "Scheldt & Bachmann GmbH" },
+ { 0x0CD7, "NEWCHIP S.r.l." },
+ { 0x0CD8, "JS Digitech, Inc." },
+ { 0x0CD9, "Shin Din Cable Ltd." },
+ { 0x0CDA, "INTERFACE K.K." },
+ { 0x0CDB, "OSMOOZE S.A." },
+ { 0x0CDC, "HIJI HIGH-TECH CO., LTD." },
+ { 0x0CDD, "Fidelica Microsystems, Inc." },
+ { 0x0CDE, "Z-Com INC." },
+ { 0x0CDF, "BUZZ-VC" },
+ { 0x0CE0, "ZAPEX Research Ltd." },
+ { 0x0CE1, "Pepperoni Light" },
+ { 0x0CE2, "Eltech Solutions Inc." },
+ { 0x0CE3, "MaxVision Corporation" },
+ { 0x0CE4, "JOOHONG" },
+ { 0x0CE5, "Hemisphere West" },
+ { 0x0CE6, "First Silicon Solutions, Inc." },
+ { 0x0CE7, "Bakker IT Services BV" },
+ { 0x0CE8, "Interflex Datensysteme GmbH" },
+ { 0x0CE9, "Pico Technology Limited" },
+ { 0x0CEA, "PRO TECH COMMUNICATIONS INC." },
+ { 0x0CEB, "Sophia Systems Co., Ltd." },
+ { 0x0CEC, "Cyverse Corp." },
+ { 0x0CED, "MAYCOM Audio Systems b.v." },
+ { 0x0CEE, "Gaitmat II" },
+ { 0x0CEF, "Contex A/S" },
+ { 0x0CF0, "Cadac Electronics plc." },
+ { 0x0CF1, "e-CONN ELECTRONIC CO., LTD." },
+ { 0x0CF2, "ENE Technology Inc." },
+ { 0x0CF3, "Qualcomm Atheros, Inc." },
+ { 0x0CF4, "Fomtex Corporation" },
+ { 0x0CF5, "Cellink Co., Ltd." },
+ { 0x0CF6, "Compucable Corporation" },
+ { 0x0CF7, "ishoni Networks" },
+ { 0x0CF8, "Clarisys Incorporated" },
+ { 0x0CF9, "Central System Research Co., Ltd." },
+ { 0x0CFA, "Inviso, Inc." },
+ { 0x0CFB, "SEnergy Corporation" },
+ { 0x0CFC, "Konica-Minolta" },
+ { 0x0CFD, "Hitex UK Ltd." },
+ { 0x0CFE, "L.J. Technical Systems Ltd." },
+ { 0x0CFF, "SAFA MEDIA CO., LTD." },
+ { 0x0D00, "Polar Instruments Ltd" },
+ { 0x0D01, "Red Bird LLC" },
+ { 0x0D02, "Vestibular Technolgies" },
+ { 0x0D03, "Triad Spectrum Ltd." },
+ { 0x0D04, "Addmaster Corporation" },
+ { 0x0D05, "Chung Nam Electronics Co. Ltd." },
+ { 0x0D06, "telos EDV Systementwicklung GmbH" },
+ { 0x0D07, "TAUREUS s.r.o." },
+ { 0x0D08, "UTStarcom (Hangzhou) Telecom Co., Ltd" },
+ { 0x0D09, "MMELECTRONICS" },
+ { 0x0D0A, "Colourfull Creations" },
+ { 0x0D0B, "Contemporary Controls" },
+ { 0x0D0C, "Astron Electronics Co., Ltd." },
+ { 0x0D0D, "MKNet Corporation" },
+ { 0x0D0E, "Hybrid Networks, Inc" },
+ { 0x0D0F, "Feng Shin Cable Co. Ltd." },
+ { 0x0D10, "Elastic Networks" },
+ { 0x0D11, "Maspro Denkoh Corp." },
+ { 0x0D12, "Hansol Electronics Inc." },
+ { 0x0D13, "BMF CORPORATION" },
+ { 0x0D14, "Array Comm, Inc." },
+ { 0x0D15, "OnStream b.v." },
+ { 0x0D16, "Hi-Touch Imaging Technologies Co., Ltd." },
+ { 0x0D17, "NALTEC, Inc." },
+ { 0x0D18, "coaXmedia" },
+ { 0x0D19, "Shanghai Hank Connection Co., Ltd." },
+ { 0x0D1A, "COMTECH SYSTEMS, INC" },
+ { 0x0D1B, "EC Engineering, LLC" },
+ { 0x0D1C, "MACSEMA, INC" },
+ { 0x0D1D, "GEMAC mbH" },
+ { 0x0D1E, "Eone Inc." },
+ { 0x0D1F, "imc MessSysteme GmbH" },
+ { 0x0D20, "Malcom Co., Ltd." },
+ { 0x0D22, "Rojone Pty Ltd" },
+ { 0x0D23, "SATAKE USA INC." },
+ { 0x0D24, "Trapper Data AB" },
+ { 0x0D25, "PENTTECH Engineering Systems AB" },
+ { 0x0D26, "Micro-Vu" },
+ { 0x0D27, "CLEARJET GmbH" },
+ { 0x0D28, "ARM Ltd" },
+ { 0x0D29, "Eng Resource Inc" },
+ { 0x0D2A, "FIELDSERVER TECHNOLOGIES" },
+ { 0x0D2B, "DAINIPPON SCREEN" },
+ { 0x0D2C, "3M Library Systems" },
+ { 0x0D2D, "GigaSysNet" },
+ { 0x0D2E, "Feedback Instruments Ltd" },
+ { 0x0D2F, "Andamiro Co., Ltd." },
+ { 0x0D30, "Vision Electronics Co., Ltd." },
+ { 0x0D31, "Arizona Cooperative Power" },
+ { 0x0D32, "Leo Hui Electric Wire & Cable Co., Ltd." },
+ { 0x0D33, "AirSpeak Inc." },
+ { 0x0D34, "Moxi Digital, Inc." },
+ { 0x0D35, "Dah Kun Co., Ltd." },
+ { 0x0D36, "Tellabs" },
+ { 0x0D37, "PRISM" },
+ { 0x0D38, "Nihon Culture-soft Service Co., Ltd." },
+ { 0x0D3A, "Posiflex Technologies, Inc." },
+ { 0x0D3B, "SANYO TECNICA Co., Ltd." },
+ { 0x0D3C, "SRI CABLE TECHNOLOGY LTD." },
+ { 0x0D3D, "TANGTOP TECHNOLOGY CO., LTD." },
+ { 0x0D3E, "Fitcom, inc." },
+ { 0x0D3F, "MTS Systems Corporation" },
+ { 0x0D40, "Ascor Inc." },
+ { 0x0D41, "Ta Yun Electronic Technology Co., Ltd." },
+ { 0x0D42, "FULL DER CO., LTD." },
+ { 0x0D43, "iCableSystem Co., Ltd." },
+ { 0x0D44, "AFG Elektronik GmbH" },
+ { 0x0D45, "Union Data Corporation" },
+ { 0x0D46, "KOBIL Systems GmbH" },
+ { 0x0D47, "KOPEK PACIFIC LTD." },
+ { 0x0D48, "PROMETHEAN" },
+ { 0x0D49, "Maxtor" },
+ { 0x0D4A, "NF Corporation" },
+ { 0x0D4B, "Grape Systems Inc." },
+ { 0x0D4C, "TEDAS AG" },
+ { 0x0D4D, "Coherent Inc." },
+ { 0x0D4E, "Agere Systems Netherland BV" },
+ { 0x0D4F, "EADS AIRBUS FRANCE" },
+ { 0x0D50, "Cleware GmbH" },
+ { 0x0D51, "Volex (Asia) Pte Ltd" },
+ { 0x0D52, "YAMAHA Motor Co., Ltd" },
+ { 0x0D53, "HMI Co., Ltd." },
+ { 0x0D54, "HOLON Corporation" },
+ { 0x0D55, "ASKA Technologies Inc." },
+ { 0x0D56, "AVLAB Technology, Inc." },
+ { 0x0D57, "SOLOMON Microtech Ltd." },
+ { 0x0D59, "CDS electronics bv" },
+ { 0x0D5A, "Hoshino Metal Industries, Ltd." },
+ { 0x0D5B, "LOGIC CORPORATION" },
+ { 0x0D5C, "Eumitcom Technology Inc." },
+ { 0x0D5D, "Telesis Technologies, Inc." },
+ { 0x0D5E, "MYACOM LTD" },
+ { 0x0D5F, "CSI, Inc." },
+ { 0x0D60, "IVL Technologies Ltd." },
+ { 0x0D61, "MEILU ELECTRONICS (SHENZHEN) CO., LTD." },
+ { 0x0D62, "Darfon Electronics Corp." },
+ { 0x0D63, "Fritz Gegauf AG" },
+ { 0x0D64, "DXG Technology Corp." },
+ { 0x0D65, "KMJP CO., LTD." },
+ { 0x0D66, "TMT" },
+ { 0x0D67, "Advanet Inc." },
+ { 0x0D68, "Super Link Electronics Co., Ltd." },
+ { 0x0D69, "NSI" },
+ { 0x0D6A, "eMegaTech International Corp." },
+ { 0x0D6B, "And-Or Logic" },
+ { 0x0D6C, "CANMAX Technology Ltd." },
+ { 0x0D6D, "Mitsubishi Elec. Micro-Computer App. Software Co." },
+ { 0x0D6E, "Forum Trading Ltd. (UK)" },
+ { 0x0D70, "Try Computer Co. LTD." },
+ { 0x0D71, "Hirakawa Hewtech Corp." },
+ { 0x0D72, "Winmate Communication Inc." },
+ { 0x0D73, "Hit's Communications INC." },
+ { 0x0D74, "Dreams Come True Co., Ltd." },
+ { 0x0D75, "LET'S Corporation, Ltd." },
+ { 0x0D76, "MFP Korea, Inc." },
+ { 0x0D77, "Power Sentry/Newpoint" },
+ { 0x0D78, "Japan Distributor Corporation" },
+ { 0x0D79, "Assistive Technology Engineering Lab" },
+ { 0x0D7A, "MARX CryptoTech LP" },
+ { 0x0D7B, "Wellco Technology Co., Ltd." },
+ { 0x0D7C, "Taiwan Line Tek Electronic Co., Ltd." },
+ { 0x0D7D, "Add-On Technology Co., Ltd." },
+ { 0x0D7E, "American Computer & Digital Components" },
+ { 0x0D7F, "Essential Reality LLC" },
+ { 0x0D80, "H.R. Silvine Electronics Inc." },
+ { 0x0D81, "TechnoVision" },
+ { 0x0D83, "Think Outside, Inc." },
+ { 0x0D84, "ELECTRO-SYSTEM Co., Ltd." },
+ { 0x0D85, "Identix Incorporated" },
+ { 0x0D86, "Marconi" },
+ { 0x0D87, "Dolby Laboratories Inc." },
+ { 0x0D88, "Miyoshi Corp." },
+ { 0x0D89, "Oz Software" },
+ { 0x0D8A, "KING JIM CO., LTD." },
+ { 0x0D8B, "Ascom Telecommunications Ltd." },
+ { 0x0D8C, "C-MEDIA ELECTRONICS INC." },
+ { 0x0D8D, "Promotion & Display Technology Ltd." },
+ { 0x0D8E, "Global Sun Technology Inc." },
+ { 0x0D8F, "Pitney Bowes" },
+ { 0x0D90, "Sure-Fire Electrical Corporation" },
+ { 0x0D91, "ALPHA PROJECT Co., Ltd." },
+ { 0x0D92, "Mega & Game" },
+ { 0x0D93, "Nishitomo Co., Ltd." },
+ { 0x0D94, "Advanced Logic Technology (ALT)" },
+ { 0x0D95, "Numonics Corp." },
+ { 0x0D96, "Skanhex Technology Inc." },
+ { 0x0D97, "Santa Barbara Instrument Group (SBIG)" },
+ { 0x0D98, "Mars Semiconductor Corp." },
+ { 0x0D99, "Trazer Technologies Inc." },
+ { 0x0D9A, "RTX Telecom A/S" },
+ { 0x0D9B, "Tat Shing Electrical Co." },
+ { 0x0D9C, "Chee Chen Hi-Technology Co., Ltd." },
+ { 0x0D9D, "Sanwa Supply Inc" },
+ { 0x0D9E, "Avaya" },
+ { 0x0D9F, "Powercom Co., Ltd." },
+ { 0x0DA0, "Danger Research" },
+ { 0x0DA1, "Suzhou Peter's Precise Industrial Co., Ltd." },
+ { 0x0DA2, "Land Instruments International Ltd." },
+ { 0x0DA3, "Nippon Electro-Sensory Devices Corporation" },
+ { 0x0DA4, "POLAR ELECTRO OY" },
+ { 0x0DA5, "TOKYO MAGNETIC PRINTING CO., LTD." },
+ { 0x0DA6, "Aimtron Technology Corp." },
+ { 0x0DA7, "IOGEAR, Inc." },
+ { 0x0DA8, "softDSP Co., Ltd." },
+ { 0x0DA9, "DigiLife Technology Inc." },
+ { 0x0DAA, "Derelek" },
+ { 0x0DAB, "Diasonic Technology Co., Ltd." },
+ { 0x0DAC, "Smart Card Technology, Inc." },
+ { 0x0DAD, "Westover Scientific" },
+ { 0x0DAE, "SERIAL SYSTEM LTD" },
+ { 0x0DAF, "NXTV, Inc." },
+ { 0x0DB0, "Micro-Star International Co., Ltd." },
+ { 0x0DB1, "Wen Te Electronics Co., Ltd." },
+ { 0x0DB2, "Shian Hwi Plug Parts, Plastic Factory" },
+ { 0x0DB3, "Tekram Technology Co. Ltd." },
+ { 0x0DB4, "Chung Fu Chen Yeh Enterprise Corporation" },
+ { 0x0DB5, "Azio Ltd." },
+ { 0x0DB6, "SIMS Valley Co., Ltd." },
+ { 0x0DB7, "ELCON Systemtechnik GmbH" },
+ { 0x0DB8, "Garear Taiwan Co., Ltd." },
+ { 0x0DB9, "EMKAY" },
+ { 0x0DBA, "DIGIDESIGN" },
+ { 0x0DBB, "Luna Analytics, Inc." },
+ { 0x0DBC, "A&D Company, Limited" },
+ { 0x0DBD, "Bruker Biospin" },
+ { 0x0DBE, "Jiuh Shiuh Precision Industry Co., Ltd." },
+ { 0x0DBF, "Jess-Link International" },
+ { 0x0DC0, "G7 Solutions" },
+ { 0x0DC1, "Tamagawa Seiki Co., Ltd." },
+ { 0x0DC3, "Athena Smartcard Solutions Inc." },
+ { 0x0DC4, "inXtron, Inc." },
+ { 0x0DC5, "SDK Co, Ltd." },
+ { 0x0DC6, "Precision Squared Technology Corporation" },
+ { 0x0DC7, "First Cable Line, Inc." },
+ { 0x0DC8, "WINTEC Corporation" },
+ { 0x0DC9, "Arvel Corp." },
+ { 0x0DCA, "SMaL Camera Technologies, Inc." },
+ { 0x0DCB, "RocketPod, Inc." },
+ { 0x0DCC, "Largan Digital" },
+ { 0x0DCD, "NetworkFab Corporation" },
+ { 0x0DCE, "E-MU Systems, Inc., d.b.a. E-MU/ENSONIQ" },
+ { 0x0DCF, "Analytik Jena AG" },
+ { 0x0DD0, "Access Solutions" },
+ { 0x0DD1, "Contek Electronics Co., Ltd." },
+ { 0x0DD2, "Power Quotient International Co., Ltd." },
+ { 0x0DD3, "MediaQ" },
+ { 0x0DD4, "Custom Engineering SPA" },
+ { 0x0DD5, "California Micro Devices" },
+ { 0x0DD6, "TECHKON GmbH" },
+ { 0x0DD7, "KOCOM CO., LTD" },
+ { 0x0DD8, "Netac Technology Co., Ltd." },
+ { 0x0DD9, "HighSpeed Surfing" },
+ { 0x0DDA, "Integrated Silicon Solution, Inc" },
+ { 0x0DDB, "Tamarack Inc." },
+ { 0x0DDC, "Takaotec" },
+ { 0x0DDD, "Datelink Technology Co., Ltd." },
+ { 0x0DDE, "UBICOM, INC" },
+ { 0x0DDF, "DriveCam Video Systems" },
+ { 0x0DE1, "Vidicode Datacommunicatie BV" },
+ { 0x0DE2, "Acom Data" },
+ { 0x0DE3, "RFTECH CO., LTD." },
+ { 0x0DE4, "Aron Digital Inc." },
+ { 0x0DE5, "Secure2Net, Inc. USA" },
+ { 0x0DE6, "Dentsply Int'l - Gendex Dental Division" },
+ { 0x0DE7, "USBmicro" },
+ { 0x0DE8, "Delsy Electronic Components AG" },
+ { 0x0DE9, "Technische Industrie TACX BV" },
+ { 0x0DEA, "UTECH Electronic (D.G.) Co., Ltd." },
+ { 0x0DEB, "Lean Horn Co." },
+ { 0x0DEC, "Callserve Communications Ltd." },
+ { 0x0DED, "Novasonics" },
+ { 0x0DEE, "Lifetime Memory Products" },
+ { 0x0DEF, "Full Rise Electronic Co., Ltd." },
+ { 0x0DF0, "GE Yokogawa Medical Systems, Ltd." },
+ { 0x0DF1, "Envoy Medical Corporation" },
+ { 0x0DF2, "Nisshin Electronics Co., Ltd." },
+ { 0x0DF3, "VeriTek Co., Ltd." },
+ { 0x0DF4, "Net & Sys Co., Ltd." },
+ { 0x0DF5, "Yamatake Corporation" },
+ { 0x0DF6, "Sitecom Europe B.V." },
+ { 0x0DF7, "Mobile Action Technology Inc." },
+ { 0x0DF8, "Hoya Computer Co., Ltd." },
+ { 0x0DF9, "Nice Fountain Industrial Co., Ltd." },
+ { 0x0DFA, "Toyo Networks & System Integration Co., Ltd." },
+ { 0x0DFB, "Daisy Technology" },
+ { 0x0DFC, "General Touch Technology Co., Ltd." },
+ { 0x0DFD, "Suruga Seiki Co., Ltd." },
+ { 0x0DFE, "Interactive Metronome" },
+ { 0x0DFF, "Deodeo Corporation" },
+ { 0x0E00, "Novar GmbH" },
+ { 0x0E01, "Sheng Xiang Investment Ltd." },
+ { 0x0E02, "Doowon Co., LTD" },
+ { 0x0E03, "Nippon Systemware Co., Ltd." },
+ { 0x0E04, "PowerCom Technology Co., Ltd." },
+ { 0x0E05, "Nordic ID" },
+ { 0x0E06, "Personal Telecom, Inc." },
+ { 0x0E07, "Viewtek Co., Ltd" },
+ { 0x0E08, "Winbest Technology Co., Ltd." },
+ { 0x0E09, "Winskon Cabling Specialist Co., Ltd." },
+ { 0x0E0A, "JAEIK Information & Communication Co., Ltd." },
+ { 0x0E0B, "Fujitsu Denso Ltd." },
+ { 0x0E0C, "Gesytec GmbH" },
+ { 0x0E0D, "Picoquant GmbH" },
+ { 0x0E0E, "Fuji Data System Co., Ltd." },
+ { 0x0E0F, "VMWare, Inc." },
+ { 0x0E10, "TERUMO Corporation (Suruga Factory)" },
+ { 0x0E11, "Neurotec" },
+ { 0x0E12, "Danam Communications Inc." },
+ { 0x0E13, "Lugh Networks, Inc." },
+ { 0x0E14, "Hunter Engineering Co." },
+ { 0x0E15, "Tellert Elektronik GmbH" },
+ { 0x0E16, "JMTEK, LLC" },
+ { 0x0E17, "Walex Electronic Ltd." },
+ { 0x0E18, "UNIWIDE Technologies" },
+ { 0x0E19, "OeRSTED, Inc." },
+ { 0x0E1A, "RDM Corporation" },
+ { 0x0E1B, "Crewave Co., Ltd." },
+ { 0x0E1C, "Beijing Hi-tech Wealth Software Technology Co." },
+ { 0x0E1D, "International Parts & Information Co., Ltd." },
+ { 0x0E1E, "Green Hills Software, Inc." },
+ { 0x0E1F, "Cabin Industrial Co., Ltd." },
+ { 0x0E20, "Pegasus Technologies Ltd." },
+ { 0x0E21, "Cowon Systems, Inc." },
+ { 0x0E22, "Symbian Ltd." },
+ { 0x0E23, "Liou Yuane International Ltd." },
+ { 0x0E24, "Samson Electric Wire Co., Ltd." },
+ { 0x0E25, "VinChip Systems, Inc." },
+ { 0x0E26, "J-Phone East Co., Ltd." },
+ { 0x0E27, "Thunder Island Limited" },
+ { 0x0E28, "Industrial Control Systems" },
+ { 0x0E29, "CB Sciences, Inc." },
+ { 0x0E2A, "Flight Link Inc." },
+ { 0x0E2B, "Kumamoto Techno Corporation" },
+ { 0x0E2C, "Intersoft Electronics N.V." },
+ { 0x0E2D, "SKF Condition Monitoring" },
+ { 0x0E2E, "Brady Corporation" },
+ { 0x0E2F, "Daisen Electronic Industrial Co., Ltd." },
+ { 0x0E30, "HeartMath LLC" },
+ { 0x0E31, "Biosign" },
+ { 0x0E32, "ICONAG - Intelligent Control AG" },
+ { 0x0E33, "Luna Innovations, Inc." },
+ { 0x0E34, "Micro Computer Control Corp." },
+ { 0x0E35, "3Pea Technologies, Inc." },
+ { 0x0E36, "TiePie engineering" },
+ { 0x0E37, "Alpha Data Corp." },
+ { 0x0E38, "Stratitec, Inc." },
+ { 0x0E39, "Smart Modular Technologies, Inc." },
+ { 0x0E3A, "Neostar Technology Co., Ltd." },
+ { 0x0E3B, "Mansella Ltd." },
+ { 0x0E3C, "Raytec Electronic Co., Ltd." },
+ { 0x0E3D, "Metex Corporation" },
+ { 0x0E3E, "Good Technology, Inc." },
+ { 0x0E3F, "AM Group Corp." },
+ { 0x0E40, "Proteq LTDA" },
+ { 0x0E41, "Line 6, Inc." },
+ { 0x0E42, "Puretek Industrial Co., Ltd." },
+ { 0x0E43, "Holly Lin International Technology Inc." },
+ { 0x0E44, "Sun-Riseful Technology Co., Ltd." },
+ { 0x0E45, "SafeNet B.V." },
+ { 0x0E46, "Delphi Corporation" },
+ { 0x0E47, "AMANO Corporation" },
+ { 0x0E48, "Julia Corporation Limited" },
+ { 0x0E49, "Ingenieurbuero Chanda AG" },
+ { 0x0E4A, "Shenzhen Bao Hing Electric Wire & Cable Mfr. Co." },
+ { 0x0E4B, "System General Corp." },
+ { 0x0E4C, "Radica Games Ltd." },
+ { 0x0E4D, "Hong Shi Precision Corp." },
+ { 0x0E4E, "Lih Duo Intl. Co., Ltd." },
+ { 0x0E4F, "Data Ray Corp." },
+ { 0x0E50, "TDi GmbH TechnoData Interware" },
+ { 0x0E51, "Therapy Information & Communication System Inc." },
+ { 0x0E52, "Mindready Solutions (NI) Ltd." },
+ { 0x0E53, "King Tester Corporation" },
+ { 0x0E54, "KDE, Inc." },
+ { 0x0E55, "Speed Dragon Multimedia Ltd." },
+ { 0x0E56, "Cenix Digicom Co., Ltd." },
+ { 0x0E57, "Loas Co., Ltd" },
+ { 0x0E58, "Technology For Energy Corp." },
+ { 0x0E59, "Bourns, Inc." },
+ { 0x0E5A, "ACTIVE CO., LTD." },
+ { 0x0E5B, "Union Power Information Industrial Co., Ltd." },
+ { 0x0E5C, "Shenzhen Bitland Information Technology Co., Ltd." },
+ { 0x0E5D, "Neltron Industrial Co., Ltd." },
+ { 0x0E5E, "Conwise Technology Co., Ltd." },
+ { 0x0E5F, "Entone Technologies" },
+ { 0x0E60, "XAVi Technologies Corp." },
+ { 0x0E61, "E-Pen InMotion Inc." },
+ { 0x0E62, "Shandong CVIC Software Engineering Co., Ltd." },
+ { 0x0E63, "SECUREPIA Inc." },
+ { 0x0E64, "Nida Corporation" },
+ { 0x0E65, "Skycom Tek Co., Ltd" },
+ { 0x0E66, "Hawking Technologies, Inc." },
+ { 0x0E67, "Fossil" },
+ { 0x0E68, "Artec" },
+ { 0x0E69, "A Global Partner Corporation" },
+ { 0x0E6A, "Megawin Technology Co., Ltd." },
+ { 0x0E6B, "DMA Korea Co., Ltd" },
+ { 0x0E6C, "E & D Co., Ltd." },
+ { 0x0E6D, "Tenovis Business Communication" },
+ { 0x0E6E, "Volvo Car Corporation" },
+ { 0x0E6F, "Performance Designed Products, LLC" },
+ { 0x0E70, "Tokyo Electronic Industry Co, LTD." },
+ { 0x0E71, "Schwarzer GmbH" },
+ { 0x0E72, "Hsi-Chin Electronics Co., Ltd." },
+ { 0x0E73, "MCK Communications, Inc." },
+ { 0x0E74, "Accu-Automation Corp." },
+ { 0x0E75, "TVS Electronics Limited" },
+ { 0x0E76, "Seiko S-Yard Co., Ltd" },
+ { 0x0E77, "Weinzierl Engineering GmbH" },
+ { 0x0E78, "Ascom Powerline Communications Ltd." },
+ { 0x0E79, "ARCHOS SA" },
+ { 0x0E7A, "Indocomp Systems Inc." },
+ { 0x0E7B, "On-Tech Industry Co., Ltd." },
+ { 0x0E7C, "Legend Holdings Limited" },
+ { 0x0E7D, "Eutectics Inc." },
+ { 0x0E7E, "G.Mate, Inc." },
+ { 0x0E7F, "Keysight Technologies, Inc. - AFM division" },
+ { 0x0E80, "GateHouse A/S" },
+ { 0x0E81, "System Consultants Co., Ltd." },
+ { 0x0E82, "Ching Tai Electric Wire & Cable Co., Ltd." },
+ { 0x0E83, "Shin An Wire & Cable Co." },
+ { 0x0E84, "Elelux International Ltd." },
+ { 0x0E85, "Dynavox Systems LLC" },
+ { 0x0E86, "Watthour Engineering Co., Inc." },
+ { 0x0E87, "Internet Security Co., Ltd" },
+ { 0x0E88, "ELBIO" },
+ { 0x0E89, "PRT Manufacturing Ltd." },
+ { 0x0E8A, "FinePoint Innovations, Inc." },
+ { 0x0E8B, "KAO SHIN PRECISION INDUSTRY CO., LTD." },
+ { 0x0E8C, "Well Force Electronic Co., Ltd" },
+ { 0x0E8D, "MediaTek Inc." },
+ { 0x0E8E, "Stuart Tyrrell Developments" },
+ { 0x0E8F, "Pansignal Technology Inc." },
+ { 0x0E90, "CRU" },
+ { 0x0E91, "VTech Engineering Canada Ltd." },
+ { 0x0E92, "C'S GLORY ENTERPRISE CO., LTD." },
+ { 0x0E93, "eM Technics Co., Ltd." },
+ { 0x0E94, "Sirona Dental Systems GmbH" },
+ { 0x0E95, "Future Technology Co., Ltd" },
+ { 0x0E96, "APLUX Communications Ltd." },
+ { 0x0E97, "Fingerworks, Inc." },
+ { 0x0E98, "Advanced Analogic Technologies, Inc." },
+ { 0x0E99, "Parallel Dice Co., Ltd." },
+ { 0x0E9A, "TA HSING INDUSTRIES LTD." },
+ { 0x0E9B, "ADTEC CORPORATION" },
+ { 0x0E9C, "StreamZap, Inc." },
+ { 0x0E9D, "Hitron Technologies, Inc." },
+ { 0x0E9E, "Japan System Design Co." },
+ { 0x0E9F, "TAMURA CORPORATION" },
+ { 0x0EA0, "Ours Technology Inc." },
+ { 0x0EA1, "Infinite Communication Terminals Ltd." },
+ { 0x0EA2, "Triumph Technology Corp." },
+ { 0x0EA3, "Rion Co., Ltd." },
+ { 0x0EA4, "Intelligent Hearing Systems" },
+ { 0x0EA5, "DATA SYSTEM TECHNOLOGY CO., LTD." },
+ { 0x0EA6, "Nihon Computer Co., Ltd." },
+ { 0x0EA7, "MSL Enterprises Corp." },
+ { 0x0EA8, "CenDyne, Inc." },
+ { 0x0EA9, "J&J ENGINEERING INC." },
+ { 0x0EAA, "TOKYO SOKKI KENKYUJO CO., LTD." },
+ { 0x0EAB, "Yiso Telecom" },
+ { 0x0EAC, "ALCATech GmbH" },
+ { 0x0EAD, "HUMAX Co., Ltd." },
+ { 0x0EAE, "Alcon Labs" },
+ { 0x0EAF, "Grandex International Corporation" },
+ { 0x0EB0, "Amigo Technology Co., Ltd." },
+ { 0x0EB1, "WIS Technologies, Inc." },
+ { 0x0EB2, "Y-S ELECTRONIC CO., LTD." },
+ { 0x0EB3, "Saint Technology Corp." },
+ { 0x0EB4, "IPLAN Inc." },
+ { 0x0EB5, "@pos.com" },
+ { 0x0EB6, "GAMEPARK, Inc." },
+ { 0x0EB7, "Endor AG" },
+ { 0x0EB8, "Mettler-Toledo (Albstadt) GmbH" },
+ { 0x0EB9, "SKY Electronics" },
+ { 0x0EBA, "iWOW Connections Pte Ltd" },
+ { 0x0EBB, "Thermo Nicolet Corp." },
+ { 0x0EBC, "CHOIS Technology" },
+ { 0x0EBD, "Kyowa Electronics Co., Ltd." },
+ { 0x0EBE, "VWEB Corporation" },
+ { 0x0EBF, "Omega Technology Inc." },
+ { 0x0EC0, "LHI Technology (China) Co., Ltd." },
+ { 0x0EC1, "ABIT Computer Corporation" },
+ { 0x0EC2, "Sweetray Industrial Ltd." },
+ { 0x0EC3, "Axell Corporation" },
+ { 0x0EC4, "Ballracing Developments Ltd." },
+ { 0x0EC5, "GT Information System Co., Ltd." },
+ { 0x0EC6, "InnoVISION Multimedia Limited" },
+ { 0x0EC7, "Theta Link Corporation" },
+ { 0x0EC8, "Mitechno Co., Ltd." },
+ { 0x0EC9, "HemoCue AB" },
+ { 0x0ECA, "Mit System Co., Ltd." },
+ { 0x0ECB, "Harman Kardon" },
+ { 0x0ECC, "Samsung SDS" },
+ { 0x0ECD, "Lite-On IT Corp." },
+ { 0x0ECE, "TaiSol Electronics Co., Ltd." },
+ { 0x0ECF, "Phogenix Imaging, LLC" },
+ { 0x0ED0, "LANergy Limited" },
+ { 0x0ED1, "Tai Guen Enterprise Co., Ltd." },
+ { 0x0ED2, "Kyoto Micro Computer Co., LTD." },
+ { 0x0ED3, "Wing-Tech Enterprise Co., Ltd." },
+ { 0x0ED4, "Ross Video" },
+ { 0x0ED5, "ChronoLogic Pty. Ltd." },
+ { 0x0ED6, "TECHNOS JAPAN Co., LTD." },
+ { 0x0ED7, "COSMODOG, LTD." },
+ { 0x0ED8, "ASAHI SPECTRA CO., LTD." },
+ { 0x0ED9, "Holy Stone Enterprise Co., Ltd." },
+ { 0x0EDA, "NORITAKE ITRON CORPORATION" },
+ { 0x0EDB, "AboveTech, Inc." },
+ { 0x0EDC, "GALTRONICS" },
+ { 0x0EDD, "KOWA COMPANY, LTD." },
+ { 0x0EDE, "TOD Co., Ltd." },
+ { 0x0EDF, "e-MDT Co., Ltd." },
+ { 0x0EE0, "SHIMA SEIKI MFG., LTD." },
+ { 0x0EE1, "Sarotech Co., Ltd." },
+ { 0x0EE2, "AMI Semiconductor Inc." },
+ { 0x0EE3, "ComTrue Technology Corporation (Taiwan)" },
+ { 0x0EE4, "Sunrich Technology (H.K.) Ltd." },
+ { 0x0EE5, "Medical Graphics Corporation" },
+ { 0x0EE6, "Takacom Corporation" },
+ { 0x0EE7, "Furuno Electric Co., Ltd." },
+ { 0x0EE8, "Triz Communications Group" },
+ { 0x0EE9, "JPK Systems Limited" },
+ { 0x0EEA, "William Demant Holding A/S" },
+ { 0x0EEB, "Design Of Systems On Silicon, S.A. (DS2)" },
+ { 0x0EEC, "Tritek Co., Ltd." },
+ { 0x0EED, "CCP Co., Ltd." },
+ { 0x0EEE, "Digital STREAM Technology, Inc." },
+ { 0x0EEF, "eGalax Inc." },
+ { 0x0EF0, "Hitachi Cable, Ltd." },
+ { 0x0EF1, "Aichi Micro Intelligent Corporation" },
+ { 0x0EF2, "I/OMAGIC CORPORATION" },
+ { 0x0EF3, "Lynn Products, Inc." },
+ { 0x0EF4, "DSI Datotech" },
+ { 0x0EF5, "PointChips" },
+ { 0x0EF6, "Yield Microelectronics Corp." },
+ { 0x0EF7, "SM Tech Co., Ltd." },
+ { 0x0EF8, "ECT Inc." },
+ { 0x0EF9, "eHome TV, Inc. DBA Fuze3 Technologies" },
+ { 0x0EFA, "Corepro Entertainment" },
+ { 0x0EFB, "ARKRAY, Inc." },
+ { 0x0EFC, "ELMEX COMPANY Ltd." },
+ { 0x0EFD, "Oasis Semiconductor" },
+ { 0x0EFE, "WEM TECHNOLOGY INC." },
+ { 0x0EFF, "CSIRO-TIP" },
+ { 0x0F00, "ndd Medizintechnik AG" },
+ { 0x0F01, "EXPAN Electronics Co., Ltd." },
+ { 0x0F02, "MobileAria" },
+ { 0x0F03, "Jet Power Technology Co., Ltd." },
+ { 0x0F04, "Softlok International Limited" },
+ { 0x0F05, "Quanta Network Systems Inc." },
+ { 0x0F06, "Visual Frontier Precision Corp." },
+ { 0x0F07, "Pakon" },
+ { 0x0F08, "CSL Wire & Plug (Shen Zhen) Company" },
+ { 0x0F09, "Sandel Arionics Inc." },
+ { 0x0F0B, "Great Computer Corporation" },
+ { 0x0F0C, "CAS Corporation" },
+ { 0x0F0D, "HORI CO., LTD." },
+ { 0x0F0E, "Energyfull & Hi-Top International Ltd." },
+ { 0x0F0F, "NANOPTIX INC." },
+ { 0x0F10, "Personal Information Systems Co., Ltd." },
+ { 0x0F11, "Leybold Didactic GMBH" },
+ { 0x0F12, "MARS ENGINEERING CORPORATION" },
+ { 0x0F13, "Acetek Technology Co., Ltd." },
+ { 0x0F14, "XIRING" },
+ { 0x0F15, "PlayMore Corporation" },
+ { 0x0F16, "GLOBAL VIEW CO. LTD." },
+ { 0x0F17, "Correlant Communications" },
+ { 0x0F18, "Finger Lakes Instrumentation, LLC" },
+ { 0x0F19, "ORACOM CO., Ltd." },
+ { 0x0F1A, "General Information Systems Ltd." },
+ { 0x0F1B, "Onset Computer Corporation" },
+ { 0x0F1C, "Funai Electric Co., Ltd." },
+ { 0x0F1D, "Iwill Corporation" },
+ { 0x0F1E, "INVAIR Technologies AG" },
+ { 0x0F1F, "Laxtha" },
+ { 0x0F20, "GENNUM CORPORATION" },
+ { 0x0F21, "IOI Technology Corporation" },
+ { 0x0F22, "SENIOR INDUSTRIES, INC." },
+ { 0x0F23, "Leader Tech Manufacturer Co., Ltd" },
+ { 0x0F24, "FLEX-P INDUSTRIES SDN.BHD." },
+ { 0x0F25, "Primera Technology Inc." },
+ { 0x0F26, "B.G. Technologies, Inc." },
+ { 0x0F27, "Alpes DEIS" },
+ { 0x0F28, "ESEC SA" },
+ { 0x0F29, "TIPTEL AG" },
+ { 0x0F2A, "Marconi Data Systems" },
+ { 0x0F2B, "XEMICS SA" },
+ { 0x0F2D, "ViPower, Inc." },
+ { 0x0F2E, "Good Man Corporation" },
+ { 0x0F2F, "Priva Design Services" },
+ { 0x0F30, "Jess Technology Co., Ltd." },
+ { 0x0F31, "Chrysalis Development" },
+ { 0x0F32, "YFC-BonEagle Electric Co., Ltd." },
+ { 0x0F33, "Futek Electronics, Co., Ltd." },
+ { 0x0F34, "Hokuto Denshi Co., Ltd." },
+ { 0x0F35, "Kinpo Electronics, Inc." },
+ { 0x0F36, "Philips Medical Systems Ultrasound" },
+ { 0x0F37, "Kokuyo Co., Ltd." },
+ { 0x0F38, "Nien-Yi Industrial Corp." },
+ { 0x0F39, "Heng Yu Technology (HK) Ltd." },
+ { 0x0F3A, "Aidensi Giken" },
+ { 0x0F3B, "IR-LINK" },
+ { 0x0F3C, "Numesa, Inc." },
+ { 0x0F3D, "AirPrime Inc." },
+ { 0x0F3E, "Aastra Broadband" },
+ { 0x0F3F, "FEI Electron Optics B.V." },
+ { 0x0F40, "Denver Instrument Company" },
+ { 0x0F41, "RDC Semiconductor Co., Ltd." },
+ { 0x0F42, "Nital Consulting Services, Inc." },
+ { 0x0F43, "LiteON Semiconductor Corp." },
+ { 0x0F44, "Polhemus Incorporated" },
+ { 0x0F45, "International Road Dynamics" },
+ { 0x0F46, "KIHOKU Electronic Co., Ltd." },
+ { 0x0F47, "SN Systems Ltd." },
+ { 0x0F48, "Durand Interstellar, Inc." },
+ { 0x0F49, "Evolis" },
+ { 0x0F4A, "Planmeca Oy" },
+ { 0x0F4B, "St. John Technology Co., Ltd." },
+ { 0x0F4C, "WORLDWIDE CABLE OPTO CORP." },
+ { 0x0F4D, "Microtune, Inc." },
+ { 0x0F4E, "Freedom Scientific" },
+ { 0x0F4F, "INVENTEL" },
+ { 0x0F50, "LeadingSpect Corporation" },
+ { 0x0F51, "Zeta Broadband Inc." },
+ { 0x0F52, "Wing Kei Electrical Production Ltd." },
+ { 0x0F53, "Taiyo Cable (Dongguan) Co. Ltd." },
+ { 0x0F54, "Kawai Musical Instruments Mfg. Co., Ltd." },
+ { 0x0F55, "AmbiCom, Inc." },
+ { 0x0F56, "SecureTech Corp." },
+ { 0x0F57, "WavePlus Tech. Co., Ltd." },
+ { 0x0F58, "JASCO Corporation" },
+ { 0x0F59, "NCI/Newcomb Company, Inc." },
+ { 0x0F5A, "Cogency Semiconductor Inc." },
+ { 0x0F5B, "Ritech International Ltd." },
+ { 0x0F5C, "PRAIRIECOMM, INC." },
+ { 0x0F5D, "NewAge International, LLC" },
+ { 0x0F5E, "LEADER ELECTRONICS CORP." },
+ { 0x0F5F, "Key Technology Corporation" },
+ { 0x0F60, "GuangZhou Chief Tech Electronic Technology Co. Ltd." },
+ { 0x0F61, "Varian Inc." },
+ { 0x0F62, "Acrox Technologies Co., Ltd." },
+ { 0x0F63, "Leapfrog Enterprises" },
+ { 0x0F64, "ZAE Research, Inc." },
+ { 0x0F65, "Dataflex Design Communications Limited" },
+ { 0x0F66, "Toshiba Global Commerce Solutions" },
+ { 0x0F67, "Quantum3D, Inc." },
+ { 0x0F68, "UQUEST, LTD." },
+ { 0x0F69, "DIONEX CORPORATION" },
+ { 0x0F6A, "Vibren Technologies Inc." },
+ { 0x0F6B, "OHM ELECTRIC CO., LTD." },
+ { 0x0F6C, "DnC Tech., Inc." },
+ { 0x0F6D, "WillPoD Co., Ltd." },
+ { 0x0F6E, "INTELLIGENT SYSTEMS CO., LTD." },
+ { 0x0F6F, "Samtec GmbH" },
+ { 0x0F70, "YOZAN Inc." },
+ { 0x0F71, "Systems Integration Solutions Inc." },
+ { 0x0F72, "Robert Bosch GmbH - Chassis Systems Control" },
+ { 0x0F73, "DFI" },
+ { 0x0F74, "KOSUGI GIKEN Co, Ltd." },
+ { 0x0F75, "Future Internet" },
+ { 0x0F76, "Vacon Plc" },
+ { 0x0F77, "Fasstech" },
+ { 0x0F78, "Guntermann & Drunck GmbH" },
+ { 0x0F79, "Transonic Systems, Inc." },
+ { 0x0F7A, "EE Tools, Inc." },
+ { 0x0F7B, "Hivertec Inc." },
+ { 0x0F7C, "DQ Technology, Inc." },
+ { 0x0F7D, "NetBotz, Inc." },
+ { 0x0F7E, "Fluke" },
+ { 0x0F7F, "Lansmont Corporation" },
+ { 0x0F80, "OCULUS Optikgeraete GmbH" },
+ { 0x0F81, "DP Computers Pte. Ltd." },
+ { 0x0F82, "IMedia Semiconductor Corporation" },
+ { 0x0F83, "Ernst Reiner GmbH & Co. KG" },
+ { 0x0F84, "A.E.B. S.R.L." },
+ { 0x0F85, "IDX Company, Ltd." },
+ { 0x0F86, "Cedar Audio Limited" },
+ { 0x0F87, "HUMANDATA LTD." },
+ { 0x0F88, "VTech Holdings Ltd." },
+ { 0x0F89, "Leading Edge Co., Ltd." },
+ { 0x0F8A, "Centro De Tecnologia de las Comunicaciones, S.A." },
+ { 0x0F8B, "Yazaki Corporation" },
+ { 0x0F8C, "Young Generation International Corp." },
+ { 0x0F8D, "Uniwill Computer Corp." },
+ { 0x0F8E, "Kingnet Technology Co., Ltd." },
+ { 0x0F8F, "SOMA NETWORKS" },
+ { 0x0F90, "Quad Engineering Solutions LLC" },
+ { 0x0F91, "UNIPULSE Corporation" },
+ { 0x0F92, "JASTEC CO., LTD." },
+ { 0x0F93, "Sondex Limited" },
+ { 0x0F94, "FALCOM GmbH" },
+ { 0x0F95, "TOKYO SOKUSHIN CO., LTD." },
+ { 0x0F96, "NEC-Mitsubishi Electric Visual Systems Corp." },
+ { 0x0F97, "CviLux Corporation" },
+ { 0x0F98, "CYBERBANK CORP." },
+ { 0x0F99, "Biopia Co., Ltd." },
+ { 0x0F9A, "Sistel S.R.L." },
+ { 0x0F9B, "G-Card Technology Co., Ltd." },
+ { 0x0F9C, "HYUN WON INC." },
+ { 0x0F9D, "Opteon Corporation" },
+ { 0x0F9E, "Lucent Technologies" },
+ { 0x0F9F, "Racewood Technology Co., Ltd." },
+ { 0x0FA0, "TRITTON TECHNOLOGIES" },
+ { 0x0FA1, "AIJI System Co., Ltd." },
+ { 0x0FA2, "TAG Systems Racing Products, Inc." },
+ { 0x0FA3, "Chief Land Electronic Co., Ltd." },
+ { 0x0FA4, "ATL Technology" },
+ { 0x0FA5, "SOTEC CO., LTD." },
+ { 0x0FA6, "CMD AG" },
+ { 0x0FA7, "EPOX COMPUTER CO., LTD." },
+ { 0x0FA8, "Logic Controls, Inc." },
+ { 0x0FA9, "Shenzhen Motion Control Technology Co., Ltd." },
+ { 0x0FAA, "Changrime Telecom Co., Ltd." },
+ { 0x0FAB, "ISZ" },
+ { 0x0FAC, "Current Stone Co., Ltd." },
+ { 0x0FAD, "Ultravision Ltd." },
+ { 0x0FAE, "Redsun Technology Corp." },
+ { 0x0FAF, "Winpoint Electronic Corp." },
+ { 0x0FB0, "Haurtian Wire & Cable Co., Ltd." },
+ { 0x0FB1, "SuperGate Technologies" },
+ { 0x0FB2, "Conteck Co., Ltd." },
+ { 0x0FB3, "SYMAGERY MICROSYSTEMS INC." },
+ { 0x0FB4, "Smiths Detection" },
+ { 0x0FB5, "NIHON DENJI SOKKI CO., LTD." },
+ { 0x0FB6, "Heber Ltd." },
+ { 0x0FB7, "East Press Co., Ltd." },
+ { 0x0FB8, "Wistron Corporation" },
+ { 0x0FB9, "AACOM CORPORATION" },
+ { 0x0FBA, "SAN SHING ELECTRONICS CO., LTD.." },
+ { 0x0FBB, "Bitwise Systems, Inc." },
+ { 0x0FBC, "Schick Technologies" },
+ { 0x0FBD, "Siblings Investment Inc. (dba vantecusa)" },
+ { 0x0FBE, "Applied Diabetes Research, Inc." },
+ { 0x0FBF, "Certifiable Innovations" },
+ { 0x0FC0, "NUDIAN ELECTRON CO., LTD." },
+ { 0x0FC1, "MITAC INTERNATIONAL CORP." },
+ { 0x0FC2, "PLUG AND JACK INDUSTRIAL INC." },
+ { 0x0FC3, "BRAINTREE COMMUNICATIONS" },
+ { 0x0FC4, "Yamato Electric Industry Co., Ltd." },
+ { 0x0FC5, "Delcom Engineering" },
+ { 0x0FC6, "Dataplus Supplies, Inc." },
+ { 0x0FC7, "BES Technology Group" },
+ { 0x0FC8, "Phoenix Co., Ltd." },
+ { 0x0FC9, "Tecom Co., Ltd." },
+ { 0x0FCA, "BlackBerry Limited" },
+ { 0x0FCB, "Suzuken Co., Ltd." },
+ { 0x0FCC, "Marushin-Denshi Co., Ltd." },
+ { 0x0FCD, "Centurion, Inc." },
+ { 0x0FCE, "Sony Mobile Communications" },
+ { 0x0FCF, "Dynastream Innovations Inc." },
+ { 0x0FD0, "2L international B.V." },
+ { 0x0FD1, "Giant Electronics Ltd." },
+ { 0x0FD2, "SEAC BANCHE S.P.A." },
+ { 0x0FD3, "Marconi Applied Technologies Ltd." },
+ { 0x0FD4, "Tenovis GmbH & Co., KG" },
+ { 0x0FD5, "Direct Access Technology, Inc." },
+ { 0x0FD6, "Mexmal Mayorista S.A. de C.V." },
+ { 0x0FD7, "Jeulin S.A." },
+ { 0x0FD8, "LARSEN & BRUSGAARD" },
+ { 0x0FD9, "El Gato Software LLC" },
+ { 0x0FDA, "Quantec Networks GmbH" },
+ { 0x0FDB, "Comtech EF Data" },
+ { 0x0FDC, "Micro Plus" },
+ { 0x0FDD, "Yuyama Mfg. Co., Ltd." },
+ { 0x0FDE, "IDT DATA SYSTEM LIMITED" },
+ { 0x0FDF, "Foveon Inc." },
+ { 0x0FE0, "AONEPROTECH Co., Ltd." },
+ { 0x0FE1, "MADWAVES ApS" },
+ { 0x0FE2, "Air Techniques, Inc." },
+ { 0x0FE3, "ACCEL CORP." },
+ { 0x0FE4, "IN-TECH ELECTRONICS LIMITED" },
+ { 0x0FE5, "TC&C ELECTRONIC CO.,LTD (SUNTECC, INC.)" },
+ { 0x0FE6, "Sospita ASA" },
+ { 0x0FE7, "Mitutoyo Corporation" },
+ { 0x0FE8, "TurboComm Tech. Inc." },
+ { 0x0FE9, "DVICO Inc." },
+ { 0x0FEA, "United Computer Accessories" },
+ { 0x0FEB, "CRS ELECTRONIC CO., LTD." },
+ { 0x0FEC, "UMC Electronics Co., Ltd." },
+ { 0x0FED, "ACCESS CO., LTD." },
+ { 0x0FEE, "Xsido Corporation" },
+ { 0x0FEF, "MJ RESEARCH, INC." },
+ { 0x0FF0, "Physical Electronics" },
+ { 0x0FF1, "Minato Electronics, Inc." },
+ { 0x0FF2, "EZMAX CO., LTD." },
+ { 0x0FF3, "Dimentor" },
+ { 0x0FF4, "POLYMATECH CO., LTD." },
+ { 0x0FF5, "OYO-ELECTRIC CO., LTD." },
+ { 0x0FF6, "Core Valley Co., Ltd." },
+ { 0x0FF7, "CHI SHING COMPUTER ACCESSORIES CO., LTD." },
+ { 0x0FF8, "iXs Research Corporation" },
+ { 0x0FF9, "FHC., Inc. Frederick Haer & Co." },
+ { 0x0FFA, "ELENTEC CO., LTD." },
+ { 0x0FFB, "Avail Corporation" },
+ { 0x0FFC, "Clavia Digital Musical Instruments AB" },
+ { 0x0FFD, "AKATSUKI ELECTRIC MFG. CO., LTD." },
+ { 0x0FFE, "ASKA Corporation" },
+ { 0x0FFF, "Aopen Inc." },
+ { 0x1000, "Speed Tech Corp." },
+ { 0x1001, "Ritronics Components (S) Pte. Ltd." },
+ { 0x1002, "Spa Design Ltd." },
+ { 0x1003, "SIGMA CORPORATION" },
+ { 0x1004, "LG Electronics Inc." },
+ { 0x1005, "Apacer Technology Inc." },
+ { 0x1006, "Reign Com Ltd." },
+ { 0x1007, "Samphone Electronic Co., Ltd." },
+ { 0x1008, "Futaba Corporation" },
+ { 0x1009, "Lumanate, Inc." },
+ { 0x100A, "AVC Technology" },
+ { 0x100B, "Chou Chin Industrial Co., Ltd." },
+ { 0x100C, "eMachines, inc" },
+ { 0x100D, "NETOPIA, INC." },
+ { 0x100E, "North American Pacific Industries, Corp." },
+ { 0x100F, "Trek Inc." },
+ { 0x1010, "FUKUDA DENSHI CO., LTD." },
+ { 0x1011, "Mobile Media Tech." },
+ { 0x1012, "SDKM Fibres, Wires & Cables Berhad" },
+ { 0x1013, "TST-Touchless Sensor Technology AG" },
+ { 0x1014, "Densitron Technologies PLC" },
+ { 0x1015, "Softronics Pty. Ltd." },
+ { 0x1016, "Xiamen Hung's Enterprise Co., Ltd." },
+ { 0x1017, "SPEEDY INDUSTRIAL SUPPLIES PTE. LTD." },
+ { 0x1018, "Mindtell Inc." },
+ { 0x1019, "Fostex Corporation" },
+ { 0x101A, "Annecy Electronique" },
+ { 0x101B, "Digital Innovations" },
+ { 0x101C, "Teradyne Diagnostic Solutions Ltd." },
+ { 0x101D, "Aerospace Information Corporation Limited" },
+ { 0x101E, "Fronius International GmbH" },
+ { 0x101F, "Pocketec" },
+ { 0x1020, "Paten Wireless Technology Inc." },
+ { 0x1021, "Time Management, Inc." },
+ { 0x1022, "Shinko Shoji Co., Ltd." },
+ { 0x1023, "CHRONIX Inc." },
+ { 0x1024, "ASEC CO., LTD." },
+ { 0x1025, "Technology Testing Lab" },
+ { 0x1026, "Newly Corporation" },
+ { 0x1027, "Time Domain" },
+ { 0x1028, "Inovys Corporation" },
+ { 0x1029, "Atlantic Coast Telesys" },
+ { 0x102A, "RAMOS Technology Co., Ltd." },
+ { 0x102B, "Infotronic America, Inc." },
+ { 0x102C, "Etoms Electronics Corp." },
+ { 0x102D, "Winic Corporation" },
+ { 0x102E, "Binstead Systems Ltd." },
+ { 0x102F, "WENZHOU YIHUA CONNECTOR CO.,LTD." },
+ { 0x1030, "Asoka USA Corporation" },
+ { 0x1031, "Comax Technology Inc." },
+ { 0x1032, "C-One Technology Corp." },
+ { 0x1033, "Nucam Corporation" },
+ { 0x1034, "Teramecs Co., Ltd." },
+ { 0x1035, "Cyber Solid Laboratory" },
+ { 0x1036, "ELLAB A/S" },
+ { 0x1037, "Red Lion Controls LP" },
+ { 0x1038, "SteelSeries ApS" },
+ { 0x1039, "devolo AG" },
+ { 0x103A, "I+ME ACTIA GmbH" },
+ { 0x103B, "Quatographic AG" },
+ { 0x103C, "AMX Corp." },
+ { 0x103D, "Stanton Magnetics, Inc." },
+ { 0x103E, "Thurlby-Thandar Instruments Ltd." },
+ { 0x103F, "Tectech inc." },
+ { 0x1040, "Valiant Technology Ltd." },
+ { 0x1041, "Kongsberg Defence Communications AS" },
+ { 0x1042, "CARDIO SISTEMAS COML. INDL. LTDA." },
+ { 0x1043, "iCreate Technologies Corporation" },
+ { 0x1044, "Chu Yuen Enterprise Co., Ltd." },
+ { 0x1045, "Transiciel Technologies" },
+ { 0x1046, "Hitachi Asahi Electronics Co., Ltd." },
+ { 0x1047, "HOYA CORPORATION Vision Care Company" },
+ { 0x1048, "Targus International LLC" },
+ { 0x1049, "Studio Technologies, Inc." },
+ { 0x104A, "WACOH Corporation" },
+ { 0x104B, "CSM GmbH" },
+ { 0x104C, "AMCO TEC International Inc." },
+ { 0x104D, "Newport Corporation" },
+ { 0x104E, "Halliburton Energy Services" },
+ { 0x104F, "W B Electronics" },
+ { 0x1050, "Yubico AB" },
+ { 0x1051, "Nippon Printer Engineering Inc." },
+ { 0x1052, "U-Medica Inc." },
+ { 0x1053, "Immanuel Electronics Co., Ltd." },
+ { 0x1054, "BMS International Beheer N.V." },
+ { 0x1055, "Complex Micro Interconnection Co., Ltd." },
+ { 0x1056, "Hsin Chen Ent Co., Ltd." },
+ { 0x1057, "ON Semiconductor" },
+ { 0x1058, "Western Digital, Branded" },
+ { 0x1059, "Giesecke & Devrient GmbH" },
+ { 0x105A, "DDS, Inc." },
+ { 0x105B, "TOKIWA WEST Co., Ltd." },
+ { 0x105C, "Freeway Electronic Wire & Cable (Dongguan) Co., Ltd." },
+ { 0x105D, "Delkin Devices, Inc." },
+ { 0x105E, "Valence Semiconductor Design Limited" },
+ { 0x105F, "Chin Shong Enterprise Co., Ltd." },
+ { 0x1060, "Easthome Industrial Co., Ltd." },
+ { 0x1061, "Cardinal Components Inc." },
+ { 0x1062, "Sumitomo Electric Industries, Ltd." },
+ { 0x1063, "LPKF Laser & Electronics AG" },
+ { 0x1064, "INNOPLUS Co., Ltd." },
+ { 0x1065, "ImageQuest Co., Ltd." },
+ { 0x1066, "Eten Information Systems Co., Ltd." },
+ { 0x1067, "L-3 Communications" },
+ { 0x1068, "Micropi Elettronica" },
+ { 0x1069, "Easy Digital Concept" },
+ { 0x106A, "Loyal Legend Limited" },
+ { 0x106B, "MED Associates Inc. , [email protected]" },
+ { 0x106C, "Curitel Communications, Inc." },
+ { 0x106D, "San Chieh Manufacturing Ltd." },
+ { 0x106E, "ConectL" },
+ { 0x106F, "Money Controls" },
+ { 0x1070, "TAKAMISAWA CYBERNETICS CO., LTD." },
+ { 0x1071, "Paxton Access Ltd." },
+ { 0x1072, "FDI Matelec" },
+ { 0x1073, "Lifetron Co., Ltd." },
+ { 0x1074, "TECHNO SOFT SYSTEMNICS INC." },
+ { 0x1075, "TOKYO KEIKI INC." },
+ { 0x1076, "GCT Semiconductor, Inc." },
+ { 0x1077, "VoiceBox Technologies Inc." },
+ { 0x1078, "Maycom Co., Ltd." },
+ { 0x1079, "Suisei Electronics System Co., Ltd." },
+ { 0x107A, "Optionexist Limited" },
+ { 0x107B, "X E Systems Inc." },
+ { 0x107C, "Whelen Engineering Company Inc." },
+ { 0x107D, "Arlec Australia Limited" },
+ { 0x107E, "MIDORIYA ELECTRIC CO., LTD." },
+ { 0x107F, "KidzMouse, Inc." },
+ { 0x1080, "Musetel Co., Ltd." },
+ { 0x1081, "VG Electracon, Inc." },
+ { 0x1082, "Shin-Etsukaken Co., Ltd." },
+ { 0x1083, "CANON ELECTRONICS INC." },
+ { 0x1084, "PANTECH CO., LTD." },
+ { 0x1085, "Datalaster" },
+ { 0x1086, "Smart System Inc." },
+ { 0x1087, "Shanghai Ewaytek Co., Ltd." },
+ { 0x1088, "Archtek Telecom Co." },
+ { 0x1089, "On Track Innovations Ltd." },
+ { 0x108A, "Chloride Power Protection" },
+ { 0x108B, "Grand-tek Technology Co., Ltd." },
+ { 0x108C, "Robert Bosch GmbH" },
+ { 0x108D, "Mitsui Zosen Systems Research Inc." },
+ { 0x108E, "Lotes Co., Ltd." },
+ { 0x108F, "HIOKI E.E. CORPORATION" },
+ { 0x1090, "DSP Research Inc." },
+ { 0x1091, "DR. JOHANNES HEIDENHAIN GmbH" },
+ { 0x1092, "TOPDEK Semiconductor Inc." },
+ { 0x1093, "SongPro, Inc." },
+ { 0x1094, "NextEngine, Inc." },
+ { 0x1095, "Good Work Systems" },
+ { 0x1096, "NIO Corporation" },
+ { 0x1097, "Computational Systems Incorporated" },
+ { 0x1098, "Raytek Corp." },
+ { 0x1099, "Surface Optics Corporation" },
+ { 0x109A, "DATASOFT Systems GmbH" },
+ { 0x109B, "Qingdao Hisense Communication Co., Ltd." },
+ { 0x109C, "Electronic Trade Solutions Ltd." },
+ { 0x109D, "NAVIUS CO., LTD." },
+ { 0x109E, "Finger System Inc." },
+ { 0x109F, "eSOL Co., Ltd." },
+ { 0x10A0, "HIROTECH, INC." },
+ { 0x10A1, "target-systemelectronic gmbh" },
+ { 0x10A2, "HYUNDAI NETWORKS, INC." },
+ { 0x10A3, "MITSUBISHI MATERIALS CORPORATION" },
+ { 0x10A4, "Frontier Silicon Ltd." },
+ { 0x10A5, "FINGERPRINT CARDS AB" },
+ { 0x10A6, "SKYUP TECHNOLOGY CORPORATION" },
+ { 0x10A7, "3i techs Development Corp" },
+ { 0x10A8, "Imaging Devices, Inc." },
+ { 0x10A9, "SK Teletech Co., Ltd." },
+ { 0x10AA, "Cables To Go" },
+ { 0x10AB, "Universal Global Scientific Industrial Co., Ltd." },
+ { 0x10AC, "Honeywell, Inc." },
+ { 0x10AD, "Impact Instrumentation Inc." },
+ { 0x10AE, "Princeton Technology Corp." },
+ { 0x10AF, "Liebert Corporation" },
+ { 0x10B0, "IPmental Inc." },
+ { 0x10B1, "Safe Valley Inc." },
+ { 0x10B2, "Data East Corporation" },
+ { 0x10B3, "Roke Manor Research Limited" },
+ { 0x10B4, "Guardtec, Inc." },
+ { 0x10B5, "Comodo" },
+ { 0x10B6, "Dynojet Research, Inc." },
+ { 0x10B7, "VSM Medtech Ltd." },
+ { 0x10B8, "DIBCOM" },
+ { 0x10B9, "Prime Electronics & Satellitics, Inc." },
+ { 0x10BA, "Dong-Guan Sintai Optical Co., Ltd." },
+ { 0x10BB, "TM Technology Inc." },
+ { 0x10BC, "Dinging Technology Co., Ltd." },
+ { 0x10BD, "TMT TECHNOLOGY, INC." },
+ { 0x10BE, "KBM Electronic System Design" },
+ { 0x10BF, "Smarthome" },
+ { 0x10C0, "SougaSoft Co., Ltd." },
+ { 0x10C1, "Kyokuto Electric Co., Ltd." },
+ { 0x10C2, "Phasespace, Inc." },
+ { 0x10C3, "Universal Laser Systems" },
+ { 0x10C4, "Silicon Laboratories, Inc." },
+ { 0x10C5, "Sanei Electric Inc." },
+ { 0x10C6, "Intec, Inc." },
+ { 0x10C7, "Touchstone Technology Co., Ltd." },
+ { 0x10C8, "SIGMACOM CO., LTD." },
+ { 0x10C9, "ZUKEN Inc." },
+ { 0x10CA, "Xrosstech, Inc." },
+ { 0x10CB, "eratech" },
+ { 0x10CC, "GBM Connector Co., Ltd." },
+ { 0x10CD, "Kycon Inc." },
+ { 0x10CE, "Shinko Electric Co., Ltd." },
+ { 0x10CF, "Velleman Components" },
+ { 0x10D0, "Tokai University Educational System" },
+ { 0x10D1, "HBM GmbH" },
+ { 0x10D2, "Adams IT Services" },
+ { 0x10D3, "Trimos SA" },
+ { 0x10D4, "Man Boon Manufactory Ltd." },
+ { 0x10D5, "Uni Class Technology Co., Ltd." },
+ { 0x10D6, "Actions Semiconductor Co., Ltd." },
+ { 0x10D7, "Array Corporation" },
+ { 0x10D8, "ACTIKEY S.A." },
+ { 0x10D9, "Tecnova Corporation" },
+ { 0x10DA, "HOWTEL CO., LTD." },
+ { 0x10DB, "Prior Scientific Instruments Ltd." },
+ { 0x10DC, "Evolve Communications" },
+ { 0x10DD, "VerNova, Inc." },
+ { 0x10DE, "Authenex, Inc." },
+ { 0x10DF, "In-Win Development Inc." },
+ { 0x10E0, "Bella Corporation" },
+ { 0x10E1, "CABLEPLUS LTD." },
+ { 0x10E2, "Nada Electronics, Ltd." },
+ { 0x10E3, "tec5 AG" },
+ { 0x10E4, "Trans-Lux Corporation & Subsidiaries" },
+ { 0x10E5, "MACTek" },
+ { 0x10E6, "Altotec Hard- und Software GmbH" },
+ { 0x10E7, "dSPACE GmbH" },
+ { 0x10E8, "Kumahira Co., Ltd." },
+ { 0x10E9, "XIA LLC" },
+ { 0x10EA, "ELITRONIC s.r.o." },
+ { 0x10EB, "FREEBOX SA" },
+ { 0x10EC, "Vast Technologies Inc." },
+ { 0x10ED, "KDS USA, Inc." },
+ { 0x10EE, "Compuprint" },
+ { 0x10EF, "Integrity Instruments Inc." },
+ { 0x10F0, "Etronics Corp." },
+ { 0x10F1, "Inventec Multimedia & Telecom Corp." },
+ { 0x10F2, "Autonics Co., Ltd." },
+ { 0x10F3, "Vercel Development Inc." },
+ { 0x10F4, "INcoder Technology CO., Ltd." },
+ { 0x10F5, "Voyetra Turtle Beach, Inc." },
+ { 0x10F6, "IMAGENICS Co., Ltd." },
+ { 0x10F7, "Hando Computer Co., Ltd" },
+ { 0x10F8, "CESYS GmbH" },
+ { 0x10F9, "NSD Corporation" },
+ { 0x10FA, "CHINO Corporation" },
+ { 0x10FB, "Pictos Technologies, Inc." },
+ { 0x10FC, "MICRELEC" },
+ { 0x10FD, "Animation Technologies Inc." },
+ { 0x10FE, "Thrane & Thrane A/S" },
+ { 0x10FF, "Bellwave" },
+ { 0x1100, "VirTouch Ltd." },
+ { 0x1101, "EASYPASS INDUSTRIAL CO., LTD." },
+ { 0x1102, "Instrument Systems GmbH" },
+ { 0x1103, "Brain Products GmbH" },
+ { 0x1104, "TOA Corporation" },
+ { 0x1105, "MAP Medizin-Technologie GmbH" },
+ { 0x1106, "OrangeHouse Co., Ltd." },
+ { 0x1107, "CreamWare GmbH" },
+ { 0x1108, "BRIGHTCOM TECHNOLOGIES LTD." },
+ { 0x1109, "LG Industrial Systems Co., Ltd." },
+ { 0x110A, "Moxa Inc." },
+ { 0x110B, "NAKI INTERNATIONAL" },
+ { 0x110C, "Computer Network Technology" },
+ { 0x110D, "Hitachi Car Engineering Co., Ltd." },
+ { 0x110E, "Innotrac Diagnostics OY" },
+ { 0x110F, "OneVision Corporation" },
+ { 0x1110, "Analog Devices Canada Ltd." },
+ { 0x1111, "Siemens Healthcare Diagnostics Inc." },
+ { 0x1112, "Golden Bright (Sichuan) Electronic Technology Co Ltd" },
+ { 0x1113, "Medion AG" },
+ { 0x1114, "Psion Teklogix Inc." },
+ { 0x1115, "Data Link Co., Ltd." },
+ { 0x1116, "Compro Technology Inc." },
+ { 0x1117, "11 WAVE TECHNOLOGY, INC." },
+ { 0x1118, "MotoSAT" },
+ { 0x1119, "GCS General Control Systems GmbH" },
+ { 0x111A, "The Nippon Signal Co., Ltd." },
+ { 0x111B, "Kyusyu Ten Ltd." },
+ { 0x111C, "point electronic GmbH" },
+ { 0x111D, "Centon Electronics" },
+ { 0x111E, "VSO ELECTRONICS CO., LTD." },
+ { 0x111F, "BANCOR S.R.L." },
+ { 0x1120, "Voipac, s.r.o." },
+ { 0x1121, "Kore Technology Limited" },
+ { 0x1122, "Klein & Melgert Developments B.V." },
+ { 0x1123, "Hi-Tech Instruments, Inc." },
+ { 0x1124, "REnex Technology Limited" },
+ { 0x1125, "Industrial Computing Ltd." },
+ { 0x1126, "Protonic - Holland" },
+ { 0x1127, "BANK25 Co., Ltd." },
+ { 0x1128, "STEAG ETA-Optik GmbH" },
+ { 0x1129, "Jung Myung Telecom Co., Ltd." },
+ { 0x112A, "RedRat Ltd." },
+ { 0x112B, "Stenograph L.L.C." },
+ { 0x112C, "Ethics Organization of Computer Software" },
+ { 0x112D, "SYSMEX CORPORATION" },
+ { 0x112E, "Master Hill Electric Wire and Cable Co., Ltd." },
+ { 0x112F, "Cellon International" },
+ { 0x1130, "Tenx Technology, Inc." },
+ { 0x1131, "Integrated System Solution Corp." },
+ { 0x1132, "Visoduck discount GmbH" },
+ { 0x1133, "Sanei Electric Co., Ltd." },
+ { 0x1134, "Tri-L Data Systems, Inc." },
+ { 0x1135, "imo-elektronik GmbH" },
+ { 0x1136, "CTS ELECTRONICS" },
+ { 0x1137, "Beyond LSI, Inc." },
+ { 0x1138, "Greenwood Engineering A/S" },
+ { 0x1139, "Wavetrend" },
+ { 0x113B, "Hana Micron, Inc." },
+ { 0x113C, "Arintech Co., Ltd." },
+ { 0x113D, "Mapower Electronics Co. Ltd." },
+ { 0x113E, "KDK Electric Wire (H.K.) Co., Ltd." },
+ { 0x113F, "Integrated Biometrics" },
+ { 0x1140, "Ultra-Scan Corporation" },
+ { 0x1141, "V ONE MULTIMEDIA PTE LTD" },
+ { 0x1142, "CYBERSCAN TECH. INC." },
+ { 0x1143, "Wako Pure Chemical Industries, Ltd.." },
+ { 0x1144, "MURATA MACHINERY, LTD." },
+ { 0x1145, "Japan Radio Co., Ltd." },
+ { 0x1146, "Shimane SANYO Electric Co., Ltd." },
+ { 0x1147, "Ever Great Electric Wire and Cable Co., Ltd." },
+ { 0x1148, "KGS Corporation" },
+ { 0x1149, "TAMA TECH LAB CORP." },
+ { 0x114A, "TANITA Corporation (1)" },
+ { 0x114B, "Sphairon Technologies GmbH" },
+ { 0x114C, "Tinius Olsen Testing Machine Co., Inc." },
+ { 0x114D, "Alpha Imaging Technology Corp." },
+ { 0x114E, "Digital Electronics Corporation" },
+ { 0x114F, "WAVECOM" },
+ { 0x1150, "Don Alan Pty. Ltd." },
+ { 0x1151, "World Wide Licenses Limited" },
+ { 0x1152, "Codonics, Inc." },
+ { 0x1153, "Tritec Co., Ltd." },
+ { 0x1154, "BEB Industrie-Elektronik AG" },
+ { 0x1155, "DICESVA S.L." },
+ { 0x1156, "Cybertech bv" },
+ { 0x1157, "EKS Oy" },
+ { 0x1158, "Syn-Tech Systems Inc." },
+ { 0x1159, "Micro Application Laboratory Corp." },
+ { 0x115A, "Extreme Speed" },
+ { 0x115B, "Salix Technology Co., Ltd." },
+ { 0x115C, "CORESMA" },
+ { 0x115D, "ADTEK SYSTEM SCIENCE CO., LTD." },
+ { 0x115E, "Group Sense Ltd." },
+ { 0x115F, "Dataring Systems" },
+ { 0x1160, "Invocon, Inc." },
+ { 0x1161, "Port Denshi Co., Ltd." },
+ { 0x1162, "Secugen Corporation" },
+ { 0x1163, "DeLorme Publishing Inc." },
+ { 0x1164, "YUAN High-Tech Development Co., Ltd." },
+ { 0x1165, "Telson Electronics Co., Ltd." },
+ { 0x1166, "Bantam Interactive Technologies" },
+ { 0x1167, "Salient Systems Corporation" },
+ { 0x1168, "BizConn International Corp." },
+ { 0x1169, "Adirondack Optics" },
+ { 0x116A, "JJL Technologies, LLC" },
+ { 0x116B, "Pigeon Point Systems" },
+ { 0x116C, "SecureEye, Inc." },
+ { 0x116D, "Filmetrics, Inc." },
+ { 0x116E, "Gigastorage Corp." },
+ { 0x116F, "Silicon 10 Technology Corp." },
+ { 0x1170, "Tadiran Com. Ltd." },
+ { 0x1171, "CRE Technology Co., Ltd." },
+ { 0x1172, "Telegate Co., Ltd." },
+ { 0x1173, "Esko-Graphics" },
+ { 0x1174, "Techno-One Co., Ltd." },
+ { 0x1175, "Sheng Yih Technologies Co., Ltd." },
+ { 0x1176, "Japan Touchscreen Distributions, Inc." },
+ { 0x1177, "Hitachi Communication Technologies, Ltd." },
+ { 0x1178, "Kamaya Electric Co., Ltd." },
+ { 0x1179, "Bio-logic Systems Corp." },
+ { 0x117A, "Ishikawa Seisakusho, Ltd." },
+ { 0x117B, "Primetech Engineering Corporation" },
+ { 0x117C, "SOFTIDEA s.r.o." },
+ { 0x117D, "Santa Electronic Inc." },
+ { 0x117E, "JNC, Inc." },
+ { 0x117F, "Princeton Technology, Ltd." },
+ { 0x1180, "Spectra-Physics" },
+ { 0x1181, "USB NET" },
+ { 0x1182, "Venture Corporation Limited" },
+ { 0x1183, "Digital Dream Co. Europe Ltd." },
+ { 0x1184, "Kyocera Elco Corporation" },
+ { 0x1185, "Projectiondesign AS" },
+ { 0x1186, "Scientec System" },
+ { 0x1187, "Techno Valley Co., Ltd." },
+ { 0x1188, "Bloomberg L.P." },
+ { 0x1189, "Trisat IndTry Computer Co. LTD." },
+ { 0x118A, "KEBA AG" },
+ { 0x118B, "AXIOMTEK Co., Ltd." },
+ { 0x118C, "INFINIT GmbH" },
+ { 0x118D, "Gould Instrument Systems" },
+ { 0x118E, "Hermstedt AG" },
+ { 0x118F, "You Yang Technology Co., Ltd." },
+ { 0x1190, "Tripace" },
+ { 0x1191, "Loyalty Founder Enterprise Co., Ltd." },
+ { 0x1192, "Matsusada Precision Inc." },
+ { 0x1193, "H2I TECHNOLOGIES" },
+ { 0x1194, "GLORY AZ System Co., Ltd." },
+ { 0x1195, "ELECTROLINE" },
+ { 0x1196, "Yankee Robotics, LLC" },
+ { 0x1197, "Technoimagia Co., Ltd." },
+ { 0x1198, "StarShine Technology Corp." },
+ { 0x1199, "Sierra Wireless Inc." },
+ { 0x119A, "DONG GUAN JALINK ELECTRONICES CO.,LTD" },
+ { 0x119B, "ruwido austria GmbH" },
+ { 0x119C, "SK MEDICAL ELECTRONICS CO.,LTD" },
+ { 0x119D, "Saka-Techno Science Co., Ltd." },
+ { 0x119E, "Engineered Audio, LLC." },
+ { 0x119F, "TECNOS CO., LTD." },
+ { 0x11A0, "Chipcon" },
+ { 0x11A1, "Mikrap AG" },
+ { 0x11A2, "SitecSoft Co., Ltd." },
+ { 0x11A3, "Technovas Co., Ltd." },
+ { 0x11A4, "THE FURUKAWA ELECTRIC CO., LTD." },
+ { 0x11A5, "TOKYO RIKAKIKAI CO., LTD." },
+ { 0x11A6, "VRmagic GmbH" },
+ { 0x11A7, "SNAPSHIELD LTD." },
+ { 0x11A8, "Hoeft & Wessel AG" },
+ { 0x11A9, "Parker Hannifin" },
+ { 0x11AA, "GlobalMedia Group, LLC" },
+ { 0x11AB, "Exito Electronics Co., Ltd." },
+ { 0x11AC, "Nike, Inc." },
+ { 0x11AD, "SANWA ELECTRIC INSTRUMENT CO., LTD." },
+ { 0x11AE, "Stoelting Co." },
+ { 0x11AF, "Valence Semiconductor" },
+ { 0x11B0, "ATECH FLASH TECHNOLOGY" },
+ { 0x11B1, "New Motion Tec. Corp." },
+ { 0x11B2, "Bizerba GmbH & Co. KG" },
+ { 0x11B3, "MONYA Corporation" },
+ { 0x11B4, "SPIELO" },
+ { 0x11B5, "ADVANTECH EQUIPMENT CORP." },
+ { 0x11B6, "Diskware Co., Ltd." },
+ { 0x11B7, "Embla" },
+ { 0x11B8, "CROSS S&T Inc." },
+ { 0x11B9, "IST Electronics, Inc." },
+ { 0x11BA, "Sasem Co., Ltd." },
+ { 0x11BB, "YaMu Solutions" },
+ { 0x11BC, "Taipei EELY-ECW Co., Ltd." },
+ { 0x11BD, "UBINETICS LIMITED" },
+ { 0x11BE, "Martin Professional A/S" },
+ { 0x11BF, "SonoSite, Inc." },
+ { 0x11C0, "Sanmos Microelectronics Corp." },
+ { 0x11C1, "Wako Giken Kogyo Co., Ltd." },
+ { 0x11C2, "EYESPYFX" },
+ { 0x11C3, "Kaizen Frogpad, LLC" },
+ { 0x11C4, "DALLANTBANK, INC." },
+ { 0x11C5, "INMAX TECHNOLOGY CORP." },
+ { 0x11C6, "Guzik Technical Enterprises" },
+ { 0x11C7, "Reliance Electric Limited" },
+ { 0x11C8, "Fullcom Technology Corp." },
+ { 0x11C9, "Monster Cable Products, Inc." },
+ { 0x11CA, "VeriFone" },
+ { 0x11CB, "Magni Systems, Inc." },
+ { 0x11CC, "AIM SRL" },
+ { 0x11CD, "KTEK Co., Ltd." },
+ { 0x11CE, "Argolis BV" },
+ { 0x11CF, "Nemoto Kyorindo Co., Ltd." },
+ { 0x11D0, "TOPCON CORPORATION, Opthalmic & Medical Instrument Dept" },
+ { 0x11D1, "Far Touch Inc." },
+ { 0x11D2, "BW Technologies Ltd." },
+ { 0x11D3, "Elias Technology, Inc." },
+ { 0x11D4, "Unitac Co., Ltd." },
+ { 0x11D5, "Polyvision Corporation" },
+ { 0x11D6, "FUJIFILM AXIA CO., LTD." },
+ { 0x11D7, "Kokusai Electric Alpha Co., Ltd." },
+ { 0x11D8, "Zybertek" },
+ { 0x11D9, "Itronix Corporation" },
+ { 0x11DA, "Tekscan, Inc." },
+ { 0x11DB, "Topfield Co., Ltd." },
+ { 0x11DC, "STELECTRIC A/S" },
+ { 0x11DD, "DRAGONCHIP LTD." },
+ { 0x11DE, "La Generale Multimedia" },
+ { 0x11DF, "ROI Computer AG" },
+ { 0x11E0, "SUNX Limited" },
+ { 0x11E1, "Encentuate Pte. Ltd." },
+ { 0x11E2, "SPECSOFT CONSULTING INC" },
+ { 0x11E3, "GfS-Hofheim" },
+ { 0x11E4, "STANDARD ELECTRONICS TELECOM INC." },
+ { 0x11E5, "CHUFON Technology Co., Ltd." },
+ { 0x11E6, "K.I. Technology Co. Ltd." },
+ { 0x11E7, "Rockford Corporation" },
+ { 0x11E8, "NAAT Technology Corp." },
+ { 0x11E9, "Wincan Technology Co., Ltd." },
+ { 0x11EA, "Panram International Corp." },
+ { 0x11EB, "VTech Innovation L.P. dba Advanced American Telephones" },
+ { 0x11EC, "Hitachi Computer Peripherals Co., Ltd." },
+ { 0x11ED, "Shimizu Technology Inc." },
+ { 0x11EE, "ASAHI ELECTRIC CO., LTD." },
+ { 0x11EF, "Cableplus Industrial Co., Ltd." },
+ { 0x11F0, "Matthew Ward Solutions" },
+ { 0x11F1, "Cal-Comp Electronics (Thailand) Public Co., Ltd." },
+ { 0x11F2, "Chain Tay Technology Co., Ltd." },
+ { 0x11F3, "ROUND Co., Ltd." },
+ { 0x11F4, "Kyoritsu Electric Corporation" },
+ { 0x11F5, "Siemens Mobile Phones" },
+ { 0x11F6, "NetIndex Inc." },
+ { 0x11F7, "ALCATEL BUSINESS SYSTEMS" },
+ { 0x11F8, "BodyMedia, Inc." },
+ { 0x11F9, "Cryptocard Corporation" },
+ { 0x11FA, "Code Corporation" },
+ { 0x11FB, "HORIBA, Ltd." },
+ { 0x11FC, "ANCOT CORPORATION" },
+ { 0x11FD, "EKE-Electronics Ltd." },
+ { 0x11FE, "SHENZHEN CHANGXUNXING ELECTRONIC CO., LTD." },
+ { 0x11FF, "LITE STAR ELECTRONICS TECHNOLOGIES, CO. LTD." },
+ { 0x1200, "Spellman High Voltage Electronics Corp." },
+ { 0x1201, "Practical Automation, Inc." },
+ { 0x1202, "KUK JE TONG SHIN CO., LTD." },
+ { 0x1203, "Taiwan Semiconductor Co., Ltd." },
+ { 0x1204, "SATEC" },
+ { 0x1205, "NV ADB TTV TECHNOLOGIES SA" },
+ { 0x1206, "Synnix Technology Co." },
+ { 0x1207, "Cardinal Health UK 232 Ltd." },
+ { 0x1208, "Seiko Epson Corp.- System Device" },
+ { 0x120A, "Wintest Corp." },
+ { 0x120B, "Dension Audio Systems Ltd." },
+ { 0x120C, "ALF, Inc." },
+ { 0x120D, "(AVL) DiTEST Fahrzeugdiagnose GmbH" },
+ { 0x120E, "HUDSON SOFT CO., LTD." },
+ { 0x120F, "Magellan Navigation, Inc." },
+ { 0x1210, "Harman" },
+ { 0x1211, "COSMED S.r.l." },
+ { 0x1212, "D'Crypt Pte Ltd." },
+ { 0x1213, "Fukko System Co., Ltd." },
+ { 0x1214, "Dr. Bott KG" },
+ { 0x1215, "Towa Engineering Corporation" },
+ { 0x1216, "ProMinent Dosiertechnik GmbH" },
+ { 0x1217, "Goyatek Technology Inc." },
+ { 0x1218, "Geutebrueck GmbH" },
+ { 0x1219, "COMPAL COMMUNICATIONS, INC." },
+ { 0x121A, "TimeKeeping Systems, Inc." },
+ { 0x121B, "FEC Inc." },
+ { 0x121C, "Raysis Co., Ltd." },
+ { 0x121D, "Intelligent Computer Solutions" },
+ { 0x121E, "Jungsoft Co., Ltd." },
+ { 0x121F, "Panini S.P.A." },
+ { 0x1220, "TC Group A/S" },
+ { 0x1221, "Averatec, Inc." },
+ { 0x1222, "Tipro Keyboards D.O.O." },
+ { 0x1223, "SKYCABLE ENTERPRISE CO., LTD." },
+ { 0x1224, "SCATT, ZAO" },
+ { 0x1225, "HI-P Tech Corporation" },
+ { 0x1226, "Keihin Corporation" },
+ { 0x1227, "T-RAC INTERNATIONAL, INC." },
+ { 0x1228, "DATAPAQ" },
+ { 0x1229, "EPO Science & Technology Inc." },
+ { 0x122A, "WABCO GmbH & Co., OHG" },
+ { 0x122B, "Midas Lab Inc." },
+ { 0x122C, "Qbtech AB" },
+ { 0x122D, "Hitachi Information & Control Solutions, Ltd." },
+ { 0x122E, "IOLINE" },
+ { 0x122F, "Takimaging" },
+ { 0x1230, "MIPSABG Chipidea, Lda." },
+ { 0x1231, "CHI MEI COMMUNICATION SYSTEMS, INC." },
+ { 0x1232, "SolitonWave Co., Ltd." },
+ { 0x1233, "Targa Systems Div. L-3 Communications" },
+ { 0x1234, "Micro Science Co., Ltd." },
+ { 0x1235, "Focusrite Audio Engineering Ltd" },
+ { 0x1236, "Nozaki Insatsu Shigyo Co., Ltd." },
+ { 0x1237, "Technowave Ltd." },
+ { 0x1238, "Bridgekey Corp." },
+ { 0x1239, "Antex Electronics" },
+ { 0x123A, "Spectra Technologies Holdings Co., Ltd." },
+ { 0x123B, "De La Rue Systems Automatizacao" },
+ { 0x123C, "K-Won C & C Co., Ltd." },
+ { 0x123D, "Microplex Printware AG" },
+ { 0x123E, "A.T. WORKS, Inc." },
+ { 0x123F, "DURAPOWER TECHNOLOGY LTD." },
+ { 0x1240, "HUMUS MOG CO., LTD." },
+ { 0x1241, "OTSUKA ELECTRONICS CO., LTD." },
+ { 0x1242, "MAC SYSTEM CO., LTD." },
+ { 0x1243, "Fujikura Ltd., Fiber Optic System Division" },
+ { 0x1244, "DResearch Digital Media Systems GmbH" },
+ { 0x1245, "R/D Tech Inc." },
+ { 0x1246, "CTO S.p.A." },
+ { 0x1247, "JAPAN PRECISION INSTRUMENTS, INC." },
+ { 0x1248, "Vector Informatik GmbH" },
+ { 0x1249, "TRACESPAN Communications Ltd." },
+ { 0x124A, "AirVast Technology Inc." },
+ { 0x124B, "NYKO Technologies, Inc." },
+ { 0x124C, "MEMORY EXPERTS International Inc." },
+ { 0x124D, "Just Rams PLC" },
+ { 0x124E, "YEM Inc." },
+ { 0x124F, "Beijing JingHuiJiaDe Tech. Co., Ltd." },
+ { 0x1250, "TECMAG" },
+ { 0x1251, "Iwaya Corporation" },
+ { 0x1252, "Nextway Co., Ltd." },
+ { 0x1253, "Erebus Limited" },
+ { 0x1254, "Empirical Systems" },
+ { 0x1255, "ASCII Solutions, Inc." },
+ { 0x1256, "Spectronic Denmark A/S" },
+ { 0x1257, "AudioScience" },
+ { 0x1258, "Continental Automotive Trading UK Ltd." },
+ { 0x1259, "Deutsche Montan Technologie GmbH" },
+ { 0x125A, "Shintake Sangyo Co., Ltd." },
+ { 0x125B, "VIDEX" },
+ { 0x125C, "Apogee Instruments, Inc." },
+ { 0x125D, "Advanced Technology (UK) PLC" },
+ { 0x125E, "Bosch Automotive Service Solutions" },
+ { 0x125F, "ADATA Technology Co., Ltd." },
+ { 0x1260, "Cores Inc." },
+ { 0x1261, "All Ring Tech Co., Ltd." },
+ { 0x1262, "MICRO VISION CO., LTD." },
+ { 0x1263, "Opti Japan Corporation" },
+ { 0x1264, "Covidien Energy-based Devices" },
+ { 0x1265, "Good Mind Industries Co., Ltd." },
+ { 0x1266, "Pirelli Cavi e Sistemi Telecom S.p.A." },
+ { 0x1267, "SILCOR" },
+ { 0x1268, "icube Corp." },
+ { 0x1269, "Sequoia Voting Systems Inc." },
+ { 0x126A, "CHH Electronics Ltd." },
+ { 0x126B, "Veridian Systems" },
+ { 0x126C, "Aristocrat Technologies" },
+ { 0x126D, "Bel Stewart" },
+ { 0x126E, "Strobe Data, Inc." },
+ { 0x126F, "TwinMOS Technologies ME FZE" },
+ { 0x1270, "Procomp Informatics Ltd." },
+ { 0x1271, "Foxda Technology Industrial (Shenzhen) Co., Ltd." },
+ { 0x1272, "Linear Technology Corporation" },
+ { 0x1273, "HANEX Co., Ltd." },
+ { 0x1274, "Matin, Inc." },
+ { 0x1275, "Xaxero Marine Software Engineering Ltd." },
+ { 0x1276, "QVS" },
+ { 0x1277, "Silicon Media Inc." },
+ { 0x1278, "Starlight Xpress Ltd." },
+ { 0x1279, "Cheesecote Mountain Camac" },
+ { 0x127A, "Electrophysics Corp." },
+ { 0x127B, "The Technology Partnership (TTP)" },
+ { 0x127C, "Comarco Wireless" },
+ { 0x127D, "RAiO Technology Inc." },
+ { 0x127E, "Hugelent Telecommunication (SuZhou) Co., Ltd." },
+ { 0x127F, "IPACS Hans-Borchers-Gruentjens GbR (IPACS)" },
+ { 0x1280, "Animeta Systems Inc." },
+ { 0x1281, "Gean Sen Electronic Co., Ltd." },
+ { 0x1282, "Falco Electronics Mexico" },
+ { 0x1283, "zebris Medizintechnik GmbH" },
+ { 0x1284, "YEC Co., Ltd." },
+ { 0x1285, "Schindler Aufzuge AG" },
+ { 0x1286, "MARVELL SEMICONDUCTOR, INC." },
+ { 0x1287, "Infomove Co., Ltd." },
+ { 0x1288, "Micro Advantage Inc." },
+ { 0x1289, "Nippon Telesoft Co., Ltd." },
+ { 0x128A, "Asia Vital Components Co., Ltd." },
+ { 0x128B, "Medicapture, Inc." },
+ { 0x128C, "ITW Food Equipment Group, LLC dba Hobart Corporation" },
+ { 0x128D, "Testo AG" },
+ { 0x128E, "Stormblue Co., Ltd." },
+ { 0x128F, "Guidant Corporation" },
+ { 0x1290, "Musicus GmbH" },
+ { 0x1291, "Flarion Technologies" },
+ { 0x1292, "Fire International Ltd." },
+ { 0x1293, "Mitsubishi Electric Engineering Co., Ltd." },
+ { 0x1294, "RISO KAGAKU CORP." },
+ { 0x1295, "A & G Souzioni Digitali" },
+ { 0x1296, "RadioScape" },
+ { 0x1297, "DEKTEC Digital Video B.V." },
+ { 0x1298, "Genlyte Controls" },
+ { 0x1299, "DGStation Co., Ltd." },
+ { 0x129A, "PULSTEC INDUSTRIAL CO., LTD." },
+ { 0x129B, "CyberTAN Technology Inc." },
+ { 0x129C, "Min Aik Technology Co., Ltd." },
+ { 0x129D, "Yueqing Longhua Electronics Factory" },
+ { 0x129E, "Aceeca Limited" },
+ { 0x129F, "Howtek Devices Corp." },
+ { 0x12A0, "CDC Point S.p.A." },
+ { 0x12A1, "Tohken Co., Ltd." },
+ { 0x12A2, "E28 (Shanghai) Ltd." },
+ { 0x12A3, "KENT WORLD CO., LTD." },
+ { 0x12A4, "Guangdong Matsunichi Communications Technology Co., Ltd" },
+ { 0x12A5, "Sola/Hevi-Duty" },
+ { 0x12A6, "ULVAC-PHI, Inc." },
+ { 0x12A7, "Trendchip Technologies Corp." },
+ { 0x12A8, "Clovertech Inc." },
+ { 0x12A9, "Sunwave Technology Corp." },
+ { 0x12AA, "Bustec Production Ltd." },
+ { 0x12AB, "Honey Bee (Hong Kong) Limited" },
+ { 0x12AC, "Compact Light System Norway A/S" },
+ { 0x12AD, "Asahi Seiko Co., Ltd." },
+ { 0x12AE, "Matsunichi Communication Holdings Limited" },
+ { 0x12AF, "Baldor UK Ltd." },
+ { 0x12B0, "Axciton Systems, Inc." },
+ { 0x12B1, "HIMECS CO., LTD." },
+ { 0x12B2, "DICKSON Company" },
+ { 0x12B3, "Megaforce Company Ltd." },
+ { 0x12B4, "Hanchang System Corporation" },
+ { 0x12B5, "World Touch Gaming , Inc." },
+ { 0x12B6, "Naito Densei Machida Mfg. Co., Ltd." },
+ { 0x12B7, "Genesis Microchip Inc." },
+ { 0x12B8, "Zhejiang Xinya Electronic Technology Co., Ltd." },
+ { 0x12B9, "Freehand Systems, Inc." },
+ { 0x12BA, "Sony Computer Entertainment America" },
+ { 0x12BB, "Paltronics, Inc." },
+ { 0x12BC, "Hakusan Corporation" },
+ { 0x12BD, "Sun Light Application Co., Ltd." },
+ { 0x12BE, "Dynex Technologies" },
+ { 0x12BF, "Matrix Multimedia Ltd." },
+ { 0x12C0, "Sencore, Inc." },
+ { 0x12C1, "ARTRAY CO., LTD." },
+ { 0x12C2, "HHB Communications Ltd." },
+ { 0x12C3, "Fiso Technologies, Inc." },
+ { 0x12C4, "Autocue Ltd." },
+ { 0x12C5, "XN Technologies, Inc." },
+ { 0x12C6, "Bosch Security Systems" },
+ { 0x12C7, "Hismartech Co., Ltd." },
+ { 0x12C8, "XiMeta Inc." },
+ { 0x12C9, "Newmen Technology Corp. Ltd." },
+ { 0x12CA, "Cables To Go International Manufacturing Co., Ltd." },
+ { 0x12CB, "Dallmeier electronic GmbH" },
+ { 0x12CC, "Printherm" },
+ { 0x12CD, "Cables Unlimited" },
+ { 0x12CE, "Hakko Electronics Co., Ltd." },
+ { 0x12CF, "Dexin Corporation" },
+ { 0x12D0, "ITG Research & Development Center" },
+ { 0x12D1, "Huawei Technologies Co., Ltd." },
+ { 0x12D2, "LINE TECH INDUSTRIAL CO., LTD." },
+ { 0x12D3, "Linak A/S" },
+ { 0x12D4, "Infonics Pty. Limited" },
+ { 0x12D5, "Strategic Vista Corp." },
+ { 0x12D6, "EMS Dr. Thomas Wuensche" },
+ { 0x12D7, "Better Holdings (HK) Limited" },
+ { 0x12D8, "Araneus Information Systems Oy" },
+ { 0x12D9, "DIGITFAB INTERNATIONAL CO., LTD." },
+ { 0x12DA, "Simavionics, Inc." },
+ { 0x12DB, "Planar Systems, Inc." },
+ { 0x12DC, "MMGEAR Co., Ltd." },
+ { 0x12DD, "JFE Advantech Co., Ltd." },
+ { 0x12DE, "National Display Systems" },
+ { 0x12DF, "Sumitomo 3M Limited" },
+ { 0x12E0, "Electronica Mecanica Y Control S.A." },
+ { 0x12E1, "FDK CORPORATION" },
+ { 0x12E2, "Bonso Electronic Ltd." },
+ { 0x12E3, "1417188 Ontario Ltd." },
+ { 0x12E4, "Bruel & Kjaer Sound & Vibration Meas. A/S" },
+ { 0x12E5, "Interactive Computer Products, Inc." },
+ { 0x12E6, "Waldorf-Music AG" },
+ { 0x12E7, "Sugiyama Electron Co., Ltd." },
+ { 0x12E8, "ZAN Messgeraete" },
+ { 0x12E9, "Mindspeed Technologies" },
+ { 0x12EA, "Microlink Systems" },
+ { 0x12EB, "MITSUI & CO., LTD." },
+ { 0x12EC, "KYORITSU ELECTRICAL INSTRUMENTS WORKS, LTD. (R&D Center" },
+ { 0x12ED, "Techno Kit Corporation" },
+ { 0x12EE, "Avery Dennison Deutschland GmbH" },
+ { 0x12EF, "Tapwave, Inc." },
+ { 0x12F0, "KROHNE" },
+ { 0x12F1, "OHIRA GIKEN, IND. CO., LTD." },
+ { 0x12F2, "VIEWPLUS TECHNOLOGIES, INC." },
+ { 0x12F3, "FORMOSA TELETEK CORPORATION" },
+ { 0x12F4, "Glovic Electronics Corp." },
+ { 0x12F5, "Dynamic System Electronics Corp." },
+ { 0x12F6, "Aichi Tokei Denki Co., Ltd." },
+ { 0x12F7, "Memorex Products, Inc." },
+ { 0x12F8, "Evolution Technologies, Inc." },
+ { 0x12F9, "RF-LINK SYSTEMS, INC." },
+ { 0x12FA, "RF Micro Devices" },
+ { 0x12FB, "SSD JAPAN CO., Ltd" },
+ { 0x12FC, "eGenium S.r.l." },
+ { 0x12FD, "AIN COMM. TECHNOLOGY CO., LTD." },
+ { 0x12FE, "E.U CONNECTOR(M) SDN BHD." },
+ { 0x12FF, "Fascinating Electronics, Inc." },
+ { 0x1300, "Muscle Corporation" },
+ { 0x1301, "Woehler Messgeraete Kehrgeraete GmbH" },
+ { 0x1302, "Wildseed Ltd." },
+ { 0x1303, "Lloyd Research (Projects) Ltd." },
+ { 0x1304, "MEDIALINK-I, Inc." },
+ { 0x1305, "ELSE Ltd." },
+ { 0x1306, "Torcon Instruments Inc." },
+ { 0x1307, "USBest Technology Inc." },
+ { 0x1308, "Precision Photonics Corp." },
+ { 0x1309, "Sabine, Inc." },
+ { 0x130A, "SIBATA SCIENTIFIC TECHNOLOGY, LTD." },
+ { 0x130B, "MPC Products" },
+ { 0x130C, "Quest Technologies" },
+ { 0x130D, "Loyal Technology Corporation" },
+ { 0x130E, "Microlink Communications Inc." },
+ { 0x130F, "AGFA NDT, Krautkramer Ultrasonic Systems" },
+ { 0x1310, "Air2U Inc." },
+ { 0x1311, "EDX Epi-Scan Corp" },
+ { 0x1312, "ICS Electronics" },
+ { 0x1313, "THORLABS, INC" },
+ { 0x1314, "Ryoko Electric Co., Ltd." },
+ { 0x1315, "Prairie Systems & Equip. Ltd. O/A Massload Technologies" },
+ { 0x1316, "JUNGLE Inc" },
+ { 0x1317, "PC-CRAFT Co., Ltd." },
+ { 0x1318, "O'RITE TECHNOLOGY Co., Ltd." },
+ { 0x1319, "Peekel Instruments B.V." },
+ { 0x131A, "VERYWELL CO., LTD." },
+ { 0x131B, "Rowley Associates Ltd." },
+ { 0x131C, "Staples, Inc." },
+ { 0x131D, "Natural Point" },
+ { 0x131E, "Duerr Dental GmbH & Co., KG" },
+ { 0x131F, "Ayuttha Technology Corp." },
+ { 0x1320, "Jaguar International Corporation" },
+ { 0x1321, "Lectrosonics, Inc." },
+ { 0x1322, "Z/I Imaging" },
+ { 0x1323, "Zeustech Company Limited" },
+ { 0x1324, "H-Mod, Inc." },
+ { 0x1325, "Austriamicrosystems AG" },
+ { 0x1326, "Force Control Industries Inc." },
+ { 0x1327, "Avtec, Inc." },
+ { 0x1328, "Iris Power Engineering" },
+ { 0x1329, "Appairent Technologies, Inc." },
+ { 0x132A, "Envara" },
+ { 0x132B, "Konica Minolta, Inc." },
+ { 0x132C, "Le Prestique International (H.K.) Ltd." },
+ { 0x132D, "GE Healthcare Life Sciences" },
+ { 0x132E, "Kwang Jang Corporation" },
+ { 0x132F, "ViALUX GmbH" },
+ { 0x1330, "ALFANUCLEAR S.A." },
+ { 0x1331, "Panic Inc." },
+ { 0x1332, "Moral Follow System Co., Ltd." },
+ { 0x1333, "Ultra Electronics Precision Air & Land Systems" },
+ { 0x1334, "ADC Corporation" },
+ { 0x1335, "PLUS Corporation" },
+ { 0x1336, "IMM-Gruppe" },
+ { 0x1337, "Radiant Networks Plc" },
+ { 0x1338, "IT CONCEPTS LLC" },
+ { 0x1339, "Akashi Corporation" },
+ { 0x133A, "Vyyo Inc." },
+ { 0x133B, "FLASH SUPPORT GROUP, INC." },
+ { 0x133C, "G-Design Technology" },
+ { 0x133D, "Jasco Products Company" },
+ { 0x133E, "Kemper Digital GmbH" },
+ { 0x133F, "Hwayoung RF Solution Inc." },
+ { 0x1340, "Escherlogic Inc." },
+ { 0x1341, "Lavry Engineering" },
+ { 0x1342, "Sutter Instrument Company" },
+ { 0x1343, "Heiwa Tokei Mfg. Co., Ltd" },
+ { 0x1344, "TCI, Inc. d/b/a TCI Medical" },
+ { 0x1345, "Sino Lite Technology Corp." },
+ { 0x1346, "Mediatek Corp." },
+ { 0x1347, "Moravian Instruments, Inc." },
+ { 0x1348, "Katsuragawa Electric Co., Ltd." },
+ { 0x1349, "Esaote/Pie Medical Equipment" },
+ { 0x134A, "iX Group" },
+ { 0x134B, "El Pusk Co., Ltd." },
+ { 0x134C, "Panjit International Inc." },
+ { 0x134D, "Danfoss Drives A/S" },
+ { 0x134E, "Digby's Bitpile, Inc. D.B.A. D Bit" },
+ { 0x134F, "Addvalue Communications Pte Ltd." },
+ { 0x1350, "UniqueICs, LLC" },
+ { 0x1351, "Crossware Associates" },
+ { 0x1352, "Km2Net" },
+ { 0x1353, "Shenzhen Coship Software Co., Ltd." },
+ { 0x1354, "FACTS Engineering LLC" },
+ { 0x1355, "Ethicon Endo-Surgery, Inc." },
+ { 0x1356, "Techpoint Electric Wire & Cable Co., Ltd." },
+ { 0x1357, "P & E Microcomputer Systems, Inc." },
+ { 0x1358, "SKYLIGHT DIGITAL INC." },
+ { 0x1359, "RKC INSTRUMENT INC." },
+ { 0x135A, "URMET TLC S.p.A. - Servizio Amministrativo" },
+ { 0x135B, "M-System Co., Ltd." },
+ { 0x135C, "Real-Time Essentials, Inc." },
+ { 0x135D, "ALGOTEX SRL" },
+ { 0x135E, "Insta Elektro GmbH" },
+ { 0x135F, "Control Development, Inc." },
+ { 0x1360, "FREETRON COM LTD." },
+ { 0x1361, "Thinktel Korea Co., Ltd." },
+ { 0x1362, "IMAGICA Corp." },
+ { 0x1363, "Axsun Technologies, Inc." },
+ { 0x1364, "SHARP TAKAYA ELECTRONICS INDUSTRY CO., LTD." },
+ { 0x1365, "TOYO JIKI INDUSTRY CO., LTD." },
+ { 0x1366, "SEGGER Microcontroller Systems GmbH" },
+ { 0x1367, "The Soundbeam Project" },
+ { 0x1368, "TelePaq Technology Inc." },
+ { 0x1369, "FASL LLC." },
+ { 0x136A, "Pelco" },
+ { 0x136B, "STEC" },
+ { 0x136C, "Datastor Technology Co., Ltd." },
+ { 0x136D, "Brainchild" },
+ { 0x136E, "Andor Technology" },
+ { 0x136F, "Nielsen Media Research" },
+ { 0x1370, "Swissbit AG" },
+ { 0x1371, "Micro Technology Co., Ltd." },
+ { 0x1372, "AMAC Tek Co., Ltd." },
+ { 0x1373, "Radical Research, Inc." },
+ { 0x1374, "American Anko Co." },
+ { 0x1375, "TCL MOBILE COMMUNICATION CO., LTD." },
+ { 0x1376, "Vimtron Electronics Co., Ltd." },
+ { 0x1377, "Sennheiser Electronic" },
+ { 0x1378, "HIRATA Corporation" },
+ { 0x1379, "Inprocomm, Inc." },
+ { 0x137A, "Weldon Technologies, Inc." },
+ { 0x137B, "SCAPS GmbH" },
+ { 0x137C, "Yaskawa Electric Corporation" },
+ { 0x137D, "Diodes Incorporated" },
+ { 0x137E, "XL Microwave, Inc." },
+ { 0x137F, "Sata Hi Tech Services" },
+ { 0x1380, "Staveley Instruments" },
+ { 0x1381, "N-LINE SYSTEM CO., LTD." },
+ { 0x1382, "Systemware Inc." },
+ { 0x1383, "Application Corporation" },
+ { 0x1384, "Device Drivers Limited" },
+ { 0x1385, "Variscite Ltd." },
+ { 0x1386, "SCD Tech Inc." },
+ { 0x1387, "Advanced Technical Group" },
+ { 0x1388, "Southern Vision Systems, Inc." },
+ { 0x1389, "Coolnection Technology Co., Ltd." },
+ { 0x138A, "Validity Inc." },
+ { 0x138B, "AMS Limited, Integrated Systems" },
+ { 0x138C, "Fortemedia, Inc." },
+ { 0x138D, "CPI GmbH" },
+ { 0x138E, "RAISONANCE" },
+ { 0x138F, "Saia-Burgess Controls Ltd." },
+ { 0x1390, "TomTom International B.V." },
+ { 0x1391, "IdealTEK" },
+ { 0x1392, "SAGE INSTRUMENTS" },
+ { 0x1393, "ELNEC s.r.o." },
+ { 0x1394, "Gemini 2000 Ltd." },
+ { 0x1395, "Sennheiser Communications A/S" },
+ { 0x1396, "Greenliant Systems, Inc." },
+ { 0x1397, "Behringer Spezielle Studiotechnik GmbH" },
+ { 0x1398, "Nintendo of America" },
+ { 0x1399, "Thai Wonderful Wire Cable Co., Ltd." },
+ { 0x139A, "Infinitec Co., Ltd." },
+ { 0x139B, "Thomas Enterprises, Inc." },
+ { 0x139C, "Deltronics" },
+ { 0x139D, "Digisafe Pte. Ltd." },
+ { 0x139E, "Valueplus Inc." },
+ { 0x139F, "Audio Technology Switzerland SA" },
+ { 0x13A0, "Essilor International" },
+ { 0x13A1, "Canas Co., Ltd." },
+ { 0x13A2, "Pesa Switching Systems, Inc." },
+ { 0x13A3, "Dynon Instruments" },
+ { 0x13A4, "Equipment Systems & Devices" },
+ { 0x13A5, "Sammy Corporation" },
+ { 0x13A6, "Jeppesen Sanderson Inc." },
+ { 0x13A7, "Circuit Design, Inc." },
+ { 0x13A8, "Grandtec Electronic Corp" },
+ { 0x13A9, "YAMAMOTO-MS CO., LTD." },
+ { 0x13AA, "Sinar Electronics Limited" },
+ { 0x13AB, "MicroMade Galka i Drozdz sp.j" },
+ { 0x13AC, "DAQ Systems" },
+ { 0x13AD, "Baltech AG" },
+ { 0x13AE, "CIM-USA Inc." },
+ { 0x13AF, "Handheld Entertainment" },
+ { 0x13B0, "PerkinElmer Optoelectronics" },
+ { 0x13B1, "Cisco-Linksys, LLC" },
+ { 0x13B2, "ALESIS" },
+ { 0x13B3, "Nippon Dics Co., Ltd." },
+ { 0x13B4, "Dolch Computer Systems" },
+ { 0x13B5, "INVENTECH, INC." },
+ { 0x13B6, "ISABELLENHUETTE Heusler GmbH KG" },
+ { 0x13B7, "Keymark Technology Co., Ltd." },
+ { 0x13B8, "PDM Electronic Co., Ltd." },
+ { 0x13B9, "Cimcore" },
+ { 0x13BA, "Yung Ray Technology Co., Ltd." },
+ { 0x13BB, "Covidien Respiratory and Monitoring Solutions" },
+ { 0x13BC, "Imaging Supersonic Laboratories Co., Ltd." },
+ { 0x13BD, "Remote Technologies, Inc." },
+ { 0x13BE, "Ricoh Printing Systems, Ltd." },
+ { 0x13BF, "Accusys, Inc." },
+ { 0x13C0, "Stream Labs" },
+ { 0x13C1, "Vivitar Corporation" },
+ { 0x13C2, "SATO KEIRYOKI MFG. CO., LTD." },
+ { 0x13C3, "SCT Performance, LLC" },
+ { 0x13C4, "StationZ Inc." },
+ { 0x13C5, "MELFAS, INC." },
+ { 0x13C6, "Hasointech Co., Ltd." },
+ { 0x13C7, "ANDO ELECTRIC CO., LTD." },
+ { 0x13C8, "Togami Electric Mfg. Co., Ltd." },
+ { 0x13C9, "LinearX Systems Inc." },
+ { 0x13CA, "JyeTai Precision Industrial Co., Ltd." },
+ { 0x13CB, "JTEK Technology Corporation" },
+ { 0x13CC, "Cellvic Corporation" },
+ { 0x13CD, "ABCD Aging Biorhythms and Computer Diagnostics GmbH" },
+ { 0x13CE, "Cypherix (Pty) Ltd." },
+ { 0x13CF, "Wisair Ltd." },
+ { 0x13D0, "Swedect AB" },
+ { 0x13D1, "A-Max Technology Macao Commercial Offshore Co. Ltd." },
+ { 0x13D2, "Intelligraphics, Inc." },
+ { 0x13D3, "AzureWave Technologies, Inc." },
+ { 0x13D4, "IWATSU TEST INSTRUMENTS CORPORATION" },
+ { 0x13D5, "International Electronics Inc." },
+ { 0x13D6, "Appside" },
+ { 0x13D7, "Tableau, LLC" },
+ { 0x13D8, "University of Stirling" },
+ { 0x13D9, "Blazepoint Limited" },
+ { 0x13DA, "OPTEX CO., LTD." },
+ { 0x13DB, "Zastron Electronic (Shenzhen) Co. Ltd." },
+ { 0x13DC, "ALEREON, INC." },
+ { 0x13DD, "i.Tech Dynamic Limited" },
+ { 0x13DE, "LANKOM ELECTRONICS CO., LTD." },
+ { 0x13DF, "Good Fancy Enterprise Co., Ltd." },
+ { 0x13E0, "Taiwan Silicon Electronics Corp." },
+ { 0x13E1, "Kaibo Wire & Cable (Shenzhen) Co., Ltd." },
+ { 0x13E2, "Parallax, Inc." },
+ { 0x13E3, "SoniqCast, LLC" },
+ { 0x13E4, "Audio Precision" },
+ { 0x13E5, "Sigma Audio Research Ltd." },
+ { 0x13E6, "TechnoScope Co., Ltd." },
+ { 0x13E7, "Gantner Pigeon Systems GmbH" },
+ { 0x13E8, "PalmSource Inc." },
+ { 0x13E9, "Ununpentium, LLC" },
+ { 0x13EA, "I/F - COM A/S" },
+ { 0x13EB, "PILZ GMBH & CO. KG" },
+ { 0x13EC, "Chyau Yuan Technology Co., Ltd." },
+ { 0x13ED, "Wooju Communications Co., Ltd." },
+ { 0x13EE, "ATLab Inc." },
+ { 0x13EF, "Turner Technology" },
+ { 0x13F0, "DIGENT CO., Ltd." },
+ { 0x13F1, "AP Instruments" },
+ { 0x13F2, "Tech Micro Corporation" },
+ { 0x13F3, "Amulet Hotkey" },
+ { 0x13F4, "Verisity Design Inc." },
+ { 0x13F5, "X-TEL Communications, Inc." },
+ { 0x13F6, "Aspen Touch Solutions, Inc." },
+ { 0x13F7, "Corevalley Co., Ltd." },
+ { 0x13F8, "EZPnP Technologies Corp." },
+ { 0x13F9, "Impsys Digital Security AB" },
+ { 0x13FA, "Radiantech, Inc." },
+ { 0x13FB, "Noritsu Koki Co., Ltd." },
+ { 0x13FC, "Compucat Research Pty Limited" },
+ { 0x13FD, "Initio (HK) Corporation Limited" },
+ { 0x13FE, "Phison Electronics Corp." },
+ { 0x13FF, "VIEWCON ELECTRONIC LTD." },
+ { 0x1400, "Axxion Group Corp." },
+ { 0x1401, "Fulhua Microelectronics Corp." },
+ { 0x1402, "Bowe Bell & Howell" },
+ { 0x1403, "Sitronix Technology Corp." },
+ { 0x1404, "Fundamental Software Incorporated" },
+ { 0x1405, "Cooper Security Ltd." },
+ { 0x1406, "Systemneeds, Inc." },
+ { 0x1407, "Coin Mechanisms Inc." },
+ { 0x1408, "Comark Ltd." },
+ { 0x1409, "IDS Imaging Development Systems GmbH" },
+ { 0x140A, "Koyo Electronics Industries Co., Ltd." },
+ { 0x140B, "Vertex Standard Co., Ltd." },
+ { 0x140C, "MITS Electronics" },
+ { 0x140D, "Japan Novel Corporation" },
+ { 0x140E, "Telechips, Inc." },
+ { 0x140F, "i-WAVER" },
+ { 0x1410, "Novatel Wireless, Inc." },
+ { 0x1411, "SKIDATA AG" },
+ { 0x1412, "IMADA CO., LTD." },
+ { 0x1413, "Telsey S.p.A." },
+ { 0x1415, "Sony Computer Entertainment Europe" },
+ { 0x1416, "Axeon Limited" },
+ { 0x1417, "Butterfly Media" },
+ { 0x1418, "MediaPower Technology Corporation" },
+ { 0x1419, "ABILITY ENTERPRISE CO., LTD." },
+ { 0x141A, "Realm Systems Inc." },
+ { 0x141B, "METRAWARE" },
+ { 0x141C, "Leviton Manufacturing" },
+ { 0x141D, "J.FIT Co., Ltd." },
+ { 0x141E, "Ikegami Tsushinki Co., Ltd." },
+ { 0x141F, "SHIMADZU CORPORATION" },
+ { 0x1420, "Lyrtech Inc." },
+ { 0x1421, "Sentech Co., Ltd." },
+ { 0x1422, "Bird Electronic Corporation" },
+ { 0x1423, "ANCA Pty. Ltd." },
+ { 0x1424, "Posnet Polska S.A." },
+ { 0x1425, "IBEX Technology Co., Ltd." },
+ { 0x1426, "NADEX Co., Ltd." },
+ { 0x1427, "Global Display Solutions S.P.A." },
+ { 0x1428, "Improvision Ltd." },
+ { 0x1429, "Vega Technologies Industrial (Austria) Co." },
+ { 0x142A, "Thales-e-Transactions" },
+ { 0x142B, "Arbiter Systems, Inc." },
+ { 0x142C, "SOMA OPTICS, LTD." },
+ { 0x142D, "Sanblaze Technology, Inc." },
+ { 0x142E, "TAMS Inc." },
+ { 0x142F, "IO Display Systems" },
+ { 0x1430, "Activision" },
+ { 0x1431, "Pertech Resources, Inc." },
+ { 0x1432, "Beijing Watertek Information Technology Co., Ltd." },
+ { 0x1433, "TRANWO TECHNOLOGY CORP." },
+ { 0x1434, "Comart System Co., Ltd." },
+ { 0x1435, "Wistron NeWeb Corp." },
+ { 0x1436, "Denali Software, Inc." },
+ { 0x1437, "Carl Zeiss" },
+ { 0x1438, "My3ia (Beijing) Technology Ltd." },
+ { 0x1439, "Wind River Systems Inc." },
+ { 0x143A, "CP Technologies" },
+ { 0x143B, "RHESCA Company Limited" },
+ { 0x143C, "Altek Corporation" },
+ { 0x143D, "FUKOKU INDUSTRY CO., LTD." },
+ { 0x143E, "IAV GmbH" },
+ { 0x143F, "IDEC IZUMI CORPORATION" },
+ { 0x1440, "Jaalaa, Inc." },
+ { 0x1441, "MARIAN GbR" },
+ { 0x1442, "Canadian Bank Note Company, Limited" },
+ { 0x1443, "Digilent Inc." },
+ { 0x1444, "H & S Instruments Inc." },
+ { 0x1445, "JUSTER CO., LTD." },
+ { 0x1446, "X.J. Group Ltd." },
+ { 0x1447, "Cognex Corporation" },
+ { 0x1448, "Biosystems LLC" },
+ { 0x1449, "SHIMADEN CO., LTD." },
+ { 0x144A, "Megger" },
+ { 0x144B, "MADENTEC LTD." },
+ { 0x144C, "Always On UPS Systems Inc." },
+ { 0x144D, "K-SUN Corporation" },
+ { 0x144E, "Westar Corporation" },
+ { 0x144F, "K-jump Health Co., Ltd." },
+ { 0x1450, "Melec Inc." },
+ { 0x1451, "Force Dimension LLC" },
+ { 0x1452, "DAI NIPPON PRINTING CO., LTD." },
+ { 0x1453, "Epilog Corporation" },
+ { 0x1454, "China IWNCOMM Co., Ltd." },
+ { 0x1455, "Georgia Technology Corp." },
+ { 0x1456, "Extending Wire & Cable Co., Ltd." },
+ { 0x1457, "DAE-A Mediatech Co., Ltd." },
+ { 0x1458, "Rauland-Borg Corporation" },
+ { 0x1459, "Shanghai Simax Micro-electronics Co., Ltd." },
+ { 0x145A, "All-Systems Electronics Pty. Ltd." },
+ { 0x145B, "Lead-Type Precision Electronics Co., Ltd." },
+ { 0x145C, "Busch-Jaeger-Elektro GmbH" },
+ { 0x145D, "Sopac Ltd." },
+ { 0x145E, "Forschungszentrum Karlsruhe GmbH" },
+ { 0x145F, "Trust International BV" },
+ { 0x1460, "TATUNG Company" },
+ { 0x1461, "Staccato Communications" },
+ { 0x1462, "Bright Computech Co., Ltd." },
+ { 0x1463, "BBWM Corp." },
+ { 0x1464, "Asiamajor Inc." },
+ { 0x1465, "Michilin Prosperity Co., Ltd." },
+ { 0x1466, "H2 Developer Group" },
+ { 0x1467, "Clearly Superior Technologies" },
+ { 0x1468, "CSE Co., Ltd." },
+ { 0x1469, "ELECTRIM CORPORATION" },
+ { 0x146A, "Knobloch GmbH" },
+ { 0x146B, "BigBen Interactive Limited" },
+ { 0x146C, "HETEC Datensysteme GmbH" },
+ { 0x146D, "Progeny Inc." },
+ { 0x146E, "ClearOne Communications" },
+ { 0x146F, "Unity Electrical Ind. Ltd." },
+ { 0x1470, "STARRIVER TECHNOLOGY CO., LTD." },
+ { 0x1471, "Open Labs, Inc." },
+ { 0x1472, "Hangzhou H3C Technologies Co., Ltd." },
+ { 0x1473, "Dingo Incorporated" },
+ { 0x1474, "Lamp Express USA, Inc." },
+ { 0x1475, "NAC Image Technology Incorporated" },
+ { 0x1476, "Westech Korea Inc." },
+ { 0x1477, "XIROKU INC." },
+ { 0x1478, "Link World Electric Inc." },
+ { 0x1479, "Datalux Corporation" },
+ { 0x147A, "Formosa21 Inc." },
+ { 0x147B, "ABB STOTZ-KONTAKT GmbH" },
+ { 0x147C, "KeyGhost Ltd." },
+ { 0x147D, "Tosoh Corporation" },
+ { 0x147E, "UPEK Inc." },
+ { 0x147F, "Hama GmbH & Co., KG" },
+ { 0x1480, "SITEK S.p.a." },
+ { 0x1481, "MHT S.p.A." },
+ { 0x1482, "Vaillant GmbH" },
+ { 0x1483, "Shenzhen MingWah Aohan High Technology Co., Ltd." },
+ { 0x1484, "Triad Semiconductor, Inc." },
+ { 0x1485, "OrangeWare Corp." },
+ { 0x1486, "SCM PC-CARD GmbH" },
+ { 0x1487, "DSP Group, Ltd." },
+ { 0x1488, "Orion Technology Corp." },
+ { 0x1489, "Sakura Finetek USA, Inc." },
+ { 0x148A, "MICROVISION" },
+ { 0x148B, "HandEra, Inc." },
+ { 0x148C, "Colortrac Ltd." },
+ { 0x148D, "DESMA Co., Ltd." },
+ { 0x148E, "EVATRONIX SA" },
+ { 0x148F, "Ralink Technology, Corp." },
+ { 0x1490, "Digitek Spa" },
+ { 0x1491, "Futronic Technology Co., Ltd." },
+ { 0x1492, "Farsharp Imaging Technology Corp." },
+ { 0x1493, "Suunto" },
+ { 0x1495, "Elprotronic Inc." },
+ { 0x1496, "Tunturi Oy Ltd." },
+ { 0x1497, "Panstrong Company Ltd." },
+ { 0x1498, "ULi Electronics Inc." },
+ { 0x1499, "G-STAR Communications, Ltd." },
+ { 0x149A, "Imagination Technologies" },
+ { 0x149B, "Ivoclar Vivadent AG" },
+ { 0x149C, "TonerHead.com" },
+ { 0x149D, "QMotions Inc." },
+ { 0x149E, "Amkor Technology" },
+ { 0x149F, "Wits Technologies Pte. Ltd." },
+ { 0x14A0, "WAVE Corporation" },
+ { 0x14A1, "Sunhayato Corp." },
+ { 0x14A2, "Big Dutchman (Skandinavien) A/S" },
+ { 0x14A3, "Wipotec GmbH" },
+ { 0x14A4, "Kyerim Industrial Co." },
+ { 0x14A5, "I-ROCKS TECHNOLOGY CO., LTD." },
+ { 0x14A6, "Interface Masters, Inc." },
+ { 0x14A7, "LanReady Technologies, Inc." },
+ { 0x14A8, "1C Company" },
+ { 0x14A9, "Smar Research Corp." },
+ { 0x14AA, "WideView Technology Inc." },
+ { 0x14AB, "Technisches Buero Koenig" },
+ { 0x14AC, "Coolstf.com" },
+ { 0x14AD, "CTK Corporation" },
+ { 0x14AE, "Printronix Inc." },
+ { 0x14AF, "ATP Electronics Inc." },
+ { 0x14B0, "StarTech.com Ltd." },
+ { 0x14B1, "I.E. Gesellschaft fuer Industrieelektronik mbH" },
+ { 0x14B2, "Alpha Networks Inc." },
+ { 0x14B3, "CHUO ELECTRIC WORKS CO., LTD." },
+ { 0x14B4, "Appliances Corp." },
+ { 0x14B5, "NTS Telecom" },
+ { 0x14B6, "Mimic Technologies Inc." },
+ { 0x14B7, "In2Games Limited" },
+ { 0x14B8, "UNITEK TECHNOLOGY CORPORATION" },
+ { 0x14B9, "BP Microsystems" },
+ { 0x14BA, "FLOVEL CO., LTD." },
+ { 0x14BB, "Assembly Tech. Co., Ltd." },
+ { 0x14BC, "NordNav Technologies AB" },
+ { 0x14BD, "Eintech Co., Ltd." },
+ { 0x14BE, "Crestron Electronics, Inc." },
+ { 0x14BF, "Everbee Networks" },
+ { 0x14C0, "Rockwell Automation, Inc." },
+ { 0x14C1, "SOHYA TECHNOLOGY CO., LTD." },
+ { 0x14C2, "Gemlight Computer Ltd." },
+ { 0x14C3, "VOXELLE LTD." },
+ { 0x14C4, "CLOVER Electronics Co., Ltd." },
+ { 0x14C5, "AudioControl" },
+ { 0x14C6, "Trigon Components, Inc." },
+ { 0x14C7, "Hartmann GmbH" },
+ { 0x14C8, "Zytronic Displays Limited" },
+ { 0x14C9, "IXOS Ltd. Bvi" },
+ { 0x14CA, "Technol Seven Co., Ltd." },
+ { 0x14CB, "Dynapoint, Inc." },
+ { 0x14CC, "WIN TONG ELECTRONICS CO., LTD." },
+ { 0x14CD, "MOAI ELECTRONICS CORPORATION" },
+ { 0x14CE, "Spectra, Inc." },
+ { 0x14CF, "Measurement Systems Inc." },
+ { 0x14D0, "Dentrix Dental Systems, Inc." },
+ { 0x14D1, "Maximo Products LLC" },
+ { 0x14D2, "BITS CO., LTD." },
+ { 0x14D3, "Y2 Corporation" },
+ { 0x14D4, "Telequip Corporation" },
+ { 0x14D5, "Electronic Theatre Controls" },
+ { 0x14D6, "Beijing Zhijiu Technology Co., Ltd." },
+ { 0x14D7, "Toppan Printing Co., Ltd." },
+ { 0x14D8, "JAMER INDUSTRIES CO., LTD." },
+ { 0x14D9, "Advanced Flash Memory Card Technology Ltd." },
+ { 0x14DA, "Horng Technical Enterprise Co., Ltd." },
+ { 0x14DB, "TOA Musendenki Co., Ltd." },
+ { 0x14DC, "Ftech Co., Ltd." },
+ { 0x14DD, "Raritan Computer, Inc." },
+ { 0x14DE, "Jetway Information Co., Ltd." },
+ { 0x14DF, "COMPRION GmbH" },
+ { 0x14E0, "Winradio Communications" },
+ { 0x14E1, "Imagination Broadway Ltd" },
+ { 0x14E2, "Avistar Communications Corporation" },
+ { 0x14E3, "Medmont Pty Ltd." },
+ { 0x14E4, "S.CAM Co., Ltd." },
+ { 0x14E5, "Zinitix Co., Ltd" },
+ { 0x14E6, "Micromed Biotecnologia Ltda." },
+ { 0x14E7, "ISS Incorporated" },
+ { 0x14E8, "Animated Lighting LC" },
+ { 0x14E9, "Lifetouch, Inc." },
+ { 0x14EA, "Kosaka Laboratory Ltd." },
+ { 0x14EB, "Pendulum Instruments AB" },
+ { 0x14EC, "Vansco Electronics Ltd." },
+ { 0x14ED, "Shure Inc." },
+ { 0x14EE, "INFORAD Ltd." },
+ { 0x14EF, "AVICLink Corporation" },
+ { 0x14F0, "GE" },
+ { 0x14F1, "America Hears, LLC." },
+ { 0x14F2, "Axess AG" },
+ { 0x14F3, "BAP IMAGE SYSTEMS" },
+ { 0x14F4, "Accell Corporation" },
+ { 0x14F5, "SourceQuest, Inc." },
+ { 0x14F6, "Symbium Corporation" },
+ { 0x14F7, "TechniSat Digital GmbH" },
+ { 0x14F8, "Chenrol Electric Wire & Cable Co., Ltd." },
+ { 0x14F9, "Full Conductor Electric Appliance Manufacturer" },
+ { 0x14FA, "The Wild Divine Project" },
+ { 0x14FB, "JAI" },
+ { 0x14FC, "Signami LLC" },
+ { 0x14FD, "IPC Information Systems" },
+ { 0x14FE, "Madrics Media GmbH Europe" },
+ { 0x14FF, "Twinhead International Corp." },
+ { 0x1500, "Ellisys" },
+ { 0x1501, "Pine-Tum Enterprise Co., Ltd." },
+ { 0x1502, "Peavey Electronics" },
+ { 0x1503, "Stretch Inc." },
+ { 0x1504, "Bixolon Co., Ltd." },
+ { 0x1505, "Extraordinary Technologies Pty. Ltd.-Trading as Halcro" },
+ { 0x1506, "T.D. Technecon Ltd." },
+ { 0x1507, "APIM INFORMATIQUE" },
+ { 0x1508, "MAATEL" },
+ { 0x1509, "LI-COR Biosciences, Inc." },
+ { 0x150A, "TiVo Inc." },
+ { 0x150B, "COLLEX COMMUNICATION CORP." },
+ { 0x150C, "Brightwell Dispenses Ltd." },
+ { 0x150D, "PR Electronics A/S" },
+ { 0x150E, "Ono Sokki Co., Ltd." },
+ { 0x150F, "Nidec Nemicon Corporation" },
+ { 0x1510, "RACEWOOD TELECOM CO., LTD." },
+ { 0x1511, "BridgeCo, AG" },
+ { 0x1512, "Software Technologies Group, Inc." },
+ { 0x1513, "Hypercom" },
+ { 0x1514, "Microsemi, SOC Products Group" },
+ { 0x1515, "Hexon Media Pte Ltd" },
+ { 0x1516, "Skymedi Corporation" },
+ { 0x1517, "Precisa Instruments AG" },
+ { 0x1518, "Cheshire Engineering Corporation" },
+ { 0x1519, "Comneon GmbH Co., Ohg." },
+ { 0x151A, "RoyalTek Company Ltd." },
+ { 0x151B, "HOSTNET CO." },
+ { 0x151C, "VeriSilicon Holdings Co., Ltd." },
+ { 0x151D, "P W Allen & Co." },
+ { 0x151E, "Circad Design Ltd." },
+ { 0x151F, "Opal Kelly Incorporated" },
+ { 0x1520, "Bitwire Corp." },
+ { 0x1521, "S++ Simulation Services" },
+ { 0x1522, "Educational Insights" },
+ { 0x1523, "Hitachi High-Tech Science Corporation" },
+ { 0x1524, "SCIENTEX Inc." },
+ { 0x1525, "Newson Engineering NV" },
+ { 0x1526, "ARDUC Co., Ltd." },
+ { 0x1527, "iQue Ltd." },
+ { 0x1528, "HighAndes Limited" },
+ { 0x1529, "UBIQUAM CO., LTD." },
+ { 0x152A, "Thesycon Systemsoftware & Consulting GmbH" },
+ { 0x152B, "MIR-Medical International Research" },
+ { 0x152C, "titel++" },
+ { 0x152D, "JMicron Technology Corp." },
+ { 0x152E, "HLDS (Hitachi-LG Data Storage, Inc.)" },
+ { 0x152F, "PRO-MECH CORPORATION" },
+ { 0x1530, "Martsoft Corp." },
+ { 0x1531, "MICRODIA Ltd." },
+ { 0x1532, "Razer (Asia-Pacific) Pte Ltd." },
+ { 0x1533, "AEPTEC Microsystems, Inc." },
+ { 0x1534, "Advanced Research Corporation" },
+ { 0x1535, "Practical Engineering Incorporated" },
+ { 0x1536, "Neonode Technologies AB" },
+ { 0x1537, "Power Up Manufacturing" },
+ { 0x1538, "IES Elektronikentwicklung" },
+ { 0x1539, "AFG-Engineering GmbH" },
+ { 0x153A, "WMS Gaming Inc." },
+ { 0x153B, "ERCO Leuchten GmbH" },
+ { 0x153C, "Guger Technologies OEG" },
+ { 0x153D, "Adam Tech" },
+ { 0x153E, "abKey ptd ltd." },
+ { 0x153F, "UNIBRAIN S.A." },
+ { 0x1540, "Phihong Technology Co., Ltd." },
+ { 0x1541, "Better Light, Inc." },
+ { 0x1542, "Gemini Industries, Inc." },
+ { 0x1543, "Buxco Research Systems" },
+ { 0x1544, "Alphamosaic Ltd." },
+ { 0x1545, "Kistler Instrumente AG" },
+ { 0x1546, "u-blox AG" },
+ { 0x1547, "S. Goers IT-Solutions" },
+ { 0x1548, "Centrepoint Technologies" },
+ { 0x1549, "Beamex Oy Ab" },
+ { 0x154A, "ID Innovations Incorporated" },
+ { 0x154B, "PNY Technologies Inc." },
+ { 0x154C, "AutoXray Inc." },
+ { 0x154D, "Rapid Conn, Connect County Holdings Bhd" },
+ { 0x154E, "D & M Holdings, Inc." },
+ { 0x154F, "Shandong New Beiyang Information Technology Co., Ltd." },
+ { 0x1550, "Cardinal Health, Inc." },
+ { 0x1551, "SAIC/IISBU" },
+ { 0x1552, "DALLAB (M) SDN BHD (587734-A)" },
+ { 0x1553, "Raytheon Commercial Infrared" },
+ { 0x1554, "Prolink Microsystems Corporation" },
+ { 0x1555, "OWEN Ltd." },
+ { 0x1556, "CERN" },
+ { 0x1557, "OQO" },
+ { 0x1558, "Microbus Designs Ltd." },
+ { 0x1559, "The Toro Company" },
+ { 0x155A, "ELDAT GmbH" },
+ { 0x155B, "Shanghai Huahong Integrated Circuit Co., Ltd." },
+ { 0x155C, "Meyers Technology" },
+ { 0x155D, "National Rejectors, Inc. GmbH" },
+ { 0x155E, "DUPLO SEIKO CORPORATION" },
+ { 0x155F, "Cobra Electronics Corporation" },
+ { 0x1560, "Supra, A UTC Fire & Security Company" },
+ { 0x1561, "LaunchPadOffice Inc." },
+ { 0x1562, "Infowize Technologies Corporation" },
+ { 0x1563, "Micronet Corporation" },
+ { 0x1564, "Gizmondo Europe Ltd." },
+ { 0x1565, "Advance Modules" },
+ { 0x1566, "WIN ACCORD LTD." },
+ { 0x1567, "MUTOH Industries Ltd." },
+ { 0x1568, "Sunf Pu Technology (Dong-Guan) Co., Ltd." },
+ { 0x1569, "Mad City Labs, Inc." },
+ { 0x156A, "Logical Solutions, Inc." },
+ { 0x156B, "Cairn Research Ltd." },
+ { 0x156C, "Meade Instruments Corp." },
+ { 0x156D, "OMICRON electronics GmbH" },
+ { 0x156E, "MVox Electronics" },
+ { 0x156F, "Quantum Corporation" },
+ { 0x1570, "ALLTOP TECHNOLOGY CO., LTD." },
+ { 0x1571, "NIKON-TRIMBLE CO., LTD." },
+ { 0x1572, "Ricreations, Inc." },
+ { 0x1573, "Gradiente Eletronica S.A." },
+ { 0x1574, "HKW-Elektronik GmbH" },
+ { 0x1575, "Video Associates Labs, Inc." },
+ { 0x1576, "Maretron" },
+ { 0x1577, "MIYUKI ELEX CO., LTD." },
+ { 0x1578, "Beijing Huaqi Information Digital Technology Co., Ltd." },
+ { 0x1579, "Reputed Industrial Company Limited" },
+ { 0x157A, "Lowrance Electronics, Inc." },
+ { 0x157B, "Ketron SRL" },
+ { 0x157C, "Eurosoft (UK) Ltd." },
+ { 0x157D, "Tokyo Sokuteikizai Co., Ltd." },
+ { 0x157E, "U-MEDIA Communications, Inc." },
+ { 0x157F, "Levon Limited" },
+ { 0x1580, "Real Time Logic, Inc." },
+ { 0x1581, "IGB Communication Co., Ltd." },
+ { 0x1582, "Asia Pacifc Microsystems, Inc." },
+ { 0x1583, "EUCHNER GmbH & Co. KG" },
+ { 0x1584, "Prueftechnik AG" },
+ { 0x1585, "IKeyInfinity Inc." },
+ { 0x1586, "Palconn Technology Co., Ltd." },
+ { 0x1587, "SMA Solar Technology AG" },
+ { 0x1588, "Fine Instruments Corporation" },
+ { 0x1589, "Arcus Technology Inc." },
+ { 0x158A, "BOBE Industrie-Elektronik" },
+ { 0x158B, "Righttag Inc." },
+ { 0x158C, "LINFOS CO., LTD." },
+ { 0x158D, "Oakley Inc." },
+ { 0x158E, "Acterna Germany GmbH" },
+ { 0x158F, "Tai Yip Electrical Co., Ltd." },
+ { 0x1590, "Onsu Data Telecommunication Technology (Shenzhen) Fty." },
+ { 0x1591, "Advanced Product Design & Mfg. Inc." },
+ { 0x1592, "Tokyo Drawing Ltd." },
+ { 0x1593, "Vector International bvba" },
+ { 0x1594, "Lockheed Martin Missiles & Fire Control" },
+ { 0x1595, "Flexiworld Technologies, Inc." },
+ { 0x1596, "Kilodyne LLC" },
+ { 0x1597, "KCodes Corporation" },
+ { 0x1598, "Kunshan Guoji Electronics Co., Ltd." },
+ { 0x1599, "ANRITSU METER CO., LTD." },
+ { 0x159A, "SkuTek Instrumentation" },
+ { 0x159B, "Zitte Corporation" },
+ { 0x159C, "Binary Acoustic Technology" },
+ { 0x159D, "Boone Cable Works & Electronics" },
+ { 0x159E, "SmartSwing, Inc." },
+ { 0x159F, "Beijer Electronics AB" },
+ { 0x15A0, "Zarlink Semiconductor" },
+ { 0x15A1, "Nicety Technologies Inc." },
+ { 0x15A2, "Freescale Semiconductor, Inc." },
+ { 0x15A3, "Larson Davis, Inc." },
+ { 0x15A4, "Afa Technologies, Inc." },
+ { 0x15A5, "CIT Engineering NV" },
+ { 0x15A6, "Unicos Corporation" },
+ { 0x15A7, "APPSware Wireless LLC dba Apriva" },
+ { 0x15A8, "Shen Zhen Teamspower Electronics Co., Ltd." },
+ { 0x15A9, "Gemtek Technology Co., Ltd." },
+ { 0x15AA, "GuangDong Ya Lian Technology Co., Ltd" },
+ { 0x15AB, "Virgin HealthMiles, Inc." },
+ { 0x15AC, "Smartware" },
+ { 0x15AD, "Bleile Datentechnik GmbH" },
+ { 0x15AE, "KAYSER-THREDE GMBH" },
+ { 0x15AF, "Jenaer Antriebstechnik GmbH" },
+ { 0x15B0, "Pacific Instruments, Inc." },
+ { 0x15B1, "MiTAC Technology Corporation" },
+ { 0x15B2, "Audio Dev AB" },
+ { 0x15B3, "GL Sciences Inc." },
+ { 0x15B4, "Orient Power Multimedia Ltd." },
+ { 0x15B5, "ANUBIS ELECTRONIC GmbH" },
+ { 0x15B6, "Dialog Semiconductor GmbH" },
+ { 0x15B7, "Hyper Stimulator International Pty Ltd." },
+ { 0x15B8, "Serome Electronics, Inc." },
+ { 0x15B9, "USD Corporation" },
+ { 0x15BA, "Olimex Ltd." },
+ { 0x15BB, "CopyPro , Inc." },
+ { 0x15BC, "Daktronics Inc." },
+ { 0x15BD, "Sigmaelectronics Co., Ltd." },
+ { 0x15BE, "EssNet Interactive AB" },
+ { 0x15BF, "ESA, Inc." },
+ { 0x15C0, "CJM" },
+ { 0x15C1, "Amirix Systems Inc." },
+ { 0x15C2, "SoundGraph, Inc." },
+ { 0x15C3, "m.u.t - GmbH" },
+ { 0x15C4, "Global Marketing Alliance, Inc." },
+ { 0x15C5, "Pressure Profile Systems, Inc." },
+ { 0x15C6, "Laboratoires MXM" },
+ { 0x15C7, "IRI-Ubiteq, Inc." },
+ { 0x15C8, "KTF Technologies" },
+ { 0x15C9, "D-Box Technologies" },
+ { 0x15CA, "TEXTECH INTERNATIONAL LTD." },
+ { 0x15CB, "Activis Polska" },
+ { 0x15CC, "GL Communications Inc." },
+ { 0x15CD, "DeFelsko Corporation" },
+ { 0x15CE, "Oriental R&D Co., Ltd." },
+ { 0x15CF, "AVTOR Ltd.." },
+ { 0x15D0, "AIRSTAR Inc." },
+ { 0x15D1, "Hokuyo Automatic Co., Ltd." },
+ { 0x15D2, "REA Elektronik GmbH" },
+ { 0x15D3, "Symmetric Research" },
+ { 0x15D4, "Opinionmeter International, Ltd." },
+ { 0x15D5, "Coulomb Electronics Ltd." },
+ { 0x15D6, "Fitness Expert" },
+ { 0x15D7, "amaxa GmbH" },
+ { 0x15D8, "Grundig Business Systems GmbH" },
+ { 0x15D9, "Apexone Microelectronics Inc." },
+ { 0x15DA, "Cooper - Atkins Corporation" },
+ { 0x15DB, "Philip Harris Education" },
+ { 0x15DC, "Hynix Semiconductor Inc." },
+ { 0x15DD, "Axona Limited" },
+ { 0x15DE, "Spatial Freedom, Inc." },
+ { 0x15DF, "Helmut Fischer GmbH + Co. KG" },
+ { 0x15E0, "Seong Ji Industrial Co., Ltd." },
+ { 0x15E1, "RSA Security Inc." },
+ { 0x15E2, "Bionopoly LLC" },
+ { 0x15E3, "NEURICAM SPA" },
+ { 0x15E4, "Numark Industries" },
+ { 0x15E5, "Micro Systems Inc." },
+ { 0x15E6, "Turnkey Ltd." },
+ { 0x15E7, "Media Systems Ltd." },
+ { 0x15E8, "Micro Tools Inc." },
+ { 0x15E9, "Pacific Digital Corp." },
+ { 0x15EA, "C-guys Inc." },
+ { 0x15EB, "VIA Telecom" },
+ { 0x15EC, "Belcarra Technologies Corp." },
+ { 0x15ED, "UCA Technology Inc." },
+ { 0x15EE, "Quorum Communications, Inc." },
+ { 0x15EF, "MSilicon Electronics, Inc." },
+ { 0x15F0, "Technex Lab Co., Ltd." },
+ { 0x15F1, "Mortara Instrument, Inc." },
+ { 0x15F2, "Chyron Corp." },
+ { 0x15F3, "AquaCube Inc." },
+ { 0x15F4, "Computer & Entertainment, Inc." },
+ { 0x15F5, "Mobitek Communication Corp." },
+ { 0x15F6, "ASICS World Services Ltd." },
+ { 0x15F7, "HANTEL CO., LTD." },
+ { 0x15F8, "Vianet, Inc." },
+ { 0x15F9, "SunCorp Industrial Limited" },
+ { 0x15FA, "Department of Defense" },
+ { 0x15FB, "R-Quest Technologies , LLC" },
+ { 0x15FC, "Humen Xintai Electrical Wires Factory" },
+ { 0x15FD, "XEMAX Co., Ltd." },
+ { 0x15FE, "Bio-Rad Laboratories Deeside" },
+ { 0x15FF, "Heartsine Technologies Ltd." },
+ { 0x1600, "Monisys Limited" },
+ { 0x1601, "Avenues in Leather" },
+ { 0x1602, "CompUSA Inc." },
+ { 0x1603, "ERGODEX Corp." },
+ { 0x1604, "Kyokko Seiko Co., Ltd." },
+ { 0x1605, "Acces I/O Products, Inc." },
+ { 0x1606, "UMAX Data Systems Inc." },
+ { 0x1607, "ESE Corporate" },
+ { 0x1608, "Inside Out Networks, a division of Digi International" },
+ { 0x1609, "K-byte (ACI Group)" },
+ { 0x160A, "VIA Networking Technologies, Inc." },
+ { 0x160B, "CSI Wireless Inc." },
+ { 0x160C, "Shanghai Tiananxin Information & Tech., Co., Ltd." },
+ { 0x160D, "Samtec" },
+ { 0x160E, "INRO Consultants Inc." },
+ { 0x160F, "Strand Lighting Limited" },
+ { 0x1610, "Q-Sense AB" },
+ { 0x1611, "Vita-Mix Corporation" },
+ { 0x1612, "Soft DB Inc." },
+ { 0x1613, "Airconnect Solutions (Asia) Ltd." },
+ { 0x1614, "Amoi Electronics Co., Ltd." },
+ { 0x1615, "Rock Data Services Ltd." },
+ { 0x1616, "Cute Mobile Corp." },
+ { 0x1617, "Navman" },
+ { 0x1618, "Redpine Signals, Inc." },
+ { 0x1619, "L & K Precision Technology Co., Ltd." },
+ { 0x161A, "Celeraise Investments Ltd." },
+ { 0x161B, "MYCOM, INC." },
+ { 0x161C, "DigiTech Systems Co., Ltd." },
+ { 0x161D, "Delfin Technologies Ltd." },
+ { 0x161E, "Aerotech Inc." },
+ { 0x161F, "Prosisa International LLC" },
+ { 0x1620, "Accesstek Inc." },
+ { 0x1621, "Wionics Research" },
+ { 0x1622, "California Instruments" },
+ { 0x1623, "Mindtech Limited" },
+ { 0x1624, "AIOI Systems, USA Corp." },
+ { 0x1625, "ViaSat UK" },
+ { 0x1626, "Advance Data Technology Corporation" },
+ { 0x1627, "IPextreme, Inc." },
+ { 0x1628, "Stonestreet One, Inc." },
+ { 0x1629, "Erae Electronics" },
+ { 0x162A, "Airgo Networks Inc." },
+ { 0x162B, "Acksys" },
+ { 0x162C, "Ecler Laboratorio de Electroacustica S.A." },
+ { 0x162D, "Control Instruments Development (Pty) Ltd." },
+ { 0x162E, "Joytech Europe Ltd." },
+ { 0x162F, "WiQuest Communications, Inc." },
+ { 0x1630, "QformX" },
+ { 0x1631, "Focus Enhancements" },
+ { 0x1632, "Data Ray Inc." },
+ { 0x1633, "AIM GmbH" },
+ { 0x1634, "ABB Switzerland Ltd." },
+ { 0x1635, "Doble Engineering Co." },
+ { 0x1636, "Kobe-Addtech Co., Ltd." },
+ { 0x1637, "LZAE LUMEL SA" },
+ { 0x1638, "Skyworks Solutions" },
+ { 0x1639, "BeRiver Electronics Co., Ltd." },
+ { 0x163A, "Traficon N.V." },
+ { 0x163B, "Controlled Speed Engineering Ltd." },
+ { 0x163C, "Watchdata System Co., Ltd." },
+ { 0x163D, "Million Tech Dev. Ltd." },
+ { 0x163E, "Dezhou HongJu Communication Technology Co., Ltd." },
+ { 0x163F, "AVEX Technologies, Inc." },
+ { 0x1640, "M3 Electronics, Inc." },
+ { 0x1641, "eMagin Corporation" },
+ { 0x1642, "AquaSensors LLC" },
+ { 0x1643, "Sanwa Newtec Co., Ltd." },
+ { 0x1644, "Active Technologies SRL" },
+ { 0x1645, "Smiths Heimann Biometrics GmbH" },
+ { 0x1646, "Altronic, Inc." },
+ { 0x1647, "Horizon Navigation, Inc." },
+ { 0x1648, "Wood Head Software & Electronics" },
+ { 0x1649, "Softec Microsystems" },
+ { 0x164A, "ChipX" },
+ { 0x164B, "Lytech Technology Inc." },
+ { 0x164C, "Matrix Vision GmbH" },
+ { 0x164D, "DASAN Networks, Inc." },
+ { 0x164E, "Picotest Corp." },
+ { 0x164F, "Kinkei System Co., Ltd." },
+ { 0x1650, "Remopro Technology Inc." },
+ { 0x1651, "PACOMP" },
+ { 0x1652, "EFull Tech. Corp. Ltd." },
+ { 0x1653, "Nissho Electronics Co., Ltd." },
+ { 0x1654, "Stamer Musikanlagen GmbH" },
+ { 0x1655, "Dtron Co., Ltd." },
+ { 0x1656, "QSC Audio Products, Inc." },
+ { 0x1657, "Struck Innovative Systeme GmbH" },
+ { 0x1658, "Grayhill Inc." },
+ { 0x1659, "Lathem Time Corp." },
+ { 0x165A, "E.D.P. SRL" },
+ { 0x165B, "Frontier Design Group" },
+ { 0x165C, "Kondo Kagaku Co., Ltd." },
+ { 0x165D, "Orange Tree Technologies Ltd." },
+ { 0x165E, "Pangolin" },
+ { 0x165F, "Ansync Inc." },
+ { 0x1660, "Creatix Polymedia GmbH" },
+ { 0x1661, "DVS Korea Co., Ltd." },
+ { 0x1662, "Positivo Informatica LTDA" },
+ { 0x1663, "Sercel, Inc." },
+ { 0x1664, "ARGOX INFORMATION CO., LTD." },
+ { 0x1665, "General Dynamics Canada" },
+ { 0x1666, "Vanguard Instruments Co., Inc." },
+ { 0x1667, "GIGA-TMS, INC." },
+ { 0x1668, "Actiontec Electronics, Inc." },
+ { 0x1669, "PiKRON s.r.o." },
+ { 0x166A, "Clipsal Integrated Systems" },
+ { 0x166B, "PedalPax Corporation" },
+ { 0x166C, "Technology Driven Solutions Ltd" },
+ { 0x166D, "MCS Logic Inc." },
+ { 0x166E, "SerComm Corporation" },
+ { 0x166F, "Idetech Europe S.A." },
+ { 0x1670, "Hach Company" },
+ { 0x1671, "Telular Corporation" },
+ { 0x1672, "MBS GmbH" },
+ { 0x1673, "ROBOTIKER" },
+ { 0x1674, "Pantone, Inc." },
+ { 0x1675, "SE-IR Corporation" },
+ { 0x1676, "I-Ware Laboratory Co., Ltd." },
+ { 0x1677, "China Integrated Circuit Design Corp., Ltd." },
+ { 0x1678, "Matsunichi Information Technology (Shenzhen) Co., Ltd." },
+ { 0x1679, "Total Phase" },
+ { 0x167A, "USBWARE" },
+ { 0x167B, "Pure Digital Technologies" },
+ { 0x167C, "Vionics" },
+ { 0x167D, "SIM Security & Electronic System GmbH" },
+ { 0x167E, "Videa Technology Inc." },
+ { 0x167F, "Actigraph, LLC" },
+ { 0x1680, "KaVo Dental GmbH" },
+ { 0x1681, "Prevo Technologies, Inc." },
+ { 0x1682, "Maxwise Production Enterprise Ltd." },
+ { 0x1683, "DualCor Technologies, Inc." },
+ { 0x1684, "Godspeed Computer Corp." },
+ { 0x1685, "Tanic Electroics Ltd." },
+ { 0x1686, "ZOOM Corporation" },
+ { 0x1687, "Kingmax Digital Inc." },
+ { 0x1688, "AerotechTelub AB" },
+ { 0x1689, "Griffin International Companies, Inc." },
+ { 0x168A, "Veeco Instruments" },
+ { 0x168B, "BTC Secu Co., Ltd." },
+ { 0x168C, "Tabor Electroics Ltd." },
+ { 0x168D, "YSI, Inc." },
+ { 0x168E, "iMetrikus Inc." },
+ { 0x168F, "ETA S.A. Manufacture Horlogere Suisse" },
+ { 0x1690, "Simple Solutions" },
+ { 0x1691, "Landers Instruments" },
+ { 0x1692, "Weatherford" },
+ { 0x1693, "Zultys Technologies" },
+ { 0x1694, "Cassidian Communications" },
+ { 0x1695, "FATAR, S.r.l." },
+ { 0x1696, "Hitachi Advanced Digital, Inc." },
+ { 0x1697, "VTEC TEST, INC." },
+ { 0x1698, "Eurosmart" },
+ { 0x1699, "United RadioTek Inc." },
+ { 0x169A, "Ten X Technology Inc." },
+ { 0x169B, "aitronic GmbH" },
+ { 0x169C, "DMS" },
+ { 0x169E, "Groupics.com, Inc." },
+ { 0x169F, "Monolith Inc." },
+ { 0x16A0, "Real Thoughts GmbH" },
+ { 0x16A1, "Trilithic, Inc." },
+ { 0x16A2, "Sypris Test and Measurement (FW Bell)" },
+ { 0x16A3, "B & W Tek Inc." },
+ { 0x16A4, "Sagutech Microsystems" },
+ { 0x16A5, "Shenzhen Zhengerya Technology Co., Ltd." },
+ { 0x16A6, "UNIGRAF OY" },
+ { 0x16A7, "Sauer-Danfoss" },
+ { 0x16A8, "Nice Systems" },
+ { 0x16A9, "Worth-Pfaff Innovations, Inc." },
+ { 0x16AA, "Symtx Inc." },
+ { 0x16AB, "InnoWireless Co. Ltd." },
+ { 0x16AC, "Dongguan ChingLung Wire & Cable Co., Ltd." },
+ { 0x16AD, "Siemens VDO Trading GmbH" },
+ { 0x16AE, "ELSA Japan Inc." },
+ { 0x16AF, "Intelligent Mechatronic Systems" },
+ { 0x16B0, "Infosight Corp." },
+ { 0x16B1, "Cami Research Inc." },
+ { 0x16B2, "Bruxton Corporation" },
+ { 0x16B3, "Eizoken Inc." },
+ { 0x16B4, "Digital Cube" },
+ { 0x16B5, "PerSen Technologies, Inc." },
+ { 0x16B6, "Nexus Technology Inc." },
+ { 0x16B7, "Pulsafeeder Inc." },
+ { 0x16B8, "Honeywell Life Safety" },
+ { 0x16B9, "Origin Technologies Limited" },
+ { 0x16BA, "SmarTec" },
+ { 0x16BB, "Tomra Systems ASA" },
+ { 0x16BC, "JOBO AG" },
+ { 0x16BD, "Leica Geosystems AG" },
+ { 0x16BE, "RyuSyo Industrial Co., Ltd." },
+ { 0x16BF, "CAST, INC." },
+ { 0x16C0, "Van Ooijen Technische Informatica" },
+ { 0x16C1, "Lucas-Nuelle GmbH" },
+ { 0x16C2, "Amphenol-Data Telecom" },
+ { 0x16C3, "Nihon Kaiheiki Ind. Co., Ltd." },
+ { 0x16C4, "SavaJe Technologies, Inc." },
+ { 0x16C5, "Cryptek Inc." },
+ { 0x16C6, "NDS Surgical Imaging, LLC" },
+ { 0x16C7, "Crystal Technology, Inc." },
+ { 0x16C8, "Technische Universiteit Eindhoven" },
+ { 0x16C9, "OCT Co., Ltd." },
+ { 0x16CA, "Wireless Cables Inc." },
+ { 0x16CB, "Highwater Designs Limited" },
+ { 0x16CC, "silex technology, Inc." },
+ { 0x16CD, "Brian Moore Guitars, Inc." },
+ { 0x16CE, "IPFlex Inc." },
+ { 0x16CF, "YAZAKI PARTS CO., LTD." },
+ { 0x16D1, "SUPREMA, INC." },
+ { 0x16D2, "TOMEY" },
+ { 0x16D3, "Frontline Test Equipment, Inc." },
+ { 0x16D4, "SRTechnologies" },
+ { 0x16D5, "AnyDATA Corporation" },
+ { 0x16D6, "Jablotron" },
+ { 0x16D7, "Aprilis, Inc." },
+ { 0x16D8, "CMOTECH CO., LTD." },
+ { 0x16D9, "A7 Engineering, Inc." },
+ { 0x16DA, "Linkam Scientific Instruments Ltd." },
+ { 0x16DB, "Eridon Corporation" },
+ { 0x16DC, "W-IE-NE-R, Plein & Baus GmbH" },
+ { 0x16DD, "YOSHIDA SEIKI CO., LTD." },
+ { 0x16DE, "Schneider Electric" },
+ { 0x16DF, "King Billion Electronics Co., Ltd." },
+ { 0x16E0, "Lumex Ltd." },
+ { 0x16E1, "Bed Check Corporation" },
+ { 0x16E2, "Hitachi I E Systems Co., Ltd." },
+ { 0x16E3, "ITM Inc." },
+ { 0x16E4, "Franklin Electric Co., Inc." },
+ { 0x16E5, "TOKYO KEIKI RAIL TECHNO INC." },
+ { 0x16E6, "Diginfo Technology Corporation" },
+ { 0x16E7, "United Keys, Inc." },
+ { 0x16E8, "Frontier Information Enterprise, Inc." },
+ { 0x16E9, "Dr. Gal Ben-David" },
+ { 0x16EA, "Avionica, Inc." },
+ { 0x16EB, "Helvar" },
+ { 0x16EC, "ASAHI GLASS CO., LTD." },
+ { 0x16ED, "Parker Vision Inc." },
+ { 0x16EE, "Ryvor Corp." },
+ { 0x16EF, "Global Safety & Security Solutions OY" },
+ { 0x16F0, "GN ReSound" },
+ { 0x16F1, "Versus Technology, Inc." },
+ { 0x16F2, "St. Jude Medical AB" },
+ { 0x16F3, "Hammer Storage/Bell Microproducts" },
+ { 0x16F4, "Lineeye Co., Ltd." },
+ { 0x16F5, "Futurelogic Inc." },
+ { 0x16F6, "Shin Tek Inc." },
+ { 0x16F7, "Japan Gals Co., Ltd." },
+ { 0x16F8, "Ever Bright Wire Factory" },
+ { 0x16F9, "Astrosys International Limited" },
+ { 0x16FA, "Shachihata Inc." },
+ { 0x16FB, "MICRONIX CORPORATION" },
+ { 0x16FC, "TRICOM TECHNOLOGIES, INC." },
+ { 0x16FD, "Reakin Technology Corporation" },
+ { 0x16FE, "Su Zhou Song Qing Electronical Co., Ltd." },
+ { 0x16FF, "Ultimate Technology Corp." },
+ { 0x1700, "Hunt Engineering (UK) Ltd." },
+ { 0x1701, "Peyroutet Telecom" },
+ { 0x1702, "Softcare Ltd." },
+ { 0x1703, "NormSoft, Inc." },
+ { 0x1704, "ANIMATICS CORP." },
+ { 0x1705, "Aerosonic Corporation" },
+ { 0x1706, "BlueView Technologies, Inc." },
+ { 0x1707, "ARTIMI" },
+ { 0x1708, "Mibudenki Industrial Co., Ltd." },
+ { 0x1709, "Sanmina-SCI" },
+ { 0x170A, "MAXTEK, INC." },
+ { 0x170B, "Phonic Corp." },
+ { 0x170C, "BlueTree Wireless Data" },
+ { 0x170D, "Avnera" },
+ { 0x170E, "Iris Corporation Berhad" },
+ { 0x170F, "UbiBro Technolgies Inc." },
+ { 0x1710, "AZIO Corporation" },
+ { 0x1711, "Leica Microsystems CMS GmbH" },
+ { 0x1712, "Fujitsu LSI Technology Ltd." },
+ { 0x1713, "Enter Tech Co., Ltd" },
+ { 0x1714, "iCRco" },
+ { 0x1715, "NL Technology" },
+ { 0x1716, "LHR Technologies" },
+ { 0x1717, "Formats Unlimited, Inc." },
+ { 0x1718, "Mobile Doctor Co., Ltd." },
+ { 0x1719, "American Technology Corp." },
+ { 0x171A, "PSi Printer Systems international GmbH" },
+ { 0x171B, "NT Ware Systemprogrammierung GmbH" },
+ { 0x171C, "IER" },
+ { 0x171E, "PACIFIC CORPORATION" },
+ { 0x171F, "CHIPNUTS TECHNOLOGY INC." },
+ { 0x1720, "Innova Electronics Corp." },
+ { 0x1721, "ELAD SRL" },
+ { 0x1722, "Axicon Auto ID LTD" },
+ { 0x1723, "Datatronics Technology, Inc" },
+ { 0x1724, "Lumenera Corporation" },
+ { 0x1725, "HI-TECH Software" },
+ { 0x1726, "Axesstel, Inc." },
+ { 0x1727, "RiCHIP Incorporated" },
+ { 0x1728, "BYTE TOOLS INC." },
+ { 0x1729, "CONSULTRONICS EUROPE LTD." },
+ { 0x172A, "wenglor sensoric gmbh" },
+ { 0x172B, "CompuSoft A/S" },
+ { 0x172C, "Silicon Optix" },
+ { 0x172D, "AccFast Technology Corp." },
+ { 0x172E, "ELECTION SYSTEMS & Software" },
+ { 0x172F, "WALTOP International Corporation" },
+ { 0x1730, "MERCURY" },
+ { 0x1731, "DATA DISPLAY AG" },
+ { 0x1732, "NETENRICH INC." },
+ { 0x1733, "NUBYTECH INC." },
+ { 0x1734, "IPdrum AB" },
+ { 0x1735, "Satloc LLC (CSI Wireless)" },
+ { 0x1736, "CANON IMAGING SYSTEMS INC." },
+ { 0x1737, "Hong Kong Applied Science and Technology Research Inst." },
+ { 0x1738, "Asicen Technology Corp." },
+ { 0x1739, "Radiant Technologies Inc." },
+ { 0x173A, "F. Hoffmann-La Roche AG" },
+ { 0x173B, "Cadillac Jack Inc." },
+ { 0x173C, "Signalcraft Technologies Inc." },
+ { 0x173D, "Great Pleasure Electronics Co. LTD." },
+ { 0x173E, "Devlin Electronics Ltd." },
+ { 0x173F, "Peyer Engineering" },
+ { 0x1740, "Senao International Co., Ltd." },
+ { 0x1741, "Techino Science Co., Ltd." },
+ { 0x1742, "Nippon Chemi-Con Corp." },
+ { 0x1743, "General Atomics" },
+ { 0x1744, "Sanwa Electronic Instrument Co. Ltd." },
+ { 0x1745, "Video Simplex, Inc." },
+ { 0x1746, "Edge Products" },
+ { 0x1747, "CML MICROCIRCUITS (UK) LTD" },
+ { 0x1748, "MQP Electronics Ltd." },
+ { 0x1749, "MAGO MOBILE LTD" },
+ { 0x174A, "Endress + Hauser" },
+ { 0x174B, "BARACODA" },
+ { 0x174C, "ASMedia Technology Inc." },
+ { 0x174D, "Broadcast System & Design ApS" },
+ { 0x174E, "Xi'an Tongshi Data Co., Ltd." },
+ { 0x174F, "D-MAX Technology Co., Ltd." },
+ { 0x1750, "Hirschmann Automation and Control GmbH" },
+ { 0x1751, "EMPIRISOFT CORPORATION" },
+ { 0x1752, "Liyitec Incorporated" },
+ { 0x1753, "Tecvan Informatica LTDA" },
+ { 0x1754, "GERSTEL GmbH & Co. KG" },
+ { 0x1755, "Electronics and Telecommunication Research Institute" },
+ { 0x1756, "ENENSYS Technologies" },
+ { 0x1757, "ST-MICHAEL STRATEGIES" },
+ { 0x1758, "FUTURECOM SYSTEMS GROUP INC." },
+ { 0x1759, "LucidPort Technology, Inc." },
+ { 0x175A, "Lantronix" },
+ { 0x175B, "Dongguan Init Technology Co., Ltd." },
+ { 0x175C, "Isolcell Italia SpA" },
+ { 0x175D, "Caterpillar Inc." },
+ { 0x175E, "AT KidSystems Inc." },
+ { 0x175F, "I-BIT Corporation" },
+ { 0x1760, "RAYLASE AG" },
+ { 0x1761, "RC GROUP (Holdings) Limited" },
+ { 0x1763, "USAF" },
+ { 0x1764, "KANOMAX JAPAN INC." },
+ { 0x1765, "VK Corporation" },
+ { 0x1766, "Hip Interactive Inc." },
+ { 0x1767, "KIS Photo Mc Group" },
+ { 0x1769, "ARTEK Inc." },
+ { 0x176A, "GLOBALSAT TECHNOLOGY CORPORATION" },
+ { 0x176B, "ATOP ELECTRONICS CO., LTD." },
+ { 0x176C, "Advanced Electronic Designs" },
+ { 0x176D, "Mbridge Systems, Inc." },
+ { 0x176E, "UD electronic corp." },
+ { 0x176F, "Astralink Technology Pte Ltd" },
+ { 0x1770, "precisionWave Corporation" },
+ { 0x1771, "Shenzhen Alex Connector Co., Ltd." },
+ { 0x1772, "System Level Solutions, Inc." },
+ { 0x1773, "InSync Speech Technologies, Inc." },
+ { 0x1774, "Strawberry Linux Co., Ltd." },
+ { 0x1775, "RADAR-TRONIC KFT." },
+ { 0x1776, "HYPERLABS, Inc." },
+ { 0x1777, "Microscan Systems, Inc." },
+ { 0x1778, "PChome Online Inc." },
+ { 0x1779, "Optek Electronics Co., Ltd." },
+ { 0x177A, "Explore Semiconductor, Inc." },
+ { 0x177B, "Cetus Engineering" },
+ { 0x177C, "AD Information & Communications Co., Ltd" },
+ { 0x177D, "Delta Industrie Service" },
+ { 0x177E, "mils electronic GmbH & Co Kg" },
+ { 0x177F, "Sweex Europe B.V." },
+ { 0x1780, "TENDYRON CORPORATION" },
+ { 0x1781, "MECANIQUE" },
+ { 0x1782, "Spreadtrum Hong Kong Limited" },
+ { 0x1783, "Foster Flight, Inc." },
+ { 0x1784, "TopSeed Technology Corp." },
+ { 0x1785, "CARALLON LIMITED" },
+ { 0x1786, "Xeltek Inc." },
+ { 0x1787, "TRIDENT SYSTEMS, INC." },
+ { 0x1788, "ShenZhen Litkconn Technology Co., Ltd." },
+ { 0x1789, "Ascom (Schweiz) AG" },
+ { 0x178A, "Prentke Romich Company" },
+ { 0x178B, "Panduit Corp." },
+ { 0x178C, "URTEK TECHNOLOGIES INC." },
+ { 0x178D, "CEIVA Logic, Inc." },
+ { 0x178E, "Movimento Group AB" },
+ { 0x1790, "Ueda Japan Radio Co., Ltd." },
+ { 0x1791, "SYNTHETIC PLANNING INDUSTRY CO., LTD." },
+ { 0x1792, "LINK GmbH" },
+ { 0x1793, "Heim Systems GmbH" },
+ { 0x1794, "MA'AGALIM COMPUTER SYSTEMS Ltd." },
+ { 0x1795, "INTEGRATION ASSOCIATES INCORPORATED" },
+ { 0x1796, "Printrex, Inc." },
+ { 0x1797, "JALCO CO., LTD." },
+ { 0x1798, "TYPE TECHNOLOGY INC." },
+ { 0x1799, "Thales Norway AS" },
+ { 0x179A, "Conrad Electronic GmbH" },
+ { 0x179B, "HANDSFULL TECHNOLOGY CORP." },
+ { 0x179C, "Net-2Com Corporation" },
+ { 0x179D, "Ricavision International Inc." },
+ { 0x179E, "Silicon Engines" },
+ { 0x179F, "CLIQ LIMITED" },
+ { 0x17A0, "Samson Technologies Corp." },
+ { 0x17A1, "Taiwan Advanced Sensors Corporation" },
+ { 0x17A2, "Vantage Controls, Inc." },
+ { 0x17A3, "OnTime tek Inc." },
+ { 0x17A4, "Concept 2" },
+ { 0x17A5, "Advanced Connection Technology Inc." },
+ { 0x17A6, "Astron Clinica Ltd." },
+ { 0x17A7, "MICOMSOFT CO., LTD." },
+ { 0x17A8, "Kamstrup A/S" },
+ { 0x17A9, "MULTIMEDIA GAMES, INC." },
+ { 0x17AA, "SETEK Elektronik AB" },
+ { 0x17AB, "i-Bulldog Co., Ltd." },
+ { 0x17AC, "Dengen Automation Co., Ltd." },
+ { 0x17AD, "TRIOC AB" },
+ { 0x17AE, "NAD Electronics International/A Div. of Lenbrook Ind." },
+ { 0x17AF, "GIGABYTE Communications Inc." },
+ { 0x17B0, "Weinmann Geraete fuer Medizen GmbH+Co. KG" },
+ { 0x17B1, "ViaSat, Inc." },
+ { 0x17B2, "Metec GmbH" },
+ { 0x17B3, "Grey Innovation Pty., Ltd." },
+ { 0x17B4, "Apres Health & Fitness" },
+ { 0x17B5, "Lunatone Industrielle Elektronik GmbH" },
+ { 0x17B6, "Hydronix Limited" },
+ { 0x17B7, "Sinter Information Corp." },
+ { 0x17B8, "Trojan Technologies Private Limited" },
+ { 0x17B9, "Green Bit S.p.A." },
+ { 0x17BA, "Sauris GmbH" },
+ { 0x17BB, "Weihai Dongxing Electronics Co., Ltd." },
+ { 0x17BC, "Advanced Peripherals Technologies, Inc." },
+ { 0x17BD, "Citron Electronic Co., Ltd." },
+ { 0x17BE, "Dongguan Yangming Precision of Plastic Metal Elec Co Lt" },
+ { 0x17BF, "Ampere Inc." },
+ { 0x17C0, "ED Co., Ltd." },
+ { 0x17C1, "Sirius XM Radio" },
+ { 0x17C2, "Ingenient Technologies" },
+ { 0x17C3, "SGB Group Ltd." },
+ { 0x17C4, "VISIOWAVE SA" },
+ { 0x17C5, "Hantle System Co., Ltd." },
+ { 0x17C6, "Magnetox" },
+ { 0x17C7, "AIM Infrarot-Module GmbH" },
+ { 0x17C8, "Ringway Tech (JiangSu) Co., Ltd." },
+ { 0x17C9, "Andros Incorporated" },
+ { 0x17CA, "CyberPak Co." },
+ { 0x17CB, "CHINA HUAXU GOLDEN CARD CO., LTD." },
+ { 0x17CC, "Native Instruments Software Synthesis GmbH" },
+ { 0x17CD, "Basler Electric" },
+ { 0x17CE, "Keymile AG" },
+ { 0x17CF, "Hip Hing Cable & Plug Mfy. Ltd." },
+ { 0x17D0, "Sanford L.P." },
+ { 0x17D1, "ViDisys GmbH" },
+ { 0x17D2, "Radiometer Medical ApS" },
+ { 0x17D3, "Korea Techtron Co., Ltd." },
+ { 0x17D4, "Kenetics Innovations Pte. Ltd., Singapore" },
+ { 0x17D5, "ImageMap Inc." },
+ { 0x17D6, "Samsung Electronics Research Institute" },
+ { 0x17D7, "Copley Controls Corp." },
+ { 0x17D8, "Rapattoni Corporation" },
+ { 0x17D9, "Rasteme Systems Co., Ltd." },
+ { 0x17DA, "GEMIT GmbH" },
+ { 0x17DB, "CYNOVE" },
+ { 0x17DC, "Thermoteknix Systems Ltd." },
+ { 0x17DD, "Simply Automated, Incorporated" },
+ { 0x17DE, "Grant Instruments" },
+ { 0x17DF, "SOUTHWING" },
+ { 0x17E0, "Big Sky Laser" },
+ { 0x17E1, "ORTHOFIX" },
+ { 0x17E2, "PIKAONE" },
+ { 0x17E3, "Beck IPC GmbH" },
+ { 0x17E4, "OKB SAPR" },
+ { 0x17E5, "Memcorp Inc." },
+ { 0x17E6, "Quantel Medical" },
+ { 0x17E7, "Sirah Laser-und Plasmatechnik GmbH" },
+ { 0x17E8, "Visionee S.R.L." },
+ { 0x17E9, "DisplayLink (UK) Ltd." },
+ { 0x17EA, "Web Technology Corp" },
+ { 0x17EB, "Cornice, Inc." },
+ { 0x17EC, "Telsource" },
+ { 0x17ED, "Sumita Optical Glass, Inc." },
+ { 0x17EE, "Personal Media Corporation" },
+ { 0x17EF, "Lenovo" },
+ { 0x17F0, "Bestronic Industry Co., Ltd." },
+ { 0x17F1, "Microjet Technology Co., Ltd." },
+ { 0x17F2, "Xmultiple Technologies Inc." },
+ { 0x17F3, "Terascala, Inc." },
+ { 0x17F4, "AgaMatrix, Inc." },
+ { 0x17F5, "K.K. Rocky" },
+ { 0x17F6, "Unicomp, Inc" },
+ { 0x17F7, "Metroptic Technologies Ltd." },
+ { 0x17F8, "Enustech, Inc." },
+ { 0x17F9, "GIE Sesam-Vitale" },
+ { 0x17FA, "DOSHISHA CORPORATION" },
+ { 0x17FB, "Emutec Inc." },
+ { 0x17FC, "Vitesse Semiconductor Corp." },
+ { 0x17FD, "Formac GmbH" },
+ { 0x17FE, "NIPPON PULSE MOTOR CO., LTD." },
+ { 0x17FF, "Unication Co., Ltd" },
+ { 0x1800, "Shandong Yuanda Net & Multimedia Co., Ltd." },
+ { 0x1801, "Southern Data Comm, Inc." },
+ { 0x1802, "SYN-TEK Technologies Inc." },
+ { 0x1803, "Secutronix" },
+ { 0x1804, "Clemens GmbH" },
+ { 0x1805, "Digital Peripheral Solutions Inc." },
+ { 0x1806, "New Index AS" },
+ { 0x1807, "Par-Tech Inc." },
+ { 0x1808, "Multiplex Engineering Inc." },
+ { 0x1809, "Advantech Co., Ltd." },
+ { 0x180A, "Technosystem Co., Ltd." },
+ { 0x180B, "Photo Research, Inc." },
+ { 0x180C, "Power Digital Card Co., Ltd." },
+ { 0x180D, "U3, LLC" },
+ { 0x180E, "Audisoft Technologies" },
+ { 0x180F, "Phonak Communications AG" },
+ { 0x1810, "Wanshih Electronic Co., Ltd." },
+ { 0x1811, "Blackspot Interactive Ltd." },
+ { 0x1812, "GEWI GmbH" },
+ { 0x1813, "HAGIWARA ELECTRIC Co., Ltd." },
+ { 0x1814, "Fashionow Co. Ltd." },
+ { 0x1815, "Horizon Semiconductors Ltd." },
+ { 0x1816, "Directed Electronics" },
+ { 0x1817, "Digital Authentication Technologies, Inc." },
+ { 0x1818, "Osteosys Co., Ltd." },
+ { 0x1819, "Quality Vision International, Inc." },
+ { 0x181A, "Fotonation" },
+ { 0x181B, "Current Designs, Inc." },
+ { 0x181C, "Rensselaer Polytechnic Institute" },
+ { 0x181D, "Axon Systems Inc." },
+ { 0x181E, "Advanced Tracking Technologies, Inc." },
+ { 0x181F, "NAKAJIMA ALL Co., Ltd." },
+ { 0x1820, "DSM - Messtechnik GmbH" },
+ { 0x1821, "INwireless Co., Ltd" },
+ { 0x1822, "DIGIBIO TECHNOLOGY CORP." },
+ { 0x1823, "CelleBrite Mobile Synchronization" },
+ { 0x1824, "Aval Nagasaki Corp." },
+ { 0x1825, "Star-Dundee Ltd." },
+ { 0x1826, "Xitron Inc." },
+ { 0x1827, "Sanko Electronics Co., Ltd." },
+ { 0x1828, "TSR Silicon Resources, Inc." },
+ { 0x1829, "Dongguan YuQiu Electronics Co., Ltd." },
+ { 0x182A, "Signalion GmbH" },
+ { 0x182B, "Chest M.I., Incorporated" },
+ { 0x182C, "Caliper LifeSciences" },
+ { 0x182D, "Accutron Limited" },
+ { 0x182E, "System Instruments Co., Ltd." },
+ { 0x182F, "Worldwide Productions Inc." },
+ { 0x1830, "I CAP Technologies, Inc." },
+ { 0x1831, "Gwo Jinn Industries Co., Ltd." },
+ { 0x1832, "Huizhou Shenghua Industrial Co., Ltd." },
+ { 0x1833, "Genuine Technologies Co., Ltd." },
+ { 0x1834, "SONEL S.A." },
+ { 0x1835, "Lust Drivetronics GmbH" },
+ { 0x1836, "ePoint Technology" },
+ { 0x1837, "Hokuto Denko Corporation" },
+ { 0x1838, "Real Networks, Inc." },
+ { 0x1839, "AnexTEK Global Inc." },
+ { 0x183A, "Mediafour Corporation" },
+ { 0x183B, "SIDACON Systemtechnik GmbH" },
+ { 0x183C, "Saab AB" },
+ { 0x183D, "F3 Inc." },
+ { 0x183E, "Robonik India Pvt. Ltd." },
+ { 0x183F, "i-BEAD Co., Ltd." },
+ { 0x1840, "Cognitive Solutions, Inc." },
+ { 0x1841, "SEIKO TIME SYSTEM INC." },
+ { 0x1842, "Keen High Technologies (HK) Ltd." },
+ { 0x1843, "Vaisala" },
+ { 0x1844, "Radiotechnika Marketing Sp.zo.o" },
+ { 0x1845, "Cion Technology Corporation" },
+ { 0x1846, "microEngineering Labs, Inc." },
+ { 0x1847, "Global Payment Technologies, Inc." },
+ { 0x1848, "Eurochannels Holding B.V." },
+ { 0x1849, "Centurion Systems (Pty) Ltd." },
+ { 0x184A, "EB Neuro SPA" },
+ { 0x184B, "ARION Technology Inc." },
+ { 0x184C, "Centice" },
+ { 0x184D, "Dansk Automat Expert A/S" },
+ { 0x184E, "SyGade Solutions (Pty) Ltd." },
+ { 0x184F, "K2L GmbH" },
+ { 0x1850, "Andigilog, Inc." },
+ { 0x1851, "ULTRASONIC ENGINEERING CO., LTD." },
+ { 0x1852, "Galaxy Far East Corp" },
+ { 0x1853, "MITSUBISHI PRECISION CO., LTD." },
+ { 0x1854, "Memory Devices Ltd." },
+ { 0x1855, "Redpay Secure Payments" },
+ { 0x1856, "Imaginova" },
+ { 0x1857, "Picosecond Pulse Labs" },
+ { 0x1858, "CELLSYSTEM CO., LTD" },
+ { 0x1859, "Speech Technology Center, Ltd." },
+ { 0x185A, "WinProbe Corporation" },
+ { 0x185B, "IG-Development" },
+ { 0x185C, "Omnisec AG" },
+ { 0x185D, "Origgio Limited" },
+ { 0x185E, "Meritech Co., Ltd." },
+ { 0x185F, "Stinger Systems Inc." },
+ { 0x1860, "HYUPJIN I & C CO, LTD." },
+ { 0x1861, "Tech Technology Industrial Company" },
+ { 0x1862, "Teridian Semiconductor Corp." },
+ { 0x1863, "Wave Technology Co., Ltd." },
+ { 0x1864, "Digital Art System" },
+ { 0x1865, "Europlex Technologies" },
+ { 0x1866, "Union Community Co., Ltd." },
+ { 0x1867, "Control Microsystems" },
+ { 0x1868, "Index Braille AB" },
+ { 0x1869, "RTS Automation GmbH" },
+ { 0x186A, "Pivot International, Inc." },
+ { 0x186B, "Holophase Incorporated" },
+ { 0x186C, "Miyachi Corporation" },
+ { 0x186D, "Evermore Innovations" },
+ { 0x186E, "Reel Stream LLC" },
+ { 0x186F, "Motion Lingo, LLC" },
+ { 0x1870, "Nexio Co., Ltd." },
+ { 0x1871, "Aveo Technology Corp." },
+ { 0x1872, "Cobalt Technologies Co., Ltd." },
+ { 0x1873, "Etrovision Technology" },
+ { 0x1874, "Nexilion Inc." },
+ { 0x1875, "Humo Laboratory, Ltd." },
+ { 0x1876, "MG Industrieelektronik GmbH" },
+ { 0x1877, "SANEI HYTECHS Co., Ltd." },
+ { 0x1878, "Sumitomo Heavy Industries, Ltd." },
+ { 0x1879, "Spin Semiconductor Inc." },
+ { 0x187A, "Mediachorus Inc." },
+ { 0x187B, "Dent Instruments, Inc." },
+ { 0x187C, "Alienware Corporation" },
+ { 0x187D, "Ardware Ltd." },
+ { 0x187E, "Sentelic Corporation" },
+ { 0x187F, "Siano Mobile Silicon Ltd." },
+ { 0x1880, "Vericon Co., Ltd./Jinn Shyang Precision Industrial Co.," },
+ { 0x1881, "Interactive Learning Technologies" },
+ { 0x1882, "TransChip Israel Ltd." },
+ { 0x1883, "Tanaka S/S Ltd." },
+ { 0x1884, "Liyuh Technology Ltd." },
+ { 0x1885, "Ascalade Communications Inc." },
+ { 0x1886, "Metalink Ltd." },
+ { 0x1887, "Fishcamp Engineering" },
+ { 0x1888, "Livingston Products, Inc." },
+ { 0x1889, "DME Corporation" },
+ { 0x188A, "Moeller" },
+ { 0x188B, "Showa Electric Laboratory Co., Ltd." },
+ { 0x188C, "Epos Development Ltd." },
+ { 0x188D, "Across Techno, Inc." },
+ { 0x188E, "Neopost Technologies" },
+ { 0x188F, "Zefatek Co., Ltd." },
+ { 0x1890, "MEDIAN Inc." },
+ { 0x1891, "XSENSOR Technology Corp." },
+ { 0x1892, "Accuri Instruments, Inc." },
+ { 0x1893, "Ginga Software, Inc." },
+ { 0x1894, "SyntheSys Research, Inc." },
+ { 0x1895, "tesa scribos GmbH" },
+ { 0x1896, "Legacy Electronics, Inc." },
+ { 0x1897, "Evertop Wire Cable Co." },
+ { 0x1898, "Summit Microelectronics" },
+ { 0x1899, "Linkiss Co., Ltd." },
+ { 0x189A, "Earth Computer Technologies, Inc." },
+ { 0x189B, "Trimax Electronics Co., Ltd." },
+ { 0x189C, "Walletex Microelectronics Ltd." },
+ { 0x189D, "Navionics Inc." },
+ { 0x189E, "Net Insight AB" },
+ { 0x189F, "3Shape A/S" },
+ { 0x18A0, "Kongsberg Maritime AS" },
+ { 0x18A1, "Ionwerks, Inc." },
+ { 0x18A2, "PSIA Corp." },
+ { 0x18A3, "DIGIFRIENDS CO., LTD." },
+ { 0x18A4, "CSSN, Inc. dba Card Scanning Solutions" },
+ { 0x18A5, "Verbatim Americas LLC" },
+ { 0x18A6, "Peripheral Dynamics Inc." },
+ { 0x18A7, "Omniprint Inc." },
+ { 0x18A8, "Smiths Medical MD" },
+ { 0x18A9, "Veri-Tek International" },
+ { 0x18AA, "MedRx Inc." },
+ { 0x18AB, "Applied Data Systems, Inc." },
+ { 0x18AC, "STRATEC Biomedical Systems AG" },
+ { 0x18AD, "Invisible Technologies, Inc." },
+ { 0x18AE, "MTT Corporation" },
+ { 0x18AF, "LN Systems Limited" },
+ { 0x18B0, "Mikrodidakt AB" },
+ { 0x18B1, "Elmak Ltd." },
+ { 0x18B2, "CINTEL FRANCE" },
+ { 0x18B3, "RAYDON Corporation" },
+ { 0x18B4, "e3C Inc." },
+ { 0x18B5, "Klipsch Audio" },
+ { 0x18B6, "Mikkon Technology Limited" },
+ { 0x18B7, "Zotek Electronic Co., Ltd." },
+ { 0x18B8, "Securewave SA" },
+ { 0x18B9, "Clixxun GmbH" },
+ { 0x18BA, "Bell Fruit Games" },
+ { 0x18BB, "G7 Productivity Systems" },
+ { 0x18BC, "Muro Co., Ltd" },
+ { 0x18BD, "MNBT Co., Ltd." },
+ { 0x18BE, "Kingfisher International" },
+ { 0x18BF, "Ensyc Technologies" },
+ { 0x18C0, "Gatekeeper Systems Inc." },
+ { 0x18C1, "Shenzhen SDMC Microelectronics Co., Ltd." },
+ { 0x18C2, "AccuSport International, Inc." },
+ { 0x18C3, "Elite Semiconductor Memory Technology Inc. (ESMT)" },
+ { 0x18C4, "ServerEngines LLC" },
+ { 0x18C5, "Corega Taiwan, Inc." },
+ { 0x18C6, "Aurora Photonics" },
+ { 0x18C7, "Nagano Tectron Co., Ltd" },
+ { 0x18C8, "Computerprox Corp." },
+ { 0x18C9, "Exfo Electro-Optical Engineering Inc." },
+ { 0x18CA, "Canon Korea Business Solutions Inc." },
+ { 0x18CB, "Fr. Sauter AG" },
+ { 0x18CC, "Osaki Electric Co., Ltd." },
+ { 0x18CD, "Pico Instruments LLC" },
+ { 0x18CE, "DTC Communications, Inc" },
+ { 0x18CF, "Tung Shu Mei Industrial Co., Ltd." },
+ { 0x18D0, "Uniform Industrial Corp." },
+ { 0x18D1, "Google Inc." },
+ { 0x18D2, "Raptor Gaming Technology GmbH" },
+ { 0x18D3, "L&V Design" },
+ { 0x18D4, "ABI Electronics Ltd." },
+ { 0x18D5, "Starline International Group Limited" },
+ { 0x18D6, "Ruetz Technologies" },
+ { 0x18D7, "New Scale Technologies" },
+ { 0x18D8, "Individual Computers" },
+ { 0x18D9, "Kaba" },
+ { 0x18DA, "Phonol Inc." },
+ { 0x18DB, "Compix Incorporated" },
+ { 0x18DC, "LKC Technologies, Inc." },
+ { 0x18DD, "Docuport WC" },
+ { 0x18DE, "Cyto Pulse Sciences, Inc" },
+ { 0x18DF, "Cinea Inc." },
+ { 0x18E0, "Source Technologies, LLC" },
+ { 0x18E1, "Drew Technologies Inc." },
+ { 0x18E2, "S.J. Electronics Co., Ltd" },
+ { 0x18E3, "Fitilink Integrated Technology, Inc." },
+ { 0x18E4, "SB Solutions, Inc" },
+ { 0x18E5, "Ablaze Systems LLC" },
+ { 0x18E6, "Gobex AS" },
+ { 0x18E7, "Truscott Designs" },
+ { 0x18E8, "Mondo Systems" },
+ { 0x18E9, "Numsite Corporation" },
+ { 0x18EA, "Matrox Electronic Systems" },
+ { 0x18EB, "nDezign, Inc." },
+ { 0x18EC, "Arkmicro Technologies Inc." },
+ { 0x18ED, "Tyco Safety Products" },
+ { 0x18EE, "Holm Acoustics" },
+ { 0x18EF, "ELV Elektronik AG" },
+ { 0x18F0, "AVAL DATA CORPORATION" },
+ { 0x18F1, "AL Tech, Inc." },
+ { 0x18F2, "Rasotto S.N.C." },
+ { 0x18F3, "Miglia Technology Ltd." },
+ { 0x18F4, "Vtech Engineering Corporation" },
+ { 0x18F5, "Esterline Mason" },
+ { 0x18F6, "Zermatt Systems Inc" },
+ { 0x18F7, "ImageStream Internet Solutions Inc.." },
+ { 0x18F8, "Teitsu Denshi Kenkyusho Co., Ltd." },
+ { 0x18F9, "EX COMPANY LIMITED" },
+ { 0x18FA, "Kuang Ying Computer Equipment Co., Ltd." },
+ { 0x18FB, "Scriptel Corporation" },
+ { 0x18FC, "Kinyo Co., Ltd." },
+ { 0x18FD, "FineArch Inc." },
+ { 0x18FE, "SecuriMetrics, Inc." },
+ { 0x18FF, "HYUNDAI Digital Technology Co., Ltd." },
+ { 0x1900, "Future Wave, Inc." },
+ { 0x1901, "GE Healthcare" },
+ { 0x1902, "CSIRO Marine & Atmospheric Research" },
+ { 0x1903, "ANEX SYSTEM LTD." },
+ { 0x1904, "LVI Low Vision International AB" },
+ { 0x1905, "EGEMEN Bilgisayar Muh ve San LTD STI" },
+ { 0x1906, "Seoro Tech Co., Ltd." },
+ { 0x1907, "Elcoteq Design Center Oy" },
+ { 0x1908, "APPOTECH LIMITED" },
+ { 0x1909, "ABB Inc. Totalflow Division" },
+ { 0x190A, "Freewide Inc." },
+ { 0x190B, "Metasoft S.C." },
+ { 0x190C, "ierise Inc." },
+ { 0x190D, "Motorola GSG" },
+ { 0x190E, "YAMASA Tokei-Keiki Co, Ltd" },
+ { 0x190F, "YA HORNG ELECTRONIC CO., LTD." },
+ { 0x1910, "Seriprint-Ziprip UK Limited" },
+ { 0x1911, "Nihon Dengyo Kosaku Co., Ltd." },
+ { 0x1912, "Yukyung Technologies Co, Ltd" },
+ { 0x1913, "Atomynet, Inc." },
+ { 0x1914, "Alco Digital Devices Limited" },
+ { 0x1915, "Nordic Semiconductor ASA" },
+ { 0x1916, "Juniper Systems, Inc." },
+ { 0x1917, "Imagetech Corporation" },
+ { 0x1918, "NanoSystem Solutions, Inc." },
+ { 0x1919, "Pixelworks" },
+ { 0x191A, "PATLITE Corporation" },
+ { 0x191B, "PICOCEL Co., Ltd." },
+ { 0x191C, "Innovative Technology Limited" },
+ { 0x191D, "Midtronics, Inc." },
+ { 0x191E, "Monsoon Multimedia Inc." },
+ { 0x191F, "Venetex Co., Ltd." },
+ { 0x1920, "U.S. Digital Television, LLC" },
+ { 0x1921, "Interson Corporation" },
+ { 0x1922, "Power 7 Technologies Corp." },
+ { 0x1923, "FitSense Technology, Inc." },
+ { 0x1924, "QnAp iT" },
+ { 0x1925, "InnoFaith beauty sciences B.V." },
+ { 0x1926, "NextWindow Limited" },
+ { 0x1927, "Vulcan Portals Inc." },
+ { 0x1928, "PROCEQ SA" },
+ { 0x1929, "Wagner Owen Corporation" },
+ { 0x192A, "Intek" },
+ { 0x192B, "KVH Industries, Inc." },
+ { 0x192C, "Twig Com Oy" },
+ { 0x192D, "AgileTV" },
+ { 0x192E, "Bioanalytical Systems" },
+ { 0x192F, "Avago Technologies, Pte." },
+ { 0x1930, "Shenzhen Xianhe Technology Co., Ltd." },
+ { 0x1931, "Ningbo Broad Telecommunication Co., Ltd." },
+ { 0x1932, "Daniels Electronics Ltd." },
+ { 0x1933, "TASER INTERNATIONAL INC." },
+ { 0x1934, "SAKAI Medical Co., Ltd." },
+ { 0x1935, "Elektron Music Machines AB" },
+ { 0x1936, "Asaka Riken Co., Ltd" },
+ { 0x1937, "Dynjab Technologies Pty. Ltd." },
+ { 0x1938, "Meinberg Funkuhren GmbH & Co. KG" },
+ { 0x1939, "Hilscher GmbH" },
+ { 0x193A, "Lipman Electronic Engineering Ltd." },
+ { 0x193B, "Power Monitors, Inc." },
+ { 0x193C, "COGELEC" },
+ { 0x193D, "MAXIAN Co., Ltd." },
+ { 0x193E, "Chestnut Hill Sound Inc." },
+ { 0x193F, "OPDICOM PTY LTD" },
+ { 0x1940, "U.S. Music Corporation" },
+ { 0x1941, "Top Eight Industrial Corp." },
+ { 0x1942, "GAMING PARTNERS INTERNATIONAL" },
+ { 0x1943, "Sensoray" },
+ { 0x1944, "Wegener Communications" },
+ { 0x1945, "O-Pen" },
+ { 0x1946, "Irisguard UK Ltd" },
+ { 0x1947, "Harris Corporation" },
+ { 0x1948, "Darlitech International Co., Ltd." },
+ { 0x1949, "Lab126" },
+ { 0x194A, "Secure Design Institute Co., Ltd." },
+ { 0x194B, "Yanago Design Inc." },
+ { 0x194C, "Scanivalve Corp." },
+ { 0x194D, "Kern AG" },
+ { 0x194E, "acam-messelectronic GmbH" },
+ { 0x194F, "PreSonus Audio Electronics" },
+ { 0x1950, "FUJINON CORPORATION" },
+ { 0x1951, "Hyperstone GmbH" },
+ { 0x1952, "X-TEMPO DESIGNS LLC" },
+ { 0x1953, "Ironkey Inc." },
+ { 0x1954, "Radiient Technologies" },
+ { 0x1955, "4G Systems GmbH" },
+ { 0x1956, "The SmartPill Corporation" },
+ { 0x1957, "BIOS Corporation" },
+ { 0x1958, "Office Depot, Inc." },
+ { 0x1959, "DRS Signal Solutions Inc." },
+ { 0x195A, "Technology Link Corporation" },
+ { 0x195B, "Huge China Industrial Ltd." },
+ { 0x195C, "NewSight" },
+ { 0x195D, "Itron Technology Inc." },
+ { 0x195E, "Datakey Electronics" },
+ { 0x195F, "GODEX INTERNATIONAL CO., LTD." },
+ { 0x1960, "Brains Corporation" },
+ { 0x1961, "Grupo CD World S.L." },
+ { 0x1962, "Vstone Corp." },
+ { 0x1963, "IK MULTIMEDIA PRODUCTION srl" },
+ { 0x1964, "ID Technica Sales Co., Ltd." },
+ { 0x1965, "Uniden Corporation" },
+ { 0x1966, "ELESTA GmbH" },
+ { 0x1967, "CASIO HITACHI Mobile Communications Co., Ltd." },
+ { 0x1968, "Global Silicon Ltd." },
+ { 0x1969, "TM-Research, Inc." },
+ { 0x196A, "SmartCom" },
+ { 0x196B, "Wispro Technology Inc." },
+ { 0x196C, "EMKA Technologies" },
+ { 0x196D, "InnoDisk Corporation" },
+ { 0x196E, "SEI" },
+ { 0x196F, "Otoichi Corporation" },
+ { 0x1970, "Dane-Elec Corp. USA" },
+ { 0x1971, "Real ID Technology Co., Ltd." },
+ { 0x1972, "Diagnostic Instruments, Inc." },
+ { 0x1973, "SpectraLink Corporation" },
+ { 0x1974, "LOSTEAKA, Inc." },
+ { 0x1975, "Dongguan Guneetal Wire & Cable Co., Ltd." },
+ { 0x1976, "Chipsbrand Microelectronics (HK) Co., Ltd." },
+ { 0x1977, "Thales" },
+ { 0x1978, "Lismore Instruments Limited" },
+ { 0x1979, "Suga Digital Technology Limited" },
+ { 0x197A, "Kellendonk Elektronik GmbH" },
+ { 0x197B, "Way Systems Inc." },
+ { 0x197C, "JSC Videofon MV" },
+ { 0x197D, "Leuze electronic GmbH & Co. KG" },
+ { 0x197E, "scemtec Transponder Technology GmbH" },
+ { 0x197F, "Triton" },
+ { 0x1980, "Storage Appliance Corp." },
+ { 0x1981, "Matrix Audio Designs Inc." },
+ { 0x1982, "Hitel Italia S.P.A." },
+ { 0x1983, "Icera Inc." },
+ { 0x1984, "Targetti Sankey S.P.A." },
+ { 0x1985, "Elmos Co., Ltd." },
+ { 0x1986, "Excelitas Technologies Corporation" },
+ { 0x1987, "Camille Bauer AG" },
+ { 0x1988, "Novar Controls" },
+ { 0x1989, "Nuconn Technology Corp." },
+ { 0x198A, "MODMEN Co., Ltd." },
+ { 0x198B, "Fluid Imaging Technologies, Inc" },
+ { 0x198C, "c-scape" },
+ { 0x198D, "Fairchild Imaging" },
+ { 0x198E, "Ingrid, Inc." },
+ { 0x198F, "Beceem Communications Inc." },
+ { 0x1990, "Acron Precision Industrial Co., Ltd." },
+ { 0x1991, "AAI Corporation" },
+ { 0x1992, "Avantes B.V." },
+ { 0x1993, "Bluetop Technology Co., Ltd." },
+ { 0x1994, "ZMM Ltd." },
+ { 0x1995, "Trillium Technology PTY LTD." },
+ { 0x1996, "PixeLINK" },
+ { 0x1997, "CEFLA S.C.R.L." },
+ { 0x1998, "JENOPTIK Laser, Optik, Systeme GmbH" },
+ { 0x1999, "iba AG" },
+ { 0x199A, "DNA-Technology" },
+ { 0x199B, "MicroStrain, Inc." },
+ { 0x199C, "Richnex Microelectronics Corporation" },
+ { 0x199D, "Dexxon Groupe" },
+ { 0x199E, "The Imaging Source Europe GmbH" },
+ { 0x199F, "Benica Corporation" },
+ { 0x19A0, "Krautkramer Japan Co., Ltd." },
+ { 0x19A1, "Zeecraft Tech." },
+ { 0x19A2, "SICK AG" },
+ { 0x19A3, "ASmobile Communication Inc." },
+ { 0x19A4, "Unique Medical Co., Ltd." },
+ { 0x19A5, "Harris RF Communication" },
+ { 0x19A6, "UBISYS TECHNOLOGIES" },
+ { 0x19A7, "SuperTop International Corp." },
+ { 0x19A8, "Biforst Technology Inc." },
+ { 0x19A9, "Musashi Co., Ltd." },
+ { 0x19AA, "musicobo" },
+ { 0x19AB, "Bodelin Technologies" },
+ { 0x19AC, "Hardworks, Inc." },
+ { 0x19AD, "RiTTO GmbH & Co. KG" },
+ { 0x19AE, "KeeLog" },
+ { 0x19AF, "Innomax Technology Ltd." },
+ { 0x19B0, "Sobal Corporation" },
+ { 0x19B1, "Kyoritsu Radio Co., Ltd." },
+ { 0x19B2, "Batronix Elektronik" },
+ { 0x19B3, "SPOTWAVE WIRELESS" },
+ { 0x19B4, "CELESTRON" },
+ { 0x19B5, "B & W Group" },
+ { 0x19B6, "Infotech Logistic, LLC" },
+ { 0x19B7, "SK-Electronics Co. Ltd." },
+ { 0x19B8, "Control Technology Inc." },
+ { 0x19B9, "Drobo, Inc." },
+ { 0x19BA, "ebro Electronic GmbH & Co. KG" },
+ { 0x19BB, "Informtest" },
+ { 0x19BC, "ioLab Systems Inc." },
+ { 0x19BD, "Celluon, Inc." },
+ { 0x19BE, "Guidance Software, Inc." },
+ { 0x19BF, "HASHIMOTO Electronic Industry Co., Ltd." },
+ { 0x19C0, "TeraTron GmbH" },
+ { 0x19C1, "Digital Info Technology Pte. Ltd." },
+ { 0x19C2, "TARGA GmbH" },
+ { 0x19C3, "Riskema Informatica e Automacao Ltda." },
+ { 0x19C4, "Control Gaging, Inc." },
+ { 0x19C5, "Danaher Sensors and Controls" },
+ { 0x19C6, "Harmony Microelectronic Inc." },
+ { 0x19C7, "WEG Equipamentos El�tricos S.A. - Automa��o" },
+ { 0x19C8, "Secure Key LLC" },
+ { 0x19C9, "Electronic Sports" },
+ { 0x19CA, "Sandio Technology Corp." },
+ { 0x19CB, "EMS (European) LTD." },
+ { 0x19CC, "SCIEN Co." },
+ { 0x19CD, "D. O. Tel Co., Ltd." },
+ { 0x19CE, "SINUS Messtechnik GmbH" },
+ { 0x19CF, "Parrot SA" },
+ { 0x19D0, "Pan Pacific Enterprise Co., Inc." },
+ { 0x19D1, "Channaa" },
+ { 0x19D2, "ZTE Corporation" },
+ { 0x19D3, "Zucchetti Centro Sistemi SPA" },
+ { 0x19D4, "I Bee, K.K." },
+ { 0x19D5, "CNB Technology Inc." },
+ { 0x19D6, "WIDE Corporation" },
+ { 0x19D7, "Unitop New Technology Co., Ltd." },
+ { 0x19D8, "Smart Point SA" },
+ { 0x19D9, "Fujitsu Ten Limited" },
+ { 0x19DA, "MUSE Inc." },
+ { 0x19DB, "GeBE Elektronik und Feinwerktechnik GmbH" },
+ { 0x19DC, "Communications & Power Industries" },
+ { 0x19DD, "NEXVU TECHNOLOGIES, Inc." },
+ { 0x19DE, "MITEQ Inc." },
+ { 0x19DF, "AlpnaCom" },
+ { 0x19E0, "Micro-Nits Co., Ltd." },
+ { 0x19E1, "WeiDuan Electronic Accessory (S.Z.) Co., Ltd." },
+ { 0x19E2, "Solomon Systech Limited" },
+ { 0x19E3, "Bae Systems IEWS" },
+ { 0x19E4, "In-Situ Inc." },
+ { 0x19E5, "Jetmobile" },
+ { 0x19E6, "Apex Digital Inc." },
+ { 0x19E7, "Charismathics GmbH" },
+ { 0x19E8, "Industrial Technology Research Institute" },
+ { 0x19E9, "Bartec Auto ID Ltd." },
+ { 0x19EA, "Lung Hwa Electronics Co., Ltd." },
+ { 0x19EB, "ACE Antenna, Advanced Technology R&D Team." },
+ { 0x19EC, "Forth Dimension Displays Ltd." },
+ { 0x19ED, "Plastic Logic Ltd." },
+ { 0x19EE, "Modern Marketing Concepts Inc." },
+ { 0x19EF, "Pak Heng Technology (Shenzhen) Co., Ltd." },
+ { 0x19F0, "Jyh Woei Industrial Co., Ltd." },
+ { 0x19F1, "SindoRicoh Co., LTD." },
+ { 0x19F2, "INFOMARK Co., Ltd." },
+ { 0x19F3, "JAPAN Kyastem Co., Ltd." },
+ { 0x19F4, "Malvern Instruments Ltd" },
+ { 0x19F5, "Nationz Technologies Inc." },
+ { 0x19F6, "J. A. Woollam Co. Inc." },
+ { 0x19F7, "Rode Microphones" },
+ { 0x19F8, "RoboTech srl" },
+ { 0x19F9, "Megadata (Europe) PLC" },
+ { 0x19FA, "SHENZHEN GAMEWARE ELECTRONIC CO., LTD." },
+ { 0x19FB, "VLSI Solution Oy" },
+ { 0x19FC, "BioControl A/S" },
+ { 0x19FD, "MTI Instruments" },
+ { 0x19FE, "Micromap Corporation" },
+ { 0x19FF, "Best Buy China Ltd." },
+ { 0x1A00, "Polymax Precision Industry Co., Ltd." },
+ { 0x1A01, "Siemens Power Transmission & Dist. Energy Automation" },
+ { 0x1A02, "DLoG GmbH" },
+ { 0x1A03, "HORIBA ITECH Co., Ltd." },
+ { 0x1A04, "ASTRO MACHINE CORP." },
+ { 0x1A05, "Media Lab., Inc" },
+ { 0x1A06, "Beijing Deng Hong Technology Co., Ltd." },
+ { 0x1A07, "HID" },
+ { 0x1A08, "Bellwood International, Inc." },
+ { 0x1A09, "DILANO GmbH" },
+ { 0x1A0B, "Teleste OYJ" },
+ { 0x1A0C, "Sunkorea Electronics Co., Ltd." },
+ { 0x1A0D, "Ladybug Technologies LLC" },
+ { 0x1A0E, "Sasse Elektronik GmbH" },
+ { 0x1A0F, "HT-ITALIA" },
+ { 0x1A10, "KWANG SUNG ELECTRONICS H.K. Co., Ltd." },
+ { 0x1A11, "eMDee Technology, Inc." },
+ { 0x1A12, "KES Co., Ltd." },
+ { 0x1A13, "Plasmon" },
+ { 0x1A14, "Brainvision Inc." },
+ { 0x1A15, "Amphenol-Tuchel Electronics GmbH" },
+ { 0x1A16, "General Dynamics" },
+ { 0x1A17, "Oticon A/S" },
+ { 0x1A18, "Quadzilla Performance Technologies, Inc." },
+ { 0x1A19, "DDTIC Corporation Ltd." },
+ { 0x1A1A, "ASIACORP INTERNATIONAL LTD." },
+ { 0x1A1B, "Fischer-Zoth GmbH" },
+ { 0x1A1C, "Mercury Computer Systems AG" },
+ { 0x1A1D, "Syncomm Technology Corp." },
+ { 0x1A1E, "Dekart s.r.l." },
+ { 0x1A1F, "Ikanos Communications Inc." },
+ { 0x1A20, "Mind Logic Co., Ltd." },
+ { 0x1A21, "ASITEQ Co., Ltd." },
+ { 0x1A22, "Kenwin Industrial (HK) Ltd." },
+ { 0x1A23, "Hangzhou YiHeng Technologies Co., Ltd." },
+ { 0x1A24, "Beyondwiz Co., Ltd." },
+ { 0x1A25, "Amphenol East Asia Ltd." },
+ { 0x1A26, "APSI (Asia Pacific Satellite Industry)" },
+ { 0x1A27, "Senior Technologies" },
+ { 0x1A28, "NOVITUS SA" },
+ { 0x1A29, "ABOV Semiconductor Co., Ltd." },
+ { 0x1A2A, "Seagate Branded Solutions" },
+ { 0x1A2B, "NTI Corporation" },
+ { 0x1A2C, "Wuxi China Resources Semico Co., Ltd." },
+ { 0x1A2D, "WEBSYNC Co., Ltd." },
+ { 0x1A2E, "Lanner Electronics Inc." },
+ { 0x1A2F, "Tetradyne Software Inc." },
+ { 0x1A30, "New Media Life" },
+ { 0x1A31, "SPEX SamplePrep, LLC" },
+ { 0x1A32, "Verint Video Technology GmbH" },
+ { 0x1A33, "Schmid & Partner Engineering AG" },
+ { 0x1A34, "King Chuang Tech & Electronic Co., Ltd." },
+ { 0x1A35, "Artesyn Technologies Inc." },
+ { 0x1A36, "Topdisk Technology Limited" },
+ { 0x1A37, "Stayhealthy Inc." },
+ { 0x1A38, "Nemo-Q International AB" },
+ { 0x1A39, "GBC Scientific Equipment" },
+ { 0x1A3A, "Laerdal Medical AS" },
+ { 0x1A3B, "South Mountain Technologies, Ltd." },
+ { 0x1A3C, "New Image Co., Ltd." },
+ { 0x1A3D, "ELGA LabWater (VWS UK LTD)" },
+ { 0x1A3E, "INTEVAC" },
+ { 0x1A3F, "Hokkei Industries Co., Ltd." },
+ { 0x1A40, "TERMINUS TECHNOLOGY INC." },
+ { 0x1A41, "Action Electronics Co., Ltd." },
+ { 0x1A42, "CROSSLINK GmbH" },
+ { 0x1A43, "JTEKT CORPORATION" },
+ { 0x1A44, "VASCO Data Security NV" },
+ { 0x1A45, "Wavelength Electronics Inc." },
+ { 0x1A46, "JAVAD GNSS, Inc." },
+ { 0x1A47, "iQBio, Inc." },
+ { 0x1A48, "KYOHRITSU ELECTRONIC INDUSTRY Co., Ltd." },
+ { 0x1A49, "TOKYO SEIMITSU CO., LTD." },
+ { 0x1A4A, "Silicon Image" },
+ { 0x1A4B, "SafeBoot International B.V." },
+ { 0x1A4C, "PMC" },
+ { 0x1A4D, "N-CRYPT, Inc." },
+ { 0x1A4E, "SIMS Corp." },
+ { 0x1A4F, "Haliplex PTY Ltd." },
+ { 0x1A50, "Mechatro Inc." },
+ { 0x1A51, "FRWD Technologies Ltd." },
+ { 0x1A52, "MediaPhy Corporation" },
+ { 0x1A53, "SANDBOX Co., Ltd" },
+ { 0x1A54, "Oestling Markiersysteme GmbH" },
+ { 0x1A55, "Raytheon Systems Limited" },
+ { 0x1A56, "East Port Technology Co., Ltd." },
+ { 0x1A57, "ARESIS d.o.o." },
+ { 0x1A58, "Miranda Technologies Inc." },
+ { 0x1A59, "HAAG-STREIT AG" },
+ { 0x1A5A, "Tandberg Data" },
+ { 0x1A5B, "Entner Electronics KEG" },
+ { 0x1A5C, "Arkino Corporation Limited" },
+ { 0x1A5D, "Daikin Denshi Kogyo Co., Ltd." },
+ { 0x1A5E, "Edixia" },
+ { 0x1A5F, "Sonatest Limited" },
+ { 0x1A60, "Joytoto Co., Ltd." },
+ { 0x1A61, "Abbott Diabetes Care" },
+ { 0x1A62, "DAT H.K. LIMITED" },
+ { 0x1A63, "Canfield Scientific, Inc." },
+ { 0x1A64, "MASTERVOLT INTERNATIONAL" },
+ { 0x1A65, "ELEKTRINA d.o.o., podjetje za razvoj elektronike" },
+ { 0x1A66, "Andatek Technology, Ltd." },
+ { 0x1A67, "Privaris" },
+ { 0x1A68, "Double Top Technology Ltd." },
+ { 0x1A69, "Kalon Semiconductor, Inc." },
+ { 0x1A6A, "Cypress Semiconductor GmbH" },
+ { 0x1A6B, "Taiwin Electronics Co., Ltd." },
+ { 0x1A6C, "Hivion Co., Ltd." },
+ { 0x1A6D, "SamYoung Electronics Co., Ltd" },
+ { 0x1A6E, "Global Unichip Corp." },
+ { 0x1A6F, "Sagem Orga GmbH" },
+ { 0x1A70, "Items Technology Co., Ltd." },
+ { 0x1A71, "SEIDEL Elektronik GmbH Nfg. KG" },
+ { 0x1A72, "Physik Instrumente (PI) GmbH & Co. KG" },
+ { 0x1A73, "Huntron Inc." },
+ { 0x1A74, "Oberthur Technologies" },
+ { 0x1A75, "Nautilus Hyosung" },
+ { 0x1A76, "JADAK Technologies, Inc." },
+ { 0x1A77, "American Master Import 26, Inc." },
+ { 0x1A78, "AirLink Communications, Inc." },
+ { 0x1A79, "Ascensia Diabetes Care" },
+ { 0x1A7A, "Softron Co., Ltd." },
+ { 0x1A7B, "Lumberg Connect GmbH" },
+ { 0x1A7C, "Evoluent LLC" },
+ { 0x1A7D, "Systex Corporation" },
+ { 0x1A7E, "MELTEC Systementwicklung" },
+ { 0x1A7F, "SSD COMPANY LIMITED" },
+ { 0x1A80, "Zhong Ming Wire Cable Technology (Xiamen) Co., Ltd." },
+ { 0x1A81, "G.Tech Technology Ltd." },
+ { 0x1A82, "Proconn Technology Co., Ltd." },
+ { 0x1A83, "Socle Technology Corp." },
+ { 0x1A84, "COBB Tuning, Inc." },
+ { 0x1A85, "Southwest Research Institute" },
+ { 0x1A86, "Nanjing Qinherg Electronics Co., Ltd." },
+ { 0x1A87, "TechLab 2000 Ltd. Co., Sp Zo.o." },
+ { 0x1A88, "WowWee Limited" },
+ { 0x1A89, "Dynalith Systems Co., Ltd." },
+ { 0x1A8A, "Simula Technology Inc." },
+ { 0x1A8B, "SGS Taiwan Ltd." },
+ { 0x1A8C, "MagicEyes Digital Co., Ltd" },
+ { 0x1A8D, "BandRich Inc." },
+ { 0x1A8E, "XiTRON Technologies" },
+ { 0x1A8F, "Harman Becker Automotive Systems, GmbH" },
+ { 0x1A90, "Resource Data Management" },
+ { 0x1A91, "GEOMC Co., Ltd." },
+ { 0x1A92, "Berkash Enterprise" },
+ { 0x1A93, "Promotional Technologies International Corp." },
+ { 0x1A94, "STWTECH Co., Ltd." },
+ { 0x1A95, "Sextant Labs, Inc." },
+ { 0x1A96, "Harman Becker Automotive Systems, Inc." },
+ { 0x1A97, "XM Satellite Radio Inc." },
+ { 0x1A98, "Leica Camera AG" },
+ { 0x1A99, "Asia Tai Technology (Dongguan) Co., Ltd." },
+ { 0x1A9A, "Verari Systems, Inc." },
+ { 0x1A9B, "Balboa Instruments" },
+ { 0x1A9C, "Inomed Medizintechnik GmbH" },
+ { 0x1A9D, "TrafficSim Co., Ltd." },
+ { 0x1A9E, "Epicenter, Inc." },
+ { 0x1A9F, "Hysitron Incorporated" },
+ { 0x1AA0, "Auto Enginuity, L.L.C." },
+ { 0x1AA1, "Vestax Corporation" },
+ { 0x1AA2, "ORIENTAL MOTOR CO., LTD." },
+ { 0x1AA3, "ZOLL Medical Corporation" },
+ { 0x1AA4, "Data Drive Thru, Inc." },
+ { 0x1AA5, "UBeacon Technologies, Inc." },
+ { 0x1AA6, "eFortune Technology Corp." },
+ { 0x1AA7, "SiliconSystems, Inc." },
+ { 0x1AA8, "Waves Audio Ltd." },
+ { 0x1AA9, "Home Phone Tunes Inc." },
+ { 0x1AAA, "Taylor Associates/Communications, Inc." },
+ { 0x1AAB, "SilverCreations Software AG" },
+ { 0x1AAC, "Witschi Electronic AG" },
+ { 0x1AAD, "KeeTouch Electronic Co., Ltd." },
+ { 0x1AAE, "Johnson Component & Equipments Co., Ltd." },
+ { 0x1AAF, "Intellectual Property Library Company" },
+ { 0x1AB0, "DAEWOO ELECTRONIC COMPONENTS CO., LTD." },
+ { 0x1AB1, "Rigol Technologies, Inc." },
+ { 0x1AB2, "Allied Vision Technologies GmbH" },
+ { 0x1AB3, "M and C System" },
+ { 0x1AB4, "Japan Remote Control Co., Ltd." },
+ { 0x1AB5, "Hamamatsu TOA Electronics, Inc." },
+ { 0x1AB6, "Integrated Technology Corp." },
+ { 0x1AB7, "GLOBAL VR, Inc." },
+ { 0x1AB8, "Pen Laboratory Inc." },
+ { 0x1AB9, "Nomadio Inc." },
+ { 0x1ABA, "Kenton Electronics Limited" },
+ { 0x1ABB, "Airo Wireless Media Inc." },
+ { 0x1ABC, "Fuji Photo Film USA" },
+ { 0x1ABD, "PERTO S.A." },
+ { 0x1ABE, "MP3Car.com Inc" },
+ { 0x1ABF, "ANIMA Corporation" },
+ { 0x1AC0, "SOKKIA Co., Ltd." },
+ { 0x1AC1, "LIANHE TECHNOLOGIES, INC." },
+ { 0x1AC2, "DESKO GmbH" },
+ { 0x1AC3, "DISK KING Technology Co., Ltd." },
+ { 0x1AC4, "CAO Group, Inc." },
+ { 0x1AC5, "Electronic Engineering Solutions S.L." },
+ { 0x1AC6, "JAPAN ADE LTD." },
+ { 0x1AC7, "Modular Communication Systems, Inc." },
+ { 0x1AC8, "Toyota Industries Corporation" },
+ { 0x1AC9, "Broadxent Pte. Ltd." },
+ { 0x1ACA, "Bluebird Soft Inc." },
+ { 0x1ACB, "Salcomp Plc" },
+ { 0x1ACC, "Ta Horng Musical Instrument Co., Ltd." },
+ { 0x1ACD, "MKS Instruments" },
+ { 0x1ACE, "Temento Systems" },
+ { 0x1ACF, "International Manufacturing & Engineering Services Co." },
+ { 0x1AD0, "Cygnetron, Inc." },
+ { 0x1AD1, "Desan Wire Co., Ltd." },
+ { 0x1AD2, "Mesa Imaging AG" },
+ { 0x1AD3, "Advanced Technetix, Inc." },
+ { 0x1AD4, "Advanced Printing Systems" },
+ { 0x1AD5, "Gentec-EO" },
+ { 0x1AD6, "General Dynamics SATCOM Technologies, State College Fac" },
+ { 0x1AD7, "A.B.O. Co., Ltd." },
+ { 0x1AD8, "Motion Control i V�ster�s AB" },
+ { 0x1AD9, "Rocket Gaming Systems" },
+ { 0x1ADA, "VEGA Grieshaber KG" },
+ { 0x1ADB, "Schweitzer Engineering Laboratories" },
+ { 0x1ADC, "Turbolinux, Inc." },
+ { 0x1ADD, "Marshall Electronics, Inc." },
+ { 0x1ADE, "SpinMaster Ltd." },
+ { 0x1ADF, "digital design GmbH" },
+ { 0x1AE0, "Axiomatic Technologies Corp." },
+ { 0x1AE1, "Hoffman Engineering" },
+ { 0x1AE2, "A-JET Technology Co., LTD." },
+ { 0x1AE3, "Chung Young Digital Corp., Ltd." },
+ { 0x1AE4, "ic-design Reinhard Gottinger GmbH" },
+ { 0x1AE5, "Jianduan Technology (Shenzhen) Co., Ltd" },
+ { 0x1AE6, "JOA Telecom Co., Ltd." },
+ { 0x1AE7, "Joellenbeck GmbH" },
+ { 0x1AE8, "Myway Labs Co., Ltd." },
+ { 0x1AE9, "arnotec GmbH" },
+ { 0x1AEA, "Mobilygen Corporation" },
+ { 0x1AEB, "NIHON UNICA CORPORATION" },
+ { 0x1AEC, "PORTEK TECHNOLOGY CORPORATION" },
+ { 0x1AED, "High Top Precision Electronic Co., Ltd." },
+ { 0x1AEE, "SHEN ZHEN REX TECHNOLOGY CO., LTD." },
+ { 0x1AEF, "Octekconn Incorporation" },
+ { 0x1AF0, "SuperPix Micro Technology Limited" },
+ { 0x1AF1, "Connect One, Ltd." },
+ { 0x1AF2, "AXSionics AG" },
+ { 0x1AF3, "Smarthome Technology Limited" },
+ { 0x1AF4, "NCS Pearson, Inc." },
+ { 0x1AF5, "Arima Communications Corp." },
+ { 0x1AF6, "SL International Ltd." },
+ { 0x1AF7, "GRAPHIN CO., LTD." },
+ { 0x1AF8, "JS-ROBOTICS" },
+ { 0x1AF9, "Alvarion Ltd." },
+ { 0x1AFA, "Mobinnova Corp." },
+ { 0x1AFB, "Kirche Jesu Christi der Heiligen der Letzten Tage" },
+ { 0x1AFC, "Blue Orb" },
+ { 0x1AFD, "FarSite Communications Limited" },
+ { 0x1AFE, "A. Eberle GmbH & Co. KG" },
+ { 0x1AFF, "Defibtech, LLC" },
+ { 0x1B00, "Uster Technologies, Inc." },
+ { 0x1B01, "ETA Chips, Co." },
+ { 0x1B02, "MEN Mikro Elektronik GmbH" },
+ { 0x1B03, "Moog Japan Ltd." },
+ { 0x1B04, "MEILHAUS Electronic GmbH" },
+ { 0x1B05, "Cracol Developments Ltd." },
+ { 0x1B06, "OPGAL" },
+ { 0x1B07, "WEY Technology AG" },
+ { 0x1B08, "Actimo Inc." },
+ { 0x1B09, "MISUZU INDUSTRIES CORPORATION" },
+ { 0x1B0A, "Sense Technology Inc." },
+ { 0x1B0B, "Lambda Systems Inc." },
+ { 0x1B0C, "MYTECS Co., Ltd." },
+ { 0x1B0D, "SmarDTV" },
+ { 0x1B0E, "BLUTRONICS S.R.L." },
+ { 0x1B0F, "EKS-ELEKTRONIKSERVICE GmbH" },
+ { 0x1B10, "KAGA COMPONENTS CO., LTD." },
+ { 0x1B11, "OneClick Technologies Ltd." },
+ { 0x1B12, "Eventide, Inc." },
+ { 0x1B13, "Neuf Cegetel" },
+ { 0x1B14, "Ergotron, Inc." },
+ { 0x1B15, "i3micro technology ab" },
+ { 0x1B16, "LinTech GmbH Berlin" },
+ { 0x1B17, "SHENZHEN e-loam Technology Co., Ltd." },
+ { 0x1B18, "Mikrolab Entwicklungsgesellschaft fur Elektroniksysteme" },
+ { 0x1B19, "RADA Electronic Industries Ltd." },
+ { 0x1B1A, "Tianjin China-Silicon Microelectronics Co., Ltd." },
+ { 0x1B1B, "Shenzhen MD Electric Co., Ltd." },
+ { 0x1B1C, "CORSAIR MEMORY INC." },
+ { 0x1B1D, "Torian Wireless Ltd." },
+ { 0x1B1E, "General Imaging Company" },
+ { 0x1B1F, "eQ-3 Entwicklung GmbH" },
+ { 0x1B20, "MStar Semiconductor, Inc." },
+ { 0x1B21, "XenICs nv" },
+ { 0x1B22, "WiLinx Corp." },
+ { 0x1B23, "Skyray Instrument Co., Ltd." },
+ { 0x1B24, "Telegent Systems Inc." },
+ { 0x1B25, "ALE" },
+ { 0x1B26, "Plug Power" },
+ { 0x1B27, "Current Electronics Inc." },
+ { 0x1B28, "NAVIsis Inc." },
+ { 0x1B29, "Industrie Dial Face S.p.A." },
+ { 0x1B2A, "MICRO EMISSION CO., LTD." },
+ { 0x1B2B, "Neural Image Co., Ltd." },
+ { 0x1B2C, "Advanced Thermal Solutions, Inc." },
+ { 0x1B2D, "Photon Inc." },
+ { 0x1B2E, "ETANI ELECTRONICS CO., LTD." },
+ { 0x1B2F, "Ihara Electronic Industries Co.,Ltd." },
+ { 0x1B30, "STZ QSBV Ilmenau" },
+ { 0x1B31, "Renu Electronics Pvt. Ltd." },
+ { 0x1B32, "Ugobe, Inc." },
+ { 0x1B33, "3DV Systems Ltd." },
+ { 0x1B34, "EyeTalk Systems, Inc." },
+ { 0x1B35, "Paradigm Electronics Inc." },
+ { 0x1B36, "ViXS Systems, Inc." },
+ { 0x1B37, "Savant Systems, LLC" },
+ { 0x1B38, "ALBAHITH TECHNOLOGIES" },
+ { 0x1B39, "ViaMichelin SAS" },
+ { 0x1B3A, "JUMO GmbH & Co. KG" },
+ { 0x1B3B, "iPassion Technology Inc." },
+ { 0x1B3C, "DEVI A/S" },
+ { 0x1B3D, "Matrix Orbital" },
+ { 0x1B3E, "STIL SA" },
+ { 0x1B3F, "Generalplus Technology Inc." },
+ { 0x1B40, "AISIN SEIKI CO., LTD." },
+ { 0x1B41, "Fujitsu Australia Limited" },
+ { 0x1B42, "Cardinal Scale Manufacturing Company" },
+ { 0x1B43, "Extron Design Services" },
+ { 0x1B44, "Elite Co., Ltd." },
+ { 0x1B45, "Cyan Technology Ltd." },
+ { 0x1B46, "Holylite Microelectronics Corp." },
+ { 0x1B47, "Energizer Holdings, Inc." },
+ { 0x1B48, "Plastron Precision Co., Ltd." },
+ { 0x1B49, "Applied Printed Electronics Research, LLC" },
+ { 0x1B4A, "Gem-Med, S.L." },
+ { 0x1B4B, "Watson Marlow Ltd." },
+ { 0x1B4C, "Unitron Group" },
+ { 0x1B4D, "Objet Geometries Ltd." },
+ { 0x1B4E, "ELPRO-BUCHS AG" },
+ { 0x1B4F, "Spark Fun Electronics" },
+ { 0x1B50, "DictaNet Software AG" },
+ { 0x1B51, "Kundisch GmbH & Co. KG" },
+ { 0x1B52, "A.R. Hungary, Inc." },
+ { 0x1B53, "DANI Instruments S.p.A." },
+ { 0x1B54, "COMMIT Incorporated" },
+ { 0x1B55, "ZKSoftware Inc." },
+ { 0x1B56, "V.I.O., Inc." },
+ { 0x1B57, "ATREE Inc." },
+ { 0x1B58, "Sumitomo Elec Ind Ltd. Lightwave Network Products Div." },
+ { 0x1B59, "K.S. Terminals Inc." },
+ { 0x1B5A, "Chao Zhou Kai Yuan Electric Co., Ltd." },
+ { 0x1B5B, "Homoth Medizinelektronik" },
+ { 0x1B5C, "ICP DAS Co., Ltd." },
+ { 0x1B5D, "MV Circuit Design, Inc." },
+ { 0x1B5E, "General Engine Management Systems Ltd." },
+ { 0x1B5F, "Wayne Dalton Corp." },
+ { 0x1B60, "NanoDrop Technologies, Inc." },
+ { 0x1B61, "n-Trance Security Ltd." },
+ { 0x1B62, "Shenzhen Aoni Electronic Industry Co., Ltd." },
+ { 0x1B63, "Seedsware Corporation" },
+ { 0x1B64, "C.G. Development Ltd." },
+ { 0x1B65, "The Hong Kong Standards and Testing Centre Ltd." },
+ { 0x1B66, "Bontempi-Farfisa Sigma S.p.A." },
+ { 0x1B67, "Toradex AG" },
+ { 0x1B68, "ZAFENA AB" },
+ { 0x1B69, "KLA-Tencor" },
+ { 0x1B6A, "HIKARI Co., Ltd." },
+ { 0x1B6B, "Modiotek Co., Ltd." },
+ { 0x1B6C, "Techno Veins Co., Ltd." },
+ { 0x1B6D, "IDpendant GmbH" },
+ { 0x1B6E, "HS Automatic ApS" },
+ { 0x1B6F, "Federal Signal Vama S.A." },
+ { 0x1B70, "Minicom Advanced Systems" },
+ { 0x1B71, "Huizhou 10Moons Technology Development Co., Ltd." },
+ { 0x1B72, "ATERGI TECHNOLOGY CO., LTD." },
+ { 0x1B73, "Vehicle Camera Systems Ltd" },
+ { 0x1B74, "MODAFUN, Inc." },
+ { 0x1B75, "OvisLink Corp." },
+ { 0x1B76, "Legend Silicon Corp." },
+ { 0x1B77, "Protec, Inc." },
+ { 0x1B78, "LOGICPACK CO., LTD." },
+ { 0x1B79, "WingsTek, Inc." },
+ { 0x1B7A, "Electrox" },
+ { 0x1B7B, "Ingersoll Rand Co." },
+ { 0x1B7C, "io Corporation" },
+ { 0x1B7D, "SUNGIL TELECOM" },
+ { 0x1B7E, "Lutron Electronics Inc." },
+ { 0x1B7F, "EMC Corporation" },
+ { 0x1B80, "KWorld Computer Co., Ltd." },
+ { 0x1B81, "Kratos Analytical Ltd." },
+ { 0x1B82, "Mcube Technology Co., Ltd." },
+ { 0x1B83, "Megatone systems and Technologies LTD." },
+ { 0x1B84, "WALTHER Data GmbH Scan-Solutions" },
+ { 0x1B85, "INNOVA S.A." },
+ { 0x1B86, "Dongguan Guanshang Electronics Co., Ltd." },
+ { 0x1B87, "Davis Instruments" },
+ { 0x1B88, "ShenMing Electron (Dong Guan) Co., Ltd." },
+ { 0x1B89, "iCache, Incorporated" },
+ { 0x1B8A, "Quellan, Inc." },
+ { 0x1B8B, "PROCES-DATA A/S" },
+ { 0x1B8C, "Altium Limited" },
+ { 0x1B8D, "e-MOVE Technology Co., Ltd." },
+ { 0x1B8E, "Amlogic, Inc." },
+ { 0x1B8F, "Super Talent Technology, Inc." },
+ { 0x1B90, "Deep Sea Electronics Plc" },
+ { 0x1B91, "Zicplay SA" },
+ { 0x1B92, "Trysys Co., Ltd." },
+ { 0x1B93, "Phoenix Contact GmbH & Co. KG" },
+ { 0x1B94, "Yoggie Security Systems" },
+ { 0x1B95, "EVC electronic GmbH" },
+ { 0x1B96, "N-Trig" },
+ { 0x1B97, "Metronix GmbH" },
+ { 0x1B98, "YMax Communications Corp." },
+ { 0x1B99, "Shenzhen Yuanchuan Electronic" },
+ { 0x1B9A, "Applied Vision Systems Corporation" },
+ { 0x1B9B, "Microtrac, Inc." },
+ { 0x1B9C, "Maki Manufacturing Co., Ltd." },
+ { 0x1B9D, "Sigma Instruments, Inc." },
+ { 0x1B9E, "ARCoptix S.A" },
+ { 0x1B9F, "GHI Electronics, LLC" },
+ { 0x1BA0, "Jiangmen Kong Yue Jolimark Information Technology Ltd." },
+ { 0x1BA1, "JINQ CHERN ENTERPRISE CO., LTD." },
+ { 0x1BA2, "Lite Metals & Plastic (Shenzhen) Co., Ltd." },
+ { 0x1BA3, "EmbeddedFusion Ltd." },
+ { 0x1BA4, "Ember Corporation" },
+ { 0x1BA5, "Futiro" },
+ { 0x1BA6, "Abilis Systems" },
+ { 0x1BA7, "Xantech Corporation" },
+ { 0x1BA8, "China Telecommunication Technology Labs" },
+ { 0x1BA9, "Renau Electronic Laboratories" },
+ { 0x1BAA, "Transcell Technology, Inc." },
+ { 0x1BAB, "MATT R.P.Traczynscy Sp.J." },
+ { 0x1BAC, "Bernecker + Rainer Industrie-Elektronik Ges.m.b.H." },
+ { 0x1BAD, "Harmonix Music Systems, Inc." },
+ { 0x1BAE, "Vuzix Corporation" },
+ { 0x1BAF, "NIIGATA SEIMITSU CO., LTD." },
+ { 0x1BB0, "LBS PLUS Co., Ltd." },
+ { 0x1BB1, "Commodore International Corporation" },
+ { 0x1BB2, "G.T. trading Srl" },
+ { 0x1BB3, "Holzworth Instrumentation LLC" },
+ { 0x1BB4, "Satmap Systems Ltd." },
+ { 0x1BB5, "SEF Roboter GmbH" },
+ { 0x1BB6, "PdMA Corporation" },
+ { 0x1BB7, "DGT Sp. z o.o." },
+ { 0x1BB8, "MIZOUE PROJECT JAPAN Corporation" },
+ { 0x1BB9, "Qpixel Technology, Inc." },
+ { 0x1BBA, "Medicomp, Inc." },
+ { 0x1BBB, "TCL Communication Ltd" },
+ { 0x1BBC, "KATHREIN-Werke KG" },
+ { 0x1BBD, "Videology Imaging Solutions, Inc." },
+ { 0x1BBE, "CE+T s.a." },
+ { 0x1BBF, "Littfinski DatenTechnik (LDT)" },
+ { 0x1BC0, "Senselock Software Technology Co.,Ltd" },
+ { 0x1BC1, "ACE ELECTRONIQUE" },
+ { 0x1BC2, "SEW-EURODRIVE GmbH & Co. KG" },
+ { 0x1BC3, "Fujian START Computer Equipment Co., Ltd." },
+ { 0x1BC4, "Ford Motor Co." },
+ { 0x1BC5, "AVIXE Technology (China) Ltd." },
+ { 0x1BC6, "Yurex, Inc." },
+ { 0x1BC7, "Telit Wireless Solutions" },
+ { 0x1BC8, "MDS Technology Co., Ltd." },
+ { 0x1BC9, "Alti-2 Inc." },
+ { 0x1BCA, "Ishii Hyoki Co., Ltd." },
+ { 0x1BCB, "Cubic Defence NZ Limited" },
+ { 0x1BCC, "TopScan Ltd." },
+ { 0x1BCD, "AZKOYEN" },
+ { 0x1BCE, "Contac Cable Industrial Limited" },
+ { 0x1BCF, "Sunplus Innovation Technology Inc." },
+ { 0x1BD0, "Hangzhou Riyue Electronics Co., Ltd." },
+ { 0x1BD1, "Companion Worlds, Inc." },
+ { 0x1BD2, "Beijing G & D Card Systems Co., Ltd." },
+ { 0x1BD3, "3layer Engineering" },
+ { 0x1BD4, "FastVDO Inc." },
+ { 0x1BD5, "BG Systems, Inc." },
+ { 0x1BD6, "Lodam electronics" },
+ { 0x1BD7, "TouchNetworks, Inc." },
+ { 0x1BD8, "Image Computer Systems Limited" },
+ { 0x1BD9, "Emerson" },
+ { 0x1BDA, "University of Southampton" },
+ { 0x1BDB, "Spectral Applied Research" },
+ { 0x1BDC, "Slacker" },
+ { 0x1BDD, "QiGO Inc" },
+ { 0x1BDE, "P-TWO INDUSTRIES, INC." },
+ { 0x1BDF, "Electrone Americas Ltd., Co." },
+ { 0x1BE0, "Analog Devices, Inc. - Test Technology Group" },
+ { 0x1BE1, "LG-Ericsson Co., Ltd" },
+ { 0x1BE2, "Shenzhen Fametech Electronic Co., Ltd." },
+ { 0x1BE3, "WAGO Kontakttechnik GmbH & Co. KG" },
+ { 0x1BE4, "Integrated Digital Technologies, Inc. (IDTI)" },
+ { 0x1BE5, "NetLogic Microsystems" },
+ { 0x1BE6, "NAVENTO TECHNOLOGIES" },
+ { 0x1BE7, "CPR Tools, Inc." },
+ { 0x1BE8, "MEDAV GmbH" },
+ { 0x1BE9, "CONCH ELECTRONIC CO., LTD." },
+ { 0x1BEA, "ATTO Corporation" },
+ { 0x1BEB, "HOYA CANDEO OPTRONICS CORPORATION" },
+ { 0x1BEC, "isMedia Co., Ltd." },
+ { 0x1BED, "OPT Corporation" },
+ { 0x1BEE, "KCI Medical Products (UK) Ltd." },
+ { 0x1BEF, "Shenzhen Tongyuan Network-Communication Cables Co., Ltd" },
+ { 0x1BF0, "RealVision Inc." },
+ { 0x1BF1, "HENGSTLER" },
+ { 0x1BF2, "Newport Media, Inc." },
+ { 0x1BF3, "WAVES SYSTEM / SONAMIX" },
+ { 0x1BF4, "ABB / Drives" },
+ { 0x1BF5, "Extranet Systems Inc." },
+ { 0x1BF6, "Orient Semiconductor Electronics, Ltd." },
+ { 0x1BF7, "Axiotron, Inc." },
+ { 0x1BF8, "Game Mechanisms LLC" },
+ { 0x1BF9, "TRACTEL SAS" },
+ { 0x1BFA, "METROLAB TECHNOLOGY SA" },
+ { 0x1BFB, "ALLIED PANELS" },
+ { 0x1BFC, "Guidance Interactive Healthcare" },
+ { 0x1BFD, "RISINTECH INC." },
+ { 0x1BFE, "SEOHWA TELECOM Co., LTD." },
+ { 0x1BFF, "IonOptix Corp." },
+ { 0x1C00, "prodaSafe GmbH" },
+ { 0x1C01, "No Climb Products Ltd." },
+ { 0x1C02, "Kreton Corporation" },
+ { 0x1C03, "DDL CO., LTD." },
+ { 0x1C04, "QNAP System Inc." },
+ { 0x1C05, "Rockwell Collins" },
+ { 0x1C06, "SeekTech, Inc." },
+ { 0x1C07, "CEntrance, Inc." },
+ { 0x1C08, "Arcus-EDS GmbH" },
+ { 0x1C09, "RAMTEX Engineering ApS" },
+ { 0x1C0A, "MaxRise Inc." },
+ { 0x1C0B, "Kato Tech Co., Ltd." },
+ { 0x1C0C, "Ionics EMS Inc." },
+ { 0x1C0D, "Relm Wireless" },
+ { 0x1C0E, "Qstik plc" },
+ { 0x1C0F, "NEOTECHKNO" },
+ { 0x1C10, "Lanterra Industrial Co., Ltd." },
+ { 0x1C11, "UNIMTEC Co., Ltd." },
+ { 0x1C12, "CONITEC DATENSYSTEME GmbH" },
+ { 0x1C13, "ALECTRONIC LIMITED" },
+ { 0x1C14, "SENSITIVE OBJECT" },
+ { 0x1C15, "TeleWell Oy" },
+ { 0x1C16, "Afit Corporation" },
+ { 0x1C17, "LAB REHAB PTE LTD." },
+ { 0x1C18, "Apria Technology" },
+ { 0x1C19, "Charder Electronic Co., Ltd." },
+ { 0x1C1A, "Datel Electronics Ltd." },
+ { 0x1C1B, "Volkswagen of America, Inc." },
+ { 0x1C1C, "Schmartz Inc." },
+ { 0x1C1D, "GASTEC CORPORATION" },
+ { 0x1C1E, "Focused Test, Inc." },
+ { 0x1C1F, "Goldvish S.A." },
+ { 0x1C20, "Fuji Electric Device Technology Co., Ltd." },
+ { 0x1C21, "ADDMM LLC" },
+ { 0x1C22, "ZHONGSHAN CHIANG YU ELECTRIC CO., LTD." },
+ { 0x1C23, "Enzytek Technology Inc." },
+ { 0x1C24, "DIGITAL IMAGING SYSTEMS GmbH" },
+ { 0x1C25, "Sunwell Electronics Ltd." },
+ { 0x1C26, "Shanghai Haiying Electronics Co., Ltd." },
+ { 0x1C27, "SHENZHEN DNS INDUSTRIES CO., LTD." },
+ { 0x1C28, "PMDTechnologies" },
+ { 0x1C29, "Elster Group" },
+ { 0x1C2A, "NAVIGON AG" },
+ { 0x1C2B, "SIEB & MEYER AG" },
+ { 0x1C2C, "QUANTEL LTD." },
+ { 0x1C2D, "Barloworld Scientific Limited" },
+ { 0x1C2E, "LiveWire Test Labs, Inc." },
+ { 0x1C2F, "Wessex Advanced Switching Products Ltd." },
+ { 0x1C30, "Li Creative Technologies, Inc." },
+ { 0x1C31, "LS Mtron Ltd." },
+ { 0x1C32, "INTELBANQ" },
+ { 0x1C33, "EK-TEAM GmbH" },
+ { 0x1C34, "Pro-Active" },
+ { 0x1C35, "Superna Inc." },
+ { 0x1C36, "Axiom Manufacturing" },
+ { 0x1C37, "Sonavation, Inc." },
+ { 0x1C38, "Kirin Techno-System Company, Limited" },
+ { 0x1C39, "Quantronix, Inc." },
+ { 0x1C3A, "CCV Deutschland GmbH" },
+ { 0x1C3B, "Nivis, LLC" },
+ { 0x1C3C, "INFOTURE, INC." },
+ { 0x1C3D, "NONIN MEDICAL INC." },
+ { 0x1C3E, "Wep Peripherals" },
+ { 0x1C3F, "Amfit, Inc." },
+ { 0x1C40, "EZ PROTOTYPES" },
+ { 0x1C41, "CompX Fort" },
+ { 0x1C42, "VERCET LLC" },
+ { 0x1C43, "PeCon GmbH" },
+ { 0x1C44, "Fukasawa Co." },
+ { 0x1C45, "NavCom Technology Inc." },
+ { 0x1C46, "Hitachi Zosen Corporation" },
+ { 0x1C47, "Andrew Telecommunication Product SRL" },
+ { 0x1C48, "International Truck and Engine Corporation" },
+ { 0x1C49, "Cherng Weei Technology Corp." },
+ { 0x1C4A, "Cathay Tri-Tech., Inc." },
+ { 0x1C4B, "Geratherm Respiratory GmbH" },
+ { 0x1C4C, "SYSTECH" },
+ { 0x1C4D, "Everest Display Inc." },
+ { 0x1C4E, "Koninklijke Gazelle N.V." },
+ { 0x1C4F, "Beijing Sigmachip Co., Ltd." },
+ { 0x1C50, "Chatsworth Data Corporation" },
+ { 0x1C51, "Wisecube Co., Ltd." },
+ { 0x1C52, "FLEETWOOD ELECTRONICS LTD." },
+ { 0x1C53, "Heartland Data Co." },
+ { 0x1C54, "NU-LEC INDUSTRIES" },
+ { 0x1C55, "LGS" },
+ { 0x1C56, "RED DIGITAL CINEMA" },
+ { 0x1C57, "Zalman Tech Co., Ltd." },
+ { 0x1C58, "IVA Corporation" },
+ { 0x1C59, "SIXNET, LLC" },
+ { 0x1C5A, "Fisher and Paykel Healthcare Limited" },
+ { 0x1C5B, "FUTURE WAVES PTE Ltd." },
+ { 0x1C5C, "CELLMETRIC LTD." },
+ { 0x1C5D, "KB Kommutatcionnoy apparatury LTD." },
+ { 0x1C5E, "Fueltech Ind. & Com. Prod. Elet. Ltda." },
+ { 0x1C5F, "Watec Co., Ltd." },
+ { 0x1C60, "Vision & Control GmbH" },
+ { 0x1C61, "ASI DataMyte, Inc." },
+ { 0x1C62, "LITEPOINT CORP." },
+ { 0x1C63, "DLP Design, Inc." },
+ { 0x1C64, "QSI Corporation" },
+ { 0x1C65, "PROCENTEC" },
+ { 0x1C66, "The Trane Company" },
+ { 0x1C67, "Sugar Creek Solutions LLC" },
+ { 0x1C68, "Trace Systems, Inc." },
+ { 0x1C69, "MPB Communications" },
+ { 0x1C6A, "Regula Ltd." },
+ { 0x1C6B, "Philips & Lite-ON Digital Solutions Corporation" },
+ { 0x1C6C, "Skydigital Inc." },
+ { 0x1C6D, "Bioptigen Inc." },
+ { 0x1C6E, "MINELAB ELECTRONICS PTY LTD." },
+ { 0x1C6F, "SUN-A CORPORATION" },
+ { 0x1C70, "Wessa Engineering" },
+ { 0x1C71, "HUMANWARE LTD." },
+ { 0x1C72, "EMTEC Elektronische Messtechnik GmbH" },
+ { 0x1C73, "AMT Co., Ltd." },
+ { 0x1C74, "PHOTOVOX srl" },
+ { 0x1C75, "ARTURIA" },
+ { 0x1C76, "Sun-Light Electronic Technologies Inc." },
+ { 0x1C77, "Kaetat Industrial Co., Ltd." },
+ { 0x1C78, "Mindray DS USA, Inc." },
+ { 0x1C79, "Unigen Corporation" },
+ { 0x1C7A, "Egis Technology, Inc." },
+ { 0x1C7B, "Shenzhen Luxshare Precision Industry Co., Ltd." },
+ { 0x1C7C, "DELCOP LLC" },
+ { 0x1C7D, "STARKEY LABORATORIES INC." },
+ { 0x1C7E, "Hydrometer GmbH" },
+ { 0x1C7F, "FILTRONIC DEFENCE LIMITED" },
+ { 0x1C80, "Hoffmann + Krippner GmbH" },
+ { 0x1C81, "MOTOSOFT b.v." },
+ { 0x1C82, "Atracsys LLC" },
+ { 0x1C83, "BEKA Elektronik" },
+ { 0x1C84, "DRS Tactical Systems" },
+ { 0x1C85, "Audyssey Laboratories, Inc." },
+ { 0x1C86, "Tallahassee Technologies, Inc." },
+ { 0x1C87, "2N TELEKOMUNIKACE a.s." },
+ { 0x1C88, "Somagic, Inc." },
+ { 0x1C89, "HONGKONG WEIDIDA ELECTRON LIMITED" },
+ { 0x1C8A, "SHIN HEUNG PRECISION CO., LTD." },
+ { 0x1C8B, "Bridgestone Cycle Co., Ltd." },
+ { 0x1C8C, "noax Technologies AG" },
+ { 0x1C8D, "Payter BV" },
+ { 0x1C8E, "ASTRON INTERNATIONAL CORP." },
+ { 0x1C8F, "Scolis Technologies (India) Pvt. Ltd." },
+ { 0x1C90, "Pixela (Shanghai) Co., Ltd." },
+ { 0x1C91, "Hutchinson Technology Incorporated" },
+ { 0x1C92, "JDD Enterprises" },
+ { 0x1C93, "Airspan Networks" },
+ { 0x1C94, "Maerzhaeuser Wetzlar GmbH & Co. KG." },
+ { 0x1C95, "OVATION SYSTEMS LIMITED" },
+ { 0x1C96, "Tesselon, LLC" },
+ { 0x1C97, "PEBBLE ENTERTAINMENT GmbH" },
+ { 0x1C98, "ALPINE ELECTRONICS, INC." },
+ { 0x1C99, "KETEREX, Inc." },
+ { 0x1C9A, "Simple Step LLC" },
+ { 0x1C9B, "Ohden Co., Ltd." },
+ { 0x1C9C, "Technological Solutions Laboratory" },
+ { 0x1C9D, "Descuentos y Electronicos AVA" },
+ { 0x1C9E, "Shanghai Longcheer 3G Technology Co., Ltd." },
+ { 0x1C9F, "SISS Technology Inc." },
+ { 0x1CA0, "ACCARIO Inc." },
+ { 0x1CA1, "Symwave, Inc." },
+ { 0x1CA2, "G-coder Systems AB" },
+ { 0x1CA3, "CAPAZ GmbH" },
+ { 0x1CA4, "METRICO WIRELESS INC." },
+ { 0x1CA5, "HASLER RAIL AG" },
+ { 0x1CA6, "TECHNO-AP Limited Company" },
+ { 0x1CA7, "BAE SYSTEMS AUSTRALIA LIMITED" },
+ { 0x1CA8, "ROCCAT STUDIO GmbH" },
+ { 0x1CA9, "THE TINTOMETER LTD." },
+ { 0x1CAA, "Accel Semiconductor Corp." },
+ { 0x1CAB, "SCS Engineering, Inc." },
+ { 0x1CAC, "SHENZHEN KINSTONE D&T DEVELOP CO., LTD." },
+ { 0x1CAD, "ONE-TOO" },
+ { 0x1CAE, "MPMAN" },
+ { 0x1CAF, "2WCOM GmbH" },
+ { 0x1CB0, "LEGRAND FRANCE" },
+ { 0x1CB1, "Enforce Device Inc." },
+ { 0x1CB2, "PCO AG" },
+ { 0x1CB3, "Aces Electronics Co., Ltd." },
+ { 0x1CB4, "OPEX CORPORATION" },
+ { 0x1CB5, "Boonton Electronics" },
+ { 0x1CB6, "IDEACOM TECHNOLOGY INC." },
+ { 0x1CB7, "EASTERN TIMES TECHNOLOGY CO., LTD." },
+ { 0x1CB8, "Ferguson Beauregard" },
+ { 0x1CB9, "DIVERSIFIED TECHNICAL SYSTEMS, INC." },
+ { 0x1CBA, "MERIDIAN AUDIO LTD." },
+ { 0x1CBB, "DATATEC CO., LTD." },
+ { 0x1CBC, "Zizzle, LLC" },
+ { 0x1CBD, "Wha Shin Co., Ltd." },
+ { 0x1CBE, "Texas Instruments - Stellaris" },
+ { 0x1CBF, "FORTAT SKYMARK INDUSTRIAL COMPANY" },
+ { 0x1CC0, "PlantSense" },
+ { 0x1CC1, "EXAKTIME INC." },
+ { 0x1CC2, "CC Systems AB" },
+ { 0x1CC3, "Biocomfort Diagnostics GmbH & Co. KG" },
+ { 0x1CC4, "Byte Paradigm sprl" },
+ { 0x1CC5, "Rane Corporation" },
+ { 0x1CC6, "Digital Force Technologies" },
+ { 0x1CC7, "GELOGIC" },
+ { 0x1CC8, "Iofy Corporation" },
+ { 0x1CC9, "COMAP, spol. s r. o." },
+ { 0x1CCA, "NextWave Broadband Inc." },
+ { 0x1CCB, "Lattebox Co., Ltd." },
+ { 0x1CCC, "DA-DESIGN OY" },
+ { 0x1CCD, "Bodatong Technology (Shenzhen) Co., Ltd." },
+ { 0x1CCE, "DATA MODUL" },
+ { 0x1CCF, "Konami Digital Entertainment Co., Ltd." },
+ { 0x1CD0, "VEGATECH CO., LTD." },
+ { 0x1CD1, "ARTAFLEX" },
+ { 0x1CD2, "Christ Elektronik GmbH" },
+ { 0x1CD3, "ATSUMI ELECTRIC CO., LTD." },
+ { 0x1CD4, "adp corporation" },
+ { 0x1CD5, "Firecomms Ltd." },
+ { 0x1CD6, "Antonio Precise Products Manufactory Ltd." },
+ { 0x1CD7, "GMC-I Gossen-Metrawatt GmbH" },
+ { 0x1CD8, "Dash Navigation, Inc." },
+ { 0x1CD9, "TL Industries" },
+ { 0x1CDA, "NAVICO" },
+ { 0x1CDB, "Cat Technologies Ltd." },
+ { 0x1CDC, "Advanced Medical Electronics Corp." },
+ { 0x1CDD, "YOOSAMFLUTE CO., LTD." },
+ { 0x1CDE, "Telecommunications Technology Association (TTA)" },
+ { 0x1CDF, "WonTen Technology Co., Ltd." },
+ { 0x1CE0, "EDIMAX TECHNOLOGY CO., LTD." },
+ { 0x1CE1, "Amphenol KAE" },
+ { 0x1CE2, "Extron Electronics" },
+ { 0x1CE3, "Australian Simulation Control Systems Pty., Ltd." },
+ { 0x1CE4, "High Leah Electronics, Inc." },
+ { 0x1CE5, "SimPhonics, Inc." },
+ { 0x1CE6, "SOPRO" },
+ { 0x1CE7, "FASY SPA" },
+ { 0x1CE8, "Alcorn McBride, Inc." },
+ { 0x1CE9, "Cadmus Payment Solutions Ltd." },
+ { 0x1CEA, "MESTEK, INC." },
+ { 0x1CEB, "SMARTWI" },
+ { 0x1CEC, "Siemens AG I & S Postal Automation" },
+ { 0x1CED, "DEWESOFT d.o.o." },
+ { 0x1CEE, "Production Technology Center Kyushuu" },
+ { 0x1CEF, "Siemens LD-A" },
+ { 0x1CF0, "SA VALIDY" },
+ { 0x1CF1, "dresden elektronik ingenieurtechnik gmbh" },
+ { 0x1CF2, "TrellisWare Technologies, Inc." },
+ { 0x1CF3, "Lion Power Co., Ltd." },
+ { 0x1CF4, "SK INTERFACES LTD." },
+ { 0x1CF5, "Swirlnet A/S" },
+ { 0x1CF6, "Atlantic Zeiser GmbH" },
+ { 0x1CF7, "Electric-Spin" },
+ { 0x1CF8, "Biometric Associates" },
+ { 0x1CF9, "Aipermon GmbH & Co. KG" },
+ { 0x1CFA, "Daco Scientific Limited" },
+ { 0x1CFB, "Livescribe Inc." },
+ { 0x1CFC, "ANDES TECHNOLOGY CORPORATION" },
+ { 0x1CFD, "Flextronics Digital Design Japan, LTD." },
+ { 0x1CFE, "Cryptsoft Pty. Ltd." },
+ { 0x1CFF, "Tad Radio of Canada Inc." },
+ { 0x1D00, "MicroStone Corporation" },
+ { 0x1D01, "SNIF Labs" },
+ { 0x1D02, "DevGuru" },
+ { 0x1D03, "ICON INTERNATIONAL DIGITAL LIMITED" },
+ { 0x1D04, "Itronics" },
+ { 0x1D05, "DESTURA S.R.L." },
+ { 0x1D06, "BBK ELECTRONICS CORPORATION LIMITED" },
+ { 0x1D07, "Solid-Motion" },
+ { 0x1D08, "NINGBO HENTEK DRAGON ELECTRONICS CO., LTD." },
+ { 0x1D09, "TechFaith Wireless Technology Limited" },
+ { 0x1D0A, "Visteon Corporation" },
+ { 0x1D0B, "HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD." },
+ { 0x1D0C, "LAKS GmbH" },
+ { 0x1D0D, "TDK Marketing Europe GmbH" },
+ { 0x1D0E, "deister electronic GmbH" },
+ { 0x1D0F, "NEO ELECTRONICS (HK) CO., LIMITED" },
+ { 0x1D10, "Jiangsu Shinco Digital Technology Co., Ltd." },
+ { 0x1D11, "Xtend Technologies Pvt. Ltd." },
+ { 0x1D12, "UAB TELTONIKA" },
+ { 0x1D13, "L3 Communications - Telemetry West" },
+ { 0x1D14, "ALPHA-SAT TECHNOLOGY LIMITED" },
+ { 0x1D15, "FUJIFILM RECORDING MEDIA GmbH" },
+ { 0x1D16, "KABA MAS CORPORATION" },
+ { 0x1D17, "C-THRU MUSIC Ltd." },
+ { 0x1D18, "APICAL INSTRUMENTS, INC." },
+ { 0x1D19, "Dexatek Technology Ltd." },
+ { 0x1D1A, "Boeckeler Instruments, Inc." },
+ { 0x1D1B, "HumanBeams Inc." },
+ { 0x1D1C, "Novatron Oy" },
+ { 0x1D1D, "SYNESTHESIA CORPORATION" },
+ { 0x1D1E, "OFFCODE" },
+ { 0x1D1F, "Diostech Co., Ltd." },
+ { 0x1D20, "SAMTACK INC." },
+ { 0x1D21, "COMPUSULT LIMITED" },
+ { 0x1D22, "ELCOM s.r.o." },
+ { 0x1D23, "Netsushin Co., Ltd." },
+ { 0x1D24, "PHOTON KINETICS" },
+ { 0x1D25, "Trinity Security Systems, Inc." },
+ { 0x1D26, "ADVANCED ELECTRONICS LTD." },
+ { 0x1D27, "Prime Sense Ltd." },
+ { 0x1D28, "JORDAN VALLEY SEMICONDUCTORS LTD." },
+ { 0x1D29, "Horng Tong Enterprise Co., Ltd." },
+ { 0x1D2A, "LyconSys GmbH & Co. KG" },
+ { 0x1D2B, "BEN-RI ELECTRONICA S.A." },
+ { 0x1D2C, "equinux AG" },
+ { 0x1D2D, "Fraunhofer IBMT" },
+ { 0x1D2E, "I.S.V. Co., Ltd." },
+ { 0x1D2F, "JACO, INC." },
+ { 0x1D30, "Sinosun Technology Ltd." },
+ { 0x1D31, "XINTRONIX LIMITED" },
+ { 0x1D32, "ELECTRONICA MECHATRONIC SYSTEMS (I) PVT. LTD." },
+ { 0x1D33, "Lockheed Martin - Maritime Systems & Sensors" },
+ { 0x1D34, "DREAM LINK LTD." },
+ { 0x1D35, "ISS Manufacturing Limited" },
+ { 0x1D36, "Volucris, Inc." },
+ { 0x1D37, "Phoenix Microelectronics (China) Co., Ltd." },
+ { 0x1D38, "Ergowerx Int'l LLC/Smartfish Technologies" },
+ { 0x1D39, "XECURENEXUS Co., LTD." },
+ { 0x1D3A, "P. R. Glassel & Associates, Inc." },
+ { 0x1D3B, "J & C Technology Co., Ltd." },
+ { 0x1D3C, "Tomei Tsushin Kogyo Co., Ltd." },
+ { 0x1D3D, "R&D Center of Biometric Technology-BMSTU" },
+ { 0x1D3E, "EMCON Emanation Control Limited" },
+ { 0x1D3F, "Photon Control Inc." },
+ { 0x1D40, "EDANIS Elektronik AG" },
+ { 0x1D41, "Teletronic Rossendorf GmbH" },
+ { 0x1D42, "DRAGON JOY LIMITED" },
+ { 0x1D43, "Montage Technology, Inc." },
+ { 0x1D44, "Adirondack Digital Imaging Systems, Inc." },
+ { 0x1D45, "Qisda Corporation" },
+ { 0x1D46, "nSys Design Systems" },
+ { 0x1D47, "ATAUCE" },
+ { 0x1D48, "Shenzhen XinYonghui Precise Technology Co., Ltd." },
+ { 0x1D49, "SHENZHEN LINKCONN ELECTRONICS CO., LTD." },
+ { 0x1D4A, "HKS Co., Ltd." },
+ { 0x1D4B, "DARIM VISION CO." },
+ { 0x1D4C, "ARK-DESIGN Co., Ltd." },
+ { 0x1D4D, "Pegatron Corporation" },
+ { 0x1D4E, "INPHI CORPORATION" },
+ { 0x1D4F, "ADVANCED CHIP EXPRESS INC." },
+ { 0x1D50, "OPENMOKO, Inc." },
+ { 0x1D51, "Sengital Limited" },
+ { 0x1D52, "ELECTROBYTE di GARAVAGLIA MATTIA" },
+ { 0x1D53, "Innofidei Inc." },
+ { 0x1D54, "ZARAM TECHNOLOGY, Inc." },
+ { 0x1D55, "XRONet Corporation" },
+ { 0x1D56, "Verico International Co., Ltd." },
+ { 0x1D57, "Feeling Technology Corp." },
+ { 0x1D58, "SUZUKI Engineering" },
+ { 0x1D59, "3DSP" },
+ { 0x1D5A, "Hillcrest Laboratories, Inc." },
+ { 0x1D5B, "Smartronix, Inc." },
+ { 0x1D5C, "Fresco Logic Inc." },
+ { 0x1D5D, "QIXING INDUSTRIAL (HK) CO." },
+ { 0x1D5E, "Tonium AB" },
+ { 0x1D5F, "ViVOtech, Inc." },
+ { 0x1D60, "ASAP International Co., Ltd." },
+ { 0x1D61, "ACCEMIC GmbH & CO. KG" },
+ { 0x1D62, "KYORITSU ELECTRIC CO., LTD." },
+ { 0x1D63, "Nippon Seiki Co., Ltd." },
+ { 0x1D64, "MobilMAX Technology Inc." },
+ { 0x1D65, "Moteurs LEROY SOMER" },
+ { 0x1D66, "StreamBuster" },
+ { 0x1D67, "DYNAMIC INNOVATIONS LIMITED" },
+ { 0x1D68, "SEMA ELECTRONICS (H.K.) CO., Ltd." },
+ { 0x1D69, "Walta Electronic Co., Ltd." },
+ { 0x1D6A, "ARICENT TECHNOLOGIES (HOLDINGS) LTD." },
+ { 0x1D6B, "The Linux Foundation" },
+ { 0x1D6C, "Man & Machine, Inc." },
+ { 0x1D6D, "VARISYS LIMITED" },
+ { 0x1D6E, "EUROTECH" },
+ { 0x1D6F, "Seluxit" },
+ { 0x1D70, "MULTIPLE ACCESS COMMUNICATIONS LTD." },
+ { 0x1D71, "Finisar Corporation" },
+ { 0x1D72, "Mobiltex Data Ltd." },
+ { 0x1D73, "Signal Processing Devices Sweden AB" },
+ { 0x1D74, "LG Innotek Co., Ltd." },
+ { 0x1D75, "DICOM, spol. s r.o." },
+ { 0x1D76, "LongCheng Electronic & Communication CO., LTD." },
+ { 0x1D77, "Yueqing Changling Electronic Instrument Corp., Ltd." },
+ { 0x1D78, "CAMBRIDGE SEMICONDUCTOR LTD." },
+ { 0x1D79, "Shenzhen Innosystem Technology Ltd." },
+ { 0x1D7A, "SHINWA INTERNATIONAL HOLDINGS LTD." },
+ { 0x1D7B, "Single Strand Co., Ltd." },
+ { 0x1D7C, "KarmelSonix" },
+ { 0x1D7D, "Seoul Commtech Co., Ltd." },
+ { 0x1D7E, "WAVESAT" },
+ { 0x1D7F, "MoBeam, Inc." },
+ { 0x1D80, "PLDA" },
+ { 0x1D81, "YongXin Plastic & Hardware Co., Ltd." },
+ { 0x1D82, "HERTZ SYSTEMTECHNIK GmbH" },
+ { 0x1D83, "Mantech International" },
+ { 0x1D84, "Kechenda Plastic Electronic Factory" },
+ { 0x1D85, "NINGBO SHUNSHENG COMMUNICATION APPARATUS CO., LTD." },
+ { 0x1D86, "C.D.N. CORPORATION" },
+ { 0x1D87, "RHK TECHNOLOGY, INC." },
+ { 0x1D88, "Mahr GmbH" },
+ { 0x1D89, "Hunter Associates" },
+ { 0x1D8A, "OSASI Technos Inc. (Tokyo Headquarters)" },
+ { 0x1D8B, "MEDTRONIC" },
+ { 0x1D8C, "Wuxi AlphaScale IC Systems, Inc." },
+ { 0x1D8D, "EXEO SYSTEMS" },
+ { 0x1D8E, "Capistrano Labs, Inc." },
+ { 0x1D8F, "Viprinet GmbH" },
+ { 0x1D90, "CITIZEN SYSTEMS JAPAN CO., LTD." },
+ { 0x1D91, "BYD COMPANY LIMITED" },
+ { 0x1D92, "SPECTRONIC DEVICES LTD." },
+ { 0x1D93, "Tokyo System Development Co., Ltd." },
+ { 0x1D94, "ENCIRIS TECHNOLOGIES" },
+ { 0x1D95, "SYSTRONIK Elektronik und Systemtechnik GmbH" },
+ { 0x1D96, "CHIRSON LTD." },
+ { 0x1D97, "Telonics" },
+ { 0x1D98, "OUTLINE ELECTRONICS LTD." },
+ { 0x1D99, "Shanghai HSIC Application System Co., Ltd." },
+ { 0x1D9A, "Vubiq, Inc." },
+ { 0x1D9B, "Techno Source" },
+ { 0x1D9C, "SONIM TECHNOLOGIES, INC." },
+ { 0x1D9D, "Sigma Elektro GmbH" },
+ { 0x1D9E, "CSR, Inc." },
+ { 0x1D9F, "KUNMING ELECTRONICS CO., LTD." },
+ { 0x1DA0, "Parade Technologies, Inc." },
+ { 0x1DA1, "COVIDENCE A/S" },
+ { 0x1DA2, "LAMBDA, INC." },
+ { 0x1DA3, "bebro electronic GmbH" },
+ { 0x1DA4, "BTICINO" },
+ { 0x1DA5, "CATHEXIS INNOVATIONS INC." },
+ { 0x1DA6, "Inepro BV" },
+ { 0x1DA7, "ENDRA Inc." },
+ { 0x1DA8, "VIOLET" },
+ { 0x1DA9, "In-Circuit GmbH" },
+ { 0x1DAA, "Alcatel-Lucent" },
+ { 0x1DAB, "MAGELLAN GPS" },
+ { 0x1DAC, "MOBOTIX AG" },
+ { 0x1DAD, "DATNET KFT" },
+ { 0x1DAE, "ellipsis INC." },
+ { 0x1DAF, "Breas Medical AB" },
+ { 0x1DB0, "GreenPeak Technologies NV" },
+ { 0x1DB1, "Reliable Controls Corporation" },
+ { 0x1DB2, "Duali Inc." },
+ { 0x1DB3, "Arcelik A.S." },
+ { 0x1DB4, "Montalvo Systems" },
+ { 0x1DB5, "BRYSTON LTD." },
+ { 0x1DB6, "eDimensional, Inc." },
+ { 0x1DB7, "SMedia Technology Corporation" },
+ { 0x1DB8, "HD MEDICAL INC." },
+ { 0x1DB9, "LITEN UP TECHNOLOGIES INC." },
+ { 0x1DBA, "BancTec, Inc." },
+ { 0x1DBB, "Condalo GmbH" },
+ { 0x1DBC, "Shenzhen HOJY Technology Co., Ltd." },
+ { 0x1DBD, "Terawins" },
+ { 0x1DBE, "S.R.N. Corporation" },
+ { 0x1DBF, "Signostics Pty. Ltd." },
+ { 0x1DC0, "DATAFIELD INDIA PVT.LTD." },
+ { 0x1DC1, "Laser Drive" },
+ { 0x1DC2, "Datalogic Mobile Inc." },
+ { 0x1DC3, "PoLabs" },
+ { 0x1DC4, "TRANSICS" },
+ { 0x1DC5, "Pixim Inc." },
+ { 0x1DC6, "Miyama, Inc." },
+ { 0x1DC7, "Leroy Automatique Industrielle" },
+ { 0x1DC8, "GC Corporation" },
+ { 0x1DC9, "Hitachi Koki Co., Ltd." },
+ { 0x1DCA, "The IVOXX Corp." },
+ { 0x1DCB, "IFTEST AG" },
+ { 0x1DCC, "Document Capture Technologies, Inc." },
+ { 0x1DCD, "HIN KUI MACHINE & METAL INDUSTRIAL CO., LTD." },
+ { 0x1DCE, "SIMTEC Elektronik GmbH" },
+ { 0x1DCF, "INVIX Co., Ltd." },
+ { 0x1DD0, "ABB AS, Division Automation Products" },
+ { 0x1DD1, "EFJohnson" },
+ { 0x1DD2, "LEO BODNAR" },
+ { 0x1DD3, "Dajac, Inc." },
+ { 0x1DD4, "ARMELIN WIDGET CORPORATION" },
+ { 0x1DD5, "MetaGeek, LLC" },
+ { 0x1DD6, "Solomon Technology Corp." },
+ { 0x1DD7, "REDMERE TECHNOLOGY" },
+ { 0x1DD8, "BUFFALO KOKUYO SUPPLY INC." },
+ { 0x1DD9, "EFFICERE TECHNOLOGIES" },
+ { 0x1DDA, "TA Instruments" },
+ { 0x1DDB, "Abon Touchsystems Inc." },
+ { 0x1DDC, "id Quantique" },
+ { 0x1DDD, "DOKING ELECTRONIC TECHNOLOGY CO., LTD." },
+ { 0x1DDE, "TridonicAtco" },
+ { 0x1DDF, "L&T Technology Services" },
+ { 0x1DE0, "Shenzhen Excelstor Technology Ltd." },
+ { 0x1DE1, "Actions Microelectronics Co., Ltd." },
+ { 0x1DE2, "ENTERY INDUSTRIAL CO., LTD." },
+ { 0x1DE3, "SHENZHEN REX ELECTRONICS CO., LTD." },
+ { 0x1DE4, "DAEWOO ELECTRONICS CORPORATION" },
+ { 0x1DE5, "AMONTEC" },
+ { 0x1DE6, "MICRORISC S.R.O." },
+ { 0x1DE7, "MIDAS TECHNOLOGY" },
+ { 0x1DE8, "Applied Systems Engineering, Inc." },
+ { 0x1DE9, "Seco Technology Co., Ltd." },
+ { 0x1DEA, "Yesin Electronics Technology Co., Ltd." },
+ { 0x1DEB, "SHIUH CHI PRECISION INDUSTRY CO., LTD." },
+ { 0x1DEC, "HAGER CONTROLS SAS" },
+ { 0x1DED, "COOLIT SYSTEMS, INC." },
+ { 0x1DEE, "JCM II, Inc." },
+ { 0x1DEF, "KYOTO KAGAKU CO., LTD." },
+ { 0x1DF0, "TRICKLESTAR LIMITED" },
+ { 0x1DF1, "HUATIANYUAN ELECTRONIC INDUSTRY CO., LTD." },
+ { 0x1DF2, "China Telecommunication Technology Labs - Terminals" },
+ { 0x1DF3, "CRESYN CO., LTD." },
+ { 0x1DF4, "SHEN ZHEN FORMAN PRECISION INDUSTRY CO., LTD." },
+ { 0x1DF5, "Universal Remote Control, Inc." },
+ { 0x1DF6, "TakeMS International AG" },
+ { 0x1DF7, "Mirics Semiconductor Ltd." },
+ { 0x1DF8, "The Charles Machine Works, Inc." },
+ { 0x1DF9, "Komax AG" },
+ { 0x1DFA, "BLOCKMASTER AB" },
+ { 0x1DFB, "marco Systemanalyse und Entwicklung GmbH" },
+ { 0x1DFC, "YUNNAN NANTIAN ELECTRONICS INFORMATION CO., LTD." },
+ { 0x1DFD, "Quality Thermistor, Inc." },
+ { 0x1DFE, "BEDA Precision" },
+ { 0x1DFF, "InfraRed Integrated Systems Ltd." },
+ { 0x1E00, "Jupiter Systems" },
+ { 0x1E01, "Dynalloy, Inc." },
+ { 0x1E02, "GLOBEMASTER TECHNOLOGIES CO., LTD." },
+ { 0x1E03, "OXFORD INSTRUMENTS ANALYTICAL OY" },
+ { 0x1E04, "Coolsand Technologies (Hong Kong) Ltd." },
+ { 0x1E05, "Microtronic AG" },
+ { 0x1E06, "Moore Industries International" },
+ { 0x1E07, "GETA ELECTRONICS (DONG GUAN) CO., LTD." },
+ { 0x1E08, "Inventure, Inc." },
+ { 0x1E09, "Baldwin Boxall Communication Ltd." },
+ { 0x1E0A, "NOX Medical" },
+ { 0x1E0B, "TUBITAK UEKAE" },
+ { 0x1E0C, "NATIONAL HYBRID, INC." },
+ { 0x1E0D, "NEOWAVE" },
+ { 0x1E0E, "SHANGHAI BASECOM LTD." },
+ { 0x1E0F, "mSilica Inc." },
+ { 0x1E10, "FLIR Integrated Imaging Solutions" },
+ { 0x1E11, "Hoya Xponent" },
+ { 0x1E12, "OCTRIAN" },
+ { 0x1E13, "Burgundy Electric, LLC" },
+ { 0x1E14, "YANtide Corporation" },
+ { 0x1E15, "mStation" },
+ { 0x1E16, "SMARTIO" },
+ { 0x1E17, "Mirion Technologies Inc." },
+ { 0x1E18, "MIGHT Co., Ltd." },
+ { 0x1E19, "Torus Networks Co., Ltd." },
+ { 0x1E1A, "HITEC RCD KOREA" },
+ { 0x1E1B, "e-Practical Solutions" },
+ { 0x1E1C, "CMS PRODUCTS" },
+ { 0x1E1D, "Kanguru Solutions" },
+ { 0x1E1E, "Trans New Technology, Inc." },
+ { 0x1E1F, "INVIA" },
+ { 0x1E20, "JDSU" },
+ { 0x1E21, "NEONUMERIC" },
+ { 0x1E22, "LEDCO" },
+ { 0x1E23, "Aeronix, Inc." },
+ { 0x1E24, "Cine-tal Systems, Inc." },
+ { 0x1E25, "3M Cogent, Inc." },
+ { 0x1E26, "Multi Channel Systems MCS GmbH" },
+ { 0x1E27, "NASA / Johnson Space Center / EV2" },
+ { 0x1E28, "Raptor Innovations International" },
+ { 0x1E29, "Festo AG & Co. KG" },
+ { 0x1E2A, "NANOFORTI INC." },
+ { 0x1E2B, "3M CMD (Communication Markets Division)" },
+ { 0x1E2C, "KRONIK ELEKTRONIK SANAYI VETICARET LIMITED SIRKETI" },
+ { 0x1E2D, "Cinterion Wireless Modules GmbH" },
+ { 0x1E2E, "Syrinx Industrial Electronics b.v." },
+ { 0x1E2F, "Celrun Co., Ltd." },
+ { 0x1E30, "Kohler Co." },
+ { 0x1E31, "Greatbatch" },
+ { 0x1E32, "Opti-Sciences, Inc." },
+ { 0x1E33, "KOBIAN CANADA INC." },
+ { 0x1E34, "Sensory, Inc." },
+ { 0x1E35, "BELLING Co., Ltd." },
+ { 0x1E36, "Insulet Corporation" },
+ { 0x1E37, "Rehoboth Tech. Co., Ltd." },
+ { 0x1E38, "QRS Music Technologies Inc." },
+ { 0x1E39, "YIS Corporation" },
+ { 0x1E3A, "Continental Automotive Systems Inc." },
+ { 0x1E3B, "MICROBIT 2.0 AB" },
+ { 0x1E3C, "Vapor Bus Int'l Div of Westinghouse Air Brake Tech Corp" },
+ { 0x1E3D, "Chipsbrand Technologies (HK) Co., Limited" },
+ { 0x1E3E, "EMS Aviation" },
+ { 0x1E3F, "JJ Keller & Associates Inc." },
+ { 0x1E40, "SciLog, Inc." },
+ { 0x1E41, "Cleverscope Ltd." },
+ { 0x1E42, "SSE GmbH" },
+ { 0x1E43, "Sagem Mobiles" },
+ { 0x1E44, "SHIMANO INC." },
+ { 0x1E45, "TADANO LTD." },
+ { 0x1E46, "Danfoss A/S" },
+ { 0x1E47, "HUNG TA H.T.ENTERPRISE CO., LTD." },
+ { 0x1E48, "LABAU Technology" },
+ { 0x1E49, "FES LLC" },
+ { 0x1E4A, "CHIRON TECHNOLOGY LTD." },
+ { 0x1E4B, "exxact GmbH" },
+ { 0x1E4C, "Stereotaxis, Inc." },
+ { 0x1E4D, "BST International GmbH" },
+ { 0x1E4E, "Etron Technology, Inc." },
+ { 0x1E4F, "SECOM Co., Ltd." },
+ { 0x1E50, "VILTECHMEDA UAB" },
+ { 0x1E51, "DiMoto" },
+ { 0x1E52, "SZ TELSTAR CO., LTD." },
+ { 0x1E53, "WYPLAY" },
+ { 0x1E54, "TypeMatrix Inc." },
+ { 0x1E55, "Memorysolution GmbH" },
+ { 0x1E56, "EURINTEL" },
+ { 0x1E57, "Bundesdruckerei GmbH" },
+ { 0x1E58, "Horner APG" },
+ { 0x1E59, "inTera Tecnologia" },
+ { 0x1E5A, "VOXTRONIC TECHNOLOGY" },
+ { 0x1E5B, "APRICO A/S" },
+ { 0x1E5C, "Enova Technology Corp." },
+ { 0x1E5D, "SAT Corporation" },
+ { 0x1E5E, "Touch International" },
+ { 0x1E5F, "Relpol SA" },
+ { 0x1E60, "SEA Signalisation" },
+ { 0x1E61, "Anoto AB" },
+ { 0x1E62, "Uriver Inc." },
+ { 0x1E63, "DRAEGER MEDICAL" },
+ { 0x1E64, "IMSTORAGE CO., LTD." },
+ { 0x1E65, "THE BOEING CO." },
+ { 0x1E66, "KAPSYS" },
+ { 0x1E67, "Orban/CRL Systems, Inc." },
+ { 0x1E68, "TrekStor GmbH & Co. KG" },
+ { 0x1E69, "Hormann Funkwerk Kolleda GmbH" },
+ { 0x1E6A, "RGB Spectrum" },
+ { 0x1E6B, "iRex Technologies B.V." },
+ { 0x1E6C, "Sureshotgps Pty. Ltd." },
+ { 0x1E6D, "WAN SHIH ELECTRONIC (H.K.) CO., LTD." },
+ { 0x1E6E, "F&D Feinwerk-Und Drucktechnik GmbH" },
+ { 0x1E6F, "Images Scientific Instruments Inc." },
+ { 0x1E70, "POSBRO Inc." },
+ { 0x1E71, "NZXT Corporation" },
+ { 0x1E72, "Federal Signal Corporation" },
+ { 0x1E73, "COMLINK ELECTRONICS CO., LTD." },
+ { 0x1E74, "COBY COMMUNICATIONS, LIMITED" },
+ { 0x1E75, "TLS Communication GmbH" },
+ { 0x1E76, "Proview Technology (Shenzhen) Co., Ltd." },
+ { 0x1E77, "Core Micro Technology Inc." },
+ { 0x1E78, "Flextronics R & D (Shenzhen) Co., Ltd." },
+ { 0x1E79, "ISA Co., Ltd." },
+ { 0x1E7A, "The Tsurumi-Seiki Company, Limited" },
+ { 0x1E7B, "Zurich Instruments AG" },
+ { 0x1E7C, "biostep GmbH" },
+ { 0x1E7D, "ROCCAT GmbH" },
+ { 0x1E7E, "Bright Star Engineering Inc." },
+ { 0x1E7F, "NEXS ELECTRONIC CORP." },
+ { 0x1E80, "InterDigital Communications LLC" },
+ { 0x1E81, "KIDS PREFERRED, LLC." },
+ { 0x1E82, "Nortech Systems" },
+ { 0x1E83, "AMICUS WIRELESS" },
+ { 0x1E84, "VIVAX CORPORATION" },
+ { 0x1E85, "Gigaset Communications GmbH" },
+ { 0x1E86, "Japan Meditech Co., Ltd." },
+ { 0x1E87, "W&W Communications Inc." },
+ { 0x1E88, "GBS Laboratories, LLC" },
+ { 0x1E89, "Vtion Information Technology (Fujian) Co., Ltd." },
+ { 0x1E8A, "HIBEST Electronic (DongGuan) Co., Ltd." },
+ { 0x1E8B, "ImTech, Inc." },
+ { 0x1E8C, "Data Conversion Systems Ltd." },
+ { 0x1E8D, "HIGHVOLT Prueftechnik Dresden GmbH" },
+ { 0x1E8E, "EADS Secure Networks" },
+ { 0x1E8F, "PublicSolution GmbH" },
+ { 0x1E90, "Mego Afek" },
+ { 0x1E91, "Other World Computing" },
+ { 0x1E92, "Beyond Question Learning Technologies, Inc." },
+ { 0x1E93, "GSI Group" },
+ { 0x1E94, "RealD" },
+ { 0x1E95, "DIRECTV, Inc." },
+ { 0x1E96, "BlueAnt Wireless" },
+ { 0x1E97, "TOMMYCA HONG KONG LIMITED" },
+ { 0x1E98, "COMPASS SYSTEMS CORP." },
+ { 0x1E99, "General Dynamics C4 Systems" },
+ { 0x1E9A, "MANTHAN SEMICONDUCTOR PVT. LTD." },
+ { 0x1E9B, "Netcom Sicherheitstechnik GmbH" },
+ { 0x1E9C, "FirstPaper, LLC" },
+ { 0x1E9D, "GEOTEST AG" },
+ { 0x1E9E, "InnoSys Inc." },
+ { 0x1E9F, "Chase Peabody and Associates, Inc." },
+ { 0x1EA0, "DiabloSport, Inc." },
+ { 0x1EA1, "NANOBASE" },
+ { 0x1EA2, "N.V. Nederlandsche Apparatenfabriek Nedap" },
+ { 0x1EA3, "Concraft Holding Co., Ltd." },
+ { 0x1EA4, "MOBILE SYSTEM TECHNOLOGIES INC." },
+ { 0x1EA5, "CEN LINK CO., LTD." },
+ { 0x1EA6, "novero GmbH" },
+ { 0x1EA7, "SEMITEK INTERNATIONAL (HK) HOLDING LTD." },
+ { 0x1EA8, "Shenzhen Excelsecu Data Technology Co., Ltd." },
+ { 0x1EA9, "ANDERS ELECTRONICS PLC" },
+ { 0x1EAA, "Zeebo, Inc." },
+ { 0x1EAB, "Fujian Newland Auto-ID Tech. Co., Ltd." },
+ { 0x1EAC, "Thinkware Systems" },
+ { 0x1EAD, "Industrial Control Communications, Inc." },
+ { 0x1EAE, "YESCNC CO., LTD." },
+ { 0x1EAF, "Continental Trading GmbH" },
+ { 0x1EB0, "Centers for Disease Control & Prevention (CDC)" },
+ { 0x1EB1, "Kramer Electronics Ltd." },
+ { 0x1EB2, "IWAKI CO., LTD." },
+ { 0x1EB3, "SAE MAGNETICS (HK) LTD." },
+ { 0x1EB4, "YuhDing Precision Industry (KunShan) Co., Ltd." },
+ { 0x1EB5, "Diablo Technologies Inc." },
+ { 0x1EB6, "PHYLINKS LIMITED" },
+ { 0x1EB7, "WIN WIN PRECISION INDUSTRIAL CO., LTD." },
+ { 0x1EB8, "MODACOM CO., LTD." },
+ { 0x1EB9, "Campbell Scientific Inc." },
+ { 0x1EBA, "HITTITE MICROWAVE CORP." },
+ { 0x1EBB, "NuCORE Technology, Inc." },
+ { 0x1EBC, "Beijing Novel-Super Media Investment Co., Ltd." },
+ { 0x1EBD, "Wireless Matrix Corp." },
+ { 0x1EBE, "Qwizdom, Inc." },
+ { 0x1EBF, "Yulong Computer Telecommunication Scientific" },
+ { 0x1EC0, "VIGORHOOD PHOTOELECTRIC SHENZHEN CO., LTD." },
+ { 0x1EC1, "PROTEK DEVICES" },
+ { 0x1EC2, "CHUO ELECTRONICS CO., LTD." },
+ { 0x1EC3, "ANDREAS STIHL AG & Co. KG" },
+ { 0x1EC4, "ELTRONIC SOLUTION A/S" },
+ { 0x1EC5, "SIDSA" },
+ { 0x1EC6, "PHYWORKS LTD." },
+ { 0x1EC7, "Gefen Inc." },
+ { 0x1EC8, "TelePath Technologies Co., Ltd." },
+ { 0x1EC9, "MOSER BAER INDIA LIMITED" },
+ { 0x1ECA, "Mintpass Co., Ltd." },
+ { 0x1ECB, "Advanced Mobile Telecom Co., Ltd." },
+ { 0x1ECC, "Enfora, Inc." },
+ { 0x1ECD, "Alverix Inc." },
+ { 0x1ECE, "MyungMin Systems, Inc." },
+ { 0x1ECF, "MDR Grup S.R.L." },
+ { 0x1ED0, "Hirschmann Car Communication GmbH" },
+ { 0x1ED1, "DIGITAL CHINA NETWORKS (BEIJING) LIMITED" },
+ { 0x1ED2, "Crevis Co., Ltd." },
+ { 0x1ED3, "Forsis GmbH" },
+ { 0x1ED4, "Transwitch (Israel) Ltd." },
+ { 0x1ED5, "LLC GlobalTest" },
+ { 0x1ED6, "adidas International" },
+ { 0x1ED7, "Headplay, Inc." },
+ { 0x1ED8, "Fender Musical Instruments Corp." },
+ { 0x1ED9, "ALBUMteam, Ltd." },
+ { 0x1EDA, "AIRTIES WIRELESS NETWORKS" },
+ { 0x1EDB, "BLACKMAGIC DESIGN PTY." },
+ { 0x1EDC, "B-DeltaCom" },
+ { 0x1EDD, "IRIDIUM SATELLITE LLC" },
+ { 0x1EDE, "steute Schaltgerate GmbH & Co. KG" },
+ { 0x1EDF, "Selectwireless Co., Ltd." },
+ { 0x1EE0, "KYUDEN TECHNOSYSTEMS CORPORATION" },
+ { 0x1EE1, "Matrix Key Inc." },
+ { 0x1EE2, "NOVA GAMING" },
+ { 0x1EE3, "3D INNOVATIONS, LLC" },
+ { 0x1EE4, "Luff Technology Co., Ltd." },
+ { 0x1EE5, "Spring Soft K.K." },
+ { 0x1EE6, "SHENZHEN EVERWIN PRECISION TECHNOLOGY CO., LTD." },
+ { 0x1EE7, "EPCOS" },
+ { 0x1EE8, "ONDA COMMUNICATION S.p.a." },
+ { 0x1EE9, "PC PARTNER LIMITED" },
+ { 0x1EEA, "Yullin Technologies Co., Ltd." },
+ { 0x1EEB, "GEOTATE" },
+ { 0x1EEC, "CTC Analytics AG" },
+ { 0x1EED, "Helo Oy / Helo Ltd." },
+ { 0x1EEE, "RigiSystems AG" },
+ { 0x1EEF, "I.C.Y. B.V." },
+ { 0x1EF0, "Thunder Tiger Corp." },
+ { 0x1EF1, "PQ Computing Ltd." },
+ { 0x1EF2, "Vircion Inc." },
+ { 0x1EF3, "JIANGXI SHIP ELECTRONICS CO., LTD." },
+ { 0x1EF4, "TATA ELXSI LTD." },
+ { 0x1EF5, "Impinj, Inc." },
+ { 0x1EF6, "EADS Deutschland GmbH" },
+ { 0x1EF7, "ZiiLABS Ltd." },
+ { 0x1EF8, "CRITICAL LINK, LLC" },
+ { 0x1EF9, "US Army Electronic Proving Ground" },
+ { 0x1EFA, "SEIKO Precision Inc." },
+ { 0x1EFB, "IMI Hydronic Engineering International SA" },
+ { 0x1EFC, "IMOGEN STUDIO" },
+ { 0x1EFD, "ROFIN-SINAR LASER GMBH" },
+ { 0x1EFE, "Sound Design Technologies" },
+ { 0x1EFF, "Kinemetrics, Inc." },
+ { 0x1F00, "YUEQING ZHONGLI COMPUTER ELECTRONICS CO., LTD." },
+ { 0x1F01, "Geo Studio Technology" },
+ { 0x1F02, "Australian National University" },
+ { 0x1F03, "PTW Freiburg GmbH" },
+ { 0x1F04, "Watlow" },
+ { 0x1F05, "Kyosai Technos Co., Ltd." },
+ { 0x1F06, "K.T.E.-Keter Technologies Europe" },
+ { 0x1F07, "OPTOQUEST Co., Ltd." },
+ { 0x1F08, "Digital Ally Inc." },
+ { 0x1F09, "DURAG GmbH" },
+ { 0x1F0A, "AUROX Ltd." },
+ { 0x1F0B, "INTRONIX TEST INSTURMENTS, INC." },
+ { 0x1F0C, "Fourier Systems Ltd." },
+ { 0x1F0D, "NAMOS" },
+ { 0x1F0E, "Inflexis Corporation" },
+ { 0x1F0F, "Action Technology (SZ) Co., Ltd." },
+ { 0x1F10, "LTW TECHNOLOGY CO., LTD." },
+ { 0x1F11, "VIRAGE LOGIC" },
+ { 0x1F12, "Photometrics" },
+ { 0x1F13, "CENTURY SYSTEMS Co., Ltd." },
+ { 0x1F14, "Astoria Networks GmbH" },
+ { 0x1F15, "Schmitt Industries Inc." },
+ { 0x1F16, "Olidata SpA" },
+ { 0x1F17, "APIS Device, Inc." },
+ { 0x1F18, "Teseq GmbH" },
+ { 0x1F19, "POLATIS INC." },
+ { 0x1F1A, "Sanden Retail Systems Corporation" },
+ { 0x1F1B, "NORTHROP GRUMMAN SPERRY MARINE" },
+ { 0x1F1C, "LXE, INC." },
+ { 0x1F1D, "How Weih Precision Technology (Shenzhen) Co., Ltd." },
+ { 0x1F1E, "TSIEN (UK) LTD." },
+ { 0x1F1F, "RaaX Co., Ltd." },
+ { 0x1F20, "Shenzhen Tenwei Electronics Co., Ltd." },
+ { 0x1F21, "Scosche Industries" },
+ { 0x1F22, "STAr Technologies, Inc." },
+ { 0x1F23, "KOUEI SYSTEM, LTD." },
+ { 0x1F24, "EBTRON INC." },
+ { 0x1F25, "Victron Energy B.V." },
+ { 0x1F26, "INCAP GmbH" },
+ { 0x1F27, "KEE Action Sports (Hater Paintball)" },
+ { 0x1F28, "Cal-Comp Electronics & Communications" },
+ { 0x1F29, "Analogix Semiconductor, Inc." },
+ { 0x1F2A, "Scene Double Ltd." },
+ { 0x1F2B, "JUKI CORPORATION" },
+ { 0x1F2C, "SELESTA INGEGNERIA SPA" },
+ { 0x1F2D, "Liteye Systems, Inc." },
+ { 0x1F2E, "ARMOUR GROUP PLC." },
+ { 0x1F2F, "UPOS SYSTEM SP. Z O.O." },
+ { 0x1F30, "RENA GmbH" },
+ { 0x1F31, "SASKEN COMMUNICATION TECH LTD." },
+ { 0x1F32, "COCHLEAR TECHNOLOGY CENTRE BELGIUM" },
+ { 0x1F33, "GrupoPIE Portugal, S.A." },
+ { 0x1F34, "Dutronics" },
+ { 0x1F35, "Amphenol ShouhMin Industry (ShenZhen) Co., Ltd" },
+ { 0x1F36, "ddm hopt + schuler GmbH & Co. KG" },
+ { 0x1F37, "Next Step Solutions Limited" },
+ { 0x1F38, "Kesumo, LLC" },
+ { 0x1F39, "Sumitomo Electric Networks, Inc." },
+ { 0x1F3A, "Allwinner Technology Co., Ltd." },
+ { 0x1F3B, "Biocryptodisk Sdn Bhd" },
+ { 0x1F3C, "Chang Yang Electronics Company Ltd." },
+ { 0x1F3D, "Advanced Engineering Services Co., Ltd." },
+ { 0x1F3E, "Telenot Electronic GmbH" },
+ { 0x1F3F, "SECA GmbH & Co. KG" },
+ { 0x1F40, "JiangSu Dongda Integrated Circuits Sys. Eng. Tech. Co." },
+ { 0x1F41, "Nipro Diagnostics, Inc" },
+ { 0x1F42, "ID2P TECHNOLOGIES, INC." },
+ { 0x1F43, "RAPID BRIDGE LLC" },
+ { 0x1F44, "Digital Business Process (dba: The Neat Company)" },
+ { 0x1F45, "QUALCOMM ENTERPRISE SERVICES" },
+ { 0x1F46, "Gener8, Inc." },
+ { 0x1F47, "Orb Networks, Inc." },
+ { 0x1F48, "H-TRONIC GmbH" },
+ { 0x1F49, "Exelis, Inc." },
+ { 0x1F4A, "Key Ingredient Corporation" },
+ { 0x1F4B, "Precision System Science Co., Ltd." },
+ { 0x1F4C, "Cyber Sport Pty., Ltd." },
+ { 0x1F4D, "SHENZHEN GENIATECH INC., LTD." },
+ { 0x1F4E, "OFF-NET SERVICE LIMITED" },
+ { 0x1F4F, "EXAR CORPORATION - JAPAN" },
+ { 0x1F50, "KEMPPI OY" },
+ { 0x1F51, "Helmut Hund GmbH" },
+ { 0x1F52, "Systems & Electronic Development FZCO (SEDCO)" },
+ { 0x1F53, "SK telesys" },
+ { 0x1F54, "LOEC, INC." },
+ { 0x1F55, "Fujitsu Electronics Europe GmbH" },
+ { 0x1F56, "MUT" },
+ { 0x1F57, "PIGNOLO S.P.A." },
+ { 0x1F58, "Inmarsat" },
+ { 0x1F59, "EL.MO. S.P.A." },
+ { 0x1F5A, "Micronova srl." },
+ { 0x1F5B, "KYODO COMMUNICATIONS & ELECTRONICS INC." },
+ { 0x1F5C, "MIDORI ANZEN CO., LTD." },
+ { 0x1F5D, "Mobii Systems (Pty) Ltd." },
+ { 0x1F5E, "Johnson Outdoors Marine Electronics, Inc." },
+ { 0x1F5F, "NETCLEUS SYSTEMS Corporation" },
+ { 0x1F60, "Young at Heart International Ltd." },
+ { 0x1F61, "Flexocard GmbH" },
+ { 0x1F62, "Elquest Corporation" },
+ { 0x1F63, "IriTech, Inc." },
+ { 0x1F64, "actionXL, Inc." },
+ { 0x1F65, "Taylor Technologies, Co., Ltd." },
+ { 0x1F66, "Hokkaido Electronics Corporation" },
+ { 0x1F67, "MICRO INNOVATIONS CORP." },
+ { 0x1F68, "General Dynamics UK Limited" },
+ { 0x1F69, "NVIS, Inc." },
+ { 0x1F6A, "AJA VIDEO SYSTEMS INC." },
+ { 0x1F6B, "Muve, Inc." },
+ { 0x1F6C, "Cadex Electronics Inc." },
+ { 0x1F6D, "AMTI" },
+ { 0x1F6E, "AccuVein LLC" },
+ { 0x1F6F, "ALIPHCOM, INC." },
+ { 0x1F70, "MKD Technology Inc." },
+ { 0x1F71, "Huaya Microelectronics (HK) Ltd." },
+ { 0x1F72, "GM INSTRUMENTS LTD." },
+ { 0x1F73, "Record4Free.TV AG" },
+ { 0x1F74, "UNISTO Ltd." },
+ { 0x1F75, "Innostor Co., Ltd." },
+ { 0x1F76, "CYBER-RAIN, INC." },
+ { 0x1F77, "POSITRON PUBLIC SAFETY SYSTEMS" },
+ { 0x1F78, "UNION TOOL CO." },
+ { 0x1F79, "Rosen Technology and Research Center GmbH" },
+ { 0x1F7A, "WhiteOak Controls Inc." },
+ { 0x1F7B, "AVMAP SRL" },
+ { 0x1F7C, "Voltopia e.U." },
+ { 0x1F7D, "UNICARD S.A." },
+ { 0x1F7E, "Canon India Private Limited" },
+ { 0x1F7F, "NOVA Sensors" },
+ { 0x1F80, "MagicPixel Inc." },
+ { 0x1F81, "HYB D.O.O." },
+ { 0x1F82, "TANDBERG TELECOM AS" },
+ { 0x1F83, "Beauty Up Co., Ltd." },
+ { 0x1F84, "Inverness Medical Innovations, Inc." },
+ { 0x1F85, "Netronix Inc." },
+ { 0x1F86, "Skyworth Overseas Development Limited" },
+ { 0x1F87, "STANTUM" },
+ { 0x1F88, "Modu Ltd." },
+ { 0x1F89, "Dongguan Goldconn Electronics Co., Ltd." },
+ { 0x1F8A, "Morning Star Industrial Co., Ltd." },
+ { 0x1F8B, "Rittal GmbH & Co. KG" },
+ { 0x1F8C, "Reference, LLC." },
+ { 0x1F8D, "DEVICE FUNCTIONS" },
+ { 0x1F8E, "SENSE INSIDE GmbH" },
+ { 0x1F8F, "Narda Safety Test Solutions GmbH" },
+ { 0x1F90, "PURE TECHNOLOGIES" },
+ { 0x1F91, "Wilhelm Mikroelektronik GmbH" },
+ { 0x1F92, "INTERNATIONAL TECHNIDYNE CORP." },
+ { 0x1F93, "Alcohol Monitoring Systems, Inc." },
+ { 0x1F94, "Microhard Systems Inc." },
+ { 0x1F95, "Art of Technology AG" },
+ { 0x1F96, "Ascend Geo, LLC" },
+ { 0x1F97, "OZMO, INC. DBA OZMO DEVICES" },
+ { 0x1F98, "DSP Design Limited" },
+ { 0x1F99, "TOKAI RIKEN CO., LTD." },
+ { 0x1F9A, "Barron Associates, Inc." },
+ { 0x1F9B, "UBIQUITI Networks, Inc." },
+ { 0x1F9C, "ARVOO Engineering BV" },
+ { 0x1F9D, "Tri Works" },
+ { 0x1F9E, "MUTECH LIMITED" },
+ { 0x1F9F, "CasaTools, LLC" },
+ { 0x1FA0, "XLNT IDEA, INC." },
+ { 0x1FA1, "Curtis Instruments, Inc." },
+ { 0x1FA2, "AMETEK DENMARK A/S" },
+ { 0x1FA3, "LAIRD TECHNOLOGIES" },
+ { 0x1FA4, "BRIDGEPORT INSTRUMENTS, LLC" },
+ { 0x1FA5, "DELTA DORE" },
+ { 0x1FA6, "Daylight Solutions, Inc." },
+ { 0x1FA7, "COSMOS WEB CO., LTD." },
+ { 0x1FA8, "TCL Technoly Electronics (Hui Zhou) Co., Ltd." },
+ { 0x1FA9, "Digital Information Technologies Corporation" },
+ { 0x1FAA, "Zhong Shan City Li Tai Electronic Industrial Co., Ltd." },
+ { 0x1FAB, "SAMSUNG DIGITAL IMAGING CO., LTD." },
+ { 0x1FAC, "Franklin Technology Inc." },
+ { 0x1FAD, "Cresta Technology Inc." },
+ { 0x1FAE, "Lumidigm, Inc." },
+ { 0x1FAF, "Weintek Labs, Inc." },
+ { 0x1FB0, "Discera, Inc." },
+ { 0x1FB1, "Weatronic GmbH" },
+ { 0x1FB2, "WITHINGS" },
+ { 0x1FB3, "Matchbeeper AB" },
+ { 0x1FB4, "Owl Computing Technologies, Inc." },
+ { 0x1FB5, "Unify Software and Solutions GmbH & Co. KG" },
+ { 0x1FB6, "SheKel" },
+ { 0x1FB7, "J & D Tech Co., Ltd." },
+ { 0x1FB8, "DORMA TIME + ACCESS GmbH" },
+ { 0x1FB9, "Lake Shore Cryotronics, Inc." },
+ { 0x1FBA, "DERMALOG Identification Systems GmbH" },
+ { 0x1FBB, "PC Worth Int'l Co., Ltd." },
+ { 0x1FBC, "Kurzweil Education Systems, Inc." },
+ { 0x1FBD, "STACK LTD." },
+ { 0x1FBE, "CGS" },
+ { 0x1FBF, "OVAL Corporation" },
+ { 0x1FC0, "JUNE-ON Co., Ltd." },
+ { 0x1FC1, "Blue Chip Technology Limited" },
+ { 0x1FC2, "Poken SA" },
+ { 0x1FC3, "ICOP Digital, Inc." },
+ { 0x1FC4, "Alfons Haar Maschinenbau GmbH & Co. KG" },
+ { 0x1FC5, "Adaxys Solutions AG" },
+ { 0x1FC6, "LAUREL BANK MACHINES CO., LTD." },
+ { 0x1FC7, "mrs GmbH" },
+ { 0x1FC8, "Medis Technologies Ltd." },
+ { 0x1FC9, "NXP Semiconductors" },
+ { 0x1FCA, "ON TIM Technologies Ltd." },
+ { 0x1FCB, "Thermo Process Instruments" },
+ { 0x1FCC, "Hiro" },
+ { 0x1FCD, "Aurora Scientific Inc." },
+ { 0x1FCE, "WEBSCAN Inc." },
+ { 0x1FCF, "ACK Co., Ltd." },
+ { 0x1FD0, "GILSON S.A.S." },
+ { 0x1FD1, "TEKWorx Limited" },
+ { 0x1FD2, "LG Display Co., Ltd." },
+ { 0x1FD3, "ASK SA" },
+ { 0x1FD4, "FINSECUR" },
+ { 0x1FD5, "Dream Multimedia GmbH" },
+ { 0x1FD6, "Logitek Electronic Systems, Inc." },
+ { 0x1FD7, "ASELSAN Elektronik Sanayi ve Ticaret. A.S." },
+ { 0x1FD8, "Guangzhou Tianhe Changjiang Communication Industrial Co" },
+ { 0x1FD9, "Knox Company" },
+ { 0x1FDA, "Beckwith Electric Co., Inc." },
+ { 0x1FDB, "Delphin Technology AG" },
+ { 0x1FDC, "HOSA TECHNOLOGY, INC." },
+ { 0x1FDD, "CHASE GLORY INDUSTRIAL LTD." },
+ { 0x1FDE, "ILX Lightwave" },
+ { 0x1FDF, "SEPURA PLC" },
+ { 0x1FE0, "REALFLEET Co., Ltd." },
+ { 0x1FE1, "Ubixum, Inc." },
+ { 0x1FE2, "Aetas Systems Inc." },
+ { 0x1FE3, "Amaranthine, LLC" },
+ { 0x1FE4, "HANDY TECH ELEKTRONIK GmbH" },
+ { 0x1FE5, "KUKA Roboter GmbH" },
+ { 0x1FE6, "BOOKHAM INC." },
+ { 0x1FE7, "VERTEX WIRELESS CO., LTD." },
+ { 0x1FE8, "103mm Tech" },
+ { 0x1FE9, "Harvard Bioscience" },
+ { 0x1FEA, "SIMPLO TECHNOLOGY CO., LTD." },
+ { 0x1FEB, "Tecella" },
+ { 0x1FEC, "NIAN YEONG ENTERPRISE CO., LTD." },
+ { 0x1FED, "SYSACOM R&D Plus Inc." },
+ { 0x1FEE, "GALILEO ENGINEERING SRL" },
+ { 0x1FEF, "RESOL - Elektronische Regelungen GmbH" },
+ { 0x1FF0, "Kyoto Electronics Manufacturing Co., Ltd." },
+ { 0x1FF1, "Remote Operations Solutions" },
+ { 0x1FF2, "Carl Valentin GmbH" },
+ { 0x1FF3, "SINTEF Energy Research" },
+ { 0x1FF4, "HYUNDAI PETATEL INC." },
+ { 0x1FF5, "Changzhou Wujin BEST Electronic Cables Co., Ltd." },
+ { 0x1FF6, "ClickTech LLC" },
+ { 0x1FF7, "Guangzhou Shi Rui Electronics Co., Ltd." },
+ { 0x1FF8, "Infinite Memories" },
+ { 0x1FF9, "Schulze Elektronik GmbH" },
+ { 0x1FFA, "ARYGON Technologies AG" },
+ { 0x1FFB, "Pololu Corporation" },
+ { 0x1FFC, "Azimut Production Association JSC" },
+ { 0x1FFD, "TESSERA, INC." },
+ { 0x1FFE, "HOST ENGINEERING, INC." },
+ { 0x1FFF, "Ideofy Inc." },
+ { 0x2000, "RongTong Info & Tech Co., Ltd." },
+ { 0x2001, "D-Link Corporation" },
+ { 0x2002, "DAP Technologies Ltd." },
+ { 0x2003, "detectomat GmbH" },
+ { 0x2004, "Shanghai Bellmann Digital Source Co., Ltd." },
+ { 0x2005, "Balluff GmbH" },
+ { 0x2006, "Lenovo Mobile Communication Technology Ltd." },
+ { 0x2007, "LEYIO" },
+ { 0x2008, "ThingMagic, Inc." },
+ { 0x2009, "MPEDIA" },
+ { 0x200A, "ADVANCED RELAY CORP." },
+ { 0x200B, "TRANSISTOR DEVICES INC." },
+ { 0x200C, "HANPIN ELECTRON CO., LTD." },
+ { 0x200D, "Belkin Electronic (Changzhou) Co., Ltd." },
+ { 0x200E, "DAIICHI PARTS (HK) CO., LTD." },
+ { 0x200F, "Progind Srl" },
+ { 0x2010, "Tectonica Australia Pty. Ltd." },
+ { 0x2011, "SHENZHEN HEXIN COM. TECH. CO., LTD." },
+ { 0x2012, "Applied Radar, Inc." },
+ { 0x2013, "PCTV Systems" },
+ { 0x2014, "ONKEN CORPORATION" },
+ { 0x2015, "Shenzhen Ephone Communication Technology Co., Ltd." },
+ { 0x2016, "Norbit AS" },
+ { 0x2017, "NAL Research Corporation" },
+ { 0x2018, "SilverPAC, Inc." },
+ { 0x2019, "Electronics Development Corp." },
+ { 0x201A, "Vortran Laser Technology, Inc." },
+ { 0x201B, "1064138 Ontario Ltd. O/A UNI-TEC ELECTRONICS" },
+ { 0x201C, "Freeport Resources Enterprises Corp." },
+ { 0x201D, "Dongguan Shunhui Electronic Co., Ltd." },
+ { 0x201E, "Qingdao Haier Telecom Co., Ltd." },
+ { 0x201F, "W.E.M. INC." },
+ { 0x2020, "Shanghai BroadMobi Communication Technology Co., Ltd." },
+ { 0x2021, "Smartd ltd" },
+ { 0x2022, "AMICON Ltd." },
+ { 0x2023, "Berthold Technologies GmbH & Co. KG" },
+ { 0x2024, "Shoto Technologies LLC" },
+ { 0x2025, "NANOSENSE" },
+ { 0x2026, "EASUN REYROLLE LIMITED" },
+ { 0x2027, "LOAD SYSTEMS INTERNATIONAL, INC." },
+ { 0x2028, "DETAS TECHNOLOGY LTD." },
+ { 0x2029, "MYTRAK HEALTH SYSTEM INC." },
+ { 0x202A, "Fast Forward Video, Inc." },
+ { 0x202B, "Damalini AB" },
+ { 0x202C, "Enhanced Vision" },
+ { 0x202D, "Snowbush IP (a division of Gennum)" },
+ { 0x202E, "Lumio Inc." },
+ { 0x202F, "US ARMY RDECOM-ARDEC" },
+ { 0x2030, "VITEC Multimedia" },
+ { 0x2031, "Vistec AG" },
+ { 0x2032, "GFMesstechnik GmbH" },
+ { 0x2033, "WYMA Tecnologia Ltda." },
+ { 0x2034, "iSoft Silicon, Inc." },
+ { 0x2035, "seowonintech" },
+ { 0x2036, "Eitech Co., Ltd." },
+ { 0x2037, "Control Devices Australia Pty., Ltd." },
+ { 0x2038, "Wescor Inc." },
+ { 0x2039, "SE-Elektronic GmbH" },
+ { 0x203A, "Parallels, Inc." },
+ { 0x203B, "EIT, Inc." },
+ { 0x203C, "Steptechnica Co., Ltd." },
+ { 0x203D, "Encore Electronics" },
+ { 0x203E, "Pascher Instruments AB" },
+ { 0x203F, "WPG System Pte. Ltd." },
+ { 0x2040, "Hauppauge Computer Works, Inc." },
+ { 0x2041, "WILL BEST (ELECTRONICS) LTD." },
+ { 0x2042, "Eberspaecher Electronics GmbH & Co. KG" },
+ { 0x2043, "Mobius Microsystems" },
+ { 0x2044, "NOVUS PRODUTOS ELETRONICOS LTDA." },
+ { 0x2045, "EMH - Energie-Messtechnik GmbH" },
+ { 0x2046, "AbleNet Inc." },
+ { 0x2047, "Texas Instruments Incorporated (MSP430 Group)" },
+ { 0x2048, "Hongtech Electronics Co., Ltd." },
+ { 0x2049, "APACEWAVE TECHNOLOGIES" },
+ { 0x204A, "Enclustra GmbH" },
+ { 0x204B, "HANSHIN INFORMATION TECHNOLOGY INC." },
+ { 0x204C, "M7Lab., Co., Ltd." },
+ { 0x204D, "Orthodyne Electronics" },
+ { 0x204E, "LINO MANFROTTO + CO. S.P.A." },
+ { 0x204F, "VIDEOTEC SpA" },
+ { 0x2050, "CBF Systems, Inc." },
+ { 0x2051, "N.A.T. GmbH" },
+ { 0x2052, "Movidius Ltd." },
+ { 0x2053, "HANSHIN TERMINAL CO., LTD." },
+ { 0x2054, "Source R & D Inc. (DBA WARPIA)" },
+ { 0x2055, "Opti B. I. Communications, Ltd." },
+ { 0x2056, "CliniComp International Inc." },
+ { 0x2057, "DICE ELECTRONICS, LLC" },
+ { 0x2058, "NANO RIVER TECHNOLOGIES" },
+ { 0x2059, "SMART Temps LLC" },
+ { 0x205A, "Hankook Tire" },
+ { 0x205B, "TRUMPF Medizin Systeme GmbH" },
+ { 0x205C, "Shenzhen Tronixin Electronics Co., Ltd." },
+ { 0x205D, "RESMED LTD." },
+ { 0x205E, "CTI PRODUCTS, Inc." },
+ { 0x205F, "Capella Microsystems Inc." },
+ { 0x2060, "U.S. Army Aviation & Missile R & D & Engineering Center" },
+ { 0x2061, "FIGMENT DESIGN LABORATORIES" },
+ { 0x2062, "Trulife" },
+ { 0x2063, "AirMagnet Inc." },
+ { 0x2064, "Shenzhen AnNet Technology Co., Ltd." },
+ { 0x2065, "MEASUREMENT SPECIALTIES INC." },
+ { 0x2066, "Unicorn Electronics Components Co., Ltd." },
+ { 0x2067, "TSB LAO COMPANY LIMITED" },
+ { 0x2068, "Seven 45 Studios" },
+ { 0x2069, "Vanguard Rugged Storage, LLC" },
+ { 0x206A, "Fujian Star-net Communication Co., Ltd." },
+ { 0x206B, "CETIM" },
+ { 0x206C, "Seeker Technology Corp." },
+ { 0x206D, "Hunan GreatWall Information Financial Equipment Co.Ltd." },
+ { 0x206E, "ZAO MIRCOM" },
+ { 0x206F, "JTOUCH Corporation" },
+ { 0x2070, "Infinite Response, Inc." },
+ { 0x2071, "SYSTEM S.P.A." },
+ { 0x2072, "GOOD YEAR ELECTRONIC MFG. CO., LTD." },
+ { 0x2073, "Shenzhen R-Way Technology Co., Ltd." },
+ { 0x2074, "UNIVERSAL CHAMPION ELECTROACOUSTIC TECHNOLOGY COMPANY" },
+ { 0x2075, "SecureKey Technologies Inc." },
+ { 0x2076, "SHINKAWA Sensor Technology, Inc." },
+ { 0x2077, "Shenzhen Gongjin Electronics Co., Ltd." },
+ { 0x2078, "Epsilon Electronics, Inc dba Power Acoustik Electronics" },
+ { 0x2079, "New Concept Gaming Ltd." },
+ { 0x207A, "C.E.T.W.I.N System Solutions Sweden AB" },
+ { 0x207B, "Technetix Group Ltd." },
+ { 0x207C, "NESA International, Inc." },
+ { 0x207D, "CESI Technology Co., Ltd." },
+ { 0x207E, "ENHANCED VIDEO DEVICES, INC." },
+ { 0x207F, "Profound BV" },
+ { 0x2080, "Barnes and Noble" },
+ { 0x2081, "UTRONIX Elektronikutreckling AB" },
+ { 0x2082, "EKOMINI INC." },
+ { 0x2083, "XEL SOLUTIONS LTD." },
+ { 0x2084, "I Zone Technologies Co., Ltd." },
+ { 0x2085, "SIXENSE ENTERTAINMENT INC." },
+ { 0x2086, "SHENZHEN CATIC INFORMATION TECHNOLOGY INDUSTRY CO., LTD" },
+ { 0x2087, "Cando Corporation" },
+ { 0x2088, "WALTON CHAINTECH CORPORATION" },
+ { 0x2089, "microdrones GmbH" },
+ { 0x208A, "TECHNO ROAD Inc." },
+ { 0x208B, "KONTRON EMBEDDED COMPUTERS GmbH" },
+ { 0x208C, "Linkbit, Inc." },
+ { 0x208D, "Attero Tech, LLC" },
+ { 0x208E, "Luxshare-ICT" },
+ { 0x208F, "Chi Mei Optoelectronics Corporation" },
+ { 0x2090, "Transition Networks" },
+ { 0x2091, "Callpod, Inc." },
+ { 0x2092, "Logina" },
+ { 0x2093, "Ambu A/S" },
+ { 0x2094, "Yoostar Entertainment Group, Inc." },
+ { 0x2095, "CE LINK LIMITED" },
+ { 0x2096, "Shenzhen Microconn Investment and Development Co., Ltd." },
+ { 0x2097, "USBPARTNER" },
+ { 0x2098, "TouchTable, Inc." },
+ { 0x2099, "Systematic Development Group, LLC" },
+ { 0x209A, "Avedis Zildjian Company" },
+ { 0x209B, "SATEL OY" },
+ { 0x209C, "iPulse Systems" },
+ { 0x209D, "Vector Co., Ltd." },
+ { 0x209E, "GlideTV Inc." },
+ { 0x209F, "Alcolizer Technology" },
+ { 0x20A0, "Flirc" },
+ { 0x20A1, "BRAINZSQUARE CO., LTD." },
+ { 0x20A2, "SCANMATIK" },
+ { 0x20A3, "Sterilucent" },
+ { 0x20A4, "Itron Metering Solutions" },
+ { 0x20A5, "Cardiorobotics, Inc." },
+ { 0x20A6, "ZheJiang SEENSUN Communication&Electronic Equipment Co." },
+ { 0x20A7, "GREAT LUSTRE (SPEEDY) CO., LTD." },
+ { 0x20A8, "nLighten Technologies (Shanghai) Co., Ltd." },
+ { 0x20A9, "Autotronic Controls Corp." },
+ { 0x20AA, "ED-CONTRIVE Co., Ltd." },
+ { 0x20AB, "Identification International, Inc." },
+ { 0x20AC, "Wintek Corporation" },
+ { 0x20AD, "Japan Probe Co., Ltd." },
+ { 0x20AE, "SoCChip (Wuxi Youxin IC Design Co., Ltd.)" },
+ { 0x20AF, "Shenzhen CARVE Electronics Co., Ltd." },
+ { 0x20B0, "ICOMM TELE LIMITED" },
+ { 0x20B1, "XMOS Ltd." },
+ { 0x20B2, "Clubbhouse Inventions LLC" },
+ { 0x20B3, "Hannstouch Solution Inc." },
+ { 0x20B4, "SANDBRIDGE TECHNOLOGIES, INC." },
+ { 0x20B5, "ACD Gruppe" },
+ { 0x20B6, "Bohle AG" },
+ { 0x20B7, "Qi Hardware, Inc." },
+ { 0x20B8, "PARA INDUSTRIAL CO., LTD." },
+ { 0x20B9, "TLAY Technologies Co., Ltd." },
+ { 0x20BA, "jwin Electronics Corp." },
+ { 0x20BB, "THALES TRANSPORTATION SYSTEMS" },
+ { 0x20BC, "Guangzhou Pingzhong Electronic Technology Co., Ltd." },
+ { 0x20BD, "KETEK" },
+ { 0x20BE, "BURY GmbH & Co. KG" },
+ { 0x20BF, "Dwyer Instruments, Inc." },
+ { 0x20C0, "FENGHUA KINGSUN CO., LTD." },
+ { 0x20C1, "HARWIN ASIA PTE. LTD." },
+ { 0x20C2, "Sumitomo Electric Ind., Ltd., Optical Comm. R&D Lab" },
+ { 0x20C3, "TECNOMOTOR ELETRONICA DO BRASIL S/A" },
+ { 0x20C4, "Communications Laboratories, Inc. (Comlabs)" },
+ { 0x20C5, "A.U. Physics Enterprises" },
+ { 0x20C6, "Mutto Optronics Corporation" },
+ { 0x20C7, "HMC INTERNATIONAL" },
+ { 0x20C8, "CEC TELECOM CO., LTD." },
+ { 0x20C9, "SYSTEMCORP Pty., Ltd." },
+ { 0x20CA, "TRIPHOS Co., Ltd." },
+ { 0x20CB, "Dave Smith Instruments" },
+ { 0x20CC, "TAKARA" },
+ { 0x20CD, "Schweers Informationstechnologie GmbH" },
+ { 0x20CE, "Mini-Circuits" },
+ { 0x20CF, "Gridmark Limited" },
+ { 0x20D0, "FRESENIUS VIAL" },
+ { 0x20D1, "Dascom Europe GmbH" },
+ { 0x20D2, "ROBOTEQ INC." },
+ { 0x20D3, "Provo Craft" },
+ { 0x20D4, "SCDi" },
+ { 0x20D5, "Lenexpo Inc. (dba: Atlona)" },
+ { 0x20D6, "Bensussen Deutsch & Associates, Inc. (BDA)" },
+ { 0x20D7, "SHENZHEN ZILI ELECTRONICS CO. LTD." },
+ { 0x20D8, "Changzhou Xinchao Technologies, Inc." },
+ { 0x20D9, "ZHEJIANG YONGCHENGGONG DIANSU.CO., LTD." },
+ { 0x20DA, "LumaSense Technologies A/S" },
+ { 0x20DB, "KTS GmbH" },
+ { 0x20DC, "KCS Digital, Inc." },
+ { 0x20DD, "FORTREND TAIWAN SCIENTIFIC CORP." },
+ { 0x20DE, "OneSail HK Ltd." },
+ { 0x20DF, "SIMTEC ELECTRONICS" },
+ { 0x20E0, "Realway Electronics Technology Limited" },
+ { 0x20E1, "Daiichi Co., Ltd." },
+ { 0x20E2, "ASEQ INSTRUMENTS" },
+ { 0x20E3, "LAUDA DR.R.WOBSER GMBH & CO. KG" },
+ { 0x20E4, "Onecell Technologies" },
+ { 0x20E5, "Cardreader, Inc." },
+ { 0x20E6, "Brooks Automation, Inc." },
+ { 0x20E7, "Scientific Digital Imaging plc" },
+ { 0x20E8, "Jow Tong Technology Co., Ltd." },
+ { 0x20E9, "adp Gauselmann GmbH" },
+ { 0x20EA, "CACTUS TECHNOLOGIES, LIMITED" },
+ { 0x20EB, "AOS Technologies AG" },
+ { 0x20EC, "AMBIR TECHNOLOGY, INC." },
+ { 0x20ED, "TRANZFINITY, INC." },
+ { 0x20EE, "Emotiva Audio Corp." },
+ { 0x20EF, "TIGRIS Elektronik GmbH" },
+ { 0x20F0, "Insight Technology Incorporated" },
+ { 0x20F1, "NET GmbH" },
+ { 0x20F2, "Secured Mobility" },
+ { 0x20F3, "Flexcore" },
+ { 0x20F4, "TRENDnet" },
+ { 0x20F5, "MKS Instruments - Technology for Productivity" },
+ { 0x20F6, "EXMAN ELECTRIC" },
+ { 0x20F7, "XIMEA s.r.o." },
+ { 0x20F8, "Guangzhou Somic Digital & Electronic Technology Co, Ltd" },
+ { 0x20F9, "Medical Computer Systems, Ltd." },
+ { 0x20FA, "IC Intracom" },
+ { 0x20FB, "Aptina Imaging Corporation" },
+ { 0x20FC, "PIE SOFT LAB CORPORATION" },
+ { 0x20FD, "NOVO NORDISK A/S" },
+ { 0x20FE, "Bittium USA Inc." },
+ { 0x20FF, "PNI Sensor Corp." },
+ { 0x2100, "RT Systems Inc." },
+ { 0x2101, "NAS Technologies Corp." },
+ { 0x2102, "Vitalograph Ltd." },
+ { 0x2103, "OHMORI ELECTRIC INDUSTRIES CO., LTD." },
+ { 0x2104, "Tobii AB" },
+ { 0x2105, "Retail Innovation HTT AB" },
+ { 0x2106, "Sharp Korea Corporation" },
+ { 0x2107, "Amstore CD Production Ltd." },
+ { 0x2108, "NEATO ROBOTICS" },
+ { 0x2109, "VIA Labs, Inc." },
+ { 0x210A, "PULSUS TECHNOLOGIES" },
+ { 0x210B, "Work Microwave GmbH" },
+ { 0x210C, "DOT HILL SYSTEMS" },
+ { 0x210D, "Plastoform Industries Ltd." },
+ { 0x210E, "Commscope" },
+ { 0x210F, "Tyco / Scott Health & Safety" },
+ { 0x2110, "carina system co., ltd." },
+ { 0x2111, "alphaNUCLEAR Inc." },
+ { 0x2112, "Point Of Pay Pty. Ltd." },
+ { 0x2113, "Softkinetic" },
+ { 0x2114, "Innovision Technology Corporation Ltd." },
+ { 0x2115, "Alliance Material Co., Ltd." },
+ { 0x2116, "KT Tech Inc." },
+ { 0x2117, "Frama AG" },
+ { 0x2118, "RF WINDOW" },
+ { 0x2119, "MoreDNA Technology Co., Ltd." },
+ { 0x211A, "PILLKEY HOLDING BV" },
+ { 0x211B, "MENTOR GmbH & Co. Praezisions-Bauteile KG" },
+ { 0x211C, "SWENC Technology Co., Ltd." },
+ { 0x211D, "Mutualink, Inc." },
+ { 0x211E, "Dongbu HiTek" },
+ { 0x211F, "XINETWORKS CO., LTD." },
+ { 0x2120, "Odirrus Limited" },
+ { 0x2121, "Escort Data Logging Systems Ltd." },
+ { 0x2122, "ZEDEL" },
+ { 0x2123, "SYNTEK DEVELOPMENT LTD." },
+ { 0x2124, "ELSAGDATAMAT S.P.A." },
+ { 0x2125, "FIBERPRO INC." },
+ { 0x2126, "SUZA INTERNATIONAL FRANCE" },
+ { 0x2127, "FutureDial, Inc." },
+ { 0x2128, "Naval Research Laboratory" },
+ { 0x2129, "Tokushu Denshi Kairo, Inc." },
+ { 0x212A, "Kappa optronics GmbH" },
+ { 0x212B, "GR Telecom Co., Ltd." },
+ { 0x212C, "Shenzhen Linoya Electronic Co., Ltd." },
+ { 0x212D, "Dong Guan City Wanhong Electric Co., Ltd." },
+ { 0x212E, "Amphenol AssembleTech (Xiamen) Co., Ltd." },
+ { 0x212F, "SUZUKI MUSICAL INST. MFG. CO., LTD." },
+ { 0x2130, "Sanmu Communication Technology (H.K.) Ltd." },
+ { 0x2131, "IES Co., Ltd." },
+ { 0x2132, "EDAS, Inc." },
+ { 0x2133, "SIGNOTEC GmbH" },
+ { 0x2134, "CANESTA, INC." },
+ { 0x2135, "W.O.M. World of Medicine AG" },
+ { 0x2136, "Compunow Trading Corp." },
+ { 0x2137, "Beyonics Technology Limited" },
+ { 0x2138, "iVina, Inc." },
+ { 0x2139, "Eigenlabs Ltd." },
+ { 0x213A, "Carlo Gavazzi" },
+ { 0x213B, "UICO, Inc." },
+ { 0x213C, "ICON Health & Fitness" },
+ { 0x213D, "DRS Data & Imaging Systems, Inc." },
+ { 0x213E, "Phase Matrix, Inc." },
+ { 0x213F, "Digitron Instrumentation Ltd." },
+ { 0x2140, "Sichuan Jiuzhou Electric Group Co., Ltd." },
+ { 0x2141, "ZT Group Int'l, Inc." },
+ { 0x2142, "Enginuity Communications" },
+ { 0x2143, "InDevR Inc." },
+ { 0x2144, "Sea Tel, Inc." },
+ { 0x2145, "Ballard Technology" },
+ { 0x2146, "Victorinox AG" },
+ { 0x2147, "Chin-Ban Electronics (Hong Kong) Co., Ltd." },
+ { 0x2148, "Visteon Sistemas Automotives Ltda." },
+ { 0x2149, "MasTouch Optoelectronics Technologies Co., Ltd." },
+ { 0x214A, "Interlink Electronics" },
+ { 0x214B, "AMECO TECHNOLOGIES (SHENZHEN) CO., LTD." },
+ { 0x214C, "Y Soft Corporation" },
+ { 0x214D, "SyTech Corporation" },
+ { 0x214E, "Swiftpoint Limited" },
+ { 0x214F, "Attainment Company, Inc." },
+ { 0x2150, "AZOTEQ (PTY) LTD." },
+ { 0x2151, "SeaSpace Corporation" },
+ { 0x2152, "AD Semiconductor Co., Ltd." },
+ { 0x2153, "Mastertouch Solutions Electronics Co., Ltd." },
+ { 0x2154, "Trace Lighting Ltd." },
+ { 0x2155, "Teledyne Controls" },
+ { 0x2156, "Weistech Technology Co., Ltd." },
+ { 0x2157, "Digital Imaging Technology" },
+ { 0x2158, "TA WEI TECHNOLOGY CO., LTD." },
+ { 0x2159, "TRIASX Pty Ltd." },
+ { 0x215A, "Sling Media, Inc." },
+ { 0x215B, "2D Debus & Diebold Messsysteme GmbH" },
+ { 0x215C, "OTOVATION, LLC" },
+ { 0x215D, "GeNUA mbH" },
+ { 0x215E, "ST Embedded Engineering, LLC" },
+ { 0x215F, "DECIMATOR DESIGN PTY LTD." },
+ { 0x2160, "PULOON Technology Inc." },
+ { 0x2161, "BEA SA" },
+ { 0x2162, "Prime Audio Inc." },
+ { 0x2163, "Digital Rapids Corp." },
+ { 0x2164, "Witek System" },
+ { 0x2165, "CONTROL SOLUTIONS, INC." },
+ { 0x2166, "JVC KENWOOD Corporation" },
+ { 0x2167, "Zhejiang Fousine Science & Technology Co., Ltd." },
+ { 0x2168, "TZYR HWEY ENTERPRISE CO., LTD." },
+ { 0x2169, "TIANJIN SHENNAN INFORMATION SECURITY CO., LTD." },
+ { 0x216A, "Shenzhen San Jing Electronics Co., Ltd." },
+ { 0x216B, "XceedID Corporation" },
+ { 0x216C, "UniDisplay Inc." },
+ { 0x216D, "BENSON MEDICAL INSTRUMENTS" },
+ { 0x216E, "KHOMP INDUSTRIA E COMERCIO LTDA" },
+ { 0x216F, "ALTAIR SEMICONDUCTOR" },
+ { 0x2170, "Wurtec, Inc." },
+ { 0x2171, "Bokam Engineering, Inc." },
+ { 0x2172, "Torrey Pines Logic, Inc." },
+ { 0x2173, "HUIZHOU HUANGJI PRECISIONS FLEX ELECTRONICAL CO., LTD." },
+ { 0x2174, "Transcend Information, Inc." },
+ { 0x2175, "Light Blue Optics, Inc." },
+ { 0x2176, "TMC - Allion Test Labs" },
+ { 0x2177, "CHAUVIN ARNOUX" },
+ { 0x2178, "Ion Science" },
+ { 0x2179, "UGtizer Corp." },
+ { 0x217A, "Triple Eye" },
+ { 0x217B, "BDP Semiconductors Ltd." },
+ { 0x217C, "Sensitech Inc." },
+ { 0x217D, "Bilcare Technologies Singapore Pte. Ltd." },
+ { 0x217E, "TP RADIO" },
+ { 0x217F, "REAL EAR A/S" },
+ { 0x2180, "Icare Finland Oy" },
+ { 0x2181, "GLOBAL TRAFFIC TECHNOLOGIES, LLC" },
+ { 0x2182, "XAC Automation Corp." },
+ { 0x2183, "Bonutti Research" },
+ { 0x2184, "GOOD WILL Instrument Co., Ltd." },
+ { 0x2185, "FUJIWORK Co., Ltd." },
+ { 0x2186, "Home Server Technologies Inc." },
+ { 0x2187, "ESPACE SERVICES MULTIMEDIAS" },
+ { 0x2188, "CalDigit, Inc." },
+ { 0x2189, "SEMNTECH" },
+ { 0x218A, "EXELYS LLC" },
+ { 0x218B, "Blackbird Technologies Inc." },
+ { 0x218C, "Gammadata Instrument AB" },
+ { 0x218D, "Adaptive I/O Technologies, Inc." },
+ { 0x218E, "UNITRO-Fleischmann" },
+ { 0x218F, "DHEF INC." },
+ { 0x2190, "esonic Co., Ltd." },
+ { 0x2191, "SecureAT Co., Ltd." },
+ { 0x2192, "FlexRadio Systems" },
+ { 0x2193, "Schnick-Schnack-Systems GmbH" },
+ { 0x2194, "ROTH + WEBER GmbH" },
+ { 0x2195, "Hans Eckes Hardware & Software" },
+ { 0x2196, "XPMOBILE" },
+ { 0x2197, "W & D, LLC" },
+ { 0x2198, "Wonde Proud Technology Co., Ltd." },
+ { 0x2199, "Image and Information Technology" },
+ { 0x219A, "COSMO ELECTRONICS CO., LTD." },
+ { 0x219B, "TPK Touch Solutions Inc." },
+ { 0x219C, "SEAL ONE AG" },
+ { 0x219D, "BDR Technologies Ltd." },
+ { 0x219E, "VALKEE OY" },
+ { 0x219F, "VENTIS" },
+ { 0x21A0, "AXELSPACE Corporation" },
+ { 0x21A1, "EMOTIV SYSTEMS INC." },
+ { 0x21A2, "ABB Low Voltage Products" },
+ { 0x21A3, "Optcom Co., Ltd." },
+ { 0x21A4, "ELECTRONIC ARTS" },
+ { 0x21A5, "Genesis Technology USA, Inc." },
+ { 0x21A6, "YUPITERU CORPORATION" },
+ { 0x21A7, "PAYPRINT SRL" },
+ { 0x21A8, "GE Intelligent Platforms, Inc." },
+ { 0x21A9, "Saleae LLC" },
+ { 0x21AA, "TAKASAKI KYODO COMPUTING CENTER CO., LTD." },
+ { 0x21AB, "Planeta Informatica Ltda." },
+ { 0x21AC, "infoSense Technology Inc." },
+ { 0x21AD, "Wobbegong Fitness and Therapy Products Pty. Ltd." },
+ { 0x21AE, "Philips and Neusoft Medical System Co., Ltd." },
+ { 0x21AF, "Euro-CB Phils. Inc." },
+ { 0x21B0, "Grace Industries, Incorporated" },
+ { 0x21B1, "TATA CONSULTANCY SERVICES" },
+ { 0x21B2, "Felix Meier GmbH" },
+ { 0x21B3, "Dongguan Teconn Electronics Technology Co., Ltd." },
+ { 0x21B4, "Wavelength Audio, Ltd." },
+ { 0x21B5, "SHENZHEN JASON ELECTRONICS CO., LTD." },
+ { 0x21B6, "EUROAVIONICS GmbH & Co. KG" },
+ { 0x21B7, "STAIB INSTRUMENTE GmbH" },
+ { 0x21B8, "KONTRONIK GmbH" },
+ { 0x21B9, "ZP ENGINEERING s.r.l." },
+ { 0x21BA, "SI2 MICROSYSTEMS, Ltd." },
+ { 0x21BB, "WWPass Corporation" },
+ { 0x21BC, "Skyhawke Technologies, LLC" },
+ { 0x21BD, "Code Red Technologies, Ltd." },
+ { 0x21BE, "KEC Co., Ltd." },
+ { 0x21BF, "Mayo Clinic" },
+ { 0x21C0, "PIXTREE, Inc." },
+ { 0x21C1, "Baumann Electronic Controls, LLC" },
+ { 0x21C2, "Shenzhen V-Interface Technology Co., Ltd." },
+ { 0x21C3, "MASIMO LABORATORIES INC." },
+ { 0x21C4, "Longsys Electronics (HK) Co., Ltd." },
+ { 0x21C5, "Vukic Computer Instruments GmbH" },
+ { 0x21C6, "PSS Hong Kong Limited" },
+ { 0x21C7, "Unisoku Co., Ltd." },
+ { 0x21C8, "IDONDEMAND INC." },
+ { 0x21C9, "Innoteletek, Inc." },
+ { 0x21CA, "RAE Systems Inc." },
+ { 0x21CB, "Vodafone Ltd." },
+ { 0x21CC, "ChipsWork Microelectronics Corp." },
+ { 0x21CD, "Infoxelle Co., Ltd." },
+ { 0x21CE, "Polostar Technology Corporation" },
+ { 0x21CF, "HISATOMI ELECTRIC IND. CO., LTD." },
+ { 0x21D0, "Red Rapids" },
+ { 0x21D1, "ADDER TECHNOLOGY LTD." },
+ { 0x21D2, "NeoLAB Convergence" },
+ { 0x21D3, "Compupack Technology Co., Ltd." },
+ { 0x21D4, "Eduplayer Co., Ltd." },
+ { 0x21D5, "M.G.F." },
+ { 0x21D6, "Agecodagis SARL" },
+ { 0x21D7, "VINCIAMO, Inc." },
+ { 0x21D8, "P & A Technologies, Inc." },
+ { 0x21D9, "Verification Technology, Inc." },
+ { 0x21DA, "Valor Auto Companion, Inc." },
+ { 0x21DB, "G-Max Technology Co., Ltd." },
+ { 0x21DC, "ABB S.p.A., Low Voltage Products Division" },
+ { 0x21DD, "Looxcie, Inc." },
+ { 0x21DE, "Cloud Engines, Inc." },
+ { 0x21DF, "Quanser Consulting Inc." },
+ { 0x21E0, "OpenPattern" },
+ { 0x21E1, "CAEN S.P.A." },
+ { 0x21E2, "Ascension Technology Corp." },
+ { 0x21E3, "Crest Technology Inc." },
+ { 0x21E4, "Xcellen Co., Ltd." },
+ { 0x21E5, "Kruglov Evgeniy Vladimirovich" },
+ { 0x21E6, "OCZ Technology Group" },
+ { 0x21E7, "Sagemcom Broadband SAS" },
+ { 0x21E8, "BOEHNKE + PARTNER GmbH Steuerungssysteme" },
+ { 0x21E9, "Jiafuh Metal & Plastic (ShenZhen) Co., Ltd." },
+ { 0x21EA, "JUST MAKE ELECTRONICS CO., LTD." },
+ { 0x21EB, "KOKORO CO., LTD." },
+ { 0x21EC, "ApniCure, Inc." },
+ { 0x21ED, "Accuphase Laboratories, Inc." },
+ { 0x21EE, "MAVIN TECHNOLOGY INC." },
+ { 0x21EF, "FEMTO Messtechnik GmbH" },
+ { 0x21F0, "LivingLab Development Co., Ltd." },
+ { 0x21F1, "ABS Group AB" },
+ { 0x21F2, "Palmer Environmental Ltd." },
+ { 0x21F3, "Inspired Instruments Inc." },
+ { 0x21F4, "Minebea Technologies Taiwan Co., Ltd." },
+ { 0x21F5, "Shenzhen Strong Rising Electronics Co., Ltd." },
+ { 0x21F6, "QSR Automations, Inc." },
+ { 0x21F7, "Wuerth-Elektronik eiSos GmbH & Co. KG" },
+ { 0x21F8, "Goeasily Int'l Co., Ltd." },
+ { 0x21F9, "American Thermal Instruments" },
+ { 0x21FA, "Pitsco, Inc." },
+ { 0x21FB, "HELIOS Electronic Design & Manufacture" },
+ { 0x21FC, "Thum + Mahr GmbH" },
+ { 0x21FD, "Associated Controls (Australia) Pty., Limited" },
+ { 0x21FE, "ELAP S.p.A." },
+ { 0x21FF, "DEIF A/S" },
+ { 0x2200, "Nuribom" },
+ { 0x2201, "Elan Digital Systems Ltd." },
+ { 0x2202, "Walex Electronic (Wu Xi) Co., Ltd." },
+ { 0x2203, "Shin Shin Co., Ltd." },
+ { 0x2204, "Innov-X Systems Inc." },
+ { 0x2205, "3eYamaichi Electronics Co., Ltd." },
+ { 0x2206, "Wiretek International Investment Ltd." },
+ { 0x2207, "Fuzhou Rockchip Electronics Co., Ltd." },
+ { 0x2208, "CONNFLY ELECTRONIC CO., LTD." },
+ { 0x2209, "SPoT LLC" },
+ { 0x220A, "Anton Paar GmbH" },
+ { 0x220B, "IKARIA Holdings, Inc." },
+ { 0x220C, "Island Technology Co., Ltd." },
+ { 0x220D, "Humanline Co., Ltd." },
+ { 0x220E, "NetComm Ltd." },
+ { 0x220F, "Italdata Ingegneria Dell'Idea s.p.a." },
+ { 0x2210, "Klavis Technologies" },
+ { 0x2211, "FLUID COMPONENTS INTERNATIONAL LLC" },
+ { 0x2212, "Dev-Audio Pty. Ltd. (Dev-Audio)" },
+ { 0x2213, "Ascon Co., Ltd." },
+ { 0x2214, "Pollin Electronic GmbH" },
+ { 0x2215, "InCOMM Technologies Co., Ltd." },
+ { 0x2216, "Environmental Systems Corporation" },
+ { 0x2217, "FTS Forest Technology Systems Ltd." },
+ { 0x2218, "Listen Technologies Corp." },
+ { 0x2219, "Hogahm Technology" },
+ { 0x221A, "ZTEX" },
+ { 0x221B, "Kyodo Denshi Engineering Co., Ltd." },
+ { 0x221C, "CORTEX TECHNOLOGY APS" },
+ { 0x221D, "fischertechnik GmbH" },
+ { 0x221E, "Linktec Technologies Co., Ltd." },
+ { 0x221F, "Resolution Audio" },
+ { 0x2220, "FAMAS SYSTEM S.P.A." },
+ { 0x2221, "EnovateIT Inc." },
+ { 0x2222, "SOFTMECHA" },
+ { 0x2223, "Ratioplast-Optoelectronics GmbH" },
+ { 0x2224, "LM Technologies Ltd." },
+ { 0x2225, "GETT Geratetechnik GmbH" },
+ { 0x2226, "PLANAR LLC" },
+ { 0x2227, "Northtronics Pty., Ltd." },
+ { 0x2228, "Dantec Dynamics A/S" },
+ { 0x2229, "Key Technologies, Inc." },
+ { 0x222A, "ILI TECHNOLOGY CORP." },
+ { 0x222B, "ALPHAMEDIA CO., LTD." },
+ { 0x222C, "TOHAN DENSHI KIKI Co., Ltd." },
+ { 0x222D, "LEIFHEIT AG" },
+ { 0x222E, "OXYSEC s.r.l." },
+ { 0x222F, "Tcom Technology Co., Ltd." },
+ { 0x2230, "Plugable Technologies" },
+ { 0x2231, "Coregate Inc." },
+ { 0x2232, "NAMUGA Co., Ltd." },
+ { 0x2233, "ARGtek Communication Inc." },
+ { 0x2234, "T-CONN PRECISION CORPORATION" },
+ { 0x2235, "WoundVision" },
+ { 0x2236, "ACELLA" },
+ { 0x2237, "Kobo Inc." },
+ { 0x2238, "ELMO Motion Control Ltd." },
+ { 0x2239, "PEIKER acustic GmbH & Co., KG" },
+ { 0x223A, "BKtel Communications GmbH" },
+ { 0x223B, "Crystalfontz America, Inc." },
+ { 0x223C, "Audio Research Corp." },
+ { 0x223D, "AlfaPlus Semiconductor, Inc." },
+ { 0x223E, "Home Electronics" },
+ { 0x223F, "Oga, Inc." },
+ { 0x2240, "NETTALK.COM INC." },
+ { 0x2241, "Envision Interface Engineering, LLC" },
+ { 0x2242, "Zhihe Electronics Technology Co., Ltd." },
+ { 0x2243, "EMIC CORPORATION" },
+ { 0x2244, "Kronos" },
+ { 0x2245, "ASPEED Technology Inc." },
+ { 0x2246, "Nanjing Frentec Co., Ltd." },
+ { 0x2247, "CHUNGHWA PICTURE TUBES, LTD." },
+ { 0x2248, "KAISE CORPORATION" },
+ { 0x2249, "Long Range Systems, Inc." },
+ { 0x224A, "ORMEC SYSTEMS CORP." },
+ { 0x224B, "Sirit Inc." },
+ { 0x224C, "Datron World Communications, Inc." },
+ { 0x224D, "Tescom Co., Ltd." },
+ { 0x224E, "RDH2 Science" },
+ { 0x224F, "APDM, INC." },
+ { 0x2250, "Evernew Wire & Cable Co., Ltd." },
+ { 0x2251, "QuieTek Corp." },
+ { 0x2252, "TSANSUN TECH. CO., LTD." },
+ { 0x2253, "Arpage AG" },
+ { 0x2254, "RPO" },
+ { 0x2255, "COOPER WIRELESS" },
+ { 0x2256, "Mathias Fuchss Software - Entwicklung" },
+ { 0x2257, "On the Go Video, Inc." },
+ { 0x2258, "D+H Mechatronic AG" },
+ { 0x2259, "Skypine Electronics (Shenzhen) Co., Ltd." },
+ { 0x225A, "Vivanco GmbH" },
+ { 0x225B, "Lineage Power" },
+ { 0x225C, "Digital Check Corp" },
+ { 0x225D, "Sagem Securite" },
+ { 0x225E, "Unholtz-Dickie Corp." },
+ { 0x225F, "Ace Karaoke Corp." },
+ { 0x2260, "Multigig, Inc." },
+ { 0x2261, "DOM-Sicherheitstechnik GmbH & Co. KG" },
+ { 0x2262, "VIETTEL GROUP" },
+ { 0x2263, "Nuovations" },
+ { 0x2264, "Entourage Systems, Inc." },
+ { 0x2265, "DailyCare BioMedical Inc." },
+ { 0x2266, "Psychology Software Tools, Inc." },
+ { 0x2267, "Boreal Genomics" },
+ { 0x2268, "EXSUSS, Inc." },
+ { 0x2269, "Schlumberger Ltd." },
+ { 0x226A, "Ooma, Inc." },
+ { 0x226B, "Bruker Nano GmbH" },
+ { 0x226C, "HAL Communications Corp." },
+ { 0x226D, "Wrenchman, Inc." },
+ { 0x226E, "DISPLAX" },
+ { 0x226F, "Koyo Trading Co., Ltd." },
+ { 0x2270, "XiaMen GaoLuChang Electronics Co. Ltd." },
+ { 0x2271, "Karl Storz GmbH & Co. KG" },
+ { 0x2272, "E.E.P.D." },
+ { 0x2273, "IMAX Corporation" },
+ { 0x2274, "Morgan Schaffer Inc." },
+ { 0x2275, "ReliOn Inc." },
+ { 0x2276, "Pioneer CBC" },
+ { 0x2277, "Ortho Neuro Technologies, Inc." },
+ { 0x2278, "Infratec Datentechnik GmbH" },
+ { 0x2279, "Goossens Engineering" },
+ { 0x227A, "FLOM Corporation" },
+ { 0x227B, "CYBELEC SA" },
+ { 0x227C, "S. & A.S. LTD." },
+ { 0x227D, "Unitec Co., Ltd." },
+ { 0x227E, "JSC <SATIS-TL-94>" },
+ { 0x227F, "Granite River Labs" },
+ { 0x2280, "Life Technologies Corp." },
+ { 0x2281, "GI CORPORATION" },
+ { 0x2282, "Mamiya Digital Imaging Co., Ltd." },
+ { 0x2283, "NIHON DEMPA KOGYO Co., Ltd." },
+ { 0x2284, "SuperSonic Inc." },
+ { 0x2285, "IRIS ID" },
+ { 0x2286, "Altierre Corporation" },
+ { 0x2287, "Shenzhen Oversea Win Technology Co., Ltd." },
+ { 0x2288, "Dt&C (Digital Technology and Certification)" },
+ { 0x2289, "Sun Fair Electric Wire & Cable (HK) Co., Ltd." },
+ { 0x228A, "Hotron Precision Electronic Ind. Corp." },
+ { 0x228B, "Shenzhen DLK Electronics Technology Co., Ltd." },
+ { 0x228C, "Analogic Corporation" },
+ { 0x228D, "8D TECHNOLOGIES INC." },
+ { 0x228E, "EKO Instruments Co., Ltd." },
+ { 0x228F, "SIGMATEK GmbH & Co. KG" },
+ { 0x2290, "Touchplus information Corp." },
+ { 0x2291, "Vallen Systeme GmbH" },
+ { 0x2292, "Global Industrial Services, Ltd." },
+ { 0x2293, "Berger Elektronik GmbH" },
+ { 0x2294, "KoCo Connector AG" },
+ { 0x2295, "Sound ID" },
+ { 0x2296, "Musashi Engineering Company Limited" },
+ { 0x2297, "Grain Media, Inc." },
+ { 0x2298, "PULSION Medical Systems AG" },
+ { 0x2299, "BRAIN VISION SYSTEMS (BVS)" },
+ { 0x229A, "Control Express Finland OY" },
+ { 0x229B, "SFC Smart Fuel Cell AG" },
+ { 0x229C, "Raytheon Company" },
+ { 0x229D, "Solacia Inc." },
+ { 0x229E, "JV2R - MacWay" },
+ { 0x229F, "RRC power solutions GmbH" },
+ { 0x22A0, "Winpos System Co., Ltd." },
+ { 0x22A1, "Shenzhen Jiuzhou Electric Co., Ltd." },
+ { 0x22A2, "Disruptive Ltd." },
+ { 0x22A3, "DexCom" },
+ { 0x22A4, "InnoComm Mobile Technology Corp." },
+ { 0x22A5, "Yu Jeong System Co., Ltd." },
+ { 0x22A6, "Pie Digital, Inc." },
+ { 0x22A7, "Fortinet, Inc." },
+ { 0x22A8, "OTTO" },
+ { 0x22A9, "Valor Communication, Inc." },
+ { 0x22AA, "AppliedMicro" },
+ { 0x22AB, "Trigence Semiconductor, Inc." },
+ { 0x22AC, "Sensor Switch, Inc." },
+ { 0x22AD, "DCP Microdevelopments Limited" },
+ { 0x22AE, "Buerkert Werke GmbH" },
+ { 0x22AF, "JW Fishers Mfg." },
+ { 0x22B0, "Business Security OL AB" },
+ { 0x22B1, "Secret Labs LLC" },
+ { 0x22B2, "EDGE Tech Corp." },
+ { 0x22B3, "SOMFY" },
+ { 0x22B4, "NIPPON ANTENNA Co., Ltd." },
+ { 0x22B5, "Thyracont Vacuum Instruments GmbH" },
+ { 0x22B6, "IMTRADEX Hoer-/Sprechsysteme GmbH" },
+ { 0x22B7, "Unjo AB" },
+ { 0x22B8, "Motorola Mobility Inc." },
+ { 0x22B9, "eTurboTouch Technology Inc." },
+ { 0x22BA, "Technology Innovation Holdings Ltd." },
+ { 0x22BB, "Saris Cycling Group" },
+ { 0x22BC, "OPWILL Technologies (Beijing) Co., Ltd." },
+ { 0x22BD, "Basis Software, Inc." },
+ { 0x22BE, "Cheetah-Medical Ltd." },
+ { 0x22BF, "Bit Cauldron Corporation" },
+ { 0x22C0, "ReLia Diagnostic Systems, Inc." },
+ { 0x22C1, "ATEK Products, LLC" },
+ { 0x22C2, "Fast And Safe Technology Co., Ltd." },
+ { 0x22C3, "Tsinghua Tongfang Co., Ltd." },
+ { 0x22C4, "Fresenius Medical Care Deutschland GmbH" },
+ { 0x22C5, "Himax Technologies, Inc." },
+ { 0x22C6, "Baker Hughes Production Quest" },
+ { 0x22C7, "MEMUP" },
+ { 0x22C8, "Shenzhen Xinerchang Electronics Co., Ltd." },
+ { 0x22C9, "StepOver GmbH" },
+ { 0x22CA, "Amimon Ltd." },
+ { 0x22CB, "Forware Spain S.L." },
+ { 0x22CC, "LAONEX CO., LTD." },
+ { 0x22CD, "Kinova" },
+ { 0x22CE, "Metters Industries" },
+ { 0x22CF, "Marquess Co., Limited" },
+ { 0x22D0, "Norsonic AS" },
+ { 0x22D1, "ZeitControl GmbH" },
+ { 0x22D2, "ZETT OPTICS GmbH" },
+ { 0x22D3, "FAAC SpA" },
+ { 0x22D4, "Laview Technology Ltd." },
+ { 0x22D5, "Yellow Soft Co., Ltd." },
+ { 0x22D6, "Numatic International Ltd." },
+ { 0x22D7, "IntelliTech International, Inc." },
+ { 0x22D8, "Shantery Co., Ltd." },
+ { 0x22D9, "GuangDong OPPO Mobile Telecommunications Corp., Ltd." },
+ { 0x22DA, "TXTR GmbH" },
+ { 0x22DB, "Phase One A/S" },
+ { 0x22DC, "TILERA CORPORATION" },
+ { 0x22DD, "Kawasaki Heavy Industries, Ltd." },
+ { 0x22DE, "WeTelecom" },
+ { 0x22DF, "Medicom-MTD" },
+ { 0x22E0, "Secunet Security Networks AG" },
+ { 0x22E1, "TempoTec Corp" },
+ { 0x22E2, "IDEA!" },
+ { 0x22E3, "Escort, Inc." },
+ { 0x22E4, "Shenyang Tongzhen Precision Electronic Technology Co." },
+ { 0x22E5, "Mine Safety Appliances Co." },
+ { 0x22E6, "Labo America, Inc." },
+ { 0x22E7, "ZAFFER BVBA" },
+ { 0x22E8, "Audio Partnership" },
+ { 0x22E9, "Orion Diagnostica OY" },
+ { 0x22EA, "Bit Trade One, Ltd." },
+ { 0x22EB, "Vizimax Inc." },
+ { 0x22EC, "Kozio, Inc." },
+ { 0x22ED, "HannStar Display Corp." },
+ { 0x22EE, "Struers A/S" },
+ { 0x22EF, "Edutor Technologies India Private Limited" },
+ { 0x22F0, "Allen + Heath Ltd." },
+ { 0x22F1, "DATEQ BV" },
+ { 0x22F2, "Quest Payment Systems" },
+ { 0x22F3, "Zephyr Technology Corporation" },
+ { 0x22F4, "Olive Global Holding Pvt. Ltd." },
+ { 0x22F5, "oTHE Technology Inc." },
+ { 0x22F6, "Clear Pulse Co., Ltd." },
+ { 0x22F7, "Drivven, Inc." },
+ { 0x22F8, "Universal Sats Ltd." },
+ { 0x22F9, "Compass, s.r.l." },
+ { 0x22FA, "Sifteo Inc." },
+ { 0x22FB, "Beijing Chiplight IC Design Co., Ltd." },
+ { 0x22FC, "ModusLink Global Solutions, Inc." },
+ { 0x22FD, "Miltope Corp." },
+ { 0x22FE, "Protium Technologies, Inc." },
+ { 0x22FF, "Avnet" },
+ { 0x2300, "Nanjing Magon Opto-Electrical Science & Technology Co." },
+ { 0x2301, "Imaginant Inc." },
+ { 0x2302, "Rafael Advanced Defense Systems Ltd." },
+ { 0x2303, "Grosvenor Technology Ltd." },
+ { 0x2304, "Pinnacle" },
+ { 0x2305, "Lindemann Audiotechnik GmbH" },
+ { 0x2306, "Syba Multimedia, Inc." },
+ { 0x2307, "Madboy Audio International Oy" },
+ { 0x2308, "UV Networks, Inc." },
+ { 0x2309, "TimeLink Inc." },
+ { 0x230A, "Data Locker Inc." },
+ { 0x230B, "Shanda Interactive Entertainment Limited" },
+ { 0x230C, "GarTech Enterprises, Inc." },
+ { 0x230D, "Linktop Technology Co., Ltd." },
+ { 0x230E, "eDAQ Pty., Ltd." },
+ { 0x230F, "applause.elfmimi.jp" },
+ { 0x2310, "WCE, Inc." },
+ { 0x2311, "Francotyp-Postalia GmbH" },
+ { 0x2312, "Learning Curve Brands, Inc." },
+ { 0x2313, "Kunshan Jiahua Electronics Co., Ltd." },
+ { 0x2314, "INQ Mobile Limited" },
+ { 0x2315, "Avery Design Systems, Inc." },
+ { 0x2316, "DongGuan Potec Electric Industrial Co., Ltd." },
+ { 0x2317, "Huawei Device Co., Ltd." },
+ { 0x2318, "Solar Components LLC" },
+ { 0x2319, "Loewe Opta GmbH" },
+ { 0x231A, "SANWA KAGAKU KENKYUSHO CO., LTD." },
+ { 0x231B, "winner story Co., Ltd." },
+ { 0x231C, "SONUUS LIMITED" },
+ { 0x231D, "Fervian Technologies Limited" },
+ { 0x231E, "Chongqing CYIT Communication Technologies Co., Ltd." },
+ { 0x231F, "FandF Co., Ltd." },
+ { 0x2320, "Redring AB" },
+ { 0x2321, "iKingdom Corp. (d.b.a. iConnectivity)" },
+ { 0x2322, "RichWave Technology Corp." },
+ { 0x2323, "EFI TECHNOLOGY s.r.l." },
+ { 0x2324, "Ubisense Limited" },
+ { 0x2325, "Simbex" },
+ { 0x2326, "CKM Electronics Co., Ltd." },
+ { 0x2327, "DreamSecurity" },
+ { 0x2328, "Radio Systems Corporation" },
+ { 0x2329, "Infinite Technologies JLT" },
+ { 0x232A, "Skalar Analytical b.v." },
+ { 0x232B, "Zhuhai Pantum Technology Co., Ltd." },
+ { 0x232C, "Digital Lumens" },
+ { 0x232D, "Edinburgh Instruments Ltd." },
+ { 0x232E, "EA, Elektro-Automatik GmbH & Co. KG" },
+ { 0x232F, "Motic China Group Co., Ltd." },
+ { 0x2330, "Tensorcom, Inc." },
+ { 0x2331, "PUZZLE LOGIC INC." },
+ { 0x2332, "Coges S.p.A." },
+ { 0x2333, "Zamzee Co." },
+ { 0x2334, "Opticos srl" },
+ { 0x2335, "Personable Inc." },
+ { 0x2336, "Vix Technology (Aust) Ltd." },
+ { 0x2337, "linked IP GmbH" },
+ { 0x2338, "RedE Innovations" },
+ { 0x2339, "Sierra Nevada Corporation" },
+ { 0x233A, "Telpar" },
+ { 0x233B, "taberna pro medicum GmbH" },
+ { 0x233C, "Julabo" },
+ { 0x233D, "Microtech System" },
+ { 0x233E, "Aastra Telecom Inc." },
+ { 0x233F, "Stage Tec GmbH" },
+ { 0x2340, "Teleepoch Limited" },
+ { 0x2341, "Arduino, LLC" },
+ { 0x2342, "nextEDGE Technology, K.K." },
+ { 0x2343, "AquaScan A/S" },
+ { 0x2344, "HAMBURG INDUSTRIES CO., LTD." },
+ { 0x2345, "ZOWIE GEAR" },
+ { 0x2346, "Data Transfer & Communications Ltd." },
+ { 0x2347, "iControl Networks" },
+ { 0x2348, "Ubisys Technology" },
+ { 0x2349, "P2 Engineering Group, LLC" },
+ { 0x234A, "Cypress Technology Co., Ltd." },
+ { 0x234B, "Free Software Initiative of Japan" },
+ { 0x234C, "Zenverge Inc." },
+ { 0x234D, "Skype Inc." },
+ { 0x234E, "Anewin" },
+ { 0x234F, "VaniOs Consulting" },
+ { 0x2350, "ZiiLABS Pte. Ltd." },
+ { 0x2351, "EmbCodeAB" },
+ { 0x2352, "SKYTEX Technology Inc." },
+ { 0x2353, "PHiON Technology Inc." },
+ { 0x2354, "BirdBrain Technologies LLC" },
+ { 0x2355, "Pacific Northwest National Laboratory (PNNL)" },
+ { 0x2356, "Grid Connect Inc." },
+ { 0x2357, "TP-LINK Technologies Co., Ltd." },
+ { 0x2358, "Greenconn Corporation" },
+ { 0x2359, "Shenzhen Autone-Tronic Technology Co., Ltd." },
+ { 0x235A, "Top Yang Technology Enterprise Co., Ltd." },
+ { 0x235B, "KangXiang Electronic Co., Ltd." },
+ { 0x235C, "Neuralieve" },
+ { 0x235D, "Wavepod Technologies LLC" },
+ { 0x235E, "Sage Electronic Engineering LLC" },
+ { 0x235F, "Delux Technology Co., Ltd." },
+ { 0x2360, "AudioProbe Inc." },
+ { 0x2361, "Artiza Networks, Inc." },
+ { 0x2362, "Intuity Medical" },
+ { 0x2363, "SplitFish Ltd." },
+ { 0x2364, "Friedrich Leutert GmbH & Co. KG" },
+ { 0x2365, "Midwest Microwave Solutions" },
+ { 0x2366, "Bitmanufaktur GmbH" },
+ { 0x2367, "Teenage Engineering" },
+ { 0x2368, "Peterson Electro-Musical Products, Inc." },
+ { 0x2369, "Telspan Data, LLC" },
+ { 0x236A, "SiBEAM, Inc." },
+ { 0x236B, "Era Optoelectronics Inc." },
+ { 0x236C, "ZheJiang Chunsheng Electronics Co., Ltd." },
+ { 0x236D, "e-supplies Co., Ltd." },
+ { 0x236E, "Idex ASA" },
+ { 0x236F, "Risun Electric Information Technology Co., Ltd." },
+ { 0x2370, "Vlatacom d.o.o." },
+ { 0x2371, "Zetron, Inc." },
+ { 0x2372, "Shenzhen Techaser Technologies Co., Ltd." },
+ { 0x2373, "Pumatronix Equipamentos Eletronicos Ltda." },
+ { 0x2374, "Codan Limited" },
+ { 0x2375, "Nexell Co., Ltd." },
+ { 0x2376, "Realfiction Aps" },
+ { 0x2377, "Musa srl" },
+ { 0x2378, "OnLive, INC." },
+ { 0x2379, "Geotechnical Instruments (UK) Ltd." },
+ { 0x237A, "Danatronics, Corp." },
+ { 0x237B, "YUKAI Engineering" },
+ { 0x237C, "POWERVAR" },
+ { 0x237D, "CradlePoint, Inc." },
+ { 0x237E, "Ernie Ball, Inc." },
+ { 0x237F, "He Shan World Fair Electronics Technology Ltd." },
+ { 0x2380, "Law Enforcement Associates, Inc." },
+ { 0x2381, "IPE Music" },
+ { 0x2382, "Trigaudio, Inc." },
+ { 0x2383, "Super Pioneer Co., Ltd." },
+ { 0x2384, "Tamara Electronics Design" },
+ { 0x2385, "Booyco Electronics (Pty) Ltd." },
+ { 0x2386, "Raydium Semiconductor Corporation" },
+ { 0x2387, "N&S Services, Inc. dba XIM Technologies" },
+ { 0x2388, "High Density Devices" },
+ { 0x2389, "ShenZhen Handin Tech Co., Ltd." },
+ { 0x238A, "ASAHI SANGYO CO., LTD." },
+ { 0x238B, "Hytera Communications Co., Ltd." },
+ { 0x238C, "Japan Care Net Service Corporation" },
+ { 0x238D, "OMNIO Corporation" },
+ { 0x238E, "Xtralis" },
+ { 0x238F, "TRS Star GmbH" },
+ { 0x2390, "Triex Technologies, Inc." },
+ { 0x2391, "FUKUDA CO., LTD." },
+ { 0x2392, "Deltatee Enterprises Ltd." },
+ { 0x2393, "WonATech Co., Ltd." },
+ { 0x2394, "J.MORITA MFG. CORP." },
+ { 0x2395, "CNOGA MEDICAL LTD." },
+ { 0x2396, "Advanced Multi Tech Pte. Ltd." },
+ { 0x2397, "Simaudio Ltd." },
+ { 0x2398, "Bluetechnix" },
+ { 0x2399, "Lightwares" },
+ { 0x239A, "Adafruit Industries LLC" },
+ { 0x239B, "TZ Medical, Inc." },
+ { 0x239C, "Braebon Medical Corporation" },
+ { 0x239D, "Memjet Labels, Inc." },
+ { 0x239E, "Rubin Informatikai Zrt." },
+ { 0x239F, "Nikola Engineering Inc." },
+ { 0x23A0, "BIFIT" },
+ { 0x23A1, "Pepperl+Fuchs GmbH" },
+ { 0x23A2, "Mobile Peak Holdings, Ltd." },
+ { 0x23A3, "Dongguan City ShengJing Electronics Co., Ltd." },
+ { 0x23A4, "MINGTECH CHINA CO., LTD." },
+ { 0x23A5, "Instytut Fotonowy Sp. Z o.o." },
+ { 0x23A6, "Tronical Components GmbH" },
+ { 0x23A7, "System In Frontier Inc." },
+ { 0x23A8, "Sagio A/S" },
+ { 0x23A9, "SiliconGo Microelectronics Inc." },
+ { 0x23AA, "DOK (HK) Trading Limited" },
+ { 0x23AB, "SZZT ELECTRONICS CO., LTD" },
+ { 0x23AC, "Marunix Electron Limited" },
+ { 0x23AD, "voxeljet technology GmbH" },
+ { 0x23AE, "DIGITAL DEVICES UG" },
+ { 0x23AF, "iOWA AB" },
+ { 0x23B0, "Seniorsoft Development Co., Ltd." },
+ { 0x23B1, "Riken Keiki Co., Ltd." },
+ { 0x23B2, "SEER Technology, Inc." },
+ { 0x23B3, "Straubtec GmbH & Co. KG" },
+ { 0x23B4, "Dental Wings Inc." },
+ { 0x23B5, "Crowcon Detection Instruments Limited" },
+ { 0x23B6, "FULL ELECTRONIC system" },
+ { 0x23B7, "Isca Networks" },
+ { 0x23B8, "Daruma Telecomunicacoes e Informatica S/A" },
+ { 0x23B9, "Green Energy Options Ltd." },
+ { 0x23BA, "Playback Designs LLC" },
+ { 0x23BB, "EMI STOP CORP." },
+ { 0x23BC, "ARIDIAN TECHNOLOGY COMPANY INC." },
+ { 0x23BD, "Musashi Engineering, Inc." },
+ { 0x23BE, "Raynet Technologies Pte. Ltd." },
+ { 0x23BF, "Environics Oy" },
+ { 0x23C0, "Kotec" },
+ { 0x23C1, "MakerBot Industries" },
+ { 0x23C2, "CREALOGIX E-Banking AG" },
+ { 0x23C3, "Cydle Corp." },
+ { 0x23C4, "Media Engineering" },
+ { 0x23C5, "Promega Corporation" },
+ { 0x23C6, "plawa-feinwerktechnik GmbH & Co. KG" },
+ { 0x23C7, "GCI Technologies Corp." },
+ { 0x23C8, "IML Ltd." },
+ { 0x23C9, "IRM Touch Inc." },
+ { 0x23CA, "IHP GmbH Innovations for High Performance Microelectro" },
+ { 0x23CB, "Point Core SARL" },
+ { 0x23CC, "Avitech International Corp." },
+ { 0x23CD, "Avconn Precise Connector Co., Ltd." },
+ { 0x23CE, "Gembird Electronics Ltd." },
+ { 0x23CF, "Admesy BV" },
+ { 0x23D0, "Youjie" },
+ { 0x23D1, "LUFFT Mess-und Regeltechnik GmbH" },
+ { 0x23D2, "WEAVERSMIND Inc." },
+ { 0x23D3, "RFTECH SRL" },
+ { 0x23D4, "ALLTRAX, Inc." },
+ { 0x23D5, "SerialTek" },
+ { 0x23D6, "DONGGUAN LICHENG ELECTRONICS CO., LTD." },
+ { 0x23D7, "PENNYWISE PERIPHERALS PTY. LTD." },
+ { 0x23D8, "CREATOR (CHINA) TECH CO., LTD." },
+ { 0x23D9, "SIGLEAD Inc." },
+ { 0x23DA, "THK Co., Ltd." },
+ { 0x23DB, "Sonicweld" },
+ { 0x23DC, "Phonic Ear, Inc. Frontrow Division" },
+ { 0x23DD, "Ningbo Sunny Opotech Co., Ltd." },
+ { 0x23DE, "ZAO Papillon" },
+ { 0x23DF, "WebAthletics BV" },
+ { 0x23E0, "BitifEye Digital Test Solutions GmbH" },
+ { 0x23E1, "Vidyo, Inc." },
+ { 0x23E2, "Shape Medical Systems, Inc." },
+ { 0x23E3, "Christie Digital Systems Canada Inc." },
+ { 0x23E4, "General Microsystems Sdn Bhd" },
+ { 0x23E5, "Antelope Audio" },
+ { 0x23E6, "DIGIT MOBILE INC." },
+ { 0x23E7, "ROGER Dariusz Wensker Grzegorz Wensker S.P.j." },
+ { 0x23E8, "Propellerhead Software AB" },
+ { 0x23E9, "Peregrine Technology Co., Ltd." },
+ { 0x23EA, "Inputek" },
+ { 0x23EB, "TOPPAN FORMS CO., LTD." },
+ { 0x23EC, "Alacer Biomedica Industria Eletronica Ltda." },
+ { 0x23ED, "Optomotive, mehatronika d.o.o." },
+ { 0x23EE, "Sofird, Inc." },
+ { 0x23EF, "PPHU AWEX RAFAL STANUCH" },
+ { 0x23F0, "Ecotronics Limited" },
+ { 0x23F1, "WIMM Labs" },
+ { 0x23F2, "Northern Digital Inc." },
+ { 0x23F3, "Funke Digital TV" },
+ { 0x23F4, "NXT Plc" },
+ { 0x23F5, "Speed Conn Electronics (Shenzhen) Co., Ltd." },
+ { 0x23F6, "Gamesman Ltd." },
+ { 0x23F7, "TechRhythm, Inc." },
+ { 0x23F8, "Xiangde Electronic Technologies (Shenzhen) Co., Ltd." },
+ { 0x23F9, "RT Systems (Pty) Ltd." },
+ { 0x23FA, "DJO, LLC" },
+ { 0x23FB, "Janich & Klass Computertechnik GmbH" },
+ { 0x23FC, "SesKion GmbH" },
+ { 0x23FD, "AWare, Inc." },
+ { 0x23FE, "Express Way Limited" },
+ { 0x23FF, "UIworks Electronics" },
+ { 0x2400, "Shenzhen Chuangyitong Technology Co., Ltd" },
+ { 0x2401, "Deltronic Labs" },
+ { 0x2402, "DA FACT" },
+ { 0x2403, "XTRAMUS TECHNOLOGIES" },
+ { 0x2404, "GE MDS" },
+ { 0x2405, "Custom Computer Services, Inc." },
+ { 0x2406, "WIseKey" },
+ { 0x2407, "Incasolution Co., Ltd." },
+ { 0x2408, "Catalyst Enterprises, Inc." },
+ { 0x2409, "BCInet, Inc." },
+ { 0x240A, "Infron Teknolojik Sistemleri San. Ve Tic. Ltd. STI" },
+ { 0x240B, "Kawamura Electric, Inc." },
+ { 0x240C, "Maples Micro System Corp" },
+ { 0x240D, "Chinachip Technology Limited" },
+ { 0x240E, "JEFF ROWLAND DESIGN GROUP, INC" },
+ { 0x240F, "Trantek Electronics Co., Ltd." },
+ { 0x2410, "Tenebraex Corp." },
+ { 0x2411, "Industrial Scientific Oldham SAS" },
+ { 0x2412, "Invision Biometrics Ltd." },
+ { 0x2413, "Skyviia Corporation" },
+ { 0x2414, "Leopold Kostal GmbH & Co. KG" },
+ { 0x2415, "CipherLab Co., Ltd." },
+ { 0x2416, "FUTURE DESIGNS, INC." },
+ { 0x2417, "INIT GmbH" },
+ { 0x2418, "Irphotonics" },
+ { 0x2419, "Shenzhen Dnine Technology Co., Ltd." },
+ { 0x241A, "The Silanna Group Pty. Ltd." },
+ { 0x241B, "Dongguan City Qirui Electronics Co., Ltd." },
+ { 0x241C, "ATMOS Medizin Technik GmbH & Co. KG" },
+ { 0x241D, "Redbird Flight Simulations, Inc." },
+ { 0x241E, "SHENZHEN FUNDUN TECHNOLOGY CO., LTD." },
+ { 0x241F, "Global Geo Supplies, Inc." },
+ { 0x2420, "M Seven System Limited" },
+ { 0x2421, "Anasphere, Inc." },
+ { 0x2422, "Tom Communication Industrial Co., Ltd." },
+ { 0x2423, "Bio-Med Devices Inc." },
+ { 0x2424, "CREATZ Inc." },
+ { 0x2425, "PIQX Imaging Pte. Ltd." },
+ { 0x2426, "Johnson Controls, Inc. - Building Efficiency Business" },
+ { 0x2427, "Winkelmann UK Ltd." },
+ { 0x2428, "SANTEC CORPORATION" },
+ { 0x2429, "IWSCOPE Inc." },
+ { 0x242A, "HUR OY" },
+ { 0x242B, "Philips Healthcare" },
+ { 0x242C, "ARMSTEL, Inc." },
+ { 0x242D, "Flastar Technology Co., Ltd." },
+ { 0x242E, "Vossloh-Schwabe Deutschland GmbH" },
+ { 0x242F, "GPH Co., Ltd." },
+ { 0x2430, "APE GmbH" },
+ { 0x2431, "Yamazaki Co., Ltd." },
+ { 0x2432, "Ceton Corp." },
+ { 0x2433, "Asetek A/S" },
+ { 0x2434, "NOVA electronics, Inc." },
+ { 0x2435, "PAKSENSE, INC." },
+ { 0x2436, "MediTECH Electronic GmbH" },
+ { 0x2437, "NIKETECH ELECTRONICS GROUP LIMITED" },
+ { 0x2438, "Innopower Technology Corporation" },
+ { 0x2439, "Comex Electronics AB" },
+ { 0x243A, "Mobile Devices Ingenierie" },
+ { 0x243B, "OTAX Electronics (ShenZhen) Co., Ltd." },
+ { 0x243C, "DiZiC Co., Ltd." },
+ { 0x243D, "emz - Hanauer GmbH & Co KGaA" },
+ { 0x243E, "Savi Elettronica srl" },
+ { 0x243F, "Photonic GesmbH & Co. KG" },
+ { 0x2440, "RB GeneralEkonomik" },
+ { 0x2441, "TV One" },
+ { 0x2442, "University of Central Florida" },
+ { 0x2443, "Aessent Technology Ltd." },
+ { 0x2444, "NetModule AG" },
+ { 0x2445, "TOMY Company, Ltd." },
+ { 0x2446, "Avionics Interface Technologies" },
+ { 0x2447, "Knick Elektronische Messgerate GmbH & Co. KG" },
+ { 0x2448, "Winterhalter GmbH" },
+ { 0x2449, "SHAEFER GmbH" },
+ { 0x244A, "Onzo Ltd." },
+ { 0x244B, "Applied Technical Systems" },
+ { 0x244C, "MinebeaMitsumi Inc." },
+ { 0x244D, "Pantec Biosolutions AG" },
+ { 0x244E, "ShopGuard Ltd." },
+ { 0x244F, "iWall A/S" },
+ { 0x2450, "Boule Medical AB" },
+ { 0x2451, "AEM Performance Electronics" },
+ { 0x2452, "Speeder Electronics Co., Ltd." },
+ { 0x2453, "BAANTO" },
+ { 0x2454, "Velosti Technology Limited" },
+ { 0x2455, "Anton/Bauer, Inc." },
+ { 0x2456, "CKD NIKKI DENSO CO., LTD" },
+ { 0x2457, "Alcomp. Inc." },
+ { 0x2458, "Bluegiga Technologies Oy" },
+ { 0x2459, "Secure Holdings Limited" },
+ { 0x245A, "KONDOH SEISAKUSHO Co., Ltd." },
+ { 0x245B, "Zixsys Inc." },
+ { 0x245C, "Steinbauer Electronics GmbH" },
+ { 0x245D, "ID Technologies" },
+ { 0x245E, "LNT - Automation GmbH" },
+ { 0x245F, "Chord Electronics Limited" },
+ { 0x2460, "NELS, Ltd." },
+ { 0x2461, "Beam Communications" },
+ { 0x2462, "IDENTICA S.A." },
+ { 0x2463, "BAP Precision Ltd." },
+ { 0x2464, "Nestlabs" },
+ { 0x2465, "Microsoft Surface Hub" },
+ { 0x2466, "Fractal Audio Systems, LLC" },
+ { 0x2467, "Nektar Technology, Inc." },
+ { 0x2468, "New Cosmos Electric Co., Ltd." },
+ { 0x2469, "Gloria Music Corp." },
+ { 0x246A, "UNH Interoperability Laboratory" },
+ { 0x246B, "Perfect Fortune Electric Wire & Cable (ShenZhen) Co. Ltd." },
+ { 0x246C, "Shanghai Fudan Microelectronics Co., Ltd." },
+ { 0x246D, "TrackMan A/S" },
+ { 0x246E, "Movinto Fun AB" },
+ { 0x246F, "STORK PRINTS AUSTRIA GmbH" },
+ { 0x2470, "Hale Microsystems" },
+ { 0x2471, "Bloonn Srl" },
+ { 0x2472, "Bossa Nova Robotics, Inc." },
+ { 0x2473, "Trend Control Systems Limited" },
+ { 0x2474, "Stamps.com" },
+ { 0x2475, "JCM American Corporation" },
+ { 0x2476, "Yost Engineering Inc." },
+ { 0x2477, "UbiVelox" },
+ { 0x2478, "Sonix Technology (Shenzhen) Co., Ltd." },
+ { 0x2479, "smartek d.o.o." },
+ { 0x247A, "Suzhou Jutze Technologies Co., Ltd" },
+ { 0x247B, "Digibras Industria do Brasil S.A" },
+ { 0x247C, "Fullconn Industry Inc." },
+ { 0x247D, "JARGY CO. LTD." },
+ { 0x247E, "GEWA music GmbH" },
+ { 0x247F, "Lynx Studio Technology, Inc." },
+ { 0x2480, "Omniware Inc." },
+ { 0x2481, "Shenzhen SKY DRAGON Audio-Video Technology Co., Ltd." },
+ { 0x2482, "SmartRoom LLC" },
+ { 0x2483, "Valups Corp." },
+ { 0x2484, "Unipolar Optics-Electrical Technology Co., Ltd." },
+ { 0x2485, "Dream SAS" },
+ { 0x2486, "DCG Systems, Inc." },
+ { 0x2487, "SHANGHAI VEI SHENG AUTO PARTS MANUFACTURING CO., LTD." },
+ { 0x2488, "SuperD Co., Ltd." },
+ { 0x2489, "Irvine Sensors Corporation" },
+ { 0x248A, "TeLink Semiconductor (Shanghai) Co., Ltd." },
+ { 0x248B, "DONGGUAN SYNCONN PRECISION INDUSTRY CO. LTD." },
+ { 0x248C, "Avicenna Instruments, LLC" },
+ { 0x248D, "Digital Matter Pty Ltd." },
+ { 0x248E, "Pulsar Informatics, Inc." },
+ { 0x248F, "HMS Industrial Networks AB" },
+ { 0x2490, "Zealtek electronic Co. Ltd." },
+ { 0x2491, "OBSERVATOR instruments b.v." },
+ { 0x2492, "Mofiria Corporation" },
+ { 0x2493, "Sensolutions Inc." },
+ { 0x2494, "Invoxia" },
+ { 0x2495, "Summit Semiconductor LLC" },
+ { 0x2496, "Dongguan DaTang Industrial Investment Co., Ltd." },
+ { 0x2497, "HyunWoo Electronics Co., Ltd." },
+ { 0x2498, "Aurora SFC Systems, Inc." },
+ { 0x2499, "Governors America Corp." },
+ { 0x249A, "Anedio, LLC" },
+ { 0x249B, "Miller Electric Mfg. Co." },
+ { 0x249C, "M2TECH SRL" },
+ { 0x249D, "Ken-A-Vision Manufacturing Company, Inc." },
+ { 0x249E, "Tlab West Systems AB" },
+ { 0x249F, "ABC PCB Sarl" },
+ { 0x24A0, "VIMAR SPA" },
+ { 0x24A1, "AUTONICS Corporation" },
+ { 0x24A2, "SafeTech Ltd." },
+ { 0x24A3, "BioTillion, LLC" },
+ { 0x24A4, "Primare AB" },
+ { 0x24A5, "OWANDY" },
+ { 0x24A6, "Shenzhen Pangngai Industrial Co., Ltd." },
+ { 0x24A7, "PROMAX ELECTRONICA S.A." },
+ { 0x24A8, "Hermes electronic GmbH" },
+ { 0x24A9, "ASolid Technology Co., Ltd." },
+ { 0x24AA, "Wasatch Photonics" },
+ { 0x24AB, "IMERJ LTD." },
+ { 0x24AC, "ToMiTec GmbH" },
+ { 0x24AD, "embedded brains GmbH" },
+ { 0x24AE, "Shenzhen Rapoo Technology Co., Ltd." },
+ { 0x24AF, "Integrated Corporation" },
+ { 0x24B0, "Echometer Company" },
+ { 0x24B1, "SCR Engineers Ltd." },
+ { 0x24B2, "DelSys Inc." },
+ { 0x24B3, "Simbionix Ltd." },
+ { 0x24B4, "Leema Acoustics" },
+ { 0x24B5, "3C TEK CORP." },
+ { 0x24B6, "Shenzhen New-Conn International Co., Ltd." },
+ { 0x24B7, "Medical Equipment Europe GmbH" },
+ { 0x24B8, "DongGuan CJ TOUCH Electronic Co., Ltd." },
+ { 0x24B9, "Hoshin Electronics Co., Ltd." },
+ { 0x24BA, "PRADOTEC Corporation Sdn. Bhd." },
+ { 0x24BB, "SHANGHAI LIGHTSURFING INFORMATION TECHNOLOGY CO., LTD." },
+ { 0x24BC, "Sartorius AG" },
+ { 0x24BD, "Smart Solution" },
+ { 0x24BE, "Mutewatch AB" },
+ { 0x24BF, "NBS Payment Solutions, Inc." },
+ { 0x24C0, "Chaney Instrument Co." },
+ { 0x24C1, "Maction Technologies, Inc." },
+ { 0x24C2, "DiCon Fiberoptics, Inc." },
+ { 0x24C3, "Covaris, Inc." },
+ { 0x24C4, "CMITECH Co., Ltd." },
+ { 0x24C5, "HUINTECH" },
+ { 0x24C6, "Xbox 3rd Party Partners" },
+ { 0x24C7, "Laser Technology, Inc." },
+ { 0x24C8, "CHAPP INC." },
+ { 0x24C9, "Pilot Electronic (China) Ltd." },
+ { 0x24CA, "SMARTEH d.o.o." },
+ { 0x24CB, "Servotronix Motion Control Ltd." },
+ { 0x24CC, "JSB Tech Pte. Ltd." },
+ { 0x24CD, "Viking360.com LLC" },
+ { 0x24CE, "Shenzhen Deren Electronic Co., Ltd." },
+ { 0x24CF, "Lytro, Inc." },
+ { 0x24D0, "Smith Micro Software, Inc." },
+ { 0x24D1, "POS & Solution Company" },
+ { 0x24D2, "DADT Holdings, LLC" },
+ { 0x24D3, "Lexking Technology Co., Ltd." },
+ { 0x24D4, "KOMATSU ELECTRONIC CO., LTD." },
+ { 0x24D5, "SATEL Ltd." },
+ { 0x24D6, "Develer S.r.l." },
+ { 0x24D7, "ACORDE TECHNOLOGIES" },
+ { 0x24D8, "Pittway Tecnologica Srl" },
+ { 0x24D9, "Unfors Instruments AB" },
+ { 0x24DA, "KYOCERA ELCO Korea Co., Ltd." },
+ { 0x24DB, "DDUSB Technology" },
+ { 0x24DC, "Aladdin Software Security R.D." },
+ { 0x24DD, "Kingspan Environmental Ltd." },
+ { 0x24DE, "Navicron" },
+ { 0x24DF, "ALGO System. Co" },
+ { 0x24E0, "Yoctopuce Sarl" },
+ { 0x24E1, "Paratronic S.A." },
+ { 0x24E2, "Digital Information Technology Studies (Shenzhen) Ltd." },
+ { 0x24E3, "Beijing TianYu Communication Equipment Co., Ltd." },
+ { 0x24E4, "Bytec Group Limited" },
+ { 0x24E5, "Lanmark Controls Inc." },
+ { 0x24E6, "ACI Analytical Control Instruments GmbH" },
+ { 0x24E7, "maxon motor ag" },
+ { 0x24E8, "ivee" },
+ { 0x24E9, "Microelectronics Technology Inc." },
+ { 0x24EA, "ZEBEX INDUSTRIES INC." },
+ { 0x24EB, "SHENZHEN PCTX TECHNOLOGY DEVELOPMENT CO., LTD." },
+ { 0x24EC, "CE-Infosys GmbH" },
+ { 0x24ED, "ZEN FACTORY GROUP (ASIA) LTD." },
+ { 0x24EE, "A C S Co., Ltd." },
+ { 0x24EF, "DATONG PLC" },
+ { 0x24F0, "Das Keyboard - Metadot" },
+ { 0x24F1, "Silicon Communication Technology" },
+ { 0x24F2, "Secure Electrans LTD." },
+ { 0x24F3, "MartinLogan Ltd." },
+ { 0x24F4, "Mind Media BV" },
+ { 0x24F5, "QRS Diagnostic" },
+ { 0x24F6, "Aplix IP Holdings Corporation" },
+ { 0x24F7, "Seneye Ltd." },
+ { 0x24F8, "Bang & Olufsen A/S" },
+ { 0x24F9, "TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORP." },
+ { 0x24FA, "Vectronix AG" },
+ { 0x24FB, "GTECH Corporation" },
+ { 0x24FC, "GPEG International" },
+ { 0x24FD, "Nichiyu Giken Kogyo Co., Ltd." },
+ { 0x24FE, "GOMETRICS, S.L." },
+ { 0x24FF, "Acroname Inc." },
+ { 0x2500, "Ettus Research LLC" },
+ { 0x2501, "Bridge Publications, Inc." },
+ { 0x2502, "Canadian Automotive Instruments Ltd." },
+ { 0x2503, "Kurth Electronic GmbH" },
+ { 0x2504, "Nemic Lambda Ltd." },
+ { 0x2505, "Xiroku Accupoint Technology Inc." },
+ { 0x2506, "Hind Technology Group" },
+ { 0x2507, "Advion BioSystems" },
+ { 0x2508, "Symplex Communications, Inc." },
+ { 0x2509, "Chain-In Electronic Co., Ltd." },
+ { 0x250A, "H-Squared" },
+ { 0x250B, "Nautilus Lifeline Ltd." },
+ { 0x250C, "PHX Inc." },
+ { 0x250D, "Alstom Grid SAS" },
+ { 0x250E, "Beijing MOPS Technology Co., Ltd." },
+ { 0x250F, "itplants ltd." },
+ { 0x2510, "SE Elektronische Systeme" },
+ { 0x2511, "Morita Tech Co., Ltd." },
+ { 0x2512, "RNDPLUS Co., Ltd." },
+ { 0x2513, "RMI Laser, LLC" },
+ { 0x2514, "Fullpower Technologies" },
+ { 0x2515, "AMITEK" },
+ { 0x2516, "Cooler Master Co., Ltd." },
+ { 0x2517, "Marel EHF" },
+ { 0x2518, "Anite Telecoms Inc." },
+ { 0x2519, "n-gineric gmbh" },
+ { 0x251A, "Daiichi Electronics" },
+ { 0x251B, "Stable Imaging Solutions, LLC" },
+ { 0x251C, "snom technology AG" },
+ { 0x251D, "Fortebio Inc." },
+ { 0x251E, "Polara Engineering, Inc." },
+ { 0x251F, "Golden Emperor International Ltd." },
+ { 0x2520, "ANA-U GmbH" },
+ { 0x2521, "Fundacion Tekniker" },
+ { 0x2522, "Light Harmonic" },
+ { 0x2523, "Recon Instruments Inc." },
+ { 0x2524, "CVRx" },
+ { 0x2525, "Barron McCann Technology Ltd." },
+ { 0x2526, "Weide Electronics Co., Ltd." },
+ { 0x2527, "Software Bisque, Inc." },
+ { 0x2528, "BittWare Inc." },
+ { 0x2529, "SUZHOU XINYA ELECTRIC COMMUNICATION CO., LTD." },
+ { 0x252A, "SUZHOU KELI TECHNOLOGY DEVELOPMENT CO., LTD." },
+ { 0x252B, "TOP Exactitude Industry (ShenZhen) Co., Ltd." },
+ { 0x252C, "VIGO System S.A." },
+ { 0x252D, "Nokia Siemens Networks" },
+ { 0x252E, "Heliox Technologies, Inc." },
+ { 0x252F, "Pentronic AB" },
+ { 0x2530, "STT Emtec AB" },
+ { 0x2531, "Proteus Industries Inc." },
+ { 0x2532, "C.R.D.E. (Cahors Group)" },
+ { 0x2533, "Osaka Micro Computer, Inc." },
+ { 0x2534, "Russia's Institute of Radionavigation and Time" },
+ { 0x2535, "ShenZhen Hogend Precision Technology Co., Ltd." },
+ { 0x2536, "Ubisys Technology Co., Ltd." },
+ { 0x2537, "Norel Systems Ltd." },
+ { 0x2538, "Cochlear Ltd." },
+ { 0x2539, "Club Electronics" },
+ { 0x253A, "System Sacom Industry Corporation" },
+ { 0x253B, "RCF S.p.a." },
+ { 0x253C, "Tri-Tech Manufacturing Inc." },
+ { 0x253D, "Koss Corporation" },
+ { 0x253E, "Creative Product Design Pty., Ltd." },
+ { 0x253F, "ORANGE IT INC." },
+ { 0x2540, "Applied Materials" },
+ { 0x2541, "Shanghai AisinoChip Electronics Technology Co., Ltd." },
+ { 0x2542, "Ditron S.R.L." },
+ { 0x2543, "Spark Dental Technology Limited" },
+ { 0x2544, "Energy Micro AS" },
+ { 0x2545, "Digital Foci, Inc." },
+ { 0x2546, "Ravensburger Spieleverlag GmbH" },
+ { 0x2547, "YiDu Technology" },
+ { 0x2548, "Pulse-Eight Limited" },
+ { 0x2549, "Librestream Technologies" },
+ { 0x254A, "Enegate Co., Ltd." },
+ { 0x254B, "Toy Toy Toy Ltd." },
+ { 0x254C, "X6D Limited" },
+ { 0x254D, "ICAR VISION SYSTEMS S.L." },
+ { 0x254E, "SHF Communication Technologies AG" },
+ { 0x254F, "Jigeon Technologies Co., Ltd." },
+ { 0x2550, "Teledyne" },
+ { 0x2551, "A.E.B. Industriale S.r.l." },
+ { 0x2552, "Striiv, Inc." },
+ { 0x2553, "C8 MediSensor" },
+ { 0x2554, "ASSA ABLOY AB" },
+ { 0x2555, "Pulse Tracer, Inc." },
+ { 0x2556, "United Radio-Electronic Technologies Co., Ltd." },
+ { 0x2557, "Robatech AG" },
+ { 0x2558, "INTECH ELECTRONICS CORP." },
+ { 0x2559, "Jangus Music, Inc. (dba Wi Digital Systems)" },
+ { 0x255A, "TaiDoc Technology Corp." },
+ { 0x255B, "NDI Technologies, Inc." },
+ { 0x255C, "HOSIWELL TECHNOLOGY CO., LTD." },
+ { 0x255D, "ATEECS" },
+ { 0x255E, "Beijing Bonxeon Technology Co., Ltd." },
+ { 0x255F, "DORNIER-LTF GmbH" },
+ { 0x2560, "e-con Systems India Private Limited" },
+ { 0x2561, "Brookhaven Instruments Corp." },
+ { 0x2562, "SHENGZHEN MAYA ELECTRONICS CREATION CO. LTD." },
+ { 0x2563, "Shenzhen ShanWan Technology Co., Ltd." },
+ { 0x2564, "TESSERA TECHNOLOGY INC." },
+ { 0x2565, "Cyclone Industries Limited" },
+ { 0x2566, "Cryptera A/S" },
+ { 0x2567, "DongGuan LongTao Electronic Co., Ltd." },
+ { 0x2568, "ALL LINK CONN. TECHNOLOGY CORP." },
+ { 0x2569, "DongGuan City MingJi Electronics Co., Ltd." },
+ { 0x256A, "TAIAN TECHNOLOGY (WUXI) Co., Ltd." },
+ { 0x256B, "Perreaux Industries Ltd." },
+ { 0x256C, "GRAPHICS TECHNOLOGY (HK) CO., LIMITED" },
+ { 0x256D, "Compal Broadband Networks, Inc." },
+ { 0x256E, "Valuest Co., Ltd." },
+ { 0x256F, "3D CONNEXION SAM" },
+ { 0x2570, "AVID Technologies, Inc." },
+ { 0x2571, "CHIPMAST TECHNOLOGY CO., LTD." },
+ { 0x2572, "Vmarker" },
+ { 0x2573, "ESI Audiotechnik GmbH" },
+ { 0x2574, "AVer Information Inc." },
+ { 0x2575, "Weida Hi-Tech Co., Ltd." },
+ { 0x2576, "AFO Co., Ltd." },
+ { 0x2577, "LCDVF LLC" },
+ { 0x2578, "MPEC Technology Limited" },
+ { 0x2579, "Dongguan Wisechamp Electronic Co., Ltd." },
+ { 0x257A, "Shanghai Yuga Information Technology Co., Ltd." },
+ { 0x257B, "shenzhen dcard smart card tech. co., ltd." },
+ { 0x257C, "Richard Woehr GmbH" },
+ { 0x257D, "Panovel Technology Corporation" },
+ { 0x257E, "RFL Electronics Inc." },
+ { 0x257F, "8devices" },
+ { 0x2580, "DJ Techtools (Golden Sol Music LLC. Is Holding Co.)" },
+ { 0x2581, "Plug-up" },
+ { 0x2582, "Helmholz GmbH & Co. KG" },
+ { 0x2583, "VECTRUX DISTRIBUTORS LLC" },
+ { 0x2584, "COSMO CO., LTD." },
+ { 0x2585, "HomeChip Ltd." },
+ { 0x2586, "PLANET Technology Corporation" },
+ { 0x2587, "Ningbo Jiatang Electronic Co., Ltd." },
+ { 0x2588, "Infinitegra, Inc." },
+ { 0x2589, "Argon Technology Corporation" },
+ { 0x258A, "Sino Wealth Electronic Ltd." },
+ { 0x258B, "KORYO ELECTRONICS CO., LTD." },
+ { 0x258C, "Fastec Imaging Corporation" },
+ { 0x258D, "Sequans Communications" },
+ { 0x258E, "ENJsoft Co., Ltd." },
+ { 0x258F, "CME" },
+ { 0x2590, "MuChip Co., Ltd." },
+ { 0x2591, "Optimus Semiconductor Inc." },
+ { 0x2592, "Quest International" },
+ { 0x2593, "CELIZION, Inc." },
+ { 0x2594, "Acsys Technologies Ltd." },
+ { 0x2595, "SANYO DENKI CO., LTD." },
+ { 0x2596, "Twisted Melon Inc." },
+ { 0x2597, "Diagnostic Systems Associates Inc." },
+ { 0x2598, "Aerocrine" },
+ { 0x2599, "Q-tag AG" },
+ { 0x259A, "TriQuint Semiconductor" },
+ { 0x259B, "INUVIO" },
+ { 0x259C, "Immedia Semiconductor Inc." },
+ { 0x259D, "RCA DA AMAZONIA LTDA" },
+ { 0x259E, "American Messaging Services LLC" },
+ { 0x259F, "THERMO KING" },
+ { 0x25A0, "Ciegus Ltd." },
+ { 0x25A1, "Suitable Technologies, Inc." },
+ { 0x25A2, "LEMKE ENG." },
+ { 0x25A3, "Nanoteq (Pty) Ltd." },
+ { 0x25A4, "ALGOLTEK, INC." },
+ { 0x25A5, "Yakel Enterprises LLC" },
+ { 0x25A6, "AADI AS" },
+ { 0x25A7, "Beken Corporation" },
+ { 0x25A8, "Guangzhou Geoelectron Science & Technology Co., Ltd." },
+ { 0x25A9, "Advanced Bionics" },
+ { 0x25AA, "Top Victory Investments Ltd. (HK)" },
+ { 0x25AB, "Carmanah Signs" },
+ { 0x25AC, "PLIGG" },
+ { 0x25AD, "Aurora Networks, Inc." },
+ { 0x25AE, "OXIPULSE" },
+ { 0x25AF, "C&A Marketing" },
+ { 0x25B0, "Musical Fidelity" },
+ { 0x25B1, "Disc Soft Ltd." },
+ { 0x25B2, "DRS-RSTA, Inc." },
+ { 0x25B3, "DongGuan Elinke Industrial Co., Ltd." },
+ { 0x25B4, "Fairhaven Health" },
+ { 0x25B5, "FlatFrog Laboratories AB" },
+ { 0x25B6, "Fructel AB" },
+ { 0x25B7, "Neomitic Technologies S.A. de C.V." },
+ { 0x25B8, "Neutronics Inc." },
+ { 0x25B9, "Nujira Ltd." },
+ { 0x25BA, "WITec Wissenschaftliche Instrumente & Technologie GmbH" },
+ { 0x25BB, "Brunner Elektronik AG" },
+ { 0x25BC, "CETRTA POT" },
+ { 0x25BD, "TECHEYE SYSTEMS INC." },
+ { 0x25BE, "Infinite Z" },
+ { 0x25BF, "Elegant Invention" },
+ { 0x25C0, "Beyond Music Industrial Co., Ltd." },
+ { 0x25C1, "Vaddio" },
+ { 0x25C2, "Smith + Nephew Inc." },
+ { 0x25C3, "Phorus" },
+ { 0x25C4, "A & R Cambridge Ltd." },
+ { 0x25C5, "Securetec Detektions Systeme AG" },
+ { 0x25C6, "AVA Group A/S" },
+ { 0x25C7, "MEGATRON Elektronik AG & Co." },
+ { 0x25C8, "Visualplanet Ltd." },
+ { 0x25C9, "Proximiant" },
+ { 0x25CA, "Hovding Sverige AB" },
+ { 0x25CB, "ELZET80 Mikrocomputer Giesler & Danne GmbH & Co. KG" },
+ { 0x25CC, "NKC Co., Ltd." },
+ { 0x25CD, "Edwards Ltd." },
+ { 0x25CE, "MYTEK DIGITAL" },
+ { 0x25CF, "Corning Optical Communications LLC" },
+ { 0x25D0, "AeVee Laboratories LLC" },
+ { 0x25D1, "TOKAI-DENSHI Inc." },
+ { 0x25D2, "MRA Tek LLC" },
+ { 0x25D3, "Zhe Jiang Huasheng Technology Co., Ltd." },
+ { 0x25D4, "LOOPCOMM TECHNOLOGY, INC." },
+ { 0x25D5, "DATATON AB" },
+ { 0x25D6, "KOUZIRO Co., Ltd." },
+ { 0x25D7, "Audiomatica srl" },
+ { 0x25D8, "Serious Integrated, Inc." },
+ { 0x25D9, "Monarch Innovative Technologies Pvt. Ltd." },
+ { 0x25DA, "NETATMO" },
+ { 0x25DB, "Merrick Industries, Inc." },
+ { 0x25DC, "Cobolt AB" },
+ { 0x25DD, "bit4id srl" },
+ { 0x25DE, "Gasmet Technologies OY" },
+ { 0x25DF, "TTE Systems Ltd." },
+ { 0x25E0, "MULTIPLEX Modellsport GmbH & Co. KG" },
+ { 0x25E1, "Daimler AG" },
+ { 0x25E2, "Domain Surgical" },
+ { 0x25E3, "SCI Innovations Ltd." },
+ { 0x25E4, "AnaJet" },
+ { 0x25E5, "ALLFLEX EUROPE" },
+ { 0x25E6, "Digital Drilling Data Systems, LLC" },
+ { 0x25E7, "EIFELWERK Butler Systeme GmbH" },
+ { 0x25E8, "ATOLL Electronique" },
+ { 0x25E9, "Leybold Vacuum" },
+ { 0x25EA, "Aeroflex Weinschel" },
+ { 0x25EB, "Medical Intubation Technology Corp." },
+ { 0x25EC, "VELUX A/S" },
+ { 0x25ED, "Logic PD" },
+ { 0x25EE, "Mimoco" },
+ { 0x25EF, "BLITZ Co., Ltd." },
+ { 0x25F0, "GOODBETTERBEST Ltd." },
+ { 0x25F1, "Eden Innovations" },
+ { 0x25F2, "Dongguan Jinyue Electronics Co., Ltd." },
+ { 0x25F3, "Kicker" },
+ { 0x25F4, "ADVANSEE" },
+ { 0x25F5, "Lucas Holding bv" },
+ { 0x25F6, "SaferZone Co., Ltd." },
+ { 0x25F7, "Engineea Remote Technologies S.L." },
+ { 0x25F8, "Keypair Co., Ltd." },
+ { 0x25F9, "Donbass Soft Ltd. & Co. KG" },
+ { 0x25FA, "SoftEther Corporation" },
+ { 0x25FB, "RICOH IMAGING COMPANY, LTD." },
+ { 0x25FC, "RWA (Hong Kong) Limited" },
+ { 0x25FD, "Neuromonics Inc." },
+ { 0x25FE, "Providence Enterprise Limited" },
+ { 0x25FF, "Watermark Medical, Inc." },
+ { 0x2600, "SMARTCORE Inc." },
+ { 0x2601, "OFI Testing Equipment, Inc." },
+ { 0x2602, "Magenta Research Ltd." },
+ { 0x2603, "Swyx Solutions AG" },
+ { 0x2604, "Shenzhen Tenda Technology, Ltd." },
+ { 0x2605, "OSRAM SYLVANIA" },
+ { 0x2606, "O-Network Engineering AB" },
+ { 0x2607, "Prox Dynamics AS" },
+ { 0x2608, "OLHO tronic GmbH" },
+ { 0x2609, "FICOSA" },
+ { 0x260A, "SPEMOT AG" },
+ { 0x260B, "Schneider Electric Canada Inc. - Division of PCT" },
+ { 0x260C, "Saiko Systems Ltd." },
+ { 0x260D, "DongGuan Togran Electronic Co., Ltd." },
+ { 0x260E, "DongGuan HYX Industrial Co., Ltd." },
+ { 0x260F, "VITY" },
+ { 0x2610, "Egan Teamboard Inc." },
+ { 0x2611, "I.C.E. Co., Ltd." },
+ { 0x2612, "Crave Innovations" },
+ { 0x2613, "Gerd Bar GmbH" },
+ { 0x2614, "VMC Consulting Corporation" },
+ { 0x2615, "Gammaflux L.P." },
+ { 0x2616, "PS Audio" },
+ { 0x2617, "Front-End Technology, Inc." },
+ { 0x2618, "MicroGate Systems Ltd." },
+ { 0x2619, "Advanced Silicon SA" },
+ { 0x261A, "Shandong Synthesis Electronic Technology Co., Ltd." },
+ { 0x261B, "INTELLIGENT ENERGY, LTD." },
+ { 0x261C, "EISST Limited" },
+ { 0x261D, "Arkham Technology" },
+ { 0x261E, "IFAM GmbH Erfurt" },
+ { 0x261F, "Cooper Industries" },
+ { 0x2620, "SUE unicon.uz Scientific, Engineering & Marketing RC" },
+ { 0x2621, "CLIXUP LLC" },
+ { 0x2622, "IAG Group Limited" },
+ { 0x2623, "SGR Audio Pty Ltd." },
+ { 0x2624, "L-3 Communications - Communications Systems West" },
+ { 0x2625, "MilDef AB" },
+ { 0x2626, "Aruba Networks" },
+ { 0x2627, "Vectron Systems AG" },
+ { 0x2628, "TEN-TEC, INC." },
+ { 0x2629, "Winstars Technology Limited" },
+ { 0x262A, "SAVITECH CORP." },
+ { 0x262B, "YTOP Electronics Technical (Kunshan) Co., Ltd." },
+ { 0x262C, "Scannx" },
+ { 0x262D, "Fujian Witsi Microelectronics Technology Co., Ltd." },
+ { 0x262E, "UNITEX Corporation" },
+ { 0x262F, "MELAG Medizintechnik oHG" },
+ { 0x2630, "ifm electronic gmbh" },
+ { 0x2631, "NEOPROT TECNOLOGIA EM INFORMATICA LTDA." },
+ { 0x2632, "ENSPERT Inc." },
+ { 0x2633, "Inno Audio & Video (HK) Limited" },
+ { 0x2634, "E.M.S. S.R.L." },
+ { 0x2635, "uHDevice Technology Ltd." },
+ { 0x2636, "MED-EL Medical Electronics" },
+ { 0x2637, "TAEWOONG MEDICAL. CO., LTD." },
+ { 0x2638, "Becker-Antriebe GmbH" },
+ { 0x2639, "Xsens Technologies B.V." },
+ { 0x263A, "Maury Microwave" },
+ { 0x263B, "Time & Data Systems International Ltd." },
+ { 0x263C, "Schultes Microcomputer-Vertriebs-GmbH & Co KG" },
+ { 0x263D, "pls Programmierbare Logik & Systeme GmbH" },
+ { 0x263E, "Odin TeleSystems Inc." },
+ { 0x263F, "ES-Experts, Ltd." },
+ { 0x2640, "Banner Engineering" },
+ { 0x2641, "PRO TUNE ELECTRONIC SYSTEMS" },
+ { 0x2642, "NPP ELIKS America Inc. DBA T&M Atlantic" },
+ { 0x2643, "COMVOX AUDIO CO., LTD." },
+ { 0x2644, "Sioux Electronics B.V." },
+ { 0x2645, "Lead Data Inc." },
+ { 0x2646, "Bel Canto Design, Ltd." },
+ { 0x2647, "FORMER ENGINEERING SERVICE CO., LTD." },
+ { 0x2648, "Telongo LLC" },
+ { 0x2649, "Soundspring Audio, Inc" },
+ { 0x264A, "THERMALTAKE Technology Co., Ltd." },
+ { 0x264B, "Industrial Indexing Systems" },
+ { 0x264C, "Si14 SpA" },
+ { 0x264D, "Wolfrum Elektronik & Avionik" },
+ { 0x264E, "3i Corporation" },
+ { 0x264F, "RF Controls, LLC" },
+ { 0x2650, "Electronics For Imaging, Inc." },
+ { 0x2651, "Otis Instruments Inc." },
+ { 0x2652, "Fallbrook Technologies, Inc." },
+ { 0x2653, "AutoHotBox" },
+ { 0x2654, "DarklingX, LLC" },
+ { 0x2655, "Moog Inc." },
+ { 0x2656, "Ashcroft Inc." },
+ { 0x2657, "Embedia Technologies Corporation" },
+ { 0x2658, "Sintermask GmbH" },
+ { 0x2659, "Sundtek" },
+ { 0x265A, "3Brain GmbH" },
+ { 0x265B, "D-tect Systems" },
+ { 0x265C, "IDEX Health + Science LLC" },
+ { 0x265D, "H. Schomaecker GmbH" },
+ { 0x265E, "JSC Engineering Centre Energoservice" },
+ { 0x265F, "Azatrax" },
+ { 0x2660, "YEONG DER (SUM-EM) Enterprises Co., Ltd." },
+ { 0x2661, "WorldCast Systems" },
+ { 0x2662, "MOOG Music Inc." },
+ { 0x2663, "JOMESA Messsysteme GmbH" },
+ { 0x2664, "NOHMI BOSAI Ltd." },
+ { 0x2665, "Yamaki Electric Corporation" },
+ { 0x2666, "BLX IC Design Corp., Ltd." },
+ { 0x2667, "SuZhou ZhongXingLian Precision Industrial Co., Ltd." },
+ { 0x2668, "Shenzhen Yuwenfa Electronic Technology Co., Ltd." },
+ { 0x2669, "ME4SURE, Inc." },
+ { 0x266A, "Linear LLC" },
+ { 0x266B, "ProSys Development Services" },
+ { 0x266C, "Brightsight BV" },
+ { 0x266D, "Ergotest Innovation A.S." },
+ { 0x266E, "Multimedia Link, Inc." },
+ { 0x266F, "Shanghai Zhengyuan Technologies Co., Ltd." },
+ { 0x2670, "Zhengzhou Xin Da Jie An Information Technology Co., Ltd" },
+ { 0x2671, "Innovative Logic" },
+ { 0x2672, "GoPro" },
+ { 0x2673, "Wadia Digital" },
+ { 0x2674, "Hoyt Monitor Technologies, LLC" },
+ { 0x2675, "Peter Huber Kaeltemaschinenbau GmbH" },
+ { 0x2676, "Basler AG" },
+ { 0x2677, "Winegard Company" },
+ { 0x2678, "Sky Deutschland GmbH & Co. KG" },
+ { 0x2679, "BESTMEDIA CD-Recordable GmbH & Co. KG" },
+ { 0x267A, "Xi'an YEP Telecommunication Technology Co., Ltd." },
+ { 0x267B, "Palpilot International Corp." },
+ { 0x267C, "OptiGene Limited" },
+ { 0x267D, "KOHZU Precision Co., Ltd." },
+ { 0x267E, "E.D. Bullard Company" },
+ { 0x267F, "Acromag Inc." },
+ { 0x2680, "DIGICO UK Limited" },
+ { 0x2681, "MYLAPS B.V." },
+ { 0x2682, "ROBOX S.P.A." },
+ { 0x2683, "Gazogiken Co., Ltd." },
+ { 0x2684, "Funkwerk Security Communications GmbH" },
+ { 0x2685, "Cardo Systems Inc." },
+ { 0x2686, "IP LABS Inc." },
+ { 0x2687, "FITBIT" },
+ { 0x2688, "Stratasys Inc." },
+ { 0x2689, "StepOver Inc." },
+ { 0x268A, "QEES" },
+ { 0x268B, "Dimension Engineering LLC" },
+ { 0x268C, "AMS-TAOS" },
+ { 0x268D, "WEISS ENGINEERING LTD." },
+ { 0x268E, "xyzmo Software GmbH" },
+ { 0x268F, "LETech Co., Ltd." },
+ { 0x2690, "K.K. Rabbit" },
+ { 0x2691, "ZINK Imaging, Inc." },
+ { 0x2692, "CELLIENT CO., LTD." },
+ { 0x2693, "Silvershore Technology Partners" },
+ { 0x2694, "RoboteX Inc." },
+ { 0x2695, "DynaGen Technologies Inc." },
+ { 0x2696, "Sensovation AG" },
+ { 0x2697, "Anfatec Instruments" },
+ { 0x2698, "EVTD Inc." },
+ { 0x2699, "ECOUS Corp." },
+ { 0x269A, "BETTER MANAGE INVESTMENTS LIMITED" },
+ { 0x269B, "Novel Data Solutions (Suzhou) Corporation" },
+ { 0x269C, "ECTRON CORPORATION" },
+ { 0x269D, "Accessible Technologies, Inc." },
+ { 0x269E, "Astro Gaming" },
+ { 0x269F, "DKL TECHNOLOGY (SHENZHEN) CO., LTD." },
+ { 0x26A0, "MIDAS" },
+ { 0x26A1, "Miris AB" },
+ { 0x26A2, "Eppendorf AG" },
+ { 0x26A3, "EMKO ELEKTRONIK SAN. VE TIC. AS" },
+ { 0x26A4, "Blue Goji" },
+ { 0x26A5, "CAL TEST ELECTRONICS, INC." },
+ { 0x26A6, "Radio Design Group, Inc." },
+ { 0x26A7, "LOG-IN, Inc." },
+ { 0x26A8, "UNIREX CORPORATION" },
+ { 0x26A9, "Research Industrial Systems IT-Engineering (RISE) GmbH" },
+ { 0x26AA, "YAESU MUSEN CO., LTD." },
+ { 0x26AB, "Motion Control Systems, Inc." },
+ { 0x26AC, "3D Robotics Inc." },
+ { 0x26AD, "Global Distribution GmbH" },
+ { 0x26AE, "Oscium" },
+ { 0x26AF, "Bombardier Transportation GmbH, TCMS Development Ctr 2" },
+ { 0x26B0, "Zhejiang Senda Electronics Co., Ltd." },
+ { 0x26B1, "Bassett Electronic Systems Limited" },
+ { 0x26B2, "RST Instruments Ltd." },
+ { 0x26B3, "Global Inkjet Systems" },
+ { 0x26B4, "Sensor Technology Limited" },
+ { 0x26B5, "ELECTROCOMPANIET AS" },
+ { 0x26B6, "Pacom Systems Pty. Ltd." },
+ { 0x26B7, "Azusatekuno" },
+ { 0x26B8, "InkControl, LLC" },
+ { 0x26B9, "Satlantic LP" },
+ { 0x26BA, "Freetronics Pty Ltd." },
+ { 0x26BB, "Omega Elektronik Sanayi ve Ticaret A.S." },
+ { 0x26BC, "CARDIN ELETTRONICA S.p.A." },
+ { 0x26BD, "Integral Memory Plc." },
+ { 0x26BE, "AKASA (ASIA) CORP." },
+ { 0x26BF, "Broadway System, Inc." },
+ { 0x26C0, "RADIODETECTION LTD." },
+ { 0x26C1, "Viola Audio Laboratories" },
+ { 0x26C2, "FUTURE UNIVERSITY HAKODATE" },
+ { 0x26C3, "HARLEY-DAVIDSON MOTOR COMPANY" },
+ { 0x26C4, "Logic Way GmbH" },
+ { 0x26C5, "TOKAI RUBBER INDUSTRIES, LTD." },
+ { 0x26C6, "GRAF-SYTECO GmbH & Co. KG" },
+ { 0x26C7, "Beijing Stone New Technology Industry Co., Ltd." },
+ { 0x26C8, "SCHMID mme - electronic product engineering" },
+ { 0x26C9, "SPM INSTRUMENT AB" },
+ { 0x26CA, "MSY Inc." },
+ { 0x26CB, "Sung Kyung Precision Co., Ltd." },
+ { 0x26CC, "Hunting Titan" },
+ { 0x26CD, "Blendology Limited" },
+ { 0x26CE, "ASRock Inc." },
+ { 0x26CF, "The Gate Technologies" },
+ { 0x26D0, "ZK Celltest, Inc." },
+ { 0x26D1, "THORLABS LTD." },
+ { 0x26D2, "Jiangsu Yinhe Electronics Co., Ltd." },
+ { 0x26D3, "VIBRATION INSTRUMENTS CO., LTD." },
+ { 0x26D4, "Truesense Imaging" },
+ { 0x26D5, "Equinox Payments, LLC" },
+ { 0x26D6, "Sistemi Elettronici Di Addonizio Luisa" },
+ { 0x26D7, "POPSPA (HK) LTD." },
+ { 0x26D8, "APR, LLC" },
+ { 0x26D9, "ATC-NY" },
+ { 0x26DA, "Dabi Atlante" },
+ { 0x26DB, "American DJ Supply" },
+ { 0x26DC, "Gato Audio" },
+ { 0x26DD, "Monnit Corp." },
+ { 0x26DE, "Velocity Micro, Inc." },
+ { 0x26DF, "University of Cambridge" },
+ { 0x26E0, "Shenzhen Shixin Digital Co., Ltd." },
+ { 0x26E1, "CrucialTec Co., Ltd." },
+ { 0x26E2, "Ingenieurbuero Dietzsch und Thiele PartG" },
+ { 0x26E3, "SHENZHEN EXCEL DIGITAL TECHNOLOGY CO., LTD." },
+ { 0x26E4, "VIZIO, Inc." },
+ { 0x26E5, "Shaghal Ltd." },
+ { 0x26E6, "ORC Manufacturing Co., Ltd." },
+ { 0x26E7, "Fishman" },
+ { 0x26E8, "Camgian Microsystems" },
+ { 0x26E9, "Lumenergi Inc." },
+ { 0x26EA, "OPTOVUE INC." },
+ { 0x26EB, "emtrion GmbH" },
+ { 0x26EC, "SLE quality engineering GmbH & Co. KG" },
+ { 0x26ED, "a.tron3d GmbH" },
+ { 0x26EE, "Grimm Audio" },
+ { 0x26EF, "TAKEBISHI CORPORATION" },
+ { 0x26F0, "EDM Corporation" },
+ { 0x26F1, "Fujian LANDI Commercial Equipment Co., Ltd." },
+ { 0x26F2, "AUDIS SARL" },
+ { 0x26F3, "Raven Systems Design, Inc." },
+ { 0x26F4, "RTW GmbH & Co. KG" },
+ { 0x26F5, "Morning Star Digital Connector Co., Ltd." },
+ { 0x26F6, "Sea-Bird Electronics" },
+ { 0x26F7, "BFFT GmbH" },
+ { 0x26F8, "Salon Transcripts, Inc." },
+ { 0x26F9, "Outstanding Technology Co., Ltd." },
+ { 0x26FA, "DAQ SYSTEM Co., Ltd." },
+ { 0x26FB, "FLIR Advanced Imaging Systems" },
+ { 0x26FC, "Raven Industries" },
+ { 0x26FD, "Foot Levelers, Inc." },
+ { 0x26FE, "ESPROS Photonics AG" },
+ { 0x26FF, "MIA Corporation" },
+ { 0x2700, "MITACHI CO., LTD." },
+ { 0x2701, "Pro Design Electronic GmbH" },
+ { 0x2702, "Hobart GmbH" },
+ { 0x2703, "Greenwave Reality Pte. Ltd." },
+ { 0x2704, "Unisun Innovation Incorporated" },
+ { 0x2705, "CardioGrip Corporation" },
+ { 0x2706, "iKey, Ltd." },
+ { 0x2707, "Bardac Corporation" },
+ { 0x2708, "Audient Limited" },
+ { 0x2709, "ZEON CORPORATION" },
+ { 0x270A, "Channel Islands Audio" },
+ { 0x270B, "MSHeli Srl" },
+ { 0x270C, "Inhon Computer Co., Ltd." },
+ { 0x270D, "ROSAND Technologies" },
+ { 0x270E, "Applied Security Inc." },
+ { 0x270F, "Western Digital, HGST" },
+ { 0x2710, "Kontron America, Inc." },
+ { 0x2711, "ASD Inc." },
+ { 0x2712, "US Army Benet Laboratories" },
+ { 0x2713, "Datalink Electronics Ltd." },
+ { 0x2714, "i'm S.p.A." },
+ { 0x2715, "Photron Limited" },
+ { 0x2716, "YUEN DA ELECTRONIC PRODUCTS FACTORY" },
+ { 0x2717, "Xiaomi Communications Co., Ltd." },
+ { 0x2718, "Tamaggo" },
+ { 0x2719, "4iiii Innovations Inc." },
+ { 0x271A, "KONE Industrial Ltd." },
+ { 0x271B, "Tec.to" },
+ { 0x271C, "KDDI Technology Corporation" },
+ { 0x271D, "Gionee Communication Equipment Co., Ltd. ShenZhen" },
+ { 0x271E, "Changzhou Traful Electronic Co., Ltd." },
+ { 0x271F, "Shanghai Nufront Electronic Technology Co., Ltd." },
+ { 0x2720, "motrona GmbH" },
+ { 0x2721, "Germaneers GmbH" },
+ { 0x2722, "TRANIT" },
+ { 0x2723, "KUK Electronic AG" },
+ { 0x2724, "XS Technology, Inc." },
+ { 0x2725, "L-3 Applied Signal & Image Technology" },
+ { 0x2726, "Universal Electronics Inc. (dba: TVIEW)" },
+ { 0x2727, "ANM OPTO LIMITED" },
+ { 0x2728, "STX-Med SPRL" },
+ { 0x2729, "Regenersis (Glenrothes) Ltd." },
+ { 0x272A, "StarLeaf Limited" },
+ { 0x272B, "VAT Vakuumventile AG" },
+ { 0x272C, "IAR Systems" },
+ { 0x272D, "AKAR GAME LTD." },
+ { 0x272E, "Teratronik elektronische Systeme GmbH" },
+ { 0x272F, "tommis gmbh, Ingenieurburo f. Nachrichtentechnik u. Aut" },
+ { 0x2730, "Camozzi spa" },
+ { 0x2731, "Pebble Audio Oy" },
+ { 0x2732, "Samsung Medison Co., Ltd." },
+ { 0x2733, "ShenZhen SunSonny Electronic Technology Co., Ltd." },
+ { 0x2734, "Wuhan XinAn LuoJia Technologies Co., Ltd." },
+ { 0x2735, "Wilk Elektronik S.A." },
+ { 0x2736, "Silver Palm Technologies LLC" },
+ { 0x2737, "Blu Controls" },
+ { 0x2738, "Bad Rabby Designs" },
+ { 0x2739, "BluePacket Communications Co., Ltd." },
+ { 0x273A, "Singular Technology Co., Ltd." },
+ { 0x273B, "TecScan Systems Inc." },
+ { 0x273C, "Etherstack Limited" },
+ { 0x273D, "Thrimona Corporation" },
+ { 0x273E, "LIFODAS" },
+ { 0x273F, "Hughski Limited" },
+ { 0x2740, "Apparent Corporation" },
+ { 0x2741, "N2 Imaging Systems" },
+ { 0x2742, "Organ Recovery Systems, Inc." },
+ { 0x2743, "XS Embedded GmbH" },
+ { 0x2744, "RIKEN KEIKI NARA MFG. Co., Ltd." },
+ { 0x2745, "Unitech Electronics Co., Ltd." },
+ { 0x2746, "Shenzhen YishunTai Metal Factory" },
+ { 0x2747, "AHA INC. Co., Ltd." },
+ { 0x2748, "Stresstech Oy" },
+ { 0x2749, "GMV SISTEMAS" },
+ { 0x274A, "Qdac Inc." },
+ { 0x274B, "Automotive Data Solutions, Inc." },
+ { 0x274C, "Atos Worldline" },
+ { 0x274D, "FXI Technologies AS" },
+ { 0x274E, "VECTRONIC Aerospace GmbH" },
+ { 0x274F, "Dacuda AG" },
+ { 0x2750, "SafeLine Sweden AB" },
+ { 0x2751, "AMI International, Inc." },
+ { 0x2752, "miniDSP Ltd." },
+ { 0x2753, "Danville Signal Processing, Inc." },
+ { 0x2754, "Trapeze Software Group, Inc." },
+ { 0x2755, "Cosmic Circuits Pvt. Ltd." },
+ { 0x2756, "Victor Hasselblad AB" },
+ { 0x2757, "HiteVision Digital Media Technology Co., Ltd." },
+ { 0x2758, "MobileEco Co., Ltd." },
+ { 0x2759, "Philip Morris Products S.A." },
+ { 0x275A, "Vertex Aquaristik GmbH" },
+ { 0x275B, "PROPACK" },
+ { 0x275C, "NITA, LLC" },
+ { 0x275D, "NewSoc Tech Limited" },
+ { 0x275E, "Scent Sciences Corporation" },
+ { 0x275F, "Vishay Measurements Group, Inc." },
+ { 0x2760, "Oxigraf, Inc." },
+ { 0x2761, "CAST Navigation LLC" },
+ { 0x2762, "FERMAX ELECTRONICA S.A.U." },
+ { 0x2763, "PRIMES GmbH" },
+ { 0x2764, "Ouman Oy" },
+ { 0x2765, "Firstbeat Technologies Ltd." },
+ { 0x2766, "LifeScan" },
+ { 0x2767, "Cheetah Hi-Tech, Inc." },
+ { 0x2768, "DongGuan City Lian Zhi Electronic Technology Co. Ltd." },
+ { 0x2769, "SPI ENGINEERING Co., Ltd." },
+ { 0x276A, "SUGIYAMA ELECTRIC SYSTEM INC." },
+ { 0x276B, "CTI INFORMATION CENTER CO., LTD." },
+ { 0x276C, "PROTEI" },
+ { 0x276D, "YSTEK Technology Company" },
+ { 0x276E, "RGB Lasersysteme GmbH" },
+ { 0x276F, "Lightware Visual Engineering" },
+ { 0x2771, "TTE Corporation" },
+ { 0x2772, "Audio Tuning Vertriebs GmbH" },
+ { 0x2773, "HILTI AG" },
+ { 0x2774, "Novasina AG" },
+ { 0x2775, "Sonardyne International Ltd." },
+ { 0x2776, "KFI Trading s.r.l." },
+ { 0x2777, "SingTrix LLC" },
+ { 0x2778, "Cypher Labs LLC" },
+ { 0x2779, "Qualnetics Corporation" },
+ { 0x277A, "Occipital, Inc." },
+ { 0x277B, "Moxtek, Inc" },
+ { 0x277C, "SignalCore, Inc." },
+ { 0x277D, "Microcom Corporation" },
+ { 0x277E, "Sportable Scoreboards, Inc." },
+ { 0x277F, "DongGuan City Shangjie Electronic Co., Ltd." },
+ { 0x2780, "M31 Technology Corp." },
+ { 0x2781, "Liteconn Co., Ltd." },
+ { 0x2782, "TTS Inc." },
+ { 0x2783, "Aktina Medical Corp." },
+ { 0x2784, "A-One Co., Ltd." },
+ { 0x2785, "Mayekawa Mfg. Co., Ltd." },
+ { 0x2786, "Switch Science, Incorporation" },
+ { 0x2787, "AVTECH Corporation" },
+ { 0x2788, "Sanwin (HK) Electronic Technology Co., Ltd." },
+ { 0x2789, "Suzhou WEIJU Electronics Technology Co., Ltd." },
+ { 0x278A, "MARSHAL Corporation" },
+ { 0x278B, "The Rotel Co., Ltd." },
+ { 0x278C, "NAGATA ELECTRIC CO., LTD." },
+ { 0x278D, "GPSports Systems Pty., Ltd." },
+ { 0x278E, "TSS AB" },
+ { 0x278F, "Bosch Sicherheitssysteme Engineering GmbH" },
+ { 0x2790, "Cobalt Digital, Inc." },
+ { 0x2791, "SunTech Medical, Inc." },
+ { 0x2792, "SYSTEC Co., Limited" },
+ { 0x2793, "i-KAIST" },
+ { 0x2794, "SilverPlus, Inc." },
+ { 0x2795, "QuantaScope Biotech" },
+ { 0x2796, "Zhejiang Wellcom Technology Co., Ltd." },
+ { 0x2797, "EUROIMMUN AG" },
+ { 0x2798, "Turning Technologies" },
+ { 0x2799, "Colorimetry Research, Inc." },
+ { 0x279A, "Naim Audio Limited" },
+ { 0x279B, "Bluefish Technologies Pty Ltd." },
+ { 0x279C, "Advanced Anaesthesia Specialists" },
+ { 0x279D, "Towa Electronics Co., Ltd." },
+ { 0x279E, "Syntronix Corporation" },
+ { 0x279F, "Hiragawa Electronics Industry Co., Ltd." },
+ { 0x27A0, "Mondokey Limited" },
+ { 0x27A1, "Autoliv Romania S.R.L." },
+ { 0x27A2, "T.I.T. ENG CO., LTD." },
+ { 0x27A3, "AU Optronics Corporation" },
+ { 0x27A4, "Digital Act Inc." },
+ { 0x27A5, "Advantest Corporation" },
+ { 0x27A6, "iRobot Corporation" },
+ { 0x27A7, "Delta Computer Systems, Inc." },
+ { 0x27A8, "Square Inc." },
+ { 0x27A9, "Global Mixed-mode Technology Inc." },
+ { 0x27AA, "Just Connector Kunshan Co., Ltd." },
+ { 0x27AB, "Shenzhen Maxmade Technology Co., Ltd." },
+ { 0x27AC, "GP Electronics (HK) Limited" },
+ { 0x27AD, "PAUL HARTMANN AG" },
+ { 0x27AE, "TeleOrbit GmbH" },
+ { 0x27AF, "HANNA Instruments, Inc." },
+ { 0x27B0, "FOXPRO Inc." },
+ { 0x27B1, "UltiMachine" },
+ { 0x27B2, "OrthoAccel Technologies, Inc." },
+ { 0x27B3, "Secure Systems Limited" },
+ { 0x27B4, "Duerkopp Adler AG" },
+ { 0x27B5, "J-MEX Inc." },
+ { 0x27B6, "TechnoKom Ltd." },
+ { 0x27B7, "Fraunhofer IMS" },
+ { 0x27B8, "ThingM Corporation" },
+ { 0x27B9, "Ziotech Corp" },
+ { 0x27BA, "Aoptix Technologies, Inc." },
+ { 0x27BB, "Plenom A/S" },
+ { 0x27BC, "KeyView" },
+ { 0x27BD, "Codethink Limited" },
+ { 0x27BE, "InHand Electronics, Inc." },
+ { 0x27BF, "Dongguan CPO Electronic Co., Ltd." },
+ { 0x27C0, "Cadwell Laboratories, Inc." },
+ { 0x27C1, "ARKAMI" },
+ { 0x27C2, "ArcBotics LLC" },
+ { 0x27C3, "Danfoss Turbocor Compressors Inc." },
+ { 0x27C4, "KRYPTUS" },
+ { 0x27C5, "SRT Marine Technology Limited" },
+ { 0x27C6, "Shenzhen Huiding Technology Co. Ltd." },
+ { 0x27C7, "TransluSense, LLC" },
+ { 0x27C8, "Rigaku Corporation" },
+ { 0x27C9, "ElaraTek LTD." },
+ { 0x27CA, "JayBird LLC" },
+ { 0x27CB, "ANXA Limited Hong Kong" },
+ { 0x27CC, "GHL Matthias Gross GmbH & Co. KG" },
+ { 0x27CD, "GHEO SA" },
+ { 0x27CE, "Double Power Technology Inc." },
+ { 0x27CF, "Weidmueller Interface GmbH & Co. KG" },
+ { 0x27D0, "Traxon Technologies Europe GmbH" },
+ { 0x27D1, "Angelbird Technologies GmbH" },
+ { 0x27D2, "EURONOVATE SA" },
+ { 0x27D3, "PRECIA MOLEN" },
+ { 0x27D4, "Blackstar Amplification Ltd." },
+ { 0x27D5, "BSkyB LTD." },
+ { 0x27D6, "T3 Innovation" },
+ { 0x27D7, "Senova Systems, Inc." },
+ { 0x27D8, "Patriot Memory" },
+ { 0x27D9, "Gallagher Group Limited" },
+ { 0x27DA, "S Net Media Inc." },
+ { 0x27DB, "Hiitop Technology Limited" },
+ { 0x27DC, "Tennant Company" },
+ { 0x27DD, "Shenzhen MinDe Electronics Technology Ltd." },
+ { 0x27DE, "Newtec Cy" },
+ { 0x27DF, "Charles Novacroft Direct Limited" },
+ { 0x27E0, "Stelulu Technology" },
+ { 0x27E1, "TRX Systems, Inc." },
+ { 0x27E2, "Natus Medical Incorproated" },
+ { 0x27E3, "Chemyx Inc." },
+ { 0x27E4, "Easybotics LLC" },
+ { 0x27E5, "Shiroshita Industrial Co., Ltd." },
+ { 0x27E6, "SENECA srl" },
+ { 0x27E7, "AVIWEST" },
+ { 0x27E8, "takwak GmbH" },
+ { 0x27E9, "Soeks Limited" },
+ { 0x27EA, "Goldmund International" },
+ { 0x27EB, "ACCUCOMM, INC." },
+ { 0x27EC, "SEETECH CO., LTD." },
+ { 0x27ED, "Tescom-Emerson Process Management" },
+ { 0x27EE, "DashLogic Inc." },
+ { 0x27EF, "TAIYO SEIKI CO., LTD." },
+ { 0x27F0, "DITECT Corporation" },
+ { 0x27F1, "VERTU Corporation Limited" },
+ { 0x27F2, "Softnautics Private Limited" },
+ { 0x27F3, "Indutherm Erwaermungsanlagen GmbH" },
+ { 0x27F4, "LEGIC Identsystems Ltd." },
+ { 0x27F5, "Relume Technologies, Inc." },
+ { 0x27F6, "Advanced Simulation Technology Inc." },
+ { 0x27F7, "Wyred 4 Sound" },
+ { 0x27F8, "Wikipad, Inc." },
+ { 0x27F9, "MIDAS Elektronik GmbH" },
+ { 0x27FA, "Afag Automation AG" },
+ { 0x27FB, "Barclays" },
+ { 0x27FC, "CAREL SPA" },
+ { 0x27FD, "GI Therapies Pty Ltd." },
+ { 0x27FE, "DONGGUAN Rakecorp Co., Ltd." },
+ { 0x27FF, "Cashway Technology Co., Ltd." },
+ { 0x2800, "iluminage, Inc." },
+ { 0x2801, "Pear Sports LLC" },
+ { 0x2802, "Moixa Technology" },
+ { 0x2803, "StarLine LLC" },
+ { 0x2804, "4MOD Technology" },
+ { 0x2805, "Shenzhen N-Pass Mobile Technology, Ltd." },
+ { 0x2806, "RF DataTech" },
+ { 0x2807, "Elliptic Laboratories AS" },
+ { 0x2808, "FocalTech Systems, Ltd." },
+ { 0x2809, "Sept Co., Ltd." },
+ { 0x280A, "Culti Co., Ltd." },
+ { 0x280B, "Dukane Corporation" },
+ { 0x280C, "Linera" },
+ { 0x280D, "Ai Electronic Industry Co., Ltd." },
+ { 0x280E, "Leaf Imaging Ltd." },
+ { 0x280F, "MBit Wireless, Inc." },
+ { 0x2810, "Aphex, LLC" },
+ { 0x2811, "DigiTalks INC." },
+ { 0x2812, "Bridge Semiconductor Corp." },
+ { 0x2813, "Brookfield Engineering Laboratories Inc." },
+ { 0x2814, "OOO SMS-Soft" },
+ { 0x2815, "KING TSUSHIN KOGYO CO., LTD." },
+ { 0x2816, "Harvard Photonix" },
+ { 0x2817, "Test Equipment Plus" },
+ { 0x2818, "Codex Digital Limited" },
+ { 0x2819, "MESSRING Systembau MSG GmbH" },
+ { 0x281A, "SWAC Automation Consult GmbH" },
+ { 0x281B, "HiES Tech s.r.o." },
+ { 0x281C, "Presidium Instruments Pte. Ltd." },
+ { 0x281D, "AISIN AW CO., LTD." },
+ { 0x281E, "Symphodia Phil" },
+ { 0x281F, "Motion Control, Inc." },
+ { 0x2820, "Sanovas" },
+ { 0x2821, "Aclima Inc." },
+ { 0x2822, "REFLEXdigital" },
+ { 0x2823, "Dongguan Jiumutong Industry Co., Ltd." },
+ { 0x2824, "Vollsun Ltd." },
+ { 0x2825, "Baumer Optronic GmbH" },
+ { 0x2826, "BSH Bosch und Siemens Hausgerate GmbH" },
+ { 0x2827, "DIGITTRADE GmbH" },
+ { 0x2828, "SAPHYMO" },
+ { 0x2829, "Scanomat A/S" },
+ { 0x282A, "REDL GmbH" },
+ { 0x282B, "Aevoe Inc." },
+ { 0x282C, "Reichert, Inc." },
+ { 0x282D, "Aeromax Technology Co., Ltd." },
+ { 0x282E, "Vectawave Technology Ltd." },
+ { 0x282F, "SANKEN ELECTRIC CO., LTD." },
+ { 0x2830, "GD-Broadband" },
+ { 0x2831, "Power Integrations" },
+ { 0x2832, "Applied Research Associates" },
+ { 0x2833, "Oculus VR LLC" },
+ { 0x2834, "JM Concept" },
+ { 0x2835, "SEIDENSHA ELECTRONICS Co., Ltd." },
+ { 0x2836, "OUYA Inc." },
+ { 0x2837, "Tunstall Healthcare (UK) Ltd." },
+ { 0x2838, "Ontorix GmbH" },
+ { 0x2839, "Grass Elektronik" },
+ { 0x283A, "HIKe Mobile Co., Ltd." },
+ { 0x283B, "Cellon Communications Technology (Shenzhen) Co., Ltd." },
+ { 0x283C, "HIGH TEK HARNESS ENTERPRISE CO., LTD." },
+ { 0x283D, "SigNET (AC) Ltd." },
+ { 0x283E, "DECATHLON SA" },
+ { 0x283F, "Elprosys Sp. Z.o.o." },
+ { 0x2840, "Taiwan Carol Electronics Co., Ltd." },
+ { 0x2841, "Artvision Technologies Inc." },
+ { 0x2842, "RobotGroup" },
+ { 0x2843, "SyncMOS Technologies International, Inc." },
+ { 0x2844, "ELSIST Srl" },
+ { 0x2845, "Systec Designs BV" },
+ { 0x2846, "ATRON electronic GmbH" },
+ { 0x2847, "TMG TE GmbH" },
+ { 0x2848, "Sentons USA, Inc." },
+ { 0x2849, "Astronics Advanced Electronic Systems Corp." },
+ { 0x284A, "Yangtze Optical Fibre and Cable Company Ltd." },
+ { 0x284B, "Leadingui Co., Ltd." },
+ { 0x284C, "Full in Hope Co., Ltd." },
+ { 0x284D, "Qltouch Tech Co., Ltd." },
+ { 0x284E, "Flysky RC Model Co., Ltd." },
+ { 0x284F, "ANTLIA SA" },
+ { 0x2850, "Intellectual Property Group SA" },
+ { 0x2851, "RETIA, a.s." },
+ { 0x2852, "Virtual Console, LLC" },
+ { 0x2853, "Ralston Instruments" },
+ { 0x2854, "Great River Technology" },
+ { 0x2855, "System Dimensions, Inc." },
+ { 0x2856, "Thales Alenia Space - Italia" },
+ { 0x2857, "Skardin Industrial Corporation" },
+ { 0x2858, "PT Doo Won Precision Indonesia" },
+ { 0x2859, "Viconn Technology (HK) Co., Ltd." },
+ { 0x285A, "AiM Touch Technology Co., Ltd." },
+ { 0x285B, "HARDWARE & SOFTWARE TECHNOLOGY CO., LTD." },
+ { 0x285C, "URMET S.p.a." },
+ { 0x285D, "Alarm.com, Inc." },
+ { 0x285E, "Occam Robotics" },
+ { 0x285F, "CyWee Group Limited" },
+ { 0x2860, "WISYCOM UNIPERSONALE s.r.l." },
+ { 0x2861, "Pacific Image Electronics Co., Ltd." },
+ { 0x2862, "DeVilbiss Healthcare LLC" },
+ { 0x2863, "BIOMATIQUES IDENTIFICATION SOLUTIONS PRIVATE LIMITED" },
+ { 0x2864, "Wenngo Inc." },
+ { 0x2865, "VIKING GmbH" },
+ { 0x2866, "SLOW CONTROL" },
+ { 0x2867, "DASCOM" },
+ { 0x2868, "Chakra Energetics Ltd." },
+ { 0x2869, "Comfort Audio AB" },
+ { 0x286A, "Dipl. - Ing. H. Horstmann GmbH" },
+ { 0x286B, "STANEO SAS" },
+ { 0x286C, "Atest-Gaz A. M. Pachole sp. j." },
+ { 0x286D, "Production Resource Group, LLC" },
+ { 0x286E, "Geosense Inc." },
+ { 0x286F, "Bretford Manufacturing Inc." },
+ { 0x2870, "Typhoon HIL, Inc." },
+ { 0x2871, "BYK-Gardner GmbH" },
+ { 0x2872, "Brite Semiconductor (Shanghai) Corporation" },
+ { 0x2873, "Spire Payments Holdings S.a.r.l." },
+ { 0x2874, "Dexter Research Center, Inc." },
+ { 0x2875, "nVideon, Inc." },
+ { 0x2876, "Safety Innovations, Inc." },
+ { 0x2877, "BrightSign LLC" },
+ { 0x2878, "Cabletech Electronics (Hong Kong) Co., Ltd." },
+ { 0x2879, "Rancore Technologies Private Limited" },
+ { 0x287A, "Shenzhen Bojuxing Industrial Development Co., Ltd." },
+ { 0x287B, "Pro-Tech" },
+ { 0x287C, "Special Recording Systems Ltd." },
+ { 0x287D, "Pettersson Elektronik AB" },
+ { 0x287E, "Silicon Designs, Inc." },
+ { 0x287F, "Beijing Jinke XinAn Technology Co., Ltd." },
+ { 0x2880, "Black Diamond Video" },
+ { 0x2881, "DX Antenna Co., Ltd." },
+ { 0x2882, "GCOMM CORPORATION" },
+ { 0x2883, "abatec group AG" },
+ { 0x2884, "Bor" },
+ { 0x2885, "Quantec SA" },
+ { 0x2886, "Seeed Technology Co., Ltd." },
+ { 0x2887, "Specwerkz" },
+ { 0x2888, "VEX Robotics, Inc." },
+ { 0x2889, "TrueVision Systems, Inc." },
+ { 0x288A, "LEXIBOOK LIMITED" },
+ { 0x288B, "Hierstar (Suzhou)" },
+ { 0x288C, "Moswell Co., Ltd." },
+ { 0x288D, "Centre for Development of Advanced Computing (C-DAC)" },
+ { 0x288E, "mce-systems Ltd." },
+ { 0x288F, "Voxx Accessories Corp." },
+ { 0x2890, "Teknic, Inc." },
+ { 0x2891, "Flytec AG" },
+ { 0x2892, "NAVIgard" },
+ { 0x2893, "LEVEL Ltd." },
+ { 0x2894, "Hovercam" },
+ { 0x2895, "INIM Electronics s.r.l." },
+ { 0x2896, "TTAF Elektronik Sanayi ve Ticaret Ltd. Sti." },
+ { 0x2897, "SDJ Technologies, Inc." },
+ { 0x2898, "Accumetrics Associates, Inc." },
+ { 0x2899, "Toptronic Industrial Co., Ltd." },
+ { 0x289A, "Scan-Sense A.S." },
+ { 0x289B, "DRACAL Technologies Inc." },
+ { 0x289C, "TLS Corp." },
+ { 0x289D, "Tyrian Systems, Inc." },
+ { 0x289E, "Esselte Leitz GmbH & Co. KG" },
+ { 0x289F, "inoage GmbH" },
+ { 0x28A0, "I-CUBE TECHNOLOGY Co., Ltd." },
+ { 0x28A1, "AVEST-SYSTEMS Private Unitary Enterprise" },
+ { 0x28A2, "Meadowlark Optics Incorporated" },
+ { 0x28A3, "SensoMotoric Instruments GmbH" },
+ { 0x28A4, "Objective Solutions Sweden AB" },
+ { 0x28A5, "TCS John Huxley" },
+ { 0x28A6, "E-SEEK Inc." },
+ { 0x28A7, "Hugo Brennenstuhl GmbH & Co. KG" },
+ { 0x28A8, "AT Sciences, LLC" },
+ { 0x28A9, "Alpha Technologies" },
+ { 0x28AA, "Realta Entertainment Group" },
+ { 0x28AB, "Navigil Ltd." },
+ { 0x28AC, "euroBRAILLE" },
+ { 0x28AD, "iDTRONIC GmbH" },
+ { 0x28AE, "Zynaptic Limited" },
+ { 0x28AF, "Sharkbay Technologies Pte. Ltd." },
+ { 0x28B0, "PMC - Sierra" },
+ { 0x28B1, "EcoTech, Inc." },
+ { 0x28B2, "Siemens Infrastructure & Cities" },
+ { 0x28B3, "Profoto AB" },
+ { 0x28B4, "TOACK Corporation" },
+ { 0x28B5, "Solacom Inc." },
+ { 0x28B6, "Alcohol Countermeasure Systems Corp." },
+ { 0x28B7, "Pleora Technologies Inc." },
+ { 0x28B8, "Swiss Authentication Research & Development AG" },
+ { 0x28B9, "Kapsch TrafficCom AB" },
+ { 0x28BA, "RSscan International NV" },
+ { 0x28BB, "ICP Systems b.v." },
+ { 0x28BC, "Cyplex Corporation" },
+ { 0x28BD, "GuangZhou Ugee Computer Technology Co., Ltd." },
+ { 0x28BE, "GMG TECH. Co., Ltd." },
+ { 0x28BF, "Vitetech Int'l Co., Ltd." },
+ { 0x28C0, "SCVNGR, Inc." },
+ { 0x28C1, "DOMMEL GmbH" },
+ { 0x28C2, "Tapko Technologies GmbH" },
+ { 0x28C3, "MITSUBISHI ELECTRIC SYSTEM & SERVICE CO., LTD." },
+ { 0x28C4, "GALA, Inc." },
+ { 0x28C5, "ShenZhen Innovate-link Precision Hardware Co., Ltd." },
+ { 0x28C6, "FASTLITE" },
+ { 0x28C7, "Ultimaker BV" },
+ { 0x28C8, "ULTRACHIP Inc." },
+ { 0x28C9, "DongGuan City DHE Wire & Cable Co., Ltd." },
+ { 0x28CA, "NUMATA Corporation" },
+ { 0x28CB, "GO engineering GmbH" },
+ { 0x28CC, "MIWA ELECTRIC CO., LTD." },
+ { 0x28CD, "SMARTMATIC INTERNATIONAL CORP." },
+ { 0x28CE, "Changzhou Shi Wujin Miqi East Electronic Co., Ltd." },
+ { 0x28CF, "Asiatelco Technologies Co." },
+ { 0x28D0, "Stryker Corporation" },
+ { 0x28D1, "Technomedica Co., Ltd." },
+ { 0x28D2, "FTK Corporation" },
+ { 0x28D3, "Golden Transmart International Co., Ltd." },
+ { 0x28D4, "DEVIALET SAS" },
+ { 0x28D5, "Vicor Corporation" },
+ { 0x28D6, "Electrogamez USA Inc." },
+ { 0x28D7, "Tekron International" },
+ { 0x28D8, "Panda Ocean Inc." },
+ { 0x28D9, "Shenzhen Yoshuo Precision Components Co., Ltd." },
+ { 0x28DA, "G.SKILL Int'l Enterprice Co., Ltd." },
+ { 0x28DB, "Konftel AB" },
+ { 0x28DC, "Power Electronics International, Inc." },
+ { 0x28DD, "AIWA COMPANY LTD. - Love Harmony (LH)" },
+ { 0x28DE, "Valve Corporation" },
+ { 0x28DF, "EMBED-IT" },
+ { 0x28E0, "PRASIMAX" },
+ { 0x28E1, "Shenzhen iSolution Technologies Co., Ltd." },
+ { 0x28E2, "Surplus Electronic Technology Co., Ltd." },
+ { 0x28E3, "Apollo Electrical Technology Co., Ltd." },
+ { 0x28E4, "RKS, Inc." },
+ { 0x28E5, "MEP TECH" },
+ { 0x28E6, "BIAMP SYSTEMS" },
+ { 0x28E7, "Glyph Production Technologies" },
+ { 0x28E8, "Jefferson Audio Video Systems, Inc." },
+ { 0x28E9, "GigaDevice Semiconductor (Beijing) Inc." },
+ { 0x28EA, "Dongguan Vast Electronics Co.,Ltd" },
+ { 0x28EB, "SHEN ZHEN SHI YUAN AI HARDWARE ELECTRONIC CO., LTD." },
+ { 0x28EC, "Transcom Instruments Co., Ltd." },
+ { 0x28ED, "Shenzhen AraTek Biometrics Technology Co., Ltd." },
+ { 0x28EE, "China Mobile Group Device Co., Ltd." },
+ { 0x28EF, "SEEFRONT GmbH" },
+ { 0x28F0, "Elcus Electronic Company JSC" },
+ { 0x28F1, "Leddartech Inc." },
+ { 0x28F2, "Applied Vision Corporation" },
+ { 0x28F3, "Clover Network" },
+ { 0x28F4, "Sonoma Wire Works" },
+ { 0x28F5, "Electrolux Laundry Systems Sweden AB" },
+ { 0x28F6, "SERVOMEX Group Ltd." },
+ { 0x28F7, "ANYWIRE CORPORATION" },
+ { 0x28F8, "VTECH Technology Corp." },
+ { 0x28F9, "Comcraft" },
+ { 0x28FA, "iProtoXi Oy" },
+ { 0x28FB, "Shin Hwa Contech Co., Ltd." },
+ { 0x28FC, "Shandong Sinochiptp Electronic Technology Co., Ltd." },
+ { 0x28FD, "Wolfson Microelectronics Plc." },
+ { 0x28FE, "Marquardt Mechatronik GmbH" },
+ { 0x28FF, "MIRAENANOTECH" },
+ { 0x2900, "Labsphere" },
+ { 0x2901, "Tolomatic Inc." },
+ { 0x2902, "Woodward Inc." },
+ { 0x2903, "Lightspeed Aviation" },
+ { 0x2904, "Charon Technologies LLC" },
+ { 0x2905, "iDea USA Products Inc." },
+ { 0x2906, "Masimo Corporation" },
+ { 0x2907, "Mimetics Inc." },
+ { 0x2908, "Shenzhen Sen5 Technology Co., Ltd." },
+ { 0x2909, "Active Mind Technology" },
+ { 0x290A, "Electronic Systems Technology, Inc." },
+ { 0x290B, "Beats Electronics LLC" },
+ { 0x290C, "R. Hamilton & Co. Ltd." },
+ { 0x290D, "IBCONN Technologies (Shenzhen) Co., Ltd." },
+ { 0x290E, "Fugoo Inc." },
+ { 0x290F, "AFL Noyes" },
+ { 0x2910, "Cree, Inc." },
+ { 0x2911, "Penetek, Inc." },
+ { 0x2912, "Management Company ATOL Ltd." },
+ { 0x2913, "Teladin Co., Ltd." },
+ { 0x2914, "Kent Displays Inc." },
+ { 0x2915, "Sage Microelectronics Corp." },
+ { 0x2916, "Yota Devices Ltd." },
+ { 0x2917, "Pan Xin Precision Electronics Co., Ltd." },
+ { 0x2918, "Gigatronik Ingolstadt GmbH" },
+ { 0x2919, "GE Analytical Instruments" },
+ { 0x291A, "Anker Technology Co., Limited" },
+ { 0x291B, "LONTEX PIOTR LONDZIN" },
+ { 0x291C, "KEISOKUKI CENTER CO., LTD." },
+ { 0x291D, "Research & Development Center ELVEES OJSC" },
+ { 0x291E, "Shanghai DynamiCode Company Ltd." },
+ { 0x291F, "CBN Inc." },
+ { 0x2920, "Fiberplex Technologies, LLC" },
+ { 0x2921, "BiovenTus, LLC" },
+ { 0x2922, "Dongguan Digi-in Digital Technology Co., Ltd." },
+ { 0x2923, "Vprime" },
+ { 0x2924, "Chinon Corporation" },
+ { 0x2925, "Flight System Consulting Inc." },
+ { 0x2926, "Wildlife Acoustics, Inc." },
+ { 0x2927, "BF1 Systems Ltd." },
+ { 0x2928, "Dongguan Sineng Electronic Technology Co., Ltd." },
+ { 0x2929, "Shenzhen Taishan Online Technology Co., Ltd." },
+ { 0x292A, "T1Visions, Inc." },
+ { 0x292B, "Precision Audio Device Lab Limited" },
+ { 0x292C, "GENUSION, Inc." },
+ { 0x292D, "Wellitec Development Limited" },
+ { 0x292E, "HOYA Service Corporation" },
+ { 0x292F, "Nanotec Electronic GmbH & Co. KG" },
+ { 0x2930, "Ineda Systems Inc." },
+ { 0x2931, "Jolla Ltd." },
+ { 0x2932, "Peraso Technologies, Inc." },
+ { 0x2933, "IEI Integration Corp." },
+ { 0x2934, "CETA Testsysteme GmbH" },
+ { 0x2935, "Nanjing Magewell Electronics Co., Ltd." },
+ { 0x2936, "LEAP Motion" },
+ { 0x2937, "Tmax Digital Inc." },
+ { 0x2938, "Aides Technology Co., Ltd." },
+ { 0x2939, "Zaber Technologies Inc." },
+ { 0x293A, "The SmarTV Company" },
+ { 0x293B, "Lucent Medical Systems, Inc." },
+ { 0x293C, "Comcast" },
+ { 0x293D, "Medicatec Inc." },
+ { 0x293E, "EIDEN Co., Ltd." },
+ { 0x293F, "Gan Zhou DPT-Technology Co., Ltd." },
+ { 0x2940, "Shenzhen Yiwanda Electronics Co., Ltd." },
+ { 0x2941, "Sanofi-Aventis Deutschland GmbH" },
+ { 0x2942, "SoftLab - NSK" },
+ { 0x2943, "ZAGG Inc." },
+ { 0x2944, "RailComm" },
+ { 0x2945, "Matrix Design Group, LLC" },
+ { 0x2946, "OnAsset Intelligence Inc." },
+ { 0x2947, "KAPELSE" },
+ { 0x2948, "Access Network Technology Limited" },
+ { 0x2949, "Shenzhen JSR Technology Co., Ltd." },
+ { 0x294A, "Shenzhen Xinguodu Technology Co., Ltd." },
+ { 0x294B, "snakebyte Asia Ltd." },
+ { 0x294C, "Terminus Circuits Pvt Ltd." },
+ { 0x294D, "Cellwise Holding Co., Ltd." },
+ { 0x294E, "SHIH HUA TECHNOLOGY LTD." },
+ { 0x294F, "Dollar Connection Ltd." },
+ { 0x2950, "Resource One Inc." },
+ { 0x2951, "Raytrix GmbH" },
+ { 0x2952, "Seba Dynatronic GmbH" },
+ { 0x2953, "Axes System sp. Z.o.o." },
+ { 0x2954, "Human Design Medical, LLC" },
+ { 0x2955, "Baidu Online Network Technology (Beijing) Co., Ltd." },
+ { 0x2956, "Alfatest Ind. e Com. Produtos Eletronicos S/A" },
+ { 0x2957, "OBSIDIAN RESEARCH CORPORATION" },
+ { 0x2958, "Eleven Engineering Inc." },
+ { 0x2959, "Inuitive" },
+ { 0x295A, "ENERMAX TECHNOLOGY CORPORATION" },
+ { 0x295B, "eflow Inc." },
+ { 0x295C, "MediaNet M. Hermsen" },
+ { 0x295D, "Positive Grid" },
+ { 0x295E, "Britelite Enterprises" },
+ { 0x295F, "Tecvox Connectivity, LLC" },
+ { 0x2960, "Power Probe, Inc." },
+ { 0x2961, "Miselu Inc." },
+ { 0x2962, "Wilocity Ltd." },
+ { 0x2963, "BIO-key International, Inc." },
+ { 0x2964, "Kintech Co., Ltd." },
+ { 0x2965, "Kortek" },
+ { 0x2966, "Schatz AG" },
+ { 0x2967, "St. Andrews Instrumentation Ltd." },
+ { 0x2968, "Phoenix Avionics Systems, LLC" },
+ { 0x2969, "Sumix" },
+ { 0x296A, "Nitero, Inc." },
+ { 0x296B, "Xacti Corporation" },
+ { 0x296C, "KNC ONE GmbH - Research & Development" },
+ { 0x296D, "Azuri Technologies Ltd" },
+ { 0x296E, "LG CNS Co., Ltd." },
+ { 0x296F, "Broadsound Corporation" },
+ { 0x2970, "MERIDIAN SOFTWARE SYSTEMS LIMITED" },
+ { 0x2971, "Ory Laboratory Ltd." },
+ { 0x2972, "FiiO Electronics Technology Co., Ltd." },
+ { 0x2973, "Wild Elektronik & Kunststoff GmbH & Co. KG" },
+ { 0x2974, "Printrbot, Inc." },
+ { 0x2975, "MPC Research Ltd." },
+ { 0x2976, "COMOTA Co., Ltd." },
+ { 0x2977, "Shenzhen Zowee Technology Co., Ltd." },
+ { 0x2978, "Imaging Solutions Group of NY, Inc." },
+ { 0x2979, "Williams Sound, LLC" },
+ { 0x297A, "Innovative Developments LLC" },
+ { 0x297B, "ALKERIA s.r.l." },
+ { 0x297C, "HashFast Technologies LLC" },
+ { 0x297D, "Krypton Solutions" },
+ { 0x297E, "Shenzhen DTEC Electronic Technology Co., Ltd." },
+ { 0x297F, "Emerging Technology (Holdings) Ltd." },
+ { 0x2980, "CiDELEC" },
+ { 0x2981, "Elektron Technology UK Limited" },
+ { 0x2982, "Ableton AG" },
+ { 0x2983, "Coyote System" },
+ { 0x2984, "Glensound Electronics Ltd." },
+ { 0x2985, "DUALO" },
+ { 0x2986, "Rapt Touch (Ireland) Ltd." },
+ { 0x2987, "Lyve Minds, Inc." },
+ { 0x2988, "3D Systems Corporation" },
+ { 0x2989, "Nanjing Fujitsu Electronics Information Technology Co., Ltd" },
+ { 0x298A, "Singeen Electronics Technologies (Dongguan) Co., Ltd." },
+ { 0x298B, "Hanil ProTech" },
+ { 0x298C, "GL Solutions Inc." },
+ { 0x298D, "NEXT Biometrics" },
+ { 0x298E, "Delta Controls" },
+ { 0x298F, "NIHON DENON CO., LTD." },
+ { 0x2990, "SHIGA MEC Company Limited" },
+ { 0x2991, "Orbitsound Ltd" },
+ { 0x2992, "Lantos Technologies, Inc." },
+ { 0x2993, "ADPlaus Technology Limited" },
+ { 0x2995, "Resodyn Corporation" },
+ { 0x2996, "Delphi Data Connectivity" },
+ { 0x2997, "Inogeni Inc." },
+ { 0x2998, "EOS S.r.l." },
+ { 0x2999, "Fourtec Technologies Ltd." },
+ { 0x299A, "Ogi Systems Ltd. by A.A. Lab Systems" },
+ { 0x299B, "Ohio Semitronics, Inc." },
+ { 0x299C, "WINTOUCH Co., Ltd." },
+ { 0x299D, "Horst Platz Beratungs und Vertriebs GmbH" },
+ { 0x299E, "TRE INNOVATORER AB" },
+ { 0x299F, "MESTEC Technologies" },
+ { 0x29A0, "Bang & Olufsen Medicom A/S" },
+ { 0x29A1, "Union Electric Plug & Connector Corp." },
+ { 0x29A2, "MUTEC GmbH" },
+ { 0x29A3, "Cista System Corporation" },
+ { 0x29A4, "Source Audio LLC" },
+ { 0x29A5, "Harbo Entertainment LLC" },
+ { 0x29A6, "Chiyoda Electronics Co., Ltd." },
+ { 0x29A7, "Tekinvest Holding Ltd." },
+ { 0x29A8, "Lester Electrical" },
+ { 0x29A9, "Smartisan Technology Co., Ltd." },
+ { 0x29AA, "Zivix, LLC" },
+ { 0x29AB, "The Eye Tribe" },
+ { 0x29AC, "Cool Control (S.D.) Ltd." },
+ { 0x29AD, "Quest Engineering & Development, Inc." },
+ { 0x29AE, "Japan Lifeline Co., Ltd." },
+ { 0x29AF, "Zhongshan K-Mate General Electronics Co., Ltd." },
+ { 0x29B0, "Diebold Financial Equipment Co., Ltd." },
+ { 0x29B1, "Dongguan Haitai Precision Electronic Technology Co Ltd" },
+ { 0x29B2, "Canova Tech" },
+ { 0x29B3, "Dowling Software" },
+ { 0x29B4, "Shenzhen Carbetter Technology Co., Ltd." },
+ { 0x29B5, "PN Devices Int'l Limited" },
+ { 0x29B6, "Gowin Technology International Holdings Limited" },
+ { 0x29B7, "X.O.Ware, Inc." },
+ { 0x29B8, "Hawk-Owl Systems" },
+ { 0x29B9, "S.I.C.E.S. S.r.l." },
+ { 0x29BA, "TOPTICA Photonics AG" },
+ { 0x29BB, "SMUFS Biometric Solutions" },
+ { 0x29BC, "IMBEL - Industria de Material Belico do Brasil" },
+ { 0x29BD, "Silicon Works" },
+ { 0x29BE, "Mamiya-OP NEQUOS Co., Ltd." },
+ { 0x29BF, "BalanceMaster, Inc." },
+ { 0x29C0, "Canopy Co." },
+ { 0x29C1, "TazTag" },
+ { 0x29C2, "Lewitt GmbH" },
+ { 0x29C3, "Noviga" },
+ { 0x29C4, "SoundHawk Corporation" },
+ { 0x29C5, "Peachtree Audio" },
+ { 0x29C6, "Shenzhen Jiali Asia Industry Co., Ltd." },
+ { 0x29C7, "HANRICO ANFU ELECTRONICS CO., LTD." },
+ { 0x29C8, "Samil CTS Co., Ltd." },
+ { 0x29C9, "BEEVC-Electronic Systems, LDA" },
+ { 0x29CA, "Cross the Road Electronics, LLC" },
+ { 0x29CB, "Xima Software" },
+ { 0x29CC, "Kodak Alaris" },
+ { 0x29CD, "Carotron, Inc." },
+ { 0x29CE, "JGR Optics Inc." },
+ { 0x29CF, "Richtek Technology Corporation" },
+ { 0x29D0, "ShenZhen Synergy Digital Co., Ltd." },
+ { 0x29D1, "Binatone Electronics Int. Ltd." },
+ { 0x29D2, "Crypto Control Limited" },
+ { 0x29D3, "HESS Cash Systems GmbH & Co. KG" },
+ { 0x29D4, "Twin Development S.A." },
+ { 0x29D5, "Alibaba Cloud Computing Ltd." },
+ { 0x29D6, "Ara Hub Design Inc." },
+ { 0x29D7, "Suritel" },
+ { 0x29D8, "Vigor Electric Corporation" },
+ { 0x29D9, "San-Eisha, Ltd." },
+ { 0x29DA, "The Modal Shop" },
+ { 0x29DB, "Shenzhen iBoard Technology Co., Ltd." },
+ { 0x29DC, "TOHO Electronics Inc." },
+ { 0x29DD, "Embedded Micro" },
+ { 0x29DE, "Korea Electric Terminal Co., Ltd." },
+ { 0x29DF, "SMIT(HK) Limited" },
+ { 0x29E0, "ARCCRA Technology Co., Ltd." },
+ { 0x29E1, "TOSEI ENGINEERING CORP." },
+ { 0x29E2, "Huatune Technology (Shanghai) Co., Ltd." },
+ { 0x29E3, "Bio-Medical Research" },
+ { 0x29E4, "Prestigio Plaza Ltd." },
+ { 0x29E5, "Dongguan Kechenda Electronic Technology Co., Ltd." },
+ { 0x29E6, "Fengshun Peiying Electro-Acoustic Co., Ltd." },
+ { 0x29E7, "Brunel University" },
+ { 0x29E8, "4Links Limited" },
+ { 0x29E9, "Quanttus, Inc." },
+ { 0x29EA, "Kinesis Corporation" },
+ { 0x29EB, "Virtuix Inc." },
+ { 0x29EC, "R. Stahl" },
+ { 0x29ED, "CERA" },
+ { 0x29EE, "Pinnacle Response Ltd." },
+ { 0x29EF, "GamePop Inc." },
+ { 0x29F0, "WirePath Home Systems dba Snap AV" },
+ { 0x29F1, "0XF8 Limited" },
+ { 0x29F2, "RECO Gesellschaft fur Industriefilterregelung mbH" },
+ { 0x29F3, "Resonessence Labs" },
+ { 0x29F4, "NeuroSky, Inc." },
+ { 0x29F5, "AirNetix, LLC" },
+ { 0x29F6, "Evoko Unlimited AB" },
+ { 0x29F7, "Matica Technologies AG" },
+ { 0x29F8, "MD ELEKTRONIK GmbH" },
+ { 0x29F9, "EnerLab, LLC" },
+ { 0x29FA, "LogTag Recorders Ltd." },
+ { 0x29FB, "JSK Co., Ltd." },
+ { 0x29FC, "Namsung Corporation" },
+ { 0x29FD, "Bad Elf, LLC" },
+ { 0x29FE, "GEO Semiconductor Inc." },
+ { 0x29FF, "Thalmic Labs Inc." },
+ { 0x2A00, "NTLab" },
+ { 0x2A01, "Amuseway Korea Co., Ltd." },
+ { 0x2A02, "OJI LTD." },
+ { 0x2A03, "dog hunter AG" },
+ { 0x2A04, "Microtech Laboratory Inc." },
+ { 0x2A05, "EXO LABS INC." },
+ { 0x2A06, "HiFiMAN Electronics" },
+ { 0x2A07, "ise GmbH" },
+ { 0x2A08, "Marshall Amplification PLC" },
+ { 0x2A09, "cytonome" },
+ { 0x2A0A, "All Star International Trading" },
+ { 0x2A0B, "Leopard Imaging Inc." },
+ { 0x2A0C, "MultiSoft Systems Ltd." },
+ { 0x2A0D, "ADVANCE Co., Ltd." },
+ { 0x2A0E, "Shenzhen DreamSource Technology Co., Ltd." },
+ { 0x2A0F, "Shenzhen Giec Electronics Co., Ltd." },
+ { 0x2A10, "Powerway Electronics Co., Ltd." },
+ { 0x2A11, "P3 Ingenieurgesellschaft mbH" },
+ { 0x2A12, "Vreo Limited" },
+ { 0x2A13, "Grabba International" },
+ { 0x2A14, "Kanex" },
+ { 0x2A15, "navAero AB" },
+ { 0x2A16, "Hella Gutmann Solutions" },
+ { 0x2A17, "UDEA Electronic Ltd." },
+ { 0x2A18, "King Abdulaziz City for Science and Technology" },
+ { 0x2A19, "Numato Systems Pvt. Ltd." },
+ { 0x2A1A, "ASCOT GmbH" },
+ { 0x2A1B, "DRS Power & Control Technologies, Inc." },
+ { 0x2A1C, "ThinkWrite" },
+ { 0x2A1D, "Oxford Nanopore Technologies" },
+ { 0x2A1E, "Obsidian Technology" },
+ { 0x2A1F, "Lucent Trans Electronics Co., Ltd." },
+ { 0x2A20, "GUOGUANG GROUP CO., LTD." },
+ { 0x2A21, "ROL Ergo AB" },
+ { 0x2A22, "CDEX CORP." },
+ { 0x2A23, "Artec Design" },
+ { 0x2A24, "CNPLUS" },
+ { 0x2A25, "Fourstar Group" },
+ { 0x2A26, "Tragant International Co., Ltd." },
+ { 0x2A27, "DongGuan LianGang Optoelectronic Technology Co., Ltd." },
+ { 0x2A28, "Higbie, LLC dba kinetuex" },
+ { 0x2A29, "PayPal, Inc." },
+ { 0x2A2A, "TARGAMITE LLC" },
+ { 0x2A2B, "NooElec Inc." },
+ { 0x2A2C, "Bkav Corporation" },
+ { 0x2A2D, "Atrust Computer Corp." },
+ { 0x2A2E, "VIA Alliance Semiconductor Co., Ltd." },
+ { 0x2A2F, "BSUN Electronics Co., Ltd." },
+ { 0x2A30, "KORR Medical Technologies" },
+ { 0x2A31, "Sandia National Laboratories" },
+ { 0x2A32, "Centre for Advanced Transport Engineering and Research" },
+ { 0x2A33, "NTT R&D Laboratories" },
+ { 0x2A34, "KT System, Inc." },
+ { 0x2A35, "Quatius Limited" },
+ { 0x2A36, "MOS Co., Ltd." },
+ { 0x2A37, "RTD Embedded Technologies, Inc." },
+ { 0x2A38, "Electronic Design Inc." },
+ { 0x2A39, "RME GmbH" },
+ { 0x2A3A, "K'NEX Limited Partnership Group" },
+ { 0x2A3B, "Eschenbach Optik GmbH" },
+ { 0x2A3C, "TRINAMIC Motion Control GmbH & Co. KG" },
+ { 0x2A3D, "FIME" },
+ { 0x2A3E, "Atlas Copco" },
+ { 0x2A3F, "Yasunaga Corporation" },
+ { 0x2A40, "Shenzhen Choseal Industrial Co., Ltd." },
+ { 0x2A41, "Canyon Semiconductor" },
+ { 0x2A42, "Spectra7 Microsystems Corp." },
+ { 0x2A43, "Ekosur S.A." },
+ { 0x2A44, "FUEL3D Technologies Limited" },
+ { 0x2A45, "Meizu Technology Co., Ltd." },
+ { 0x2A46, "Hubei Yingtong Telecommunication Cable Inc." },
+ { 0x2A47, "Mundo Reader SL" },
+ { 0x2A48, "Pointmobile" },
+ { 0x2A49, "UNOWHY" },
+ { 0x2A4A, "threeRivers 3D, Inc." },
+ { 0x2A4B, "EMULEX Corporation" },
+ { 0x2A4C, "Tianjin SharpNow Technology Co., Ltd." },
+ { 0x2A4D, "Wilder Technologies" },
+ { 0x2A4E, "Henge Docks, LLC" },
+ { 0x2A4F, "L-3 Communications Avionics Systems" },
+ { 0x2A50, "Akizuki Denshi Tsusho Co., Ltd." },
+ { 0x2A51, "Multiclet Corp." },
+ { 0x2A52, "L CARD Ltd." },
+ { 0x2A53, "x-odos GmbH" },
+ { 0x2A54, "Black Diamond Advanced Technology, LLC" },
+ { 0x2A56, "eemagine Medical Imaging Solutions GmbH" },
+ { 0x2A57, "Bellingham + Stanley Limited" },
+ { 0x2A58, "ALIGN Corporation Limited" },
+ { 0x2A59, "The Whistler Group" },
+ { 0x2A5A, "Kromek Group Plc." },
+ { 0x2A5B, "Integrity Applications Ltd." },
+ { 0x2A5C, "Dalian Zonewin Electronics Co., Ltd." },
+ { 0x2A5D, "Zhejiang Wanli Jo Ju Automation Technonolgy Co., Ltd." },
+ { 0x2A5E, "The Chemours Company" },
+ { 0x2A5F, "Tencent Technology (Shenzhen) Company Limited" },
+ { 0x2A60, "Oscadi SAS" },
+ { 0x2A61, "Ellex Medical Pty Ltd." },
+ { 0x2A62, "Flymaster Avionics, LDA" },
+ { 0x2A63, "Postek Electronics Co., Ltd." },
+ { 0x2A64, "Zhejiang Songcheng Electronics Co., Ltd." },
+ { 0x2A65, "FreeWave Technologies, Inc." },
+ { 0x2A66, "JoyLabz LLC" },
+ { 0x2A67, "Chart Industries" },
+ { 0x2A68, "CheckSum, LLC" },
+ { 0x2A69, "EDIC Systems Inc." },
+ { 0x2A6A, "PINTSCH TIEFENBACH GmbH" },
+ { 0x2A6B, "VSN Mobil" },
+ { 0x2A6C, "Silego Technology" },
+ { 0x2A6D, "SAsync, LLC" },
+ { 0x2A6E, "Bare Conductive Ltd." },
+ { 0x2A6F, "Shenzhen Justtide Tech Co., Ltd." },
+ { 0x2A70, "Shenzhen Oneplus Science and Technology Co., Inc." },
+ { 0x2A71, "Eyelock, Inc." },
+ { 0x2A72, "Omega Engineering" },
+ { 0x2A73, "IMAC Co., Ltd." },
+ { 0x2A74, "Innoflight Tech., Ltd." },
+ { 0x2A75, "Delta Dansk Elektronik, Lys & Akustik" },
+ { 0x2A76, "Microsemi Corporation (Phoenix)" },
+ { 0x2A77, "American Printing House for the Blind" },
+ { 0x2A78, "mySkin, Inc." },
+ { 0x2A79, "S.E. Technologies Limited" },
+ { 0x2A7A, "Beijing Casue Technology Co., Ltd." },
+ { 0x2A7B, "Bellwether Electronic Corp." },
+ { 0x2A7C, "Acute Technology Inc." },
+ { 0x2A7D, "ParTech, Inc." },
+ { 0x2A7E, "VAIO Corporation" },
+ { 0x2A7F, "Perixx Computer GmbH" },
+ { 0x2A80, "Smart Start Inc." },
+ { 0x2A81, "Hale Products, Inc." },
+ { 0x2A82, "Printek, Inc." },
+ { 0x2A83, "Autodesk Inc." },
+ { 0x2A84, "ATE Systems" },
+ { 0x2A85, "HANK ELECTRONICS CO., LTD" },
+ { 0x2A86, "KITRIS AG" },
+ { 0x2A87, "Kummler + Matter AG" },
+ { 0x2A88, "DFU Technology Ltd." },
+ { 0x2A89, "Robert Bosch Tool Corporation" },
+ { 0x2A8A, "Benchmark Drives GmbH & Co. KG" },
+ { 0x2A8B, "I.C. Lercher GmbH & Co. KG" },
+ { 0x2A8C, "Sonnet Technologies, Inc." },
+ { 0x2A8D, "Keysight Technologies Inc." },
+ { 0x2A8E, "Starlink Electronics Corp." },
+ { 0x2A8F, "Manutronics Vietnam Joint Stock Company" },
+ { 0x2A90, "NowComputing, LLC" },
+ { 0x2A91, "Seed Industrial Designing Co., Ltd." },
+ { 0x2A92, "Woosim Systems Inc." },
+ { 0x2A93, "Enblink Co., Ltd." },
+ { 0x2A94, "G2 Touch Co., Ltd." },
+ { 0x2A95, "Flipkart Internet Pvt. Ltd." },
+ { 0x2A96, "Micromax Informatics Ltd" },
+ { 0x2A97, "Broadway Semiconductor, Inc." },
+ { 0x2A98, "Calix" },
+ { 0x2A99, "Humanistic Robotics, Inc." },
+ { 0x2A9A, "SRAM, LLC" },
+ { 0x2A9B, "Doblet Inc." },
+ { 0x2A9C, "Olorin AB" },
+ { 0x2A9D, "LawMate International Co., Ltd." },
+ { 0x2A9E, "SEIKO SOLUTIONS Inc." },
+ { 0x2A9F, "Mobelisk LLC" },
+ { 0x2AA0, "Casco Products Corp." },
+ { 0x2AA1, "Ivanhoe (DE), Inc." },
+ { 0x2AA2, "GTI Spindle Technology, Inc." },
+ { 0x2AA3, "Strike Technologies a Division of Penbro Kelnick (Pty) Ltd" },
+ { 0x2AA4, "Voim Technologies Inc." },
+ { 0x2AA5, "Pen Generations, Inc." },
+ { 0x2AA6, "ChengFong International Limited" },
+ { 0x2AA7, "MJC Techno Co., Ltd." },
+ { 0x2AA8, "Resus Industries NV" },
+ { 0x2AA9, "Infrared Cameras Inc." },
+ { 0x2AAA, "Virtium Technology, Inc." },
+ { 0x2AAB, "Field and Company LLC, dba Leef USA" },
+ { 0x2AAC, "Elinchrom S.A." },
+ { 0x2AAD, "iCatch Technology, Inc." },
+ { 0x2AAE, "Chipone Technology (Beijing) Co., Ltd." },
+ { 0x2AAF, "Xiamen Hanin Electronic Technology Co., Ltd." },
+ { 0x2AB0, "GM Global Technology Operations LLC" },
+ { 0x2AB1, "Tesco Stores Ltd." },
+ { 0x2AB2, "Maktar, Inc." },
+ { 0x2AB3, "Key Asic Inc." },
+ { 0x2AB4, "Line Seiki Co., Ltd." },
+ { 0x2AB5, "Micro-Technica Co., Ltd." },
+ { 0x2AB6, "T+A Elektroakustik GmbH + Co. KG" },
+ { 0x2AB7, "foc.us" },
+ { 0x2AB8, "Meggitt (Orange County), Inc." },
+ { 0x2AB9, "Monsoon Solutions, Inc." },
+ { 0x2ABA, "MagneMotion Inc." },
+ { 0x2ABB, "HiDeep Inc." },
+ { 0x2ABC, "Beijing Kingrich Medical Technology Co., Ltd." },
+ { 0x2ABD, "Meeteasy Technology Limited" },
+ { 0x2ABE, "Bluink Ltd" },
+ { 0x2ABF, "Revolabs, Inc." },
+ { 0x2AC0, "POWA Technologies Ltd." },
+ { 0x2AC1, "Lattice Semiconductor Corp" },
+ { 0x2AC2, "Toreck Co., Ltd." },
+ { 0x2AC3, "Foshan Nanhai Saga Audio Equipment Co., Ltd." },
+ { 0x2AC4, "BlackBox Biometrics, Inc." },
+ { 0x2AC5, "PhotoFast Co., Ltd." },
+ { 0x2AC6, "HAKKO Corporation" },
+ { 0x2AC7, "Ultrahaptics Limited" },
+ { 0x2AC8, "SimonsVoss Technologies GmbH" },
+ { 0x2AC9, "TELPA Telekomunikasyon Tic. A.S. Brand: General Mobile" },
+ { 0x2ACA, "Toledo do Brasil Industria de Balancas Ltda." },
+ { 0x2ACB, "Pole/Zero Acquisition, Inc." },
+ { 0x2ACC, "illunis LLC" },
+ { 0x2ACD, "Silergy Corp." },
+ { 0x2ACE, "Tonetron Electronic Ltd." },
+ { 0x2ACF, "Ruffy Controls Inc." },
+ { 0x2AD0, "Holley Performance Products (CANADA) Inc." },
+ { 0x2AD1, "Pictronic GmbH" },
+ { 0x2AD2, "Allnic Audio" },
+ { 0x2AD3, "Shenzhen Hali-Power Industrial Co., Ltd." },
+ { 0x2AD4, "L&F Corporation" },
+ { 0x2AD5, "Baikal Electronics JSC" },
+ { 0x2AD6, "Cozumo, Inc." },
+ { 0x2AD7, "RHENAC Systems GmbH" },
+ { 0x2AD8, "i2s" },
+ { 0x2AD9, "Zound Industries International AB" },
+ { 0x2ADA, "McCarthy Music Corp." },
+ { 0x2ADB, "I-PEX (Dai-ichi Seiko)" },
+ { 0x2ADC, "Absolute USA" },
+ { 0x2ADD, "SEE-PLUS INDUSTRIAL LTD." },
+ { 0x2ADE, "Orga BV" },
+ { 0x2ADF, "Noiseless Security A/S" },
+ { 0x2AE0, "Auma Riester GmbH & Co. KG" },
+ { 0x2AE1, "EDEC PROGRESS CO., LTD." },
+ { 0x2AE2, "VXi Corporation" },
+ { 0x2AE3, "Jiuzhou Digital (Hong Kong) Limited" },
+ { 0x2AE4, "Next! s.c. Slawomir Piela, Bartlomiej Dryja" },
+ { 0x2AE5, "Fairphone B.V." },
+ { 0x2AE6, "e-distribuzione Spa" },
+ { 0x2AE7, "Advanced Media, Inc." },
+ { 0x2AE8, "Quintic Microelectronics (Wuxi) Co., Ltd." },
+ { 0x2AE9, "Regal Beloit Canada ULC. dba Thomson Power Systems" },
+ { 0x2AEA, "Protonex Technology Corporation" },
+ { 0x2AEB, "NovaTech, LLC" },
+ { 0x2AEC, "Ambiq Micro, Inc." },
+ { 0x2AED, "Technology Launch, LLC" },
+ { 0x2AEE, "Adapt-IP Company" },
+ { 0x2AEF, "Coronado Electronics, Inc." },
+ { 0x2AF0, "Zhejiang Yuesui Electron Stock Co., Ltd." },
+ { 0x2AF1, "Innovation Spring Tech, Inc." },
+ { 0x2AF2, "CIS Corporation" },
+ { 0x2AF3, "Rehan Electronics Ltd." },
+ { 0x2AF4, "ROLI Ltd." },
+ { 0x2AF5, "Libratone A/S" },
+ { 0x2AF6, "Nix Sensor Ltd." },
+ { 0x2AF7, "Shenzhen Hazens Automotive Electronics (SZ) Co., Ltd." },
+ { 0x2AF8, "Jiangsu Toppower Automotive Electronics Co., Ltd." },
+ { 0x2AF9, "Drapho Electronics Technology Co., Ltd." },
+ { 0x2AFA, "Yokogawa Digital Computer Corporation" },
+ { 0x2AFB, "EMC, Electronic Music Components" },
+ { 0x2AFC, "Savox Communications OY AB" },
+ { 0x2AFD, "McIntosh Laboratory, Inc." },
+ { 0x2AFE, "IntriCon" },
+ { 0x2AFF, "ARP Corporation" },
+ { 0x2B00, "Novitec Co., Ltd." },
+ { 0x2B01, "Zimi Corporation" },
+ { 0x2B02, "AMGOO Telecom Co., Ltd." },
+ { 0x2B03, "STEREOLABS" },
+ { 0x2B04, "Spark Labs, Inc." },
+ { 0x2B05, "Warn Industries" },
+ { 0x2B06, "TEControl" },
+ { 0x2B07, "ESA Elektroschaltanlagen Grimma GmbH" },
+ { 0x2B08, "KYOEI ENGINEERING Co., Ltd." },
+ { 0x2B09, "Shenzhen Lidacheng Technology Co., Ltd." },
+ { 0x2B0A, "AMICCOM Electronics Corporation" },
+ { 0x2B0B, "Qtul Enterprises" },
+ { 0x2B0C, "Goclever Sp z o.o." },
+ { 0x2B0D, "Dongguan Yulian Electronic Industrial Co., Ltd." },
+ { 0x2B0E, "Le Shi Zhi Xin Electronic Technology (Tian Jin) Limited" },
+ { 0x2B0F, "Best Integration Technology Co., Ltd." },
+ { 0x2B10, "Cardiac Insight, Inc." },
+ { 0x2B11, "Europe Net Srl" },
+ { 0x2B12, "DeepSpar" },
+ { 0x2B13, "Lightcomm Technology Co., Ltd." },
+ { 0x2B14, "EverPro Technologies Company, Ltd." },
+ { 0x2B15, "Rosenberger Hochfrequenztechnik" },
+ { 0x2B16, "Spirometrix, Inc." },
+ { 0x2B17, "Jaguar Land Rover" },
+ { 0x2B18, "ProSign GmbH" },
+ { 0x2B19, "JBSignal Co." },
+ { 0x2B1A, "Fortune Ship Technology (HK) Limited" },
+ { 0x2B1B, "Dongguan City Sanji Electronics Co., Ltd." },
+ { 0x2B1C, "Shenzhen Virtual Reality Technology Company Limited" },
+ { 0x2B1D, "Lintes Technology Co., Ltd." },
+ { 0x2B1E, "NFUZD Technology Inc" },
+ { 0x2B1F, "KinnexA, Inc." },
+ { 0x2B20, "WaveLynx Technologies Corporation" },
+ { 0x2B21, "Project Florida" },
+ { 0x2B22, "Metra Electronics Corp." },
+ { 0x2B23, "Red Hat, Inc." },
+ { 0x2B24, "KeepKey, LLC" },
+ { 0x2B25, "Logos Biosystems, Inc." },
+ { 0x2B26, "Oltrade LLC" },
+ { 0x2B27, "FluxData Incorporated" },
+ { 0x2B28, "Enovation Controls, LLC" },
+ { 0x2B29, "Lezyne" },
+ { 0x2B2A, "BDX" },
+ { 0x2B2B, "BITwave PTE LTD." },
+ { 0x2B2C, "S1nn GmbH & Co. KG" },
+ { 0x2B2D, "AEG Power Solutions GmbH" },
+ { 0x2B2E, "pei tel Communications GmbH" },
+ { 0x2B2F, "UL TS B.V." },
+ { 0x2B30, "Neratec Solutions AG" },
+ { 0x2B31, "JVIS USA, LLC" },
+ { 0x2B32, "NVS Technologies AG" },
+ { 0x2B33, "Commend International GmbH" },
+ { 0x2B34, "Seemahale Telecoms" },
+ { 0x2B35, "Assem Technology Co., Ltd." },
+ { 0x2B36, "Dongguan City Jianghan Electronics Co., Ltd." },
+ { 0x2B37, "Huizhou Desay SV Automotive Co., Ltd." },
+ { 0x2B38, "Ningbo Rixing Electronics Co., Ltd." },
+ { 0x2B39, "KANAI ELECTRONIC APPLIANCE Co., Ltd." },
+ { 0x2B3A, "Cirrus Research plc" },
+ { 0x2B3B, "ScriptPro, LLC" },
+ { 0x2B3C, "Technikos Sports Inc." },
+ { 0x2B3D, "GuangDong YuanFeng Automotive Electroics Co., Ltd." },
+ { 0x2B3E, "NewAE Technology Inc." },
+ { 0x2B3F, "ATL-SD Co., Ltd." },
+ { 0x2B40, "Matsumura Engineering Co., Ltd." },
+ { 0x2B41, "Image Match Design Inc." },
+ { 0x2B42, "NEXO S.A." },
+ { 0x2B43, "Doro AB" },
+ { 0x2B44, "Wildfire, Inc." },
+ { 0x2B45, "PRA Audio Systems, Inc." },
+ { 0x2B46, "Centerm Information Co., Ltd." },
+ { 0x2B47, "Huizhou Aorora Science & Technology Co., Ltd." },
+ { 0x2B48, "Sounding Audio Industrial Limited" },
+ { 0x2B49, "GECO Incorporated" },
+ { 0x2B4A, "Yueqing Huaxin Electronic Co., Ltd." },
+ { 0x2B4B, "China Hualu Group Co., Ltd." },
+ { 0x2B4C, "Beijing SHENQI Technology Co., Ltd." },
+ { 0x2B4D, "SMC Corporation" },
+ { 0x2B4E, "Microcabin Inc." },
+ { 0x2B4F, "Aeroscout Ltd. (Stanley Healthcare)" },
+ { 0x2B50, "Denchi Power Ltd." },
+ { 0x2B51, "Pax Instruments" },
+ { 0x2B52, "Dongguan Evermax Electronics Technology Co., Ltd." },
+ { 0x2B53, "Shenzhen Supernature Multimedia Co., Ltd." },
+ { 0x2B54, "AMPAK Technology Inc." },
+ { 0x2B55, "FUJIFILM Imaging Systems Co., Ltd." },
+ { 0x2B56, "The Crypto Group" },
+ { 0x2B57, "GIROPTIC" },
+ { 0x2B58, "DJ Sound Electronics, LLC / BiZi Inc." },
+ { 0x2B59, "ESI Motion" },
+ { 0x2B5A, "Universal Audio, Inc." },
+ { 0x2B5B, "Xiamen Home Meitu Technology Co., Ltd." },
+ { 0x2B5C, "B&B Exporting Limited" },
+ { 0x2B5D, "GSL Solutions, Inc." },
+ { 0x2B5E, "Audio Alchemy" },
+ { 0x2B5F, "b-plus GmbH" },
+ { 0x2B60, "Viking Technology" },
+ { 0x2B61, "Universal Biosensors, Inc." },
+ { 0x2B62, "ICP Entwicklungs GmbH" },
+ { 0x2B63, "Inora Technologies, Inc." },
+ { 0x2B64, "Cyanogen Inc." },
+ { 0x2B65, "Atelier Vision Corporation" },
+ { 0x2B66, "Clinton Instrument Company" },
+ { 0x2B67, "Lifesize, Inc." },
+ { 0x2B68, "FLEXIM - Flexible Industriemesstechnik GmbH" },
+ { 0x2B69, "Humax Automotive Co., Ltd." },
+ { 0x2B6A, "FUJI TECOM INC." },
+ { 0x2B6B, "Colorix SA" },
+ { 0x2B6C, "Transbit Sp. z o.o." },
+ { 0x2B6D, "SATORI ELECTRIC CO., LTD." },
+ { 0x2B6E, "Airviz Inc." },
+ { 0x2B6F, "Revolution Education Ltd." },
+ { 0x2B70, "Micran, Research & Production Company" },
+ { 0x2B71, "Zhejiang Flashforge 3D Technology Co., Ltd." },
+ { 0x2B72, "RT Corporation" },
+ { 0x2B73, "Pioneer DJ Corporation" },
+ { 0x2B74, "Embedded Intelligence, Inc." },
+ { 0x2B75, "New Matter" },
+ { 0x2B76, "Shanghai Wingtech Electronic Technology Co., Ltd." },
+ { 0x2B77, "Epiphan Systems Inc." },
+ { 0x2B78, "Elyctis" },
+ { 0x2B79, "Radio Sound, Inc." },
+ { 0x2B7A, "Spin Master Far East Ltd." },
+ { 0x2B7B, "Gigaset Digital Technology (Shenzhen) Co., Ltd." },
+ { 0x2B7C, "Noveltek Semiconductor Corp." },
+ { 0x2B7D, "ZEITEC Semiconductor Co., Ltd." },
+ { 0x2B7E, "Shenzhen Kingcome Optoelectronic Co., Ltd." },
+ { 0x2B7F, "NanoTS Co., Ltd." },
+ { 0x2B80, "Miyuki Giken Co., Ltd." },
+ { 0x2B81, "PULAX Corporation" },
+ { 0x2B82, "TELE RADIO AB" },
+ { 0x2B83, "Silicon Line GmbH" },
+ { 0x2B84, "Ever Win International Corp." },
+ { 0x2B85, "YICHUN YILIAN PRINT TECH CO., LTD." },
+ { 0x2B86, "MITSUBISHI HITACHI POWER SYSTEMS ENGINEERING CO., LTD." },
+ { 0x2B87, "ATP Industries Group Ltd." },
+ { 0x2B88, "Socionext Inc." },
+ { 0x2B89, "Ugreen Group Limited" },
+ { 0x2B8A, "Shanghai Pateo Electronic Equipment Mfg. Co., Ltd." },
+ { 0x2B8B, "Inner Mongolia Yinan Science & Technology Dev. Co., Ltd" },
+ { 0x2B8C, "EDGE I&D" },
+ { 0x2B8D, "Dr. Fritz Faulhaber GmbH & Co. KG" },
+ { 0x2B8E, "Pentair PLC" },
+ { 0x2B8F, "DxO Labs Corp." },
+ { 0x2B90, "ACR Braendli & Voegeli AG" },
+ { 0x2B91, "The Fredericks Company" },
+ { 0x2B92, "i-BLADES, Inc." },
+ { 0x2B93, "Altia Systems Inc." },
+ { 0x2B94, "ShenZhen Baoyuanda Electronics Co., Ltd." },
+ { 0x2B95, "iST - Integrated Service Technology Inc." },
+ { 0x2B96, "HYUNDAI MOBIS Co., Ltd." },
+ { 0x2B97, "Digen Co., Ltd." },
+ { 0x2B98, "Glenair, Inc." },
+ { 0x2B99, "360fly, Inc." },
+ { 0x2B9A, "HUIZHOU CHENG SHUO HARDWARE PLASTIC CO., LTD." },
+ { 0x2B9B, "Zhongshan Aute Electronics Technology Co., Ltd." },
+ { 0x2B9C, "Guangdong King Link Industrial Co., Ltd." },
+ { 0x2B9D, "HARTING Electric GmbH & Co. KG" },
+ { 0x2B9E, "ZPower LLC" },
+ { 0x2B9F, "Scietera Technologies, Inc." },
+ { 0x2BA0, "InVue Security Products" },
+ { 0x2BA1, "I-Sheng Electric Wire & Cable Co., Ltd." },
+ { 0x2BA2, "China Daheng Group Inc Beijing Image Vision Tech Branch" },
+ { 0x2BA3, "Shenzhen FeiTianXia Technology Ltd." },
+ { 0x2BA4, "Shenzhen HengJia New Energy Auto Part Co., Ltd." },
+ { 0x2BA5, "Yueguan Network Technology (Shanghai) Co., Ltd." },
+ { 0x2BA6, "Cyberith GmbH" },
+ { 0x2BA7, "77 Elektronika Kft." },
+ { 0x2BA8, "YUDU EASON ELECTRONIC CO., LTD." },
+ { 0x2BA9, "YanFeng Visteon Automotive Electronics Co., Ltd." },
+ { 0x2BAA, "New World Technologies Inc." },
+ { 0x2BAB, "Grandstream Networks, Inc." },
+ { 0x2BAC, "Polyera Corporation" },
+ { 0x2BAD, "XinJi Technologies Ltd." },
+ { 0x2BAE, "Holinail H.K. Limited" },
+ { 0x2BAF, "Getac Technology Corp." },
+ { 0x2BB0, "ITES Co., Ltd." },
+ { 0x2BB1, "Validata LLC" },
+ { 0x2BB2, "HIDEX OY" },
+ { 0x2BB3, "Elcoa Industria e Comercio Ltda" },
+ { 0x2BB4, "PRINK Srl" },
+ { 0x2BB5, "Silk ID Systems" },
+ { 0x2BB6, "3D Imaging & Simulations Corp. (3DISC)" },
+ { 0x2BB7, "Dongguan ChengXiang Industrial Co., Ltd." },
+ { 0x2BB8, "OCC (Zhuhai) Electronic Co., Ltd." },
+ { 0x2BB9, "ARGUS-SPECTRUM" },
+ { 0x2BBA, "Sinseader Electronic Co., Ltd." },
+ { 0x2BBB, "DONGGUAN YELLOW KNIFE Industrial Co., Ltd." },
+ { 0x2BBC, "Guided Ultrasonics Ltd" },
+ { 0x2BBD, "RF Creations Ltd." },
+ { 0x2BBE, "Chengyi Semiconductors (Shanghai) Co., Ltd." },
+ { 0x2BBF, "Shenzhen Shinning Electronic Co., Ltd." },
+ { 0x2BC0, "Shenzhen WFD Electronics Co., Ltd." },
+ { 0x2BC1, "Dongguan Sino Syncs Industrial Co., Ltd." },
+ { 0x2BC2, "JNTC Co., Ltd." },
+ { 0x2BC3, "Nihon Mechatronics Co., Ltd." },
+ { 0x2BC4, "SR Research Ltd." },
+ { 0x2BC5, "Orbbec 3D Tech. Int'l Inc." },
+ { 0x2BC6, "Server Technology, Inc." },
+ { 0x2BC7, "Zounds Hearing Inc." },
+ { 0x2BC8, "DONGGUAN POLIXIN ELECTRIC CO., LTD." },
+ { 0x2BC9, "Tama Electric (Suzhou) Co., Ltd." },
+ { 0x2BCA, "Exvision, Inc." },
+ { 0x2BCB, "Tanaka Electric Industry Co., Ltd." },
+ { 0x2BCC, "InoTec GmbH Organisationssysteme" },
+ { 0x2BCD, "Keyprocessor BV" },
+ { 0x2BCE, "UV Partners" },
+ { 0x2BCF, "Magtrol, Inc." },
+ { 0x2BD0, "mophie, LLC" },
+ { 0x2BD1, "Spectran LLC" },
+ { 0x2BD2, "Nabtesco Corporation" },
+ { 0x2BD3, "Dongguan ULT-unite electronic technology co., LTD" },
+ { 0x2BD4, "JL Audio, Inc." },
+ { 0x2BD5, "Cable Matters Inc." },
+ { 0x2BD6, "CoroWare, Inc." },
+ { 0x2BD7, "EcuTek International Ltd." },
+ { 0x2BD8, "ROPEX Industrie-Elektronik GmbH" },
+ { 0x2BD9, "Huddly" },
+ { 0x2BDA, "Panono GmbH" },
+ { 0x2BDB, "LOVEOX CO., LTD." },
+ { 0x2BDC, "Automation Electronics Inc." },
+ { 0x2BDD, "Charm Sciences Inc." },
+ { 0x2BDE, "Pickering Interfaces Limited" },
+ { 0x2BDF, "Hangzhou Hikvision Digital Technology Co., Ltd." },
+ { 0x2BE0, "Fullink Technology Co., Ltd" },
+ { 0x2BE1, "AutoChips Inc." },
+ { 0x2BE2, "Electric Connector Technology Co., Ltd." },
+ { 0x2BE3, "Hydac Electronic GmbH" },
+ { 0x2BE4, "Cojali S.L. ES-B13210489" },
+ { 0x2BE5, "LELTEK" },
+ { 0x2BE6, "Dongguan KaiWin Electronics Co., Ltd." },
+ { 0x2BE7, "BEFS Co., Ltd." },
+ { 0x2BE8, "Archisite, Inc." },
+ { 0x2BE9, "Magneti Marelli S.p.A Electr BL" },
+ { 0x2BEA, "Inspire Medical Systems" },
+ { 0x2BEB, "Gateworks Corporation" },
+ { 0x2BEC, "Lumantek Co., Ltd." },
+ { 0x2BED, "Econoburn LLC" },
+ { 0x2BEE, "Ventev Mobile" },
+ { 0x2BEF, "Quanta Storage Inc." },
+ { 0x2BF0, "Tech-Top Technology Limited" },
+ { 0x2BF1, "Murakami Color Research Laboratory" },
+ { 0x2BF2, "ABB India Limited" },
+ { 0x2BF3, "Photek Ltd." },
+ { 0x2BF4, "Thunderbird International DBA Spectec" },
+ { 0x2BF5, "Shenzhen YOOBAO Technology Co., Ltd." },
+ { 0x2BF6, "Shenzhen Sinotek Technology Co., Ltd." },
+ { 0x2BF7, "KEYW" },
+ { 0x2BF8, "Visual Land Inc." },
+ { 0x2BF9, "Poynt Co." },
+ { 0x2BFA, "High Country Tek" },
+ { 0x2BFB, "Strattec Advanced Logic, LLC" },
+ { 0x2BFC, "Sulon Technologies Inc." },
+ { 0x2BFD, "Kinematics GmbH" },
+ { 0x2BFE, "Novexx Solutions GmbH" },
+ { 0x2BFF, "Shindengen Electric Mfg. Co., Ltd." },
+ { 0x2C00, "MEEM SL Ltd" },
+ { 0x2C01, "Dongguan Arin Electronics Technology Co., Ltd." },
+ { 0x2C02, "DongGuan City JianNuo Electronics Co., Ltd." },
+ { 0x2C03, "Barrett Communications Pty. Ltd." },
+ { 0x2C04, "Shenzhen XOX Electronics Co., Ltd." },
+ { 0x2C05, "Protop International Inc." },
+ { 0x2C06, "Microsemi Semiconductor (US) Inc." },
+ { 0x2C07, "Webcloak LLC" },
+ { 0x2C08, "INVECAS INC." },
+ { 0x2C09, "Prediktor Medical AS" },
+ { 0x2C0A, "ATANS Technology Inc." },
+ { 0x2C0B, "Triple Win Precision Technology Co., Ltd." },
+ { 0x2C0C, "IC Realtech" },
+ { 0x2C0D, "Embrava Pty Ltd" },
+ { 0x2C0E, "Unity Scientific" },
+ { 0x2C0F, "Mantra Softech (India) Pvt Ltd" },
+ { 0x2C10, "Sinotronics Co., Ltd." },
+ { 0x2C11, "ALLBEST ELECTRONICS TECHNOLOGY CO., LTD." },
+ { 0x2C12, "Shenzhen Xin Kai Feng Electronics Factory" },
+ { 0x2C13, "MOST WELL Technology Corp." },
+ { 0x2C14, "Buffalo Memory Co., Ltd." },
+ { 0x2C15, "Xentris Wireless" },
+ { 0x2C16, "Priferential Accessories Ltd" },
+ { 0x2C17, "SVS-VISTEK GmbH" },
+ { 0x2C18, "Euclideon Pty. Ltd." },
+ { 0x2C19, "Sunlike Technology Co., Ltd." },
+ { 0x2C1A, "Young Fast Optoelectronics Co., Ltd." },
+ { 0x2C1B, "ISAW Camera Inc" },
+ { 0x2C1C, "Daesung Eltec., Ltd" },
+ { 0x2C1D, "Makita Corporation" },
+ { 0x2C1E, "Global Fire Equipment S.A." },
+ { 0x2C1F, "Cashmaster International Limited" },
+ { 0x2C20, "Pulsar Instruments Plc." },
+ { 0x2C21, "Prynt Corp." },
+ { 0x2C22, "Qanba USA, LLC" },
+ { 0x2C23, "Super Micro Computer Inc." },
+ { 0x2C24, "SONOTEC Ultraschallsensorik Halle GmbH" },
+ { 0x2C25, "Shanghai TAIDU INTELLIGENT TECHNOLOGY CO., LTD." },
+ { 0x2C26, "Micromax International Corporation" },
+ { 0x2C27, "YAWATA Electric Industrial Co., Ltd." },
+ { 0x2C28, "Granite River Labs Japan Ltd." },
+ { 0x2C29, "Coagent Enterprise Limited" },
+ { 0x2C2A, "LEIA Inc." },
+ { 0x2C2B, "NetScout Systems, Inc." },
+ { 0x2C2C, "Fortify Technologies, LLC" },
+ { 0x2C2D, "Shenzhen Ebull Technology Limited" },
+ { 0x2C2E, "Hualun Technology Co., Ltd." },
+ { 0x2C2F, "Sensel, Inc." },
+ { 0x2C30, "Ariadne's Thread (USA), Inc. dba Immerex" },
+ { 0x2C31, "tinnos" },
+ { 0x2C32, "MCS Micronic Computer Systeme GmbH" },
+ { 0x2C33, "Shinobiya.com Co., Ltd." },
+ { 0x2C34, "Xerox Business Services (Switzerland) AG" },
+ { 0x2C35, "Decto, Inc." },
+ { 0x2C36, "Bonsai Lab, Inc." },
+ { 0x2C37, "Shenzhen Adition Audio Science & Technology Co., Ltd." },
+ { 0x2C38, "Goldenconn Electronics Technology (Suzhou) Co., Ltd." },
+ { 0x2C39, "JIB Electronics Technology Co., Ltd." },
+ { 0x2C3A, "Changzhou Shinco Automotive Electronics Co., Ltd." },
+ { 0x2C3B, "Shenzhen Hangsheng Electronics Corp., Ltd." },
+ { 0x2C3C, "Beartooth Radio, Inc." },
+ { 0x2C3D, "Audience, A Knowles Company" },
+ { 0x2C3E, "Verizon Telematics, Inc." },
+ { 0x2C3F, "Nextbit Systems, Inc." },
+ { 0x2C40, "Leadtrend" },
+ { 0x2C41, "Adaptertek Technology Co., Ltd." },
+ { 0x2C42, "Feature Integration Technology Inc." },
+ { 0x2C43, "Avegant Corporation" },
+ { 0x2C44, "Digital Design Corporation" },
+ { 0x2C45, "Reid Heath Ltd." },
+ { 0x2C46, "Soehnle Industrial Solutions GmbH" },
+ { 0x2C47, "Chunghsin International Electronics Co., Ltd." },
+ { 0x2C48, "Delphi Electrical Centers (Shanghai) Co., Ltd." },
+ { 0x2C49, "Chikuma Seiki Co., Ltd." },
+ { 0x2C4A, "System Industrie Electronic GmbH" },
+ { 0x2C4B, "Huntleigh Healthcare Ltd." },
+ { 0x2C4C, "Double Robotics, Inc." },
+ { 0x2C4D, "VVETEK DOO" },
+ { 0x2C4E, "Mercusys Technologies Co., Limited" },
+ { 0x2C4F, "Canon Electronic Business Machines (H.K.) Co., Ltd." },
+ { 0x2C50, "Vinghog AS" },
+ { 0x2C51, "Lambda Acoustic" },
+ { 0x2C52, "Comio Communication Co., Ltd." },
+ { 0x2C53, "Huizhou Foryou General Electronics Co., Ltd." },
+ { 0x2C54, "LifeWatch Technologies Ltd." },
+ { 0x2C55, "Magicleap" },
+ { 0x2C56, "Pocket Radar Inc." },
+ { 0x2C57, "BMT Messtechnik GmbH" },
+ { 0x2C58, "Dyden Corporation" },
+ { 0x2C59, "EBARA CORPORATION" },
+ { 0x2C5A, "Mobilus Automotive Inc" },
+ { 0x2C5B, "Shenglan Technology Co. Ltd" },
+ { 0x2C5C, "Neusoft Corporation" },
+ { 0x2C5D, "SIP Simya Electronics Technology Co., Ltd." },
+ { 0x2C5E, "ELVES Automotive Co., Ltd" },
+ { 0x2C5F, "YOODS Co., Ltd." },
+ { 0x2C60, "Sirin LABS AG" },
+ { 0x2C61, "Jadmam Corporation dba: Boytone" },
+ { 0x2C62, "Trice Medical" },
+ { 0x2C63, "Electronica Steren, S.A. de C.V." },
+ { 0x2C64, "Creaform Inc. (Ametek Ultra Precision Technologies)" },
+ { 0x2C65, "Nokia Technologies" },
+ { 0x2C66, "EMOTIQ srl" },
+ { 0x2C67, "VentureCraft, Ltd." },
+ { 0x2C68, "EMRight Technology Co., Ltd." },
+ { 0x2C69, "BBPOS Limited" },
+ { 0x2C6A, "Joint Stock Company Research Centre Module" },
+ { 0x2C6B, "System JD Co., Ltd" },
+ { 0x2C6C, "Nano TouchSystems co., Ltd." },
+ { 0x2C6D, "Gibson Innovations" },
+ { 0x2C6E, "Shen Zhen Xian Shuo Technology Co. Ltd." },
+ { 0x2C6F, "PST Eletronica LTDA" },
+ { 0x2C70, "PERI, Inc." },
+ { 0x2C71, "Bozhou BoTong Information Technology Co., Ltd." },
+ { 0x2C72, "BlueberryE GmbH" },
+ { 0x2C73, "Qiku Internet Network Scientific (Shenzhen) Co., Ltd." },
+ { 0x2C74, "CJSC Nordavind" },
+ { 0x2C75, "Net And Print Inc." },
+ { 0x2C76, "DATAPATH LTD" },
+ { 0x2C77, "Profindustry GmbH" },
+ { 0x2C78, "BRAGI GmbH" },
+ { 0x2C79, "WAWGD, Inc. (DBA: Foresight Sports)" },
+ { 0x2C7A, "AutoNavi Software Co., Ltd." },
+ { 0x2C7B, "Beijing ASU Tech Co., Ltd." },
+ { 0x2C7C, "Anysmart Technologies Co., Ltd." },
+ { 0x2C7D, "Shenzhen Protruly Electronic Co., Ltd." },
+ { 0x2C7E, "Dongguan Allpass Electronic Co., Ltd." },
+ { 0x2C7F, "SHENZHEN D-VITEC INDUSTRIAL CO., LTD." },
+ { 0x2C80, "motomobile AG" },
+ { 0x2C81, "Indie Semiconductor" },
+ { 0x2C82, "Cloud9 Technologies LLC" },
+ { 0x2C83, "LRP electronic GmbH" },
+ { 0x2C84, "Innodezign MauRitius Limited" },
+ { 0x2C85, "Audientes" },
+ { 0x2C86, "Ultraflux" },
+ { 0x2C87, "ISKN" },
+ { 0x2C88, "K-Tronic SRL" },
+ { 0x2C89, "Younes Medical Technologies" },
+ { 0x2C8A, "Advanced Casino Electronics" },
+ { 0x2C8B, "Huizhou Dehong Technology Co., Ltd." },
+ { 0x2C8C, "PowerCenter Technology Limited" },
+ { 0x2C8D, "Mizco International, Inc." },
+ { 0x2C8E, "Unique Secure Limited" },
+ { 0x2C8F, "Regulus Company Ltd." },
+ { 0x2C90, "I. AM. PLUS, LLC" },
+ { 0x2C91, "Corigine, Inc." },
+ { 0x2C92, "Ningbo Yinzhou Shengke Electronics Co., Ltd." },
+ { 0x2C93, "SWFL Inc. dba: Filament" },
+ { 0x2C94, "HIRATSUKA Engineering Co., Ltd." },
+ { 0x2C95, "TOSHIBA MACHINE CO., LTD." },
+ { 0x2C96, "KBS Industrieelektronik GmbH" },
+ { 0x2C97, "LEDGER" },
+ { 0x2C98, "Fosfomatic Technology LLC" },
+ { 0x2C99, "Prusa Research s.r.o." },
+ { 0x2C9A, "Lawo AG" },
+ { 0x2C9B, "SPECIM, Spectral Imaging Ltd." },
+ { 0x2C9C, "Vayyar Imaging LTD." },
+ { 0x2C9D, "Nod Inc." },
+ { 0x2C9E, "Shanghai Linguo Technology Co.,Ltd." },
+ { 0x2C9F, "e-Smart Systems Pvt. Ltd." },
+ { 0x2CA0, "Leagtech Jiangxi Electronic Co., Ltd." },
+ { 0x2CA1, "Veetone Technologies Limited" },
+ { 0x2CA2, "GuangZhou MingPing Electronics Technology" },
+ { 0x2CA3, "DJI Technology Co., Ltd." },
+ { 0x2CA4, "Shenzhen Alex Technology Co., Ltd." },
+ { 0x2CA5, "Fussen Technology Co., Ltd." },
+ { 0x2CA6, "Dai-ichi Dentsu Ltd." },
+ { 0x2CA7, "Heptagon Advanced Micro Optics" },
+ { 0x2CA8, "STATSports" },
+ { 0x2CA9, "JITS TECHNOLOGY CO., LIMITED" },
+ { 0x2CAA, "LIVV Brand llc" },
+ { 0x2CAB, "AppWorld S. de R.L. de C.V." },
+ { 0x2CAC, "MGF Sviesos Konversija, UAB" },
+ { 0x2CAD, "EMS Security Group Ltd." },
+ { 0x2CAE, "Clyde Broadcast Products Ltd." },
+ { 0x2CAF, "IDS GmbH" },
+ { 0x2CB0, "Creative bits Solutions" },
+ { 0x2CB1, "Avista Corporation" },
+ { 0x2CB2, "NAGANO KEIKI CO., LTD." },
+ { 0x2CB3, "Shenzhen Bolin Image Science Technology Co., Ltd." },
+ { 0x2CB4, "Ava Enterprises, Inc. dba Boss Audio Systems" },
+ { 0x2CB5, "SUS Corp." },
+ { 0x2CB6, "Borqs Hong Kong Limited" },
+ { 0x2CB7, "Fibocom Wireless Inc." },
+ { 0x2CB8, "Shenzhen Sydixon Electronic Technology Co., Ltd." },
+ { 0x2CB9, "On-Bright Electronics (Shanghai) Co., Ltd." },
+ { 0x2CBA, "Dongguan Puxu Industrial Co., Ltd." },
+ { 0x2CBB, "Shenzhen Soling Indusrtial Co., Ltd." },
+ { 0x2CBD, "EGGCYTE, INC." },
+ { 0x2CBE, "uQontrol" },
+ { 0x2CBF, "Donggguan Yuhua Electronic Co., Ltd." },
+ { 0x2CC0, "Hangzhou Zero Zero Technology Co., Ltd." },
+ { 0x2CC1, "SIGFOX" },
+ { 0x2CC2, "Lautsprecher Teufel GmbH" },
+ { 0x2CC3, "A-VEKT K.K." },
+ { 0x2CC4, "Sanden Advanced Technology Corporation" },
+ { 0x2CC5, "Metatronics" },
+ { 0x2CC6, "Prodigy Technovations Pvt Ltd" },
+ { 0x2CC7, "EmergiTech, Inc" },
+ { 0x2CC8, "Hewlett Packard Enterprise" },
+ { 0x2CC9, "Monolithic Power Systems Inc." },
+ { 0x2CCA, "Amphenol Advanced Sensors" },
+ { 0x2CCB, "USB Memory Direct" },
+ { 0x2CCC, "Silicon Mitus Inc." },
+ { 0x2CCD, "ITOS Inc." },
+ { 0x2CCE, "SMARTY Performance King SA" },
+ { 0x2CCF, "Hypersecu Information Systems, Inc." },
+ { 0x2CD0, "Technics Global Electronics & JCE Co., Ltd." },
+ { 0x2CD1, "Tamron Co., Ltd." },
+ { 0x2CD2, "Mikrotikls S/A" },
+ { 0x2CD3, "Life Robotics Inc." },
+ { 0x2CD4, "NGK SPARK PLUG CO., LTD." },
+ { 0x2CD5, "Institut Dr. Foerster GmbH & Co. KG" },
+ { 0x2CD6, "Immersive Media" },
+ { 0x2CD7, "Cosemi Technologies Inc." },
+ { 0x2CD8, "Nanoport Technology, Inc." },
+ { 0x2CD9, "Cambrionix Ltd" },
+ { 0x2CDA, "CXUN Co. Ltd." },
+ { 0x2CDB, "China Tsp Inc" },
+ { 0x2CDC, "Sea & Sun Technology GmbH" },
+ { 0x2CDD, "IAI Corporation" },
+ { 0x2CDE, "RTI International" },
+ { 0x2CDF, "Tecno Alarm S.R.L." },
+ { 0x2CE0, "iClassmate Educational Technologies Co., Ltd." },
+ { 0x2CE1, "Gradus Group" },
+ { 0x2CE2, "Yanfeng Visteon (Chongqing) Automotive Electronics Co" },
+ { 0x2CE3, "Alcorlink Corp." },
+ { 0x2CE4, "ISBC Ltd." },
+ { 0x2CE5, "InX8 Inc dba AKiTiO" },
+ { 0x2CE6, "SDAN Tecchnology Co., Ltd." },
+ { 0x2CE7, "Lemobile Information Technology (Beijing) Co., Ltd." },
+ { 0x2CE8, "DongGuan Hongweixiang Electronic Technology Co., Ltd." },
+ { 0x2CE9, "Suzhu Jingshi Electronic Technology Co., Ltd." },
+ { 0x2CEA, "Zhong Shan City Richsound Electronic Industrial Ltd." },
+ { 0x2CEB, "Dongguang Kangbang Electronics Co., Ltd." },
+ { 0x2CEC, "Ascon Tecnologic" },
+ { 0x2CED, "KMC Controls, Inc." },
+ { 0x2CEE, "Winpower Qmadix Technology Co., Ltd." },
+ { 0x2CEF, "Toptest Technologies Co., Ltd." },
+ { 0x2CF0, "Nuand, LLC" },
+ { 0x2CF1, "DTS, Inc." },
+ { 0x2CF2, "KUNSHAN DLK Electronics Technology Co., Ltd." },
+ { 0x2CF3, "Konekt, Inc." },
+ { 0x2CF4, "CAM2 Technologies, LLC dba: Czitek" },
+ { 0x2CF5, "EBARA REFRIGERATION EQUIPMENT & SYSTEMS CO., LTD." },
+ { 0x2CF6, "Eye-Fi, Inc." },
+ { 0x2CF7, "PPST, Inc." },
+ { 0x2CF8, "Itron" },
+ { 0x2CF9, "Terrafix Ltd." },
+ { 0x2CFA, "Meta Company" },
+ { 0x2CFB, "Nanchang Haozhun Electronics Co., Ltd." },
+ { 0x2CFC, "DeLaval International AB" },
+ { 0x2CFD, "GoerTek Inc." },
+ { 0x2CFE, "Alpha Data Parallel Systems" },
+ { 0x2CFF, "ITHAKi" },
+ { 0x2D00, "VDO Cyclecomputing, Cycle Parts GmbH" },
+ { 0x2D01, "Gopod Group Limited" },
+ { 0x2D02, "Zhi Sheng Electronics Technology Co., Ltd." },
+ { 0x2D03, "ECCO Safety Group" },
+ { 0x2D05, "Technology Solutions (UK) Limited" },
+ { 0x2D06, "Jireh Industries Ltd." },
+ { 0x2D07, "MSI.TOKYO, Inc." },
+ { 0x2D08, "ZIT Ltd." },
+ { 0x2D09, "Dongguan Evervictory Electronic Co., Ltd." },
+ { 0x2D0A, "Kingsignal Technology Co., Ltd." },
+ { 0x2D0B, "IPD CO., LTD" },
+ { 0x2D0C, "B & P Automation Dynamics Ltd" },
+ { 0x2D0D, "Star Vision Electronics Limited" },
+ { 0x2D0E, "Linxee (Beijing) Technology LTD." },
+ { 0x2D0F, "M8TRIX TECH LLC" },
+ { 0x2D10, "Shenzhen San Guan Si Yuan Technology Limited" },
+ { 0x2D11, "Servelec Technologies" },
+ { 0x2D12, "SICPA Security Solutions SA" },
+ { 0x2D13, "DONG GUAN EBEN ELECTRONIC CO., LTD" },
+ { 0x2D14, "Palit Microsystems Ltd" },
+ { 0x2D15, "Si-Ware Systems" },
+ { 0x2D16, "DONGGUAN WELLINK ELECTRONIC CO., LTD." },
+ { 0x2D17, "TECHVIWIN INTERNATIONAL (HONGKONG) LIMITED" },
+ { 0x2D18, "Hui Zhou Kai Yue Electronics Co., Ltd" },
+ { 0x2D19, "Churchill Navigation" },
+ { 0x2D1A, "Phononic" },
+ { 0x2D1B, "Suzhou Yourfriend Electronic Co., Ltd." },
+ { 0x2D1C, "Club 3D BV" },
+ { 0x2D1D, "Design Pool Limited" },
+ { 0x2D1E, "Excalibur" },
+ { 0x2D1F, "Wacom Taiwan Information Co. Ltd." },
+ { 0x2D20, "UL LLC" },
+ { 0x2D21, "Koozyt, Inc." },
+ { 0x2D22, "SEIKOSHA Co., Ltd." },
+ { 0x2D23, "Shenzhen Microtest Automation Co., Ltd." },
+ { 0x2D24, "Warwick Audio Technologies Ltd" },
+ { 0x2D25, "Kronegger GmbH" },
+ { 0x2D26, "Greenfield Technology" },
+ { 0x2D27, "Global Optics Limited" },
+ { 0x2D28, "Beijing ANTVR Technology Co., LTD" },
+ { 0x2D29, "Beijing Baofengmojing Technologies Co. Ltd" },
+ { 0x2D2A, "Shenzhen ZDT Technology Co., LTD" },
+ { 0x2D2B, "STYL Solutions Pte Ltd" },
+ { 0x2D2C, "Tankya Developing Co., Limited" },
+ { 0x2D2D, "Guangzhou Botao Information Technology Co., Ltd" },
+ { 0x2D2E, "Hieyoung International (Hong Kong) Limited" },
+ { 0x2D2F, "PT Phototechnics AG" },
+ { 0x2D30, "Addasound Denmark A/S" },
+ { 0x2D31, "Synox Tech Co., Ltd." },
+ { 0x2D32, "JR Technik Co., Ltd." },
+ { 0x2D33, "Elysia-raytest GmbH" },
+ { 0x2D34, "Nureva Inc." },
+ { 0x2D35, "SIGMA TECH. CO., LTD" },
+ { 0x2D36, "Blu5 View Pte. Ltd." },
+ { 0x2D37, "Xprinter Co., Ltd" },
+ { 0x2D38, "Shanghai OXi Technology Co., Ltd" },
+ { 0x2D39, "Roofer Technology (Shenzhen) Co. Ltd" },
+ { 0x2D3A, "Le Touch (Shenzhen) Electronics Co., Ltd." },
+ { 0x2D3B, "Lencheng Electronics Co., Ltd" },
+ { 0x2D3C, "FOVE, Inc." },
+ { 0x2D3D, "Battlespace Simulations, Inc." },
+ { 0x2D3E, "Technica Del Arte BV" },
+ { 0x2D3F, "ViCentra B.V." },
+ { 0x2D40, "Beijing Pico Technology Co., Ltd." },
+ { 0x2D41, "Dongguan Mankind Plastic Electronics Co., Ltd" },
+ { 0x2D42, "Protech Electronics & Technology Limited" },
+ { 0x2D43, "OSSIC Corporation" },
+ { 0x2D44, "FAMAR FUEGUINA S.A." },
+ { 0x2D45, "JSC TION SMART MICROCLIMATE" },
+ { 0x2D46, "JSC Yukon Advanced Optics Worldwide" },
+ { 0x2D47, "INVENCO GROUP LIMITED" },
+ { 0x2D48, "StarBridge, Inc." },
+ { 0x2D49, "Shanghai Deepoon Technology Co., Ltd." },
+ { 0x2D4A, "Helioway Enterprises Co., Ltd" },
+ { 0x2D4B, "Dongguan Hongwei Electronics Co.,Ltd" },
+ { 0x2D4C, "Ixtra Tech Inc" },
+ { 0x2D4D, "Razer Inc" },
+ { 0x2D4E, "Electronic Equipment BV" },
+ { 0x2D4F, "Dongguan Hanker Electronic Technology Co., Ltd." },
+ { 0x2D50, "CryLaS - Crystal Laser Systems GmbH" },
+ { 0x2D51, "NITTA Corporation" },
+ { 0x2D52, "YiQin Electronics Co.,Ltd" },
+ { 0x2D53, "OWOW Products B.V." },
+ { 0x2D54, "C-Smartlink Information Technology Co., Ltd." },
+ { 0x2D55, "Nagravision SA" },
+ { 0x2D56, "DongGuan Kelta Electro Mechanical Products CO, LTD" },
+ { 0x2D58, "Lyra Semiconductor Incorporated" },
+ { 0x2D59, "Sunyking Technology Co., Ltd" },
+ { 0x2D5A, "Shenzhen YAAN Precision Connector Co., Ltd." },
+ { 0x2D5B, "SunTo Technology (Shen Zhen) Corporation Limited" },
+ { 0x2D5C, "Daiwoo Electronics Lo., LTD" },
+ { 0x2D5D, "Loctek Ergonomic Technology Corp." },
+ { 0x2D5E, "Sky UK Limited" },
+ { 0x2D5F, "Shanghai Yuewen information technology Co., Ltd." },
+ { 0x2D60, "Comarch S.A." },
+ { 0x2D61, "Shenzhen Hongjixin Plastic & Electronics Co., Ltd" },
+ { 0x2D62, "Weifang Genius Electronics Co.,Ltd." },
+ { 0x2D63, "Cable Technology Corp." },
+ { 0x2D64, "H.D.T. S.R.L" },
+ { 0x2D65, "DPA Microphones" },
+ { 0x2D66, "Oley Company Limited" },
+ { 0x2D67, "Fengfan (Suzhou) Audio Technology Co., Ltd." },
+ { 0x2D68, "Lumulabs d.o.o." },
+ { 0x2D6A, "AIPHONE Co., LTD" },
+ { 0x2D6B, "NetUP Inc." },
+ { 0x2D6C, "Sphericam Inc." },
+ { 0x2D6D, "Shenzhen HaiWei Technology Co., LTD" },
+ { 0x2D6E, "Jiangsu Jing Lian Electronic Technology Co., Ltd" },
+ { 0x2D6F, "Tobii Dynavox" },
+ { 0x2D70, "Zhongshan Winner Electronic Technology CO., LTD" },
+ { 0x2D71, "OVERKIZ" },
+ { 0x2D72, "DOGAWIST - Investment GmbH" },
+ { 0x2D73, "XtremeMac Sarl" },
+ { 0x2D74, "CMO America; dba ZipKord Solutions" },
+ { 0x2D75, "Shenzhen Taiji Electronics Co., Ltd." },
+ { 0x2D76, "SiliConch Systems Private Limited" },
+ { 0x2D77, "SweDeltaco AB" },
+ { 0x2D78, "Dental Imaging Technology Corporation" },
+ { 0x2D79, "Shenzhen Legendary Technologies Co., LTD." },
+ { 0x2D7A, "Dongguan JingFeng Electronics Technology Co., Ltd" },
+ { 0x2D7B, "Panasonic Lighting Americas, Inc." },
+ { 0x2D7C, "Dongguan City Qingda Electronic Co., Ltd." },
+ { 0x2D7D, "Televes S.A." },
+ { 0x2D7E, "NISSIN ELECTRIC Corporation" },
+ { 0x2D7F, "Sinar Photography AG" },
+ { 0x2D80, "Pendo Technology China Corporation" },
+ { 0x2D81, "Evollve Inc." },
+ { 0x2D82, "boud" },
+ { 0x2D84, "Zhuhai J-Speed Technology Co., Ltd." },
+ { 0x2D85, "Asahi Electronics Laboratory" },
+ { 0x2D86, "Dongguan Team Force Electronic Co., Ltd" },
+ { 0x2D87, "Zhuhai Spark Electronic Equipment Co., Ltd" },
+ { 0x2D88, "Prinics Co., Ltd." },
+ { 0x2D89, "Ekahau" },
+ { 0x2D8A, "I-O Conn (GuangDong) Technologies Co., Ltd" },
+ { 0x2D8B, "Eclatkey Semiconductor Technology Company Limited" },
+ { 0x2D8C, "Hongrida Electronic Technology Co. LTD" },
+ { 0x2D8D, "MISUMI Corporation" },
+ { 0x2D8E, "Color Sentinel Systems, LLC" },
+ { 0x2D8F, "Shenzhen Bing Chuang Wei Technology Co., Ltd." },
+ { 0x2D90, "Humanplus" },
+ { 0x2D91, "SDI Technologies Inc." },
+ { 0x2D92, "Shanghai Fengtian Electronic Co., LTD." },
+ { 0x2D93, "STK TECHNOLOGY CO., LTD." },
+ { 0x2D94, "TokenWorks Inc." },
+ { 0x2D95, "Vivo Mobile Communication Co., Ltd." },
+ { 0x2D96, "SHENZHEN WAMAXLINK ELECTRONIC TECHNOLOGY CO., LTD" },
+ { 0x2D97, "Dong Guan JingHe Electronics Technology Co., Ltd" },
+ { 0x2D98, "Shenzhen Ruiming Technology Co., Ltd." },
+ { 0x2D99, "Edifier International Limited" },
+ { 0x2D9A, "Jiangsu GuoGuang Electronic Information Technology Co.," },
+ { 0x2D9B, "iStorage Limited" },
+ { 0x2D9C, "Global Connector Technology" },
+ { 0x2D9D, "Dongguan Suntes Electronics Technology Co., Ltd." },
+ { 0x2D9E, "Sivantos GmbH" },
+ { 0x2D9F, "SABRENT" },
+ { 0x2DA0, "IN-VISION Digital Imaging Optics GmbH" },
+ { 0x2DA1, "Koden Electronics Co., Ltd" },
+ { 0x2DA2, "CIMA SPA con socio unico" },
+ { 0x2DA3, "Superior Communications" },
+ { 0x2DA4, "GE Multilin" },
+ { 0x2DA5, "Tokai Rika Create Corporation" },
+ { 0x2DA6, "SiChuan Rui Thai Electronic Technology Co., Ltd." },
+ { 0x2DA7, "Topland Corporation" },
+ { 0x2DA8, "Harmonic Drive Systems Inc." },
+ { 0x2DA9, "ELECTRONIC ASSEMBLY GmbH" },
+ { 0x2DAA, "Shenzhen Jing Tuo Jin Electronics Co., Ltd." },
+ { 0x2DAB, "CYD Electronics (Shenzhen) Co., Ltd." },
+ { 0x2DAC, "Shenzhen YZB Electronics Technology Co., Ltd" },
+ { 0x2DAD, "GoerTek Dynaudio Co., Ltd" },
+ { 0x2DAE, "Hex Technology Limited" },
+ { 0x2DAF, "IF Link Electronics Co Limited" },
+ { 0x2DB0, "Shenzhen Welltech Cable Co., Ltd" },
+ { 0x2DB1, "DongGuan Greatek Electronics Technology Co., LTD" },
+ { 0x2DB2, "Imperx, Inc" },
+ { 0x2DB3, "i Digital Galaxy Ltd." },
+ { 0x2DB4, "Dongguan Changtuo Hardware Technology Co., Ltd." },
+ { 0x2DB5, "Fuji Ceramics Corporation" },
+ { 0x2DB6, "Kunshan 3e Electronics Co., Ltd." },
+ { 0x2DB7, "Premium Sound Solutions Sdn. Bhd." },
+ { 0x2DB8, "Foshan Yami Electric Ltd." },
+ { 0x2DB9, "Danelec Marine A/S" },
+ { 0x2DBA, "Houwa System Design, k.k" },
+ { 0x2DBB, "Huajie IMI Technology Co., Ltd." },
+ { 0x2DBC, "Mikroelektronika d.o.o" },
+ { 0x2DBD, "Shanghai Xiaoyi Technology Co., Ltd" },
+ { 0x2DBE, "MA Lighting Technology GmbH" },
+ { 0x2DBF, "Tul Corporation" },
+ { 0x2DC0, "Chipsea Technologies (Shenzhen) Corp" },
+ { 0x2DC1, "littleBits" },
+ { 0x2DC2, "MintWave Co., Ltd." },
+ { 0x2DC3, "Action Industries (M) SDN BHD" },
+ { 0x2DC4, "Six 15 Technologies" },
+ { 0x2DC5, "Cytek Biosciences, Inc." },
+ { 0x2DC6, "Dongguan Kingtron Electronics Technology Co., Ltd." },
+ { 0x2DC7, "Lacroix Sofrel" },
+ { 0x2DC8, "8BITDO TECHNOLOGY HK LIMITED" },
+ { 0x2DC9, "3T B.V." },
+ { 0x2DCA, "OEM Systems Co., Ltd." },
+ { 0x2DCB, "i-Money Technology Co., Ltd." },
+ { 0x2DCC, "Suzhou Keda Technology Co., Ltd." },
+ { 0x2DCD, "Yeonho Electronics" },
+ { 0x2DCE, "Shen Zhen Farmer Technology Co., Limited" },
+ { 0x2DCF, "Dialog Semiconductor (UK) Ltd" },
+ { 0x2DD0, "iBaby Labs, Inc" },
+ { 0x2DD1, "Empathy Co., Ltd." },
+ { 0x2DD2, "HARNICS Co., LTD." },
+ { 0x2DD3, "Viscell, LLC" },
+ { 0x2DD5, "Gingy Technology Inc." },
+ { 0x2DD6, "Suzhou SuperMax Smart System Co., Ltd." },
+ { 0x2DD7, "enRoute Co., Ltd." },
+ { 0x2DD8, "Perception Sensors and Instrumentation Ltd" },
+ { 0x2DD9, "Dong Guan Fei Tai Electronics CO., LTD." },
+ { 0x2DDA, "Miura Systems Ltd" },
+ { 0x2DDB, "Shenzhen DAK Technology Co., Ltd" },
+ { 0x2DDC, "Audiolink Co., Ltd" },
+ { 0x2DDD, "Princeton Infrared Technologies, Inc." },
+ { 0x2DDE, "The Chamberlain Group, Inc." },
+ { 0x2DDF, "BOMTECH ELECTRONICS CO., LTD." },
+ { 0x2DE0, "Active-semi, Inc" },
+ { 0x2DE1, "Jiang Su Denseting Precision Technology Co., Ltd." },
+ { 0x2DE2, "PathPartner Technology Pvt. Ltd" },
+ { 0x2DE3, "Shanghai Yitu Technology Co., Ltd." },
+ { 0x2DE4, "Best Case and Accessories, Inc." },
+ { 0x2DE5, "KaiJet Technology International Limited, Inc. dba j5create" },
+ { 0x2DE6, "Amazon Fulfillment Services, Inc." },
+ { 0x2DE7, "The LightCo, Inc." },
+ { 0x2DE8, "Shenzhen City Xiaoduan Electrical Co., LTD." },
+ { 0x2DE9, "CAR MATE MFG. CO., LTD." },
+ { 0x2DEA, "LightFactor" },
+ { 0x2DEB, "Hold-Key Electric Wire & Cable Co Ltd" },
+ { 0x2DEC, "ZNi Technology Co., Ltd" },
+ { 0x2DED, "Aquil Star Precision Industrial (Shenzhen) Co., Ltd" },
+ { 0x2DEE, "Shenzhen MeiG Smart Technology Co., Ltd" },
+ { 0x2DEF, "Kirale Technologies SL" },
+ { 0x2DF0, "CANVASBIO CO., LTD" },
+ { 0x2DF1, "Inovonics Corp" },
+ { 0x2DF2, "LIPS Corporation" },
+ { 0x2DF3, "LongSung Technology (Shanghai) Co., Ltd." },
+ { 0x2DF4, "Jumplux Technology Co., Ltd." },
+ { 0x2DF5, "Helium Systems Inc." },
+ { 0x2DF6, "Greektown Casino-Hotel, LLC" },
+ { 0x2DF7, "Fastwel Group Ltd." },
+ { 0x2DF8, "ITEST" },
+ { 0x2DF9, "EZQuest, Inc." },
+ { 0x2DFA, "3DRUDDER" },
+ { 0x2DFB, "Bren-Tronics, Inc." },
+ { 0x2DFC, "Graphic Products" },
+ { 0x2DFD, "Ubisoft Entertainment SA" },
+ { 0x2DFE, "Next Thing Co." },
+ { 0x2DFF, "Unicept GmbH" },
+ { 0x2E00, "CIB Security Inc" },
+ { 0x2E01, "Symetrix, Inc." },
+ { 0x2E02, "Softiron" },
+ { 0x2E03, "Zhejiang Dahua Technology Co., Ltd." },
+ { 0x2E04, "HMD Global Oy" },
+ { 0x2E05, "CKD Corporation" },
+ { 0x2E06, "Shenzhen Junlan Electronic Ltd" },
+ { 0x2E07, "Lafayette Instrument Company" },
+ { 0x2E08, "Zhongshan Dumei Weite Electronics Co., Ltd" },
+ { 0x2E09, "Beijing LLVision Technology Co. LTD" },
+ { 0x2E0A, "Dytran Instruments" },
+ { 0x2E0B, "Datafield Industries (HK) Ltd" },
+ { 0x2E0C, "Shenzhen Mek Intellisys PTE Ltd" },
+ { 0x2E0D, "Suzhou FanglinTechnology Co., Ltd" },
+ { 0x2E0E, "Hatteland Display AS" },
+ { 0x2E0F, "Institute for Defense Analyses / Center for Computing Sciences" },
+ { 0x2E10, "LinkMTech Inc." },
+ { 0x2E11, "ShenZhen ShenTai WeiXiang Electronics Co., Ltd" },
+ { 0x2E12, "Hongkong Chenyang Electronic Co., Limited" },
+ { 0x2E13, "Intelligent Automation (Zhuhai) Co., Ltd" },
+ { 0x2E14, "Expressive" },
+ { 0x2E15, "Now Technologies" },
+ { 0x2E16, "Glosys Inc." },
+ { 0x2E17, "Essential Products, Inc." },
+ { 0x2E18, "NorthStar Battery Company, LLC" },
+ { 0x2E19, "Additel Corporation" },
+ { 0x2E1A, "Shenzhen Arashi Vision Company Limited" },
+ { 0x2E1B, "BeiJie Electronics Technology Co., Ltd" },
+ { 0x2E1C, "Shenzhen Auto-Link World Information Technology Co., Ltd." },
+ { 0x2E1D, "Clarion (Malaysia) Sdn. Bhd." },
+ { 0x2E1E, "Sound Technology (C.Q.) Co., Ltd" },
+ { 0x2E1F, "BrainScope Company, Inc." },
+ { 0x2E20, "Guangzhou Long Do Co.,Ltd" },
+ { 0x2E21, "DOSCH&AMAND Research GmbH&CoKG" },
+ { 0x2E22, "DongGuan LinSong precision electronics CO., LTD" },
+ { 0x2E23, "Shenzhen Baojia Battery Technology Co., Ltd." },
+ { 0x2E24, "Hyperkin Inc." },
+ { 0x2E25, "Gold Cable (Zhongshan) Electronic Co., Ltd." },
+ { 0x2E26, "Monoprice, Inc." },
+ { 0x2E27, "Lion Semiconductor" },
+ { 0x2E28, "VOLTRONIC POWER TECHNOLOGY CORP." },
+ { 0x2E29, "Clas Ohlson AB" },
+ { 0x2E2B, "Shenzhen Qinps Technology Co Limited" },
+ { 0x2E2C, "Dashine Electronics Co, Ltd" },
+ { 0x2E2D, "Anaren Inc." },
+ { 0x2E2E, "First Design System Inc." },
+ { 0x2E2F, "Gulden Ophthalmics, Inc." },
+ { 0x2E30, "Andon Health Co., Ltd." },
+ { 0x2E31, "Thine Electronics, Inc." },
+ { 0x2E32, "Shenzhen Red Star Electronics Co., Ltd." },
+ { 0x2E33, "Squarehead Technology" },
+ { 0x2E34, "ALLDATA LLC" },
+ { 0x2E35, "Shenzhen PYS Industrial Co., LTD" },
+ { 0x2E36, "Depo Electronics Limited" },
+ { 0x2E37, "IRISO ELECTRONICS CO., LTD" },
+ { 0x2E38, "OHM ELECTRONIC INC." },
+ { 0x2E39, "Epic Tech, LLC" },
+ { 0x2E3A, "Nanaboshi Electric Mfg. Co., Ltd." },
+ { 0x2E3B, "uSens Inc" },
+ { 0x2E3C, "ARTERY Technology Co., Ltd." },
+ { 0x2E3D, "ASWAN ELEC. SALES CO., LTD." },
+ { 0x2E3E, "Karma Automotive" },
+ { 0x2E3F, "Poly-Planar Group LLC" },
+ { 0x2E40, "Mobile Technologies Inc" },
+ { 0x2E41, "DONGGUAN RONGDEKANG ELECTRONIC TECHNOLOGY CO., LTD." },
+ { 0x2E42, "Hunan Ronghe Microelectronics Co., Ltd." },
+ { 0x2E43, "Owl Labs, Inc" },
+ { 0x2E44, "Idealens Technology (Chengdu) Co., Ltd." },
+ { 0x2E45, "Widex A/S" },
+ { 0x2E46, "Mobileconn Technology Co., Ltd." },
+ { 0x2E47, "X-Media Tech, Inc." },
+ { 0x2E48, "Andromium Inc." },
+ { 0x2E49, "A&T Corporation" },
+ { 0x2E4A, "Xiamen Jinhaode Electronic Co., Ltd" },
+ { 0x2E4B, "ART SPA" },
+ { 0x2E4C, "Carter Duncan Corp." },
+ { 0x2E4D, "Vinpower, Inc." },
+ { 0x2E4E, "METER Group, Inc" },
+ { 0x2E4F, "Audiotec Fischer GmbH" },
+ { 0x2E50, "beyerdynamic GmbH & Co. KG" },
+ { 0x2E51, "EVER Sp. Z.o.o." },
+ { 0x2E52, "Toughbuilt Industries Inc" },
+ { 0x2E53, "Shenzhen East-Toptech Electronic Technology Co., Ltd" },
+ { 0x2E54, "Yin Run Precise Metal Products CO., LTD." },
+ { 0x2E55, "FIP Formatura Iniezione Polimeri an Aliaxis Company" },
+ { 0x2E56, "Juchin Technology (JIANGXI) Co., Ltd" },
+ { 0x2E57, "MEGWARE Computer Vertrieb und Service GmbH" },
+ { 0x2E58, "GONGNIU GROUP CO., LTD." },
+ { 0x2E59, "Maui Imaging, Inc." },
+ { 0x2E5A, "Mysher Technology Co., Ltd." },
+ { 0x2E5B, "Fitipower Integrated Technology Inc." },
+ { 0x2E5C, "Y.H.S. Co., Ltd" },
+ { 0x2E5D, "Dong Guan LM-Link Precise Electronic Co., Ltd." },
+ { 0x2E5E, "Mei Shun He Electronic Limited" },
+ { 0x2E5F, "Shenzhen BTC Technology Co., Ltd." },
+ { 0x2E60, "castAR, Inc." },
+ { 0x2E61, "NetBurner, Inc." },
+ { 0x2E62, "Will Semiconductor Co., LTD" },
+ { 0x2E63, "Polaris-Labs Shenzhen Co., Ltd" },
+ { 0x2E64, "Shenzhen Kaibao Technology Co., Ltd." },
+ { 0x2E65, "Kunshan Xintaili Precision Components Co., Ltd." },
+ { 0x2E66, "SALICRU, S.A." },
+ { 0x2E67, "Elevation Lab, Inc." },
+ { 0x2E68, "Tessonics Inc." },
+ { 0x2E69, "Swift Navigation Inc" },
+ { 0x2E6A, "Wilderness Labs Inc." },
+ { 0x2E6B, "DMX, LLC dba Mood Media" },
+ { 0x2E6C, "Uwatec AG" },
+ { 0x2E6D, "Laser Argentina S.A." },
+ { 0x2E6E, "E4D Technologies LLC" },
+ { 0x2E6F, "Areca Technology Corporation" },
+ { 0x2E70, "Revision Electronics & Power Systems Inc." },
+ { 0x2E71, "Futurepath Electronics Technology (Dongguan) Co., Ltd." },
+ { 0x2E72, "DongGuan YongHao Electronics Co., LTD" },
+ { 0x2E73, "Backyard Brains" },
+ { 0x2E74, "Magenta Labs Inc." },
+ { 0x2E75, "Shanghai Hinge Electronic Technologies Co., Ltd." },
+ { 0x2E76, "Guangdong Jinrun Electronics Co., Ltd." },
+ { 0x2E77, "LOGICDATA Electronics & Software Entwicklungs GmbH" },
+ { 0x2E78, "ES Gear Ltd." },
+ { 0x2E79, "NP System Development Co., Ltd." },
+ { 0x2E7A, "Jiangsu BDSTAR Navigation Electronic Co., Ltd." },
+ { 0x2E7B, "Terrada Music Score CO., Ltd." },
+ { 0x2E7C, "Pyramid Solutions" },
+ { 0x2E7D, "Shenzhen Xin Yong Yang Technology Co., Ltd." },
+ { 0x2E7E, "ValueHD Corporation" },
+ { 0x2E7F, "Aries Manufacturing - a division of Boss Tech Products Inc." },
+ { 0x2E80, "Join Tek Corporation Co., Ltd." },
+ { 0x2E81, "Zodiac Inflight Innovations" },
+ { 0x2E82, "Sapphire Technology Limited" },
+ { 0x2E83, "Ocean Tek Enterprise Co., Ltd." },
+ { 0x2E84, "Sheng San Electronics (Shen Zhen) Co., Ltd." },
+ { 0x2E85, "Verizon" },
+ { 0x2E86, "SBO HEARING A/S" },
+ { 0x2E87, "Shenzhen Injoinic Technology Co., Ltd." },
+ { 0x2E88, "Huada Semiconductor Corporation Limited" },
+ { 0x2E89, "Group Dekko, Inc." },
+ { 0x2E8A, "Raspberry Pi (Trading) Limited" },
+ { 0x2E8B, "Asia Optical International Ltd." },
+ { 0x2E8C, "Aisino Wincor Manufacturing (Shanghai) Co., Ltd." },
+ { 0x2E8D, "YSC Science Technique Electron (Yi Chun) Co., Ltd" },
+ { 0x2E8E, "Bitatek CO., LTD" },
+ { 0x2E8F, "Shenzhen Weiduli Technology Co., Ltd." },
+ { 0x2E90, "Wireless Media Tech CO., Limited" },
+ { 0x2E91, "Shenzhen Suprint Smart Technology Co., Ltd." },
+ { 0x2E92, "bioMerieux, Inc." },
+ { 0x2E93, "Shenzhen Huikeyuan Electronic Technology Co., Ltd." },
+ { 0x2E94, "Graviton Inc." },
+ { 0x2E95, "Scuf Gaming International, LLC" },
+ { 0x2E96, "Aspect Microsystems Corp." },
+ { 0x2E97, "Aerocool Advanced Technologies Corporation" },
+ { 0x2E98, "Nekteck, Inc." },
+ { 0x2E99, "Hynetek Semiconductor Co., Ltd" },
+ { 0x2E9A, "MS Solutions Co., Ltd." },
+ { 0x2E9B, "New Imaging Technologies" },
+ { 0x2E9C, "Shenzhen Silkway Technology Co., Ltd." },
+ { 0x2E9D, "Resolved Instruments Inc." },
+ { 0x2E9E, "SoundAI Technology Co., Ltd." },
+ { 0x2E9F, "EyeTech Digital Systems, Inc." },
+ { 0x2EA0, "Magnescale Co., Ltd." },
+ { 0x2EA1, "DASANELECTRON CO., LTD" },
+ { 0x2EA2, "Ningbo Kangda Electronic Co., Ltd." },
+ { 0x2EA3, "POSLAB Technology Corporation" },
+ { 0x2EA4, "Hubbell Incorporated (Delaware), Wiring Device Kellems Division" },
+ { 0x2EA5, "Dongguanshi Qitaiprecision Moulds Co., Ltd." },
+ { 0x2EA6, "Foreign Trade Corporation dba. Technocel" },
+ { 0x2EA7, "Muhanbit" },
+ { 0x2EA8, "Changsha JingJia Microelectronics Co., LTD." },
+ { 0x2EA9, "Yuneec International (China) Co., Ltd." },
+ { 0x2EAA, "TSUME S.A." },
+ { 0x2EAB, "Zong Cable Technology Co., Ltd." },
+ { 0x2EAC, "Jia Yang Electronics (Dongguan) Co., Ltd." },
+ { 0x2EAD, "Align Technology Inc." },
+ { 0x2EAE, "Shenzhen TOMTOP Technology Co., Ltd." },
+ { 0x2EAF, "microsonic co., ltd." },
+ { 0x2EB0, "Commtech, Inc." },
+ { 0x2EB1, "Samsung SmartThings" },
+ { 0x2EB2, "Markus Klotz GmbH" },
+ { 0x2EB3, "Shenzhen Tokwa Precision Technology Co., Ltd." },
+ { 0x2EB4, "Beijer Automotive BV" },
+ { 0x2EB5, "Dongguan HengYue Communication Technology Co., Ltd." },
+ { 0x2EB6, "The Vehicle Group LTD" },
+ { 0x2EB7, "Digital Divide Systems Ltd." },
+ { 0x2EB8, "Yueqing Nuode Electronic Technology Co., Ltd." },
+ { 0x2EB9, "SSI Computer Corp." },
+ { 0x2EBA, "Shenzhen E&C Smart Link Technology Co., Ltd." },
+ { 0x2EBB, "Shanghai Tuzheng Information Technology Co., Ltd." },
+ { 0x2EBC, "RAIDON Technology Inc." },
+ { 0x2EBD, "Netstor Technology Co., Ltd." },
+ { 0x2EBE, "Delphi Automotive Systems, LLC" },
+ { 0x2EBF, "Shenzhen D&D Technology Co., Ltd" },
+ { 0x2EC0, "GuideTech" },
+ { 0x2EC1, "Avid Identification Systems, Inc." },
+ { 0x2EC2, "Loupedeck Oy" },
+ { 0x2EC3, "Shenzhen Huntkey Electric Co., Ltd." },
+ { 0x2EC4, "tetralux S.a.r.l." },
+ { 0x2EC5, "Ariba Technology Co., LTD." },
+ { 0x2EC6, "Facebook, Inc." },
+ { 0x2EC7, "ITECH Electronic Co., Ltd." },
+ { 0x2EC8, "Ningbo Prime Electronic Co., Ltd." },
+ { 0x2EC9, "Shenzhou Rongan Technology (Beijing) Limited" },
+ { 0x2ECA, "AQuantia Corp" },
+ { 0x2ECB, "Zhejiang Quzhou Gelinte Wire and Cable Co., Ltd." },
+ { 0x2ECC, "ASR Microelectronics (Shanghai) Co., Ltd." },
+ { 0x2ECD, "EUROICC" },
+ { 0x2ECE, "E-Lead Electronic Co., Ltd." },
+ { 0x2ECF, "Fluo Technology Ltd." },
+ { 0x2ED0, "Mind Alive Inc." },
+ { 0x2ED1, "QBit Semiconductor LTD" },
+ { 0x2ED2, "APOLLO GIKEN Co., Ltd." },
+ { 0x2ED3, "Shenzhen Xinhongya Electronics Corporation" },
+ { 0x2ED4, "Butterfly Network Inc." },
+ { 0x2ED5, "QSAN Technology, Inc." },
+ { 0x2ED6, "Shenzhen Xinliyang Co., Ltd." },
+ { 0x2ED7, "Libratel Inc" },
+ { 0x2ED8, "Dongguan Lontion Industrial Co., Ltd." },
+ { 0x2ED9, "Microscopes International, LLC" },
+ { 0x2EDA, "Wenzhou Haitong Communication Electronics Co., Ltd." },
+ { 0x2EDB, "NeuroHabilitation Corporation" },
+ { 0x2EDC, "Nippon Techno Lab., Inc." },
+ { 0x2EDD, "reMarkable AS" },
+ { 0x2EDE, "Technik Industrial Company Limited" },
+ { 0x2EDF, "Huizhou Wealth Metal Micro Control Limited" },
+ { 0x2EE0, "Pogotec Inc." },
+ { 0x2EE1, "Safetrust Inc" },
+ { 0x2EE2, "Kashimura Co., Ltd." },
+ { 0x2EE3, "Kin Keung Electrical Mfg. Ltd." },
+ { 0x2EE4, "Osprey Video, Inc." },
+ { 0x2EE6, "NEURODIGITAL TECHNOLOGIES, S.L." },
+ { 0x2EE7, "GOOGFIT TECH LIMITED" },
+ { 0x2EE8, "Zunidata Systems, Inc." },
+ { 0x2EE9, "Adigal LLC" },
+ { 0x2EEA, "Loma Systems" },
+ { 0x2EEB, "Jianduan Technology (Shenzhen) Co., Ltd." },
+ { 0x2EEC, "Sensor Industries Limited" },
+ { 0x2EED, "Shenzhen Panhui Technologies Co., Ltd." },
+ { 0x2EEE, "Beijing Qunli Tiancheng Network Technology Company" },
+ { 0x2EEF, "Booz Allen Hamilton" },
+ { 0x2EF0, "Zhongshan Auxus Electronic Technology Co., Ltd." },
+ { 0x2EF1, "Tatvik Biosystems Private Limited" },
+ { 0x2EF2, "Shenzhen Goodwin Technology Co., Ltd." },
+ { 0x2FB2, "Fujitsu Limited" },
+ { 0x3176, "WHANAM ELECTRONICS CO., Ltd. MS division" },
+ { 0x3552, "BD Consumer Healthcare" },
+ { 0x3636, "INVIBRO" },
+ { 0x3884, "Nicolet Biomedical Inc., a Viasys Healthcare Co." },
+ { 0x3923, "National Instruments" },
+ { 0x4102, "iRiver" },
+ { 0x413C, "Dell Inc." },
+ { 0x4234, "Powervar Inc. (UPS Products)" },
+ { 0x4242, "USB Design By Example" },
+ { 0x4317, "Broadcom WLAN" },
+ { 0x4426, "TANITA Corporation" },
+ { 0x4745, "Beijing Tiertime Technology Co., Ltd." },
+ { 0x4791, "Western Digital, G-Tech" },
+ { 0x4909, "GE Healthcare Bio-Sciences AB" },
+ { 0x4971, "HITACHI GLOBAL STORAGE TECHNOLOGIES" },
+ { 0x4B53, "Key Soft Service" },
+ { 0x4C46, "DSPecialists GmbH" },
+ { 0x4DDC, "Data Device Corporation" },
+ { 0x5058, "ProXense, LLC" },
+ { 0x5245, "RESPIRONICS, INC." },
+ { 0x544D, "Transmeta Corporation" },
+ { 0x5543, "UC-Logic Technology Corp." },
+ { 0x5555, "Number Five, Software" },
+ { 0x55AA, "OnSpec Electronic Inc." },
+ { 0x5986, "BISON ELECTRONICS INC." },
+ { 0x6000, "TRIDENT MICROSYSTEMS (Far East) Ltd." },
+ { 0x630F, "Leapfrog Schoolhouse" },
+ { 0x636C, "CoreLogic, Inc." },
+ { 0x6400, "Springer Design, Inc." },
+ { 0x6A75, "Shanghai Jujo Electronics Co., Ltd." },
+ { 0x735F, "Beijing Techshino Technology Co., Ltd." },
+ { 0x8020, "Trinity, Inc." },
+ { 0x8086, "Intel Corporation" },
+ { 0x8087, "Intel" },
+ { 0x8829, "Beijing Daming Wuzhou Science & Technology Co., Ltd." },
+ { 0x8873, "Dengineer Co., Ltd." },
+ { 0x9696, "Digital Arts, Inc." },
+ { 0x9710, "Moschip Semiconductor Technology" },
+ { 0xA600, "ASIX s.r.o." },
+ { 0xA625, "Wuhan Tianyu Information Industry Co., Ltd." },
+ { 0xBEE5, "BEE SYSTEMS LLC" },
+ { 0xC0B8, "Corbett Life Science" },
+ { 0xC10C, "Given Imaging" },
+ { 0xCACE, "CACE Technologies" },
+ { 0xCC42, "Cardio Control NV" },
+ { 0xEA01, "Eagle Technology" },
+ { 0xEB1A, "Empia Technology, Inc." },
+ { 0xFF01, "DisplayPort (VESA)" },
+ { 0xFF02, "MHL, LLC" },
+ { 0xFF03, "MIPI Debug" },
+ { 0xFF04, "HDMI" },
+ { 0x0000, "Vendor ID not listed with USB.org" }
+};
+
+#endif /* __VNDRLIST_H__ */
+
diff --git a/tests/projects/winsdk/usbview/xmake.lua b/tests/projects/winsdk/usbview/xmake.lua new file mode 100644 index 000000000..5d5639429 --- /dev/null +++ b/tests/projects/winsdk/usbview/xmake.lua @@ -0,0 +1,13 @@ +-- add rules +add_rules("mode.debug", "mode.release") + +-- define target +target("usbview") + + -- windows application + add_rules("win.sdk.application") + + -- add files + add_files("*.c", "*.rc") + add_files("xmlhelper.cpp", {rule = "win.sdk.dotnet"}) + diff --git a/tests/projects/winsdk/usbview/xmlhelper.cpp b/tests/projects/winsdk/usbview/xmlhelper.cpp new file mode 100644 index 000000000..bac7d797b --- /dev/null +++ b/tests/projects/winsdk/usbview/xmlhelper.cpp @@ -0,0 +1,3235 @@ +/*++
+
+ Copyright (c) 1997-2011 Microsoft Corporation
+
+ Module Name:
+
+ XMLHELPER.CPP
+
+Abstract:
+
+This source file contains helper APIs for reading writing XML
+
+Environment:
+
+user mode
+
+Revision History:
+
+05-05-11 : created
+
+--*/
+
+/*****************************************************************************
+ I N C L U D E S
+ *****************************************************************************/
+#include "uvcview.h"
+#include "h264.h"
+#include "xmlhelper.h"
+
+// usbschema.hpp is autogenerated from schema during build PASS0
+#include "usbschema.hpp"
+
+// Include code analysis suppressions
+#include "codeanalysis.h"
+
+/*****************************************************************************
+ D E F I N E S
+ *****************************************************************************/
+#define COBJMACROS
+
+#define PACHAR_TO_STRING(X) ((X != NULL)? gcnew String(Marshal::PtrToStringAnsi((IntPtr) X )):nullptr)
+#define PWCHAR_TO_STRING(X) ((X != NULL)? gcnew String(Marshal::PtrToStringUni((IntPtr) X )):nullptr)
+
+#define MAX_STRING_DESCRIPTOR_LENGTH 512
+#define STRING_DESCRIPTOR_EN_LANGUAGE_ID 0x0409
+#define DEVICE_DESCRIPTOR_LENGTH 18
+
+#define SERVICE_EHCI "usbehci"
+#define SERVICE_XHCI "usbxhci"
+#define SERVICE_OHCI "usbohci"
+#define SERVICE_UHCI "usbuhci"
+
+#define USB_1_1 "USB 1.1"
+#define USB_2_0 "USB 2.0"
+#define USB_3_0 "USB 3.0"
+#define USB_GENERIC "USB GENERIC (UNKNOWN)"
+
+/*****************************************************************************
+ N A M E S P A C E S
+ *****************************************************************************/
+
+using namespace System;
+using namespace System::IO;
+using namespace System::Runtime::InteropServices;
+using namespace System::Collections;
+using namespace Microsoft::Kits::Samples::Usb;
+
+
+/*****************************************************************************
+ G L O B A L S
+ *****************************************************************************/
+
+namespace Microsoft
+{
+ namespace Kits
+ {
+ namespace Samples
+ {
+ namespace Usb
+ {
+ public ref class XmlGlobal sealed
+ {
+ private:
+ static XmlGlobal ^ pInstance = gcnew XmlGlobal();
+
+ // Empty private constructor
+ XmlGlobal()
+ {
+ }
+
+ public:
+ //
+ // Globals for XML view
+ //
+ property UvcViewAll ^ ViewAll;
+ property bool XmlViewInitialized;
+
+ //
+ // Stack of parents of a given node. This is used for finding
+ // where a given object should be added
+ //
+
+#if CODE_ANALYSIS
+ // ParentStack need not be constant since we will only have one instance of this object
+ [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")]
+#endif
+ static Stack ^ ParentStack = gcnew Stack();
+
+ static XmlGlobal ^ Instance()
+ {
+ return pInstance;
+ }
+ };
+ };
+ };
+ };
+};
+
+#define gXmlView ((XmlGlobal::Instance())->ViewAll->UvcView)
+#define gXmlViewInitialized ((XmlGlobal::Instance())->XmlViewInitialized)
+#define gXmlStack ((XmlGlobal::Instance())->ParentStack)
+
+/*****************************************************************************
+ D E C L A R A T I O N S
+ *****************************************************************************/
+
+String ^ XmlGetStringDescriptor(UCHAR index, PSTRING_DESCRIPTOR_NODE stringDesc, bool enOnly);
+void XmlAddHostControllerPowerMapping( UsbHCPowerStateMappingType ^xmlPwrInfo, PUSB_POWER_INFO usbHCPowerInfo);
+String ^ XmlGetDeviceClassString(UCHAR deviceClass);
+void XmlAddHostControllerPowerMapping(UsbHCPowerStateMappingType ^xmlPwrInfo, PUSB_POWER_INFO usbHCPowerInfo);
+void XmlAddHub30Descriptor(Hub30DescriptorType ^hub30Desc, PUSB_30_HUB_DESCRIPTOR hub30Descriptor);
+void XmlAddHubDescriptor(HubDescriptorType ^hubDesc, PUSB_HUB_DESCRIPTOR hubDescriptor);
+void XmlAddPortConnectorProps(PortConnectorType ^portXmlProps, PUSB_PORT_CONNECTOR_PROPERTIES portProps);
+void XmlAddHubCharacteristics(HubInformationType ^hubI, WORD hubChar);
+HRESULT XmlAddHubNodeInformation(HubNodeInformationType ^ni, PUSB_NODE_INFORMATION nodeInfo);
+HRESULT XmlAddHubInformationEx(HubInformationExType ^ex, PUSB_HUB_INFORMATION_EX hubInfoEx);
+HRESULT XmlAddHubCapabilitiesEx(HubCapabilitiesExType ^ex, USB_HUB_CAPABILITIES_EX hubCapEx);
+ExternalHubType ^ AddExternalHub(Object ^parent);
+NoDeviceType ^ AddDisconnectedPort(Object ^parent);
+UsbDeviceType ^ AddUsbDevice(Object ^parent);
+void XmlAddEndpointDescriptor(
+ EndpointDescriptorType ^usbXmlEndpointDescriptor,
+ PUSB_ENDPOINT_DESCRIPTOR endPointDescriptor,
+ UCHAR connectionSpeed);
+void XmlAddPipeInformation(
+ array< UsbPipeInfoType ^> ^ usbXmlPipeInfoList,
+ PUSB_PIPE_INFO pipeInfo,
+ ULONG numPipes,
+ UCHAR connectionSpeed);
+void XmlAddUsbDeviceDescriptor(
+ UsbDeviceDescriptorType ^usbXmlDeviceDescriptor,
+ PUSB_DEVICE_DESCRIPTOR usbDeviceDescriptor);
+void XmlAddConfigurationDescriptor(
+ UsbConfigurationDescriptorType ^ confXmlDesc,
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc);
+void XmlAddDeviceQualDescriptor(
+ UsbDeviceQualifierDescriptorType ^ qualXmlDesc,
+ PUSB_DEVICE_QUALIFIER_DESCRIPTOR qualDesc);
+void XmlAddDeviceConfiguration(
+ UsbDeviceConfigurationType ^ confXmlDesc,
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ int numInterfaces);
+void XmlAddConnectionInfoSt(
+ NodeConnectionInfoExStructType ^xmlConnectionInfoSt,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PDEVICE_INFO_NODE pNode);
+String ^ XmlGetLangIdString(UCHAR index, PSTRING_DESCRIPTOR_NODE stringDesc);
+String ^ XmlGetStringDescriptor(UCHAR index, PSTRING_DESCRIPTOR_NODE stringDesc, bool enOnly);
+String ^ XmlGetDeviceClassString(UCHAR deviceClass);
+bool XmlAddDeviceClassDetails(
+ UsbDeviceClassDetailsType ^ deviceDetails,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PUSBDEVICEINFO deviceInfo);
+void XmlAddConnectionInfo(
+ NodeConnectionInfoExType ^xmlConnectionInfo,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PUSBDEVICEINFO deviceInfo,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ PDEVICE_INFO_NODE pNode);
+void XmlAddHidDescriptor(
+ UsbDeviceHidDescriptorType ^ hidXmlDesc,
+ PUSB_HID_DESCRIPTOR hidDesc);
+void XmlAddDeviceInterfaceDescriptor(
+ UsbDeviceInterfaceDescriptorType ^ ifXmlDesc,
+ PUSB_INTERFACE_DESCRIPTOR ifDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc);
+void XmlAddOTGDescriptor(
+ UsbDeviceOTGDescriptorType ^ otgXmlDesc,
+ PUSB_OTG_DESCRIPTOR otgDesc);
+void XmlAddIADDescriptor(
+ UsbDeviceIADDescriptorType ^ iadXmlDesc,
+ PUSB_IAD_DESCRIPTOR iadDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ int nInterfaces);
+array < UsbDeviceConfigurationType ^> ^ XmlGetConfigDescriptors(
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDescs,
+ PSTRING_DESCRIPTOR_NODE stringDesc);
+UsbBosDescriptorType ^ XmlGetBosDescriptor(
+ PUSB_BOS_DESCRIPTOR bosDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ );
+UsbDeviceClassType ^ XmlGetDeviceClass(UCHAR deviceClass, UCHAR deviceSubClass, UCHAR deviceProtocol);
+UsbDeviceUnknownDescriptorType ^ XmlGetUnknownDescriptor(
+ PUSB_COMMON_DESCRIPTOR unknownDesc
+ );
+UsbUsb20ExtensionDescriptorType ^ XmlGetUsb20CapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR capDesc
+ );
+UsbSuperSpeedExtensionDescriptorType ^ XmlGetSuperSpeedCapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR capDesc
+ );
+UsbDispContIdCapExtDescriptorType ^ XmlGetContainerIdCapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR capDesc
+ );
+UsbBillboardCapabilityDescriptorType ^ XmlGetBillboardCapabilityDescriptor(
+ PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR capDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ );
+
+/*****************************************************************************
+ D E F I N I T I O N S
+ *****************************************************************************/
+
+/*****************************************************************************
+ XmlNotifyEndOfNodeList
+
+ This function is called back by WalkTreeTopDown() function to notify us
+ that there are no more children to add for the current parent
+
+ *****************************************************************************/
+VOID XmlNotifyEndOfNodeList(PVOID pContext)
+{
+ UNREFERENCED_PARAMETER(pContext);
+
+ if (gXmlStack != nullptr && gXmlStack->Count > 0)
+ {
+ // Remove the last parent on the stack
+ gXmlStack->Pop();
+ }
+}
+
+/*****************************************************************************
+
+ XmlAddHostControllerPowerMapping()
+
+ add power info to xml structure
+ *****************************************************************************/
+void XmlAddHostControllerPowerMapping(UsbHCPowerStateMappingType ^xmlPwrInfo, PUSB_POWER_INFO usbHCPowerInfo)
+{
+ int i, powerState;
+ PUSB_POWER_INFO pUPI = usbHCPowerInfo;
+ UsbHCPowerStateType ^ pwrState = nullptr;
+
+ xmlPwrInfo->PowerMap = gcnew array<UsbHCPowerStateType ^> (WdmUsbPowerSystemShutdown);
+
+ for(i = 0, powerState = WdmUsbPowerSystemWorking; powerState < WdmUsbPowerSystemShutdown; i++, powerState++, pUPI++)
+ {
+ xmlPwrInfo->PowerMap[i] = gcnew UsbHCPowerStateType();
+ pwrState = xmlPwrInfo->PowerMap[i];
+ pwrState->SystemState = PACHAR_TO_STRING(GetPowerStateString(pUPI->SystemState));
+ pwrState->HostControllerState = PACHAR_TO_STRING(GetPowerStateString(pUPI->HcDevicePowerState));
+ pwrState->HubState = PACHAR_TO_STRING(GetPowerStateString(pUPI->RhDevicePowerState));
+ pwrState->CanWakeUp = pUPI->CanWakeup? true:false;
+ pwrState->IsPowered = pUPI->IsPowered? true:false;
+ }
+
+ xmlPwrInfo->LastSleepState = PACHAR_TO_STRING(GetPowerStateString(pUPI->LastSystemSleepState));
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddHostController()
+
+ Add an host controller to XML view
+ *****************************************************************************/
+
+HRESULT XmlAddHostController(PSTR hcName, PUSBHOSTCONTROLLERINFO hcInfo)
+{
+ HRESULT hr = S_OK;
+
+ UNREFERENCED_PARAMETER(hcName);
+
+ HostControllerType ^ hc = nullptr;
+ //
+ // Check if the USB Tree array has been initialized
+ // It would have been great if XSD had a way of generating a list instead of array, but it does not
+ // So we have to do array.Resize everytime
+ //
+ if (gXmlView->UsbTree == nullptr)
+ {
+ // This is the first time we are being called, initialize the array with 1 element
+ gXmlView->UsbTree = gcnew array<HostControllerType ^>(1);
+ gXmlView->UsbTree[0] = gcnew HostControllerType();
+ hc = gXmlView->UsbTree[0];
+ }
+ else
+ {
+ // Create a new array every time as Array.Resize does not seem to work in our case (CLI)
+ // We do this using ArrayList.
+ ArrayList ^hcList = gcnew ArrayList;
+ hcList->AddRange(gXmlView->UsbTree);
+ hc = gcnew HostControllerType();
+ hcList->Add(hc);
+ gXmlView->UsbTree = reinterpret_cast<array<HostControllerType ^>^> (hcList->ToArray(HostControllerType::typeid));
+ }
+
+ if (hc != nullptr)
+ {
+ ULONG debugPort = 0;
+
+ UsbHCDeviceInfoType ^ ci = nullptr;
+ UsbHCPowerStateMappingType ^ pm = nullptr;
+
+ if (NULL != hcInfo->UsbDeviceProperties)
+ {
+ hc->HwId = PACHAR_TO_STRING(hcInfo->UsbDeviceProperties->HwId);
+ hc->DeviceId = PACHAR_TO_STRING(hcInfo->UsbDeviceProperties->DeviceId);
+ hc->ServiceName = PACHAR_TO_STRING(hcInfo->UsbDeviceProperties->Service);
+ hc->DeviceName = PACHAR_TO_STRING(hcInfo->UsbDeviceProperties->DeviceDesc);
+ hc->DeviceClass = PACHAR_TO_STRING(hcInfo->UsbDeviceProperties->DeviceClass);
+
+ bool foundUsbProtocol = false;
+ if (hcInfo->UsbDeviceProperties->Service != NULL)
+ {
+ foundUsbProtocol = true;
+
+ if (_stricmp(hcInfo->UsbDeviceProperties->Service, SERVICE_OHCI) == 0)
+ {
+ hc->UsbProtocol = gcnew String(USB_1_1);
+ }
+ else if(_stricmp(hcInfo->UsbDeviceProperties->Service, SERVICE_EHCI) == 0 ||
+ _stricmp(hcInfo->UsbDeviceProperties->Service, SERVICE_UHCI) == 0)
+ {
+ hc->UsbProtocol = gcnew String(USB_2_0);
+ }
+ else if (_stricmp(hcInfo->UsbDeviceProperties->Service, SERVICE_XHCI) == 0)
+ {
+ hc->UsbProtocol = gcnew String(USB_3_0);
+ }
+ else
+ {
+ foundUsbProtocol = false;
+ }
+ }
+
+ if (!foundUsbProtocol)
+ {
+ // If protocol lookup failed based on service name, try Controller flavor
+ if(NULL != hcInfo->ControllerInfo)
+ {
+ USB_CONTROLLER_FLAVOR flavor = hcInfo->ControllerInfo->ControllerFlavor;
+
+ if(flavor == USB_HcGeneric)
+ {
+ hc->UsbProtocol = gcnew String(USB_GENERIC);
+ }
+ else if(flavor >= OHCI_Generic && flavor < UHCI_Generic)
+ {
+ hc->UsbProtocol = gcnew String(USB_1_1);
+ }
+ else if(flavor >= UHCI_Generic && flavor <= EHCI_Generic)
+ {
+ hc->UsbProtocol = gcnew String(USB_2_0);
+ }
+ else if(flavor > EHCI_Generic)
+ {
+ hc->UsbProtocol = gcnew String(USB_3_0);
+ }
+ }
+ }
+ }
+
+ hc->ControllerInfo = gcnew UsbHCDeviceInfoType();
+ hc->PowerMapping = gcnew UsbHCPowerStateMappingType();
+ ci = hc->ControllerInfo;
+ pm = hc->PowerMapping;
+
+ ci->VendorId = hcInfo->VendorID;
+ ci->DeviceId = hcInfo->DeviceID;
+ ci->DriverKey = PACHAR_TO_STRING(hcInfo->DriverKey);
+ ci->SubSysId = hcInfo->SubSysID;
+ ci->Revision = hcInfo->Revision;
+
+ if(NULL != hcInfo->ControllerInfo)
+ {
+ ci->NumberOfRootPorts = hcInfo->ControllerInfo->NumberOfRootPorts;
+ ci->ControllerFlavor = hcInfo->ControllerInfo->ControllerFlavor;
+ ci->PortSwitchingEnabled = (hcInfo->ControllerInfo->HcFeatureFlags & USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING)? true: false;
+ ci->SelectiveSuspendEnabled = (hcInfo->ControllerInfo->HcFeatureFlags & USB_HC_FEATURE_FLAG_SEL_SUSPEND)? true: false;
+ ci->LegacyBios = (hcInfo->ControllerInfo->HcFeatureFlags & USB_HC_FEATURE_LEGACY_BIOS)? true: false;
+ ci->ControllerFlavorString = PACHAR_TO_STRING(GetControllerFlavorString(hcInfo->ControllerInfo->ControllerFlavor));
+ }
+
+ // Add power mappings
+ XmlAddHostControllerPowerMapping(pm, (PUSB_POWER_INFO) (&(hcInfo->USBPowerInfo[0])));
+
+ // Add debug port
+ debugPort = GetEhciDebugPort(hcInfo->VendorID, hcInfo->DeviceID);
+ if (debugPort > 0)
+ {
+ ci->DebugPort = debugPort;
+ }
+
+ gXmlStack->Push(hc);
+
+ }
+ else
+ {
+ hr = E_FAIL;
+ }
+
+ return hr;
+}
+
+/*****************************************************************************
+
+ XmlAddHub30Descriptor()
+
+ Adds the hub 3.0 descriptor to the given hub object
+ *****************************************************************************/
+void XmlAddHub30Descriptor(Hub30DescriptorType ^hub30Desc, PUSB_30_HUB_DESCRIPTOR hub30Descriptor)
+{
+
+ if (nullptr != hub30Desc && NULL != hub30Descriptor)
+ {
+ hub30Desc->Length = hub30Descriptor->bLength;
+ hub30Desc->DescriptorType = hub30Descriptor->bDescriptorType;
+ hub30Desc->NumberOfPorts = hub30Descriptor->bNumberOfPorts;
+ hub30Desc->HubCharacteristics = hub30Descriptor->wHubCharacteristics;
+ hub30Desc->PowerOntoPowerGood = hub30Descriptor->bPowerOnToPowerGood;
+ hub30Desc->HubControlCurrent = hub30Descriptor->bHubControlCurrent;
+ hub30Desc->HubHdrDecLat = hub30Descriptor->bHubHdrDecLat;
+ hub30Desc->DeviceRemovable = hub30Descriptor->DeviceRemovable;
+ }
+}
+
+/*****************************************************************************
+
+ XmlAddHubDescriptor()
+
+ Adds the hub descriptor to the given hub object
+ *****************************************************************************/
+void XmlAddHubDescriptor(HubDescriptorType ^hubDesc, PUSB_HUB_DESCRIPTOR hubDescriptor)
+{
+ if (nullptr != hubDesc && NULL != hubDescriptor)
+ {
+ hubDesc->DescriptorLength = hubDescriptor->bDescriptorLength;
+ hubDesc->DescriptorType = hubDescriptor->bDescriptorType;
+ hubDesc->NumberOfPorts = hubDescriptor->bNumberOfPorts;
+ hubDesc->PowerOntoPowerGood = hubDescriptor->bPowerOnToPowerGood;
+ hubDesc->HubControlCurrent = hubDescriptor->bHubControlCurrent;
+ }
+}
+
+/*****************************************************************************
+
+ XmlAddPortConnectorProps()
+
+ Adds the port connector properties to XML file
+ *****************************************************************************/
+void XmlAddPortConnectorProps(PortConnectorType ^portXmlProps, PUSB_PORT_CONNECTOR_PROPERTIES portProps)
+{
+ if (NULL != portProps)
+ {
+ portXmlProps->UsbPortProperties = gcnew UsbPortPropertiesType();
+
+ portXmlProps->ConnectionIndex = portProps->ConnectionIndex;
+ portXmlProps->ActualLength = portProps->ActualLength;
+ portXmlProps->CompanionIndex = portProps->CompanionIndex;
+ portXmlProps->CompanionPortNumber = portProps->CompanionPortNumber;
+ portXmlProps->CompanionHubSymbolicLinkName = PWCHAR_TO_STRING(portProps->CompanionHubSymbolicLinkName);
+
+ portXmlProps->UsbPortProperties->PortIsUserConnectable = portProps->UsbPortProperties.PortIsUserConnectable? true:false;
+ portXmlProps->UsbPortProperties->PortIsDebugCapable = portProps->UsbPortProperties.PortIsDebugCapable? true:false;
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddConnectionInfoV2()
+
+ Adds the V2 connection info structure
+ *****************************************************************************/
+void XmlAddConnectionInfoV2(NodeConnectionInfoExV2Type ^ connectionXmlInfo, PUSB_NODE_CONNECTION_INFORMATION_EX_V2 connectionInfo)
+{
+ if (NULL != connectionInfo)
+ {
+ connectionXmlInfo->ConnectionIndex = connectionInfo->ConnectionIndex;
+ connectionXmlInfo->Length = connectionInfo->Length;
+
+ connectionXmlInfo->Usb110Supported = connectionInfo->SupportedUsbProtocols.Usb110? true:false;
+ connectionXmlInfo->Usb200Supported = connectionInfo->SupportedUsbProtocols.Usb200? true:false;
+ connectionXmlInfo->Usb300Supported = connectionInfo->SupportedUsbProtocols.Usb300? true:false;
+
+ connectionXmlInfo->DeviceIsOperatingAtSuperSpeedOrHigher =
+ connectionInfo->Flags.DeviceIsOperatingAtSuperSpeedOrHigher;
+
+ connectionXmlInfo->DeviceIsSuperSpeedCapableOrHigher =
+ connectionInfo->Flags.DeviceIsSuperSpeedCapableOrHigher;
+
+ connectionXmlInfo->DeviceIsOperatingAtSuperSpeedPlusOrHigher =
+ connectionInfo->Flags.DeviceIsOperatingAtSuperSpeedPlusOrHigher;
+
+ connectionXmlInfo->DeviceIsSuperSpeedPlusCapableOrHigher =
+ connectionInfo->Flags.DeviceIsSuperSpeedPlusCapableOrHigher;
+
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddHubCharacteristics()
+
+ Adds the hub characteristics to the given hub object
+ *****************************************************************************/
+void XmlAddHubCharacteristics(HubInformationType ^hubI, WORD hubChar)
+{
+ HubCharacteristicsType ^hubC = nullptr;
+
+ hubI->HubCharacteristics = gcnew HubCharacteristicsType();
+ hubC = hubI->HubCharacteristics;
+ hubC->HubCharacteristicsValue = hubChar;
+ switch(hubChar & 0x3)
+ {
+ case 0x0:
+ hubC->PowerSwitching = gcnew String("Ganged");
+ break;
+ case 0x1:
+ hubC->PowerSwitching = gcnew String("Individual");
+ break;
+ case 0x2:
+ case 0x3:
+ hubC->PowerSwitching = gcnew String("None");
+ break;
+ default:
+ hubC->PowerSwitching = gcnew String("Unknown");
+ }
+
+ hubC->CompoundDevice = (hubChar & 0x4)? true:false;
+
+ switch(hubChar & 0x18)
+ {
+ case 0x0:
+ hubC->OverCurrentProtection = gcnew String("Global");
+ break;
+ case 0x8:
+ hubC->OverCurrentProtection = gcnew String("Individual");
+ break;
+ case 0x10:
+ case 0x18:
+ hubC->OverCurrentProtection = gcnew String("No protection, bus power only");
+ break;
+ default:
+ hubC->OverCurrentProtection = gcnew String("Unknown");
+ }
+}
+
+/*****************************************************************************
+
+ XmlAddHubNodeInformation()
+
+ Adds the node information to the hub object
+ *****************************************************************************/
+HRESULT XmlAddHubNodeInformation(HubNodeInformationType ^ni, PUSB_NODE_INFORMATION nodeInfo)
+{
+ PUSB_HUB_INFORMATION hubInfo = NULL;
+
+ if (NULL == nodeInfo)
+ {
+ return E_FAIL;
+ }
+
+ hubInfo = &(nodeInfo->u.HubInformation);
+ ni->HubNode = static_cast<HubNodeType> (nodeInfo->NodeType);
+
+ ni->HubInformation = gcnew HubInformationType();
+ ni->HubInformation->IsRootHub = true;
+ ni->HubInformation->IsBusPowered = hubInfo->HubIsBusPowered? true:false;
+
+ // Add hub characteristics
+ XmlAddHubCharacteristics(ni->HubInformation, hubInfo->HubDescriptor.wHubCharacteristics);
+ // Add descriptor
+ ni->HubInformation->HubDescriptor = gcnew HubDescriptorType();
+ XmlAddHubDescriptor(ni->HubInformation->HubDescriptor, &(hubInfo->HubDescriptor));
+
+ return S_OK;
+}
+
+/*****************************************************************************
+
+ XmlAddHubInformation()
+
+ Adds the node information to the hub object
+ *****************************************************************************/
+HRESULT XmlAddHubInformationEx(HubInformationExType ^ex, PUSB_HUB_INFORMATION_EX hubInfoEx)
+{
+ HubDescriptorType ^hubDesc = nullptr;
+ Hub30DescriptorType ^hub30Desc = nullptr;
+
+ if (NULL == hubInfoEx)
+ {
+ return E_FAIL;
+ }
+
+ ex->HubType = static_cast<HubTypeType> (hubInfoEx->HubType);
+ ex->HighestPortNumber = hubInfoEx->HighestPortNumber;
+ switch(hubInfoEx->HubType)
+ {
+ case UsbRootHub:
+ case Usb20Hub:
+ ex->HubDescriptor = hubDesc = gcnew HubDescriptorType();
+ XmlAddHubDescriptor(hubDesc, &(hubInfoEx->u.UsbHubDescriptor));
+ break;
+ case Usb30Hub:
+ ex->Hub30Descriptor = hub30Desc = gcnew Hub30DescriptorType();
+ XmlAddHub30Descriptor(hub30Desc, &(hubInfoEx->u.Usb30HubDescriptor));
+ break;
+ }
+ return S_OK;
+}
+
+/*****************************************************************************
+
+ XmlAddHubCapabilitiesEx()
+
+ Adds the hub capabilities information to the hub object
+ *****************************************************************************/
+HRESULT XmlAddHubCapabilitiesEx(HubCapabilitiesExType ^ex, PUSB_HUB_CAPABILITIES_EX hubCapEx)
+{
+ if(NULL != hubCapEx)
+ {
+ ex->HubIsHighSpeedCapable = hubCapEx->CapabilityFlags.HubIsHighSpeedCapable?true:false;
+ ex->HubIsHighSpeed = hubCapEx->CapabilityFlags.HubIsHighSpeed?true:false;
+ ex->HubIsMultiTtCapable = hubCapEx->CapabilityFlags.HubIsMultiTtCapable?true:false;
+ ex->HubIsMultiTt = hubCapEx->CapabilityFlags.HubIsMultiTt?true:false;
+ ex->HubIsRoot = hubCapEx->CapabilityFlags.HubIsRoot?true:false;
+ ex->HubIsArmedWakeOnConnect = hubCapEx->CapabilityFlags.HubIsArmedWakeOnConnect?true:false;
+ ex->HubIsBusPowered = hubCapEx->CapabilityFlags.HubIsBusPowered?true:false;
+ }
+ return S_OK;
+}
+
+/*****************************************************************************
+
+ ExternalHubType ^ AddExternalHub(Object ^parent)
+
+ This routine finds the type of the parent and adds an external hub object to the
+ parent's list of external hubs. The newly created object is returned
+ We are using arrays insted of better types of collections becaused the code generated
+ by xsd.exe does not support other types.
+ *****************************************************************************/
+ExternalHubType ^ AddExternalHub(Object ^parent)
+{
+ RootHubType ^ rhParent = nullptr;
+ ExternalHubType ^ ehParent = nullptr;
+ array<ExternalHubType ^> ^ exHubArray = nullptr;
+ ExternalHubType ^ exHub = nullptr;
+ boolean arrayCreated = false;
+
+ // An external hub can be connected to a Root Hub or another External Hub
+ // We need to determine the type of the object.
+
+ // Try root hub first
+
+ rhParent = dynamic_cast<RootHubType ^> (parent);
+ if (rhParent == nullptr)
+ {
+ // RootHub cast was not successfult, try external hub
+ ehParent = dynamic_cast<ExternalHubType ^> (parent);
+ if (ehParent != nullptr)
+ {
+ // External hub parent
+ if (ehParent->ExternalHub == nullptr)
+ {
+ // First hub in the list of external hubs
+ ehParent->ExternalHub = gcnew array<ExternalHubType ^> (1);
+ arrayCreated = true;
+ }
+ exHubArray = ehParent->ExternalHub;
+ }
+
+ }
+ else
+ {
+ // Parent is a root hub
+ if (rhParent->ExternalHub == nullptr)
+ {
+ // First hub in root hub list
+ rhParent->ExternalHub = gcnew array<ExternalHubType ^>(1);
+ arrayCreated = true;
+ }
+ exHubArray = rhParent->ExternalHub;
+ }
+
+ if (exHubArray != nullptr)
+ {
+ if (arrayCreated)
+ {
+ // We created the array in this function, so we use offset 0
+ exHubArray[0] = gcnew ExternalHubType();
+ exHub = exHubArray[0];
+ }
+ else
+ {
+ // The array was already present, we need to do elaborate things
+ // as array.resize does not work.
+ ArrayList ^exList = gcnew ArrayList();
+ exList->AddRange(exHubArray);
+ exHub = gcnew ExternalHubType();
+ exList->Add(exHub);
+
+ if (rhParent != nullptr)
+ {
+ rhParent->ExternalHub = reinterpret_cast<array<ExternalHubType ^>^> (exList->ToArray(ExternalHubType::typeid));
+ }
+ else
+ {
+ ehParent->ExternalHub = reinterpret_cast<array<ExternalHubType ^>^> (exList->ToArray(ExternalHubType::typeid));
+ }
+ }
+ }
+ return exHub;
+}
+/*****************************************************************************
+
+ NoDeviceType ^ AddDisconnectedPort(Object ^parent)
+
+ This routine finds the type of the parent and adds a empty port connection object to the
+ parent's list of devices. The newly created object is returned
+ We are using arrays insted of better types of collections becaused the code generated
+ by xsd.exe does not support other types.
+ *****************************************************************************/
+NoDeviceType ^ AddDisconnectedPort(Object ^parent)
+{
+ RootHubType ^ rhParent = nullptr;
+ ExternalHubType ^ ehParent = nullptr;
+ array<NoDeviceType ^> ^ devicesArray = nullptr;
+ NoDeviceType ^ noD = nullptr;
+ boolean arrayCreated = false;
+
+ // An external hub can be connected to a Root Hub or another External Hub
+ // We need to determine the type of the object.
+
+ // Try RH first
+
+ rhParent = dynamic_cast<RootHubType ^> (parent);
+ if (rhParent == nullptr)
+ {
+ // RootHub cast was not successfult, try external hub
+ ehParent = dynamic_cast<ExternalHubType ^> (parent);
+ if (ehParent != nullptr)
+ {
+ // External hub parent
+ if (ehParent->NoDevice == nullptr)
+ {
+ // First hub in the list of external hubs
+ ehParent->NoDevice = gcnew array<NoDeviceType ^> (1);
+ arrayCreated = true;
+ }
+ devicesArray = ehParent->NoDevice;
+ }
+
+ }
+ else
+ {
+ // Parent is a root hub
+ if (rhParent->NoDevice == nullptr)
+ {
+ // First hub in root hub list
+ rhParent->NoDevice = gcnew array<NoDeviceType ^>(1);
+ arrayCreated = true;
+ }
+ devicesArray = rhParent->NoDevice;
+ }
+
+ if (devicesArray != nullptr)
+ {
+ if (arrayCreated)
+ {
+ // We created the array in this function, so we use offset 0
+ devicesArray[0] = gcnew NoDeviceType();
+ noD = devicesArray[0];
+ }
+ else
+ {
+ // The array was already present, we need to do elaborate things
+ // as array.resize does not work.
+ ArrayList ^exList = gcnew ArrayList();
+ exList->AddRange(devicesArray);
+ noD = gcnew NoDeviceType();
+ exList->Add(noD);
+
+ if (rhParent != nullptr)
+ {
+ rhParent->NoDevice = reinterpret_cast<array<NoDeviceType ^>^> (exList->ToArray(NoDeviceType::typeid));
+ }
+ else
+ {
+ ehParent->NoDevice = reinterpret_cast<array<NoDeviceType ^>^> (exList->ToArray(NoDeviceType::typeid));
+ }
+ }
+ }
+ return noD;
+}
+
+/*****************************************************************************
+
+ UsbDeviceType ^ AddUsbDevice(Object ^parent)
+
+ This routine finds the type of the parent and adds a port connection object to the
+ parent's list of port connectors. The newly created object is returned
+ We are using arrays insted of better types of collections becaused the code generated
+ by xsd.exe does not support other types.
+ *****************************************************************************/
+UsbDeviceType ^ AddUsbDevice(Object ^parent)
+{
+ RootHubType ^ rhParent = nullptr;
+ ExternalHubType ^ ehParent = nullptr;
+ array<UsbDeviceType ^> ^ devicesArray = nullptr;
+ UsbDeviceType ^ usbD = nullptr;
+ boolean arrayCreated = false;
+
+ // An external hub can be connected to a Root Hub or another External Hub
+ // We need to determine the type of the object.
+
+ // Try RH first
+
+ rhParent = dynamic_cast<RootHubType ^> (parent);
+ if (rhParent == nullptr)
+ {
+ // RootHub cast was not successfult, try external hub
+ ehParent = dynamic_cast<ExternalHubType ^> (parent);
+ if (ehParent != nullptr)
+ {
+ // External hub parent
+ if (ehParent->UsbDevice == nullptr)
+ {
+ // First hub in the list of external hubs
+ ehParent->UsbDevice = gcnew array<UsbDeviceType ^> (1);
+ arrayCreated = true;
+ }
+ devicesArray = ehParent->UsbDevice;
+ }
+
+ }
+ else
+ {
+ // Parent is a root hub
+ if (rhParent->UsbDevice == nullptr)
+ {
+ // First hub in root hub list
+ rhParent->UsbDevice = gcnew array<UsbDeviceType ^>(1);
+ arrayCreated = true;
+ }
+ devicesArray = rhParent->UsbDevice;
+ }
+
+ if (devicesArray != nullptr)
+ {
+ if (arrayCreated)
+ {
+ // We created the array in this function, so we use offset 0
+ devicesArray[0] = gcnew UsbDeviceType();
+ usbD = devicesArray[0];
+ }
+ else
+ {
+ // The array was already present, we need to do elaborate things
+ // as array.resize does not work.
+ ArrayList ^exList = gcnew ArrayList();
+ exList->AddRange(devicesArray);
+ usbD = gcnew UsbDeviceType();
+ exList->Add(usbD);
+
+ if (rhParent != nullptr)
+ {
+ rhParent->UsbDevice = reinterpret_cast<array<UsbDeviceType ^>^> (exList->ToArray(UsbDeviceType::typeid));
+ }
+ else
+ {
+ ehParent->UsbDevice = reinterpret_cast<array<UsbDeviceType ^>^> (exList->ToArray(UsbDeviceType::typeid));
+ }
+ }
+ }
+ return usbD;
+}
+
+/*****************************************************************************
+
+ XmlAddIADDescriptor()
+
+ This routine adds usb IAD descriptor
+ *****************************************************************************/
+void XmlAddIADDescriptor(
+ UsbDeviceIADDescriptorType ^ iadXmlDesc,
+ PUSB_IAD_DESCRIPTOR iadDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ int nInterfaces)
+{
+ if (NULL == iadDesc || NULL == stringDesc)
+ {
+ return;
+ }
+
+ // Update structure fields
+ iadXmlDesc->BLength = iadDesc->bLength;
+ iadXmlDesc->BDescriptorType = iadDesc->bDescriptorType;
+ iadXmlDesc->BFirstInterface = iadDesc->bFirstInterface;
+ iadXmlDesc->BInterfaceCount = iadDesc->bInterfaceCount;
+ iadXmlDesc->BFunctionClass = iadDesc->bFunctionClass;
+ iadXmlDesc->BFunctionSubclass = iadDesc->bFunctionSubClass;
+ iadXmlDesc->BFunctionProtocol = iadDesc->bFunctionProtocol;
+ iadXmlDesc->IFunction = iadDesc->iFunction;
+
+ // Validate fields
+ if (iadDesc->bInterfaceCount == 1)
+ {
+ iadXmlDesc->InterfaceError = gcnew String("ERROR: bInterfaceCount must be greater than 1");
+ }
+ if (nInterfaces < iadDesc->bFirstInterface + iadDesc->bInterfaceCount)
+ {
+ iadXmlDesc->InterfaceError = gcnew String("ERROR: The total number of interfaces");
+ iadXmlDesc->InterfaceError += nInterfaces;
+ iadXmlDesc->InterfaceError += " must be greater than or equal to the highest linked interface number (base ";
+ iadXmlDesc->InterfaceError += iadDesc->bFirstInterface;
+ iadXmlDesc->InterfaceError += " + count ";
+ iadXmlDesc->InterfaceError += iadDesc->bInterfaceCount;
+ iadXmlDesc->InterfaceError += " = ";
+ iadXmlDesc->InterfaceError += (iadDesc->bFirstInterface + iadDesc->bInterfaceCount);
+ iadXmlDesc->InterfaceError += " )";
+ }
+ if (iadDesc->bFunctionClass == 0)
+ {
+ iadXmlDesc->FunctionClassError = gcnew String("ERROR: bFunctionClass contains an illegal value 0");
+ }
+
+ iadXmlDesc->FunctionDetails = XmlGetDeviceClass(
+ iadDesc->bFunctionClass,
+ iadDesc->bFunctionSubClass,
+ iadDesc->bFunctionProtocol);
+
+ // Protocol check
+ if (iadDesc->bFunctionClass == USB_DEVICE_CLASS_VIDEO)
+ {
+ if (iadDesc->bFunctionProtocol != PC_PROTOCOL_UNDEFINED)
+ {
+ iadXmlDesc->Protocol= gcnew String("WARNING: Protocol must be set to PC_PROTOCOL_UNDEFINED");
+ iadXmlDesc->Protocol+= " for this class but is set to: ";
+ iadXmlDesc->Protocol+= iadDesc->bFunctionProtocol;
+ }
+ else
+ {
+ iadXmlDesc->Protocol = gcnew String("PC_PROTOCOL_UNDEFINED protocol");
+ }
+ }
+
+ if (iadDesc->iFunction)
+ {
+ // Add String descriptor
+ iadXmlDesc->StringDesc = XmlGetStringDescriptor(
+ iadDesc->iFunction,
+ stringDesc,
+ false);
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddOTGDescriptor()
+
+ This routine adds usb OTG descriptor
+ *****************************************************************************/
+void XmlAddOTGDescriptor(
+ UsbDeviceOTGDescriptorType ^ otgXmlDesc,
+ PUSB_OTG_DESCRIPTOR otgDesc)
+{
+ if (NULL == otgDesc)
+ {
+ return;
+ }
+
+ otgXmlDesc->BLength = otgDesc->bLength;
+ otgXmlDesc->BDescriptorType = otgDesc->bDescriptorType;
+ otgXmlDesc->BmAttributes = otgDesc->bmAttributes;
+
+ // Add descriptive fields
+ switch (otgDesc->bmAttributes)
+ {
+ case 0:
+ break;
+ case 1:
+ otgXmlDesc->AttributesString = gcnew String("SRP support");
+ break;
+ case 2:
+ otgXmlDesc->AttributesString = gcnew String("HNP support");
+ break;
+ case 3:
+ otgXmlDesc->AttributesString = gcnew String("SRP and HNP support");
+ break;
+ default:
+ otgXmlDesc->AttributesString = gcnew String("ERROR: bmAttributes bits 2-7 are reserved should be 0)");
+ break;
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddHidDescriptor()
+
+ This routine adds usb HID descriptor
+ *****************************************************************************/
+void XmlAddHidDescriptor(
+ UsbDeviceHidDescriptorType ^ hidXmlDesc,
+ PUSB_HID_DESCRIPTOR hidDesc
+ )
+{
+ int i = 0;
+
+ if (NULL == hidDesc)
+ {
+ return;
+ }
+
+ hidXmlDesc->BLength = hidDesc->bLength;
+ hidXmlDesc->BDescriptorType = hidDesc->bDescriptorType;
+ hidXmlDesc->BcdHID = hidDesc->bcdHID;
+ hidXmlDesc->BCountryCode = hidDesc->bCountryCode;
+ hidXmlDesc->BNumDescriptors = hidDesc->bNumDescriptors;
+
+ // Add optional descriptors
+ if (hidDesc->bNumDescriptors > 0)
+ {
+ hidXmlDesc->OptionalDescriptor = gcnew array <UsbDeviceHidOptionalDescriptorsType ^>(hidDesc->bNumDescriptors);
+ for(i=0; i < hidDesc->bNumDescriptors; i++)
+ {
+ hidXmlDesc->OptionalDescriptor[i] = gcnew UsbDeviceHidOptionalDescriptorsType();
+ hidXmlDesc->OptionalDescriptor[i]->BDescriptorType = hidDesc->OptionalDescriptors[i].bDescriptorType;
+ hidXmlDesc->OptionalDescriptor[i]->WDescriptorLength = hidDesc->OptionalDescriptors[i].wDescriptorLength;
+ }
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlGetUnknownDescriptor()
+
+ This routine gets a usb unknown descriptor object form unknown descriptor
+ *****************************************************************************/
+UsbDeviceUnknownDescriptorType ^ XmlGetUnknownDescriptor(
+ PUSB_COMMON_DESCRIPTOR unknownDesc
+ )
+{
+ int i = 0;
+ UsbDeviceUnknownDescriptorType ^ unknownXmlDesc = nullptr;
+
+ if (NULL == unknownDesc)
+ {
+ return nullptr;
+ }
+
+ unknownXmlDesc = gcnew UsbDeviceUnknownDescriptorType();
+ unknownXmlDesc->BLength = unknownDesc->bLength;
+ unknownXmlDesc->BDescriptorType = unknownDesc->bDescriptorType;
+
+ // Add optional descriptors
+ if (unknownDesc->bLength > 0)
+ {
+ unknownXmlDesc->UnknownDescriptor = gcnew String("Unknown descriptor->");
+ for(i=0; i < unknownDesc->bLength; i++)
+ {
+ unknownXmlDesc->UnknownDescriptor += String::Format("0x{0:X} ", ((PUCHAR) unknownDesc)[i]);
+ }
+ }
+ return unknownXmlDesc;
+}
+
+/*****************************************************************************
+
+ XmlAddEndpointDescriptor()
+
+ This routine adds usb endpoint descriptor and verbose fields
+ *****************************************************************************/
+void XmlAddEndpointDescriptor(
+ EndpointDescriptorType ^usbXmlEndpointDescriptor,
+ PUSB_ENDPOINT_DESCRIPTOR endPointDescriptor,
+ UCHAR connectionSpeed
+ )
+{
+ EndpointDescriptorType ^ue = usbXmlEndpointDescriptor;
+ ULONG maxBytes = endPointDescriptor->wMaxPacketSize & 0x7FF;
+
+ // Add structure values
+ ue->Length = endPointDescriptor->bLength;
+ ue->DescriptorType = endPointDescriptor->bDescriptorType;
+ ue->EndpointAddress = endPointDescriptor->bEndpointAddress;
+ ue->Attributes = endPointDescriptor->bmAttributes;
+ ue->MaxPacketSize = endPointDescriptor->wMaxPacketSize;
+
+ // Add verbose fields
+ ue->EndpointId = endPointDescriptor->bEndpointAddress & 0x0F;
+
+ // Add endpoint direction
+ if (USB_ENDPOINT_DIRECTION_OUT(endPointDescriptor->bEndpointAddress))
+ {
+ ue->EndpointDirection = gcnew String("Out");
+ }
+ else if (USB_ENDPOINT_DIRECTION_IN(endPointDescriptor->bEndpointAddress))
+ {
+ ue->EndpointDirection = gcnew String("In");
+ }
+
+ // Add endpoint type
+ switch (endPointDescriptor->bmAttributes & USB_ENDPOINT_TYPE_MASK)
+ {
+ case USB_ENDPOINT_TYPE_CONTROL:
+ ue->EndpointType = gcnew String("Control Transfer Type");
+ break;
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ switch (endPointDescriptor->bmAttributes & 0x0C)
+ {
+ case 0x00:
+ ue->EndpointType = gcnew String("Ischronous Transfer Type - No Synchronization");
+ break;
+
+ case 0x04:
+ ue->EndpointType = gcnew String("Ischronous Transfer Type - Asynchronous");
+ break;
+
+ case 0x08:
+ ue->EndpointType = gcnew String("Ischronous Transfer Type - Adaptive");
+ break;
+
+ case 0x0C:
+ ue->EndpointType = gcnew String("Ischronous Transfer Type - Synchronous");
+ break;
+ }
+ break;
+ case USB_ENDPOINT_TYPE_BULK:
+ ue->EndpointType = gcnew String("Bulk Transfer Type");
+ break;
+
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+ ue->EndpointType = gcnew String("Interrupt Transfer Type");
+ break;
+ }
+
+ // Add packet info
+ switch (connectionSpeed)
+ {
+ case UsbHighSpeed:
+ if (endPointDescriptor->bmAttributes & 1) {
+ ULONG transactions = ((endPointDescriptor->wMaxPacketSize & 0x1800) >> 11) + 1;
+ // Isoc or Interrupt endpoint
+ ue->EndpointPacketInfo = gcnew String(
+ transactions + " transactions per microframe, " +
+ maxBytes + " max bytes");
+ }
+ else
+ {
+ // Bulk endpoint
+ ue->EndpointPacketInfo = gcnew String(maxBytes + " max bytes");
+ }
+ break;
+ case UsbFullSpeed:
+ ue->EndpointPacketInfo = gcnew String(maxBytes + " max bytes");
+ break;
+ default:
+ // Low or Invalid speed
+ ue->EndpointPacketInfo = gcnew String("Invalid bus speed");
+ break;
+ }
+
+ // Add validation
+ if (endPointDescriptor->wMaxPacketSize & 0xE000)
+ {
+ ue->EndpointPacketSizeValidation = gcnew String("ERROR: wMaxPacketSize bits 15-13 should be 0");
+ } else if (connectionSpeed==UsbHighSpeed)
+ {
+ USHORT hsMux;
+
+ hsMux = (endPointDescriptor->wMaxPacketSize >> 11) & 0x03;
+
+ switch (endPointDescriptor->bmAttributes & USB_ENDPOINT_TYPE_MASK)
+ {
+ case USB_ENDPOINT_TYPE_ISOCHRONOUS:
+ case USB_ENDPOINT_TYPE_INTERRUPT:
+ switch (hsMux) {
+ case 0:
+ if ((maxBytes < 1) || (maxBytes > 1024))
+ {
+ ue->EndpointPacketSizeValidation = gcnew String("ERROR: Invalid maximum packet size, should be between 1 and 1024");
+ }
+ break;
+
+ case 1:
+ if ((maxBytes < 513) || (maxBytes > 1024))
+ {
+ ue->EndpointPacketSizeValidation = gcnew String("ERROR: Invalid maximum packet size, should be between 513 and 1024");
+ }
+ break;
+
+ case 2:
+ if ((maxBytes < 683) || (maxBytes > 1024))
+ {
+ ue->EndpointPacketSizeValidation = gcnew String("ERROR: Invalid maximum packet size, should be between 683 and 1024");
+ }
+ break;
+
+ case 3:
+ ue->EndpointPacketSizeValidation = gcnew String("ERROR: Bits 12-11 set to reserved value\r\n");
+ break;
+ }
+ }
+ }
+
+ // Add interval
+ if (endPointDescriptor->bLength == sizeof(USB_ENDPOINT_DESCRIPTOR))
+ {
+ ue->Interval = endPointDescriptor->bInterval;
+ }
+ else
+ {
+ PUSB_ENDPOINT_DESCRIPTOR2 endpointDesc2 = (PUSB_ENDPOINT_DESCRIPTOR2) endPointDescriptor;
+ ue->WInterval = endpointDesc2->wInterval;
+ ue->SyncAddress = endpointDesc2->bSyncAddress;
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddPipeInformation()
+
+ This routine adds all the pipe information for device
+ *****************************************************************************/
+void XmlAddPipeInformation(
+ array< UsbPipeInfoType ^> ^ usbXmlPipeInfoList,
+ PUSB_PIPE_INFO pipeInfo,
+ ULONG numPipes,
+ UCHAR connectionSpeed
+ )
+{
+ ULONG i = 0;
+
+ for(i = 0; i< numPipes; i++)
+ {
+ // Add all pipe in the list
+ usbXmlPipeInfoList[i] = gcnew UsbPipeInfoType();
+ usbXmlPipeInfoList[i]->EndpointDescriptor = gcnew EndpointDescriptorType();
+ XmlAddEndpointDescriptor(
+ usbXmlPipeInfoList[i]->EndpointDescriptor,
+ &pipeInfo[i].EndpointDescriptor,
+ connectionSpeed);
+ usbXmlPipeInfoList[i]->ScheduleOffset = pipeInfo->ScheduleOffset;
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddUsbDeviceDescriptor()
+
+ This routine adds usb device descriptor
+ *****************************************************************************/
+void XmlAddUsbDeviceDescriptor(
+ UsbDeviceDescriptorType ^usbXmlDeviceDescriptor,
+ PUSB_DEVICE_DESCRIPTOR usbDeviceDescriptor)
+{
+ UsbDeviceDescriptorType ^ud = usbXmlDeviceDescriptor;
+
+ // Map all fields explicitly
+
+ ud->Length = usbDeviceDescriptor->bLength;
+ ud->DescriptorType = usbDeviceDescriptor->bDescriptorType;
+ ud->CdUSB= usbDeviceDescriptor->bcdUSB;
+ ud->DeviceClass = usbDeviceDescriptor->bDeviceClass;
+ ud->DeviceSubclass = usbDeviceDescriptor->bDeviceSubClass;
+ ud->DeviceProtocol = usbDeviceDescriptor->bDeviceProtocol;
+ ud->MaxPacketSize0 = usbDeviceDescriptor->bMaxPacketSize0;
+ ud->IdVendor = usbDeviceDescriptor->idVendor;
+ ud->IdProduct = usbDeviceDescriptor->idProduct ;
+ ud->CdDevice = usbDeviceDescriptor->bcdDevice;
+ ud->IManufacturer = usbDeviceDescriptor->iManufacturer;
+ ud->IProduct = usbDeviceDescriptor->iProduct;
+ ud->ISerialNumber = usbDeviceDescriptor->iSerialNumber;
+ ud->NumConfigurations = usbDeviceDescriptor->bNumConfigurations;
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddConfigurationDescriptor()
+
+ This routine adds the configuration descriptor
+ *****************************************************************************/
+void XmlAddConfigurationDescriptor(
+ UsbConfigurationDescriptorType ^ confXmlDesc,
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ )
+
+{
+ UINT uCount = 0;
+ BOOL isSuperSpeed = FALSE;
+
+ if (NULL == configDesc || NULL == deviceInfo)
+ {
+ return;
+ }
+
+ if(deviceInfo->ConnectionInfoV2 &&
+ (deviceInfo->ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedOrHigher ||
+ deviceInfo->ConnectionInfoV2->Flags.DeviceIsOperatingAtSuperSpeedPlusOrHigher))
+ {
+ isSuperSpeed = TRUE;
+ }
+
+ confXmlDesc->BLength = configDesc->bLength;
+ confXmlDesc->BDescriptorType = configDesc->bDescriptorType;
+ confXmlDesc->WTotalLength = configDesc->wTotalLength;
+ confXmlDesc->BNumInterfaces = configDesc->bNumInterfaces;
+ confXmlDesc->BConfigurationValue = configDesc->bConfigurationValue;
+ confXmlDesc->IConfiguration = configDesc->iConfiguration;
+ confXmlDesc->BmAttributes = configDesc->bmAttributes;
+ confXmlDesc->MaxPower = configDesc->MaxPower;
+
+ uCount = GetConfigurationSize(deviceInfo);
+
+ if (uCount != configDesc->wTotalLength)
+ {
+ confXmlDesc->ConfigDescError = gcnew String("ERROR: Invalid total configuration size " +
+ configDesc->wTotalLength + ", should be " + uCount);
+ }
+
+ if (configDesc->bConfigurationValue != 1)
+ {
+ confXmlDesc->ConfValueError = gcnew String("CAUTION: Most host controllers will only work with one configuration per speed");
+ }
+
+ if (configDesc->iConfiguration)
+ {
+ confXmlDesc->ConfStringDesc = XmlGetStringDescriptor(
+ configDesc->iConfiguration,
+ stringDesc,
+ false);
+ }
+
+ if (configDesc->bmAttributes & USB_CONFIG_BUS_POWERED)
+ {
+ confXmlDesc->AttributesStr = gcnew String("Bus Powered");
+ }
+ else if (configDesc->bmAttributes & USB_CONFIG_SELF_POWERED)
+ {
+ confXmlDesc->AttributesStr = gcnew String("Self Powered");
+ }
+ else if (configDesc->bmAttributes & USB_CONFIG_REMOTE_WAKEUP)
+ {
+ confXmlDesc->AttributesStr = gcnew String("Remote Wakeup");
+ }
+ else
+ {
+ confXmlDesc->AttributesStr = gcnew String("WARNING: bmAttributes is using reserved space");
+ }
+
+ confXmlDesc->MaxCurrent = gcnew String("");
+ confXmlDesc->MaxCurrent += (isSuperSpeed?configDesc->MaxPower * 8:configDesc->MaxPower * 2);
+ confXmlDesc->MaxCurrent += " mA";
+
+ return;
+}
+
+/*****************************************************************************
+
+ XmlGetDeviceClass()
+
+ This routine returns the interface class and subclass for given interface descriptor
+ *****************************************************************************/
+UsbDeviceClassType ^ XmlGetDeviceClass(UCHAR bInterfaceClass, UCHAR bInterfaceSubclass, UCHAR bInterfaceProtocol)
+{
+ String ^ deviceClass = nullptr;
+ String ^ deviceSubclass = nullptr;
+ UsbDeviceClassType ^ deviceDetails = gcnew UsbDeviceClassType();
+
+ switch (bInterfaceClass)
+ {
+ case USB_DEVICE_CLASS_AUDIO:
+ deviceClass = gcnew String("Audio Interface");
+
+ switch (bInterfaceSubclass)
+ {
+ case USB_AUDIO_SUBCLASS_AUDIOCONTROL:
+ deviceSubclass = gcnew String("Audio Control Interface");
+ break;
+
+ case USB_AUDIO_SUBCLASS_AUDIOSTREAMING:
+ deviceSubclass = gcnew String("Audio Streaming Interface");
+ break;
+
+ case USB_AUDIO_SUBCLASS_MIDISTREAMING:
+ deviceSubclass = gcnew String("MIDI Streaming Interface");
+ break;
+
+ default:
+ deviceSubclass = gcnew String("CAUTION: This appears to be an invalid bInterfaceSubclass : ");
+ deviceSubclass += bInterfaceSubclass;
+ break;
+ }
+ break;
+
+ case USB_DEVICE_CLASS_VIDEO:
+ deviceClass = gcnew String("Video Interface");
+
+ switch(bInterfaceSubclass)
+ {
+ case VIDEO_SUBCLASS_CONTROL:
+ deviceSubclass = gcnew String("Video Control");
+ break;
+
+ case VIDEO_SUBCLASS_STREAMING:
+ deviceSubclass = gcnew String("Video Streaming");
+ break;
+
+ default:
+ deviceSubclass = gcnew String("CAUTION: This appears to be an invalid bInterfaceSubclass : ");
+ deviceSubclass += bInterfaceSubclass;
+ break;
+ }
+ break;
+
+ case USB_DEVICE_CLASS_VENDOR_SPECIFIC:
+ deviceClass = gcnew String("Vendor Specific Device");
+ break;
+
+ case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+
+ deviceClass = gcnew String("HID Interface");
+ break;
+
+ case USB_DEVICE_CLASS_HUB:
+ deviceClass = gcnew String("HUB Interface");
+ break;
+
+ case USB_DEVICE_CLASS_RESERVED:
+ deviceClass = gcnew String("CAUTION: Reserved USB Device Interface Class");
+ break;
+
+ case USB_DEVICE_CLASS_COMMUNICATIONS:
+ deviceClass = gcnew String("Communications (CDC Control) USB Device\r\n");
+ break;
+
+ case USB_DEVICE_CLASS_MONITOR:
+ deviceClass = gcnew String("Monitor USB Device Interface Class*** (This may be obsolete)");
+ break;
+
+ case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+ deviceClass = gcnew String("Physical Interface USB Device");
+ break;
+
+ case USB_DEVICE_CLASS_POWER:
+ if (bInterfaceSubclass == 1 && bInterfaceProtocol == 1)
+ {
+ deviceClass = gcnew String("Image USB Device");
+ }
+ else
+ {
+ deviceClass = gcnew String("Power USB Device (This may be obsolete)");
+ }
+ break;
+
+ case USB_DEVICE_CLASS_PRINTER:
+ deviceClass = gcnew String("Printer USB Device");
+ break;
+
+ case USB_DEVICE_CLASS_STORAGE:
+ deviceClass = gcnew String("Mass Storage USB Device");
+ break;
+
+ case USB_CDC_DATA_INTERFACE:
+ deviceClass = gcnew String("CDC Data USB Device");
+ break;
+
+ case USB_CHIP_SMART_CARD_INTERFACE:
+ deviceClass = gcnew String("Chip/Smart Card USB Device");
+ break;
+
+ case USB_CONTENT_SECURITY_INTERFACE:
+ deviceClass = gcnew String("Content Security USB Device");
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE_INTERFACE:
+ if (bInterfaceSubclass == 1 && bInterfaceProtocol == 1)
+ {
+ deviceClass = gcnew String("Reprogrammable USB2 Compliance Diagnostic Device USB Device");
+ }
+ else
+ {
+ deviceClass = gcnew String("CAUTION: This appears to be an invalid device class: ");
+ deviceClass += bInterfaceClass;
+ }
+ break;
+
+ case USB_WIRELESS_CONTROLLER_INTERFACE:
+ if (bInterfaceSubclass == 1 && bInterfaceProtocol == 1)
+ {
+ deviceClass = gcnew String("Wireless RF Controller USB Device Interface Class with Bluetooth Programming Interface");
+ }
+ else
+ {
+ deviceClass = gcnew String("CAUTION: This appears to be an invalid device class: ");
+ deviceClass += bInterfaceClass;
+ }
+ break;
+
+ case USB_APPLICATION_SPECIFIC_INTERFACE:
+ deviceClass = gcnew String("Application Specific USB Device");
+
+ switch(bInterfaceSubclass)
+ {
+ case 1:
+ deviceSubclass = gcnew String("Device Firmware Application Specific USB Device");
+ break;
+ case 2:
+ deviceSubclass = gcnew String("IrDA Bridge Application Specific USB Device");
+ break;
+ case 3:
+ deviceSubclass = gcnew String("Test & Measurement Class (USBTMC) Application Specific USB Device");
+ break;
+ default:
+ deviceSubclass = gcnew String("CAUTION: This appears to be an invalid bInterfaceSubclass : ");
+ deviceSubclass += bInterfaceSubclass;
+ }
+ break;
+ case USB_DEVICE_CLASS_BILLBOARD:
+ deviceClass = gcnew String("Billboard Class");
+ switch (bInterfaceSubclass)
+ {
+ case 0:
+ deviceSubclass = gcnew String("Billboard Subclass");
+ break;
+ default:
+ deviceSubclass = gcnew String("CAUTION: This appears to be an invalid bInterfaceSubClass");
+ break;
+ }
+ break;
+ default:
+
+ deviceClass = gcnew String("Interface Class unknown : ");
+ deviceClass += bInterfaceClass;
+ break;
+ }
+
+ // Return class and subclass
+
+ deviceDetails->DeviceClass = deviceClass;
+ deviceDetails->DeviceSubclass = deviceSubclass;
+
+ return deviceDetails;
+}
+
+/*****************************************************************************
+
+ XmlAddInterfaceDescriptor()
+
+ This routine adds the device interface descriptor
+ *****************************************************************************/
+void XmlAddDeviceInterfaceDescriptor(
+ UsbDeviceInterfaceDescriptorType ^ ifXmlDesc,
+ PUSB_INTERFACE_DESCRIPTOR ifDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc)
+{
+ if (NULL == ifDesc || NULL == stringDesc)
+ {
+ return;
+ }
+
+ // Update structure fields
+ ifXmlDesc->BLength = ifDesc->bLength;
+ ifXmlDesc->BDescriptorType = ifDesc->bDescriptorType;
+ ifXmlDesc->BInterfaceNumber = ifDesc->bInterfaceNumber;
+ ifXmlDesc->BAlternateSetting = ifDesc->bAlternateSetting;
+ ifXmlDesc->BNumEndpoints = ifDesc->bNumEndpoints;
+ ifXmlDesc->BInterfaceClass = ifDesc->bInterfaceClass;
+ ifXmlDesc->BInterfaceSubclass = ifDesc->bInterfaceSubClass;
+ ifXmlDesc->BInterfaceProtocol = ifDesc->bInterfaceProtocol;
+ ifXmlDesc->IInterface = ifDesc->iInterface;
+
+ // Update class and sub class
+ ifXmlDesc->InterfaceDetails = XmlGetDeviceClass(
+ ifDesc->bInterfaceClass,
+ ifDesc->bInterfaceSubClass,
+ ifDesc->bInterfaceProtocol);
+
+ //This is basically the check for PC_PROTOCOL_UNDEFINED
+ if ((ifDesc->bInterfaceClass == USB_DEVICE_CLASS_VIDEO) ||
+ (ifDesc->bInterfaceClass == USB_DEVICE_CLASS_AUDIO))
+ {
+ if (ifDesc->bInterfaceProtocol != PC_PROTOCOL_UNDEFINED)
+ {
+ ifXmlDesc->ProtocolError = gcnew String("WARNING: Protocol must be set to PC_PROTOCOL_UNDEFINED");
+ ifXmlDesc->ProtocolError += " for this class but is set to: ";
+ ifXmlDesc->ProtocolError += ifDesc->bInterfaceProtocol;
+ }
+ }
+
+ if (ifDesc->iInterface)
+ {
+ // Add String descriptor
+ ifXmlDesc->StringDesc = XmlGetStringDescriptor(
+ ifDesc->iInterface,
+ stringDesc,
+ false);
+ }
+
+ if (ifDesc->bLength == sizeof(USB_INTERFACE_DESCRIPTOR2))
+ {
+ PUSB_INTERFACE_DESCRIPTOR2 interfaceDesc2;
+
+ interfaceDesc2 = (PUSB_INTERFACE_DESCRIPTOR2)ifDesc;
+
+ ifXmlDesc->WNumClasses = interfaceDesc2->wNumClasses;
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddDeviceQualDescriptor()
+
+ This routine adds the device qualifier descriptor
+ *****************************************************************************/
+
+void XmlAddDeviceQualDescriptor(
+ UsbDeviceQualifierDescriptorType ^ qualXmlDesc,
+ PUSB_DEVICE_QUALIFIER_DESCRIPTOR qualDesc)
+{
+ if (NULL == qualDesc)
+ {
+ return;
+ }
+
+ // Add structure fields
+ qualXmlDesc->BLength = qualDesc->bLength;
+ qualXmlDesc->BDescriptorType = qualDesc->bDescriptorType;
+ qualXmlDesc->BcdUSB = qualDesc->bcdUSB;
+ qualXmlDesc->BDeviceClass = qualDesc->bDeviceClass;
+ qualXmlDesc->BDeviceSubclass = qualDesc->bDeviceSubClass;
+ qualXmlDesc->BDeviceProtocol = qualDesc->bDeviceProtocol;
+ qualXmlDesc->BMaxPacketSize0 = qualDesc->bMaxPacketSize0;
+ qualXmlDesc->NumConfigurations = qualDesc->bNumConfigurations;
+
+ // Get device class string
+ qualXmlDesc->DeviceClass = XmlGetDeviceClassString(qualDesc->bDeviceClass);
+
+ if (qualDesc->bDeviceSubClass > 0x00 && qualDesc->bDeviceSubClass < 0xFF)
+ {
+ qualXmlDesc->DeviceSubclassError = gcnew String("ERROR: bDeviceSubClass is invalid : ");
+ qualXmlDesc->DeviceSubclassError += qualDesc->bDeviceSubClass;
+ }
+
+ if (qualDesc->bDeviceProtocol > 0x00 && qualDesc->bDeviceProtocol < 0xFF)
+ {
+ qualXmlDesc->DeviceProtocolError = gcnew String("ERROR: bDeviceProtocol is invalid : ");
+ qualXmlDesc->DeviceProtocolError += qualDesc->bDeviceProtocol;
+ }
+
+ qualXmlDesc->MaxPacketSizeInBytes = qualDesc->bMaxPacketSize0;
+
+ if (qualDesc->bNumConfigurations != 1)
+ {
+ qualXmlDesc->DeviceNumConfigError = gcnew String(
+ "CAUTION: Most host controllers will only work with one configuration per speed");
+ }
+
+ if (qualDesc->bReserved != 0)
+ {
+ qualXmlDesc->ReservedError = gcnew String("WARNING: bReserved needs to be set to 0 to be valid - " +
+ qualDesc->bReserved);
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddAddConfigDescriptors()
+
+ This routine adds the all the config descriptors
+ *****************************************************************************/
+array < UsbDeviceConfigurationType ^> ^ XmlGetConfigDescriptors(
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDescs,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ )
+{
+ array < UsbDeviceConfigurationType ^> ^ confXmlDescs = nullptr;
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ PUCHAR descEnd = NULL;
+ ArrayList ^confList = gcnew ArrayList;
+ UsbDeviceConfigurationType ^ deviceConf = nullptr;
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) configDescs;
+ descEnd = (PUCHAR) configDescs + configDescs->wTotalLength;
+
+ while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd &&
+ (PUCHAR)commonDesc + commonDesc->bLength <= descEnd)
+ {
+ // Add the config descriptor
+ deviceConf = gcnew UsbDeviceConfigurationType();
+
+ XmlAddDeviceConfiguration(
+ deviceConf,
+ deviceInfo,
+ (PUSB_CONFIGURATION_DESCRIPTOR) commonDesc,
+ stringDesc,
+ configDescs->bNumInterfaces
+ );
+
+ confList->Add(deviceConf);
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) ((PUCHAR) commonDesc + commonDesc->bLength);
+ }
+
+ confXmlDescs = reinterpret_cast<array<UsbDeviceConfigurationType ^>^> (confList->ToArray(UsbDeviceConfigurationType::typeid));
+ return confXmlDescs;
+}
+
+/*****************************************************************************
+
+ XmlAddDeviceConfiguration()
+
+ This routine adds the device configuration
+ *****************************************************************************/
+void XmlAddDeviceConfiguration(
+ UsbDeviceConfigurationType ^ confXmlDesc,
+ PUSBDEVICEINFO deviceInfo,
+ PUSB_CONFIGURATION_DESCRIPTOR configDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ int numInterfaces
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ UCHAR bInterfaceClass = 0;
+ UCHAR bInterfaceSubclass = 0;
+ UCHAR bInterfaceProtocol = 0;
+ BOOL displayUnknown = FALSE;
+
+ if (NULL == deviceInfo || NULL == configDesc || NULL == stringDesc)
+ {
+ return;
+ }
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR)configDesc;
+ displayUnknown = FALSE;
+
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR))
+ {
+ // Validate descriptor
+ confXmlDesc->DeviceQualifierError = String::Format(
+ "ERROR: Device Qualifier bLength value incorrect Obtained: {0} Expected {1}",
+ commonDesc->bLength,
+ sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR));
+ displayUnknown = TRUE;
+ break;
+ }
+ // Add device Qual descriptor
+ confXmlDesc->DeviceQualifierDescriptor = gcnew UsbDeviceQualifierDescriptorType();
+
+ XmlAddDeviceQualDescriptor(
+ confXmlDesc->DeviceQualifierDescriptor,
+ (PUSB_DEVICE_QUALIFIER_DESCRIPTOR) commonDesc);
+ break;
+
+ case USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ // Validate descriptor
+ confXmlDesc->SpeedConfigurationError = String::Format(
+ "ERROR: Other speed configuration bLength value incorrect Obtained: {0} Expected {1}",
+ commonDesc->bLength,
+ sizeof(USB_CONFIGURATION_DESCRIPTOR));
+ displayUnknown = TRUE;
+ }
+
+ // Add configuration desc
+ confXmlDesc->ConfigurationDescriptor = gcnew UsbConfigurationDescriptorType();
+
+ XmlAddConfigurationDescriptor(
+ confXmlDesc->ConfigurationDescriptor,
+ deviceInfo,
+ (PUSB_CONFIGURATION_DESCRIPTOR) commonDesc,
+ stringDesc);
+ break;
+
+ case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
+ {
+ // Validate descriptor
+ confXmlDesc->SpeedConfigurationError = String::Format(
+ "ERROR: Configuration bLength value incorrect Obtained: {0} Expected {1}",
+ commonDesc->bLength,
+ sizeof(USB_CONFIGURATION_DESCRIPTOR));
+ displayUnknown = TRUE;
+ break;
+ }
+
+ // Add configuration desc
+ confXmlDesc->ConfigurationDescriptor = gcnew UsbConfigurationDescriptorType();
+ XmlAddConfigurationDescriptor(
+ confXmlDesc->ConfigurationDescriptor,
+ deviceInfo,
+ (PUSB_CONFIGURATION_DESCRIPTOR) commonDesc,
+ stringDesc);
+ break;
+
+ case USB_INTERFACE_DESCRIPTOR_TYPE:
+ if ((commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR)) &&
+ (commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR2)))
+ {
+ // Validate descriptor
+ confXmlDesc->InterfaceError = String::Format(
+ "ERROR: Interface bLength value incorrect Obtained: {0} Expected: {1} or {2}",
+ commonDesc->bLength,
+ sizeof(USB_INTERFACE_DESCRIPTOR),
+ sizeof(USB_INTERFACE_DESCRIPTOR2));
+ displayUnknown = TRUE;
+ break;
+ }
+
+ // Add interface descriptor
+ bInterfaceClass = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceClass;
+ bInterfaceSubclass = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceSubClass;
+ bInterfaceProtocol = ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->bInterfaceProtocol;
+
+ confXmlDesc->InterfaceDescriptor = gcnew UsbDeviceInterfaceDescriptorType();
+ XmlAddDeviceInterfaceDescriptor(
+ confXmlDesc->InterfaceDescriptor,
+ (PUSB_INTERFACE_DESCRIPTOR) commonDesc,
+ stringDesc
+ );
+
+ case USB_ENDPOINT_DESCRIPTOR_TYPE:
+ if ((commonDesc->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR)) &&
+ (commonDesc->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR2)))
+ {
+ // Validate endpoint descriptor
+ confXmlDesc->EndpointError = String::Format(
+ "ERROR: Endpoint bLength value incorrect Obtained: {0} Expected: {1} or {2}",
+ commonDesc->bLength,
+ sizeof(USB_ENDPOINT_DESCRIPTOR),
+ sizeof(USB_ENDPOINT_DESCRIPTOR2));
+ displayUnknown = TRUE;
+ break;
+ }
+
+ confXmlDesc->EndpointDescriptor = gcnew EndpointDescriptorType();
+
+ if (NULL != deviceInfo->ConnectionInfo)
+ {
+ // Add endpoint descriptor
+ XmlAddEndpointDescriptor(
+ confXmlDesc->EndpointDescriptor,
+ (PUSB_ENDPOINT_DESCRIPTOR) commonDesc,
+ deviceInfo->ConnectionInfo->Speed);
+ }
+
+ break;
+
+ case USB_HID_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_HID_DESCRIPTOR))
+ {
+ // Validate HID
+ confXmlDesc->HidError = String::Format(
+ "ERROR: HID bLength value incorrect Obtained: {0} Expected: {1}",
+ commonDesc->bLength,
+ sizeof(USB_HID_DESCRIPTOR));
+ displayUnknown = TRUE;
+ break;
+ }
+
+ // Add HID descriptor
+ confXmlDesc->HidDescriptor = gcnew UsbDeviceHidDescriptorType();
+ XmlAddHidDescriptor(
+ confXmlDesc->HidDescriptor,
+ (PUSB_HID_DESCRIPTOR) commonDesc
+ );
+ break;
+
+ case USB_OTG_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_OTG_DESCRIPTOR))
+ {
+ // Validate length
+ confXmlDesc->HidError = String::Format(
+ "ERROR: OTG bLength value incorrect Obtained: {0} Expected: {1}",
+ commonDesc->bLength,
+ sizeof(USB_OTG_DESCRIPTOR));
+ displayUnknown = TRUE;
+ break;
+ }
+
+ // Add OTG descriptor
+ confXmlDesc->OtgDescriptor = gcnew UsbDeviceOTGDescriptorType();
+ XmlAddOTGDescriptor(
+ confXmlDesc->OtgDescriptor,
+ (PUSB_OTG_DESCRIPTOR) commonDesc
+ );
+ break;
+
+ case USB_IAD_DESCRIPTOR_TYPE:
+ if (commonDesc->bLength < sizeof(USB_IAD_DESCRIPTOR))
+ {
+ // Validate length
+ confXmlDesc->IadError = String::Format(
+ "ERROR: IAD bLength value incorrect",
+ commonDesc->bLength,
+ sizeof(USB_OTG_DESCRIPTOR));
+ displayUnknown = TRUE;
+ }
+
+ // Add IAD descriptor
+ confXmlDesc->IadDescriptor = gcnew UsbDeviceIADDescriptorType();
+ XmlAddIADDescriptor(
+ confXmlDesc->IadDescriptor,
+ (PUSB_IAD_DESCRIPTOR) commonDesc,
+ stringDesc,
+ numInterfaces
+ );
+ break;
+
+ default:
+ // Interface class device (?)
+ confXmlDesc->DeviceDetails = XmlGetDeviceClass(
+ ((PUSB_INTERFACE_DESCRIPTOR) commonDesc)->bInterfaceClass,
+ ((PUSB_INTERFACE_DESCRIPTOR) commonDesc)->bInterfaceSubClass,
+ ((PUSB_INTERFACE_DESCRIPTOR) commonDesc)->bInterfaceProtocol
+ );
+ break;
+ }
+
+ if (displayUnknown)
+ {
+ // Add unknown descriptor
+ confXmlDesc->UnknownDescriptor = XmlGetUnknownDescriptor(commonDesc);
+ }
+ return;
+}
+
+/*****************************************************************************
+
+ XmlAddConnectionInfoSt()
+
+ This routine adds connection information structures for the device
+ *****************************************************************************/
+void XmlAddConnectionInfoSt(
+ NodeConnectionInfoExStructType ^xmlConnectionInfoSt,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PDEVICE_INFO_NODE pNode)
+{
+ NodeConnectionInfoExStructType ^nS = xmlConnectionInfoSt;
+
+ nS->ConnectionIndex = connectionInfo->ConnectionIndex;
+
+ nS->DeviceDescriptor = gcnew UsbDeviceDescriptorType();
+
+ XmlAddUsbDeviceDescriptor(nS->DeviceDescriptor, &(connectionInfo->DeviceDescriptor));
+
+ nS->CurrentConfigurationValue = connectionInfo->CurrentConfigurationValue;
+ nS->Speed = connectionInfo->Speed;
+ nS->SpeedStr = static_cast<UsbConnectionSpeedType> (connectionInfo->Speed);
+ nS->DeviceIsHub = connectionInfo->DeviceIsHub? true: false;
+ nS->NumOfOpenPipes = connectionInfo->NumberOfOpenPipes;
+ nS->UsbConnectionStatus = static_cast<UsbConnectionStatusType> (connectionInfo->ConnectionStatus);
+
+ if(NULL != pNode)
+ {
+ nS->DevicePowerState = static_cast<DevicePowerStateType>(pNode->LatestDevicePowerState);
+ }
+ else
+ {
+ nS->DevicePowerState = static_cast<DevicePowerStateType>(PowerDeviceUnspecified);
+ }
+
+ // Add the pipe list
+ if (connectionInfo->NumberOfOpenPipes > 0)
+ {
+ nS->Pipe = gcnew array <UsbPipeInfoType ^>(connectionInfo->NumberOfOpenPipes);
+ XmlAddPipeInformation(
+ nS->Pipe,
+ connectionInfo->PipeList,
+ connectionInfo->NumberOfOpenPipes,
+ connectionInfo->Speed
+ );
+ }
+
+ return;
+}
+
+/*****************************************************************************
+
+ XmlGetLangIdString()
+
+ Obtains the language string for given string descriptor index
+ *****************************************************************************/
+String ^ XmlGetLangIdString(UCHAR index, PSTRING_DESCRIPTOR_NODE stringDesc)
+{
+ String ^langIdStr = nullptr;
+ bool foundDescriptor = false;
+
+ while(stringDesc)
+ {
+ if (stringDesc->DescriptorIndex == index)
+ {
+ langIdStr = PACHAR_TO_STRING(GetLangIDString(stringDesc->LanguageID));
+
+ if (langIdStr == nullptr)
+ {
+ langIdStr = gcnew String("WARNING: Invalid language ID: " + stringDesc->LanguageID);
+ }
+ foundDescriptor = true;
+ break;
+ }
+ stringDesc = stringDesc->Next;
+ }
+
+ if (foundDescriptor == false)
+ {
+ // If no descriptor was found, return error message in field
+ langIdStr = gcnew String("ERROR: No String descriptor for index " + index);
+ }
+
+ return langIdStr;
+}
+
+/*****************************************************************************
+
+ XmlGetStringDescriptor()
+
+ Obtains the string descriptor for given string descriptor index
+ *****************************************************************************/
+
+String ^ XmlGetStringDescriptor(UCHAR index, PSTRING_DESCRIPTOR_NODE stringDesc, bool enOnly)
+{
+ ULONG nBytes = 0;
+
+ CHAR pString[MAX_STRING_DESCRIPTOR_LENGTH];
+ String ^desc = nullptr;
+ bool foundDescriptor = false;
+ bool foundNonEnglishDescriptor = false;
+
+ ZeroMemory(pString, MAX_STRING_DESCRIPTOR_LENGTH);
+
+ while(stringDesc)
+ {
+ if (stringDesc->DescriptorIndex == index)
+ {
+ if (enOnly && stringDesc->LanguageID != STRING_DESCRIPTOR_EN_LANGUAGE_ID)
+ {
+ // If we are required to return only english descriptor, continue
+ foundNonEnglishDescriptor = true;
+ continue;
+ }
+
+ nBytes = WideCharToMultiByte(
+ CP_ACP,
+ WC_NO_BEST_FIT_CHARS,
+ stringDesc->StringDescriptor->bString,
+ (stringDesc->StringDescriptor->bLength -2)/2,
+ pString,
+ MAX_STRING_DESCRIPTOR_LENGTH,
+ NULL,
+ NULL
+ );
+
+ if (nBytes)
+ {
+ foundDescriptor = true;
+ desc = PACHAR_TO_STRING(pString);
+ }
+ break;
+ }
+ stringDesc = stringDesc->Next;
+ }
+
+ if ((foundDescriptor == false) && (foundNonEnglishDescriptor == false))
+ {
+ // If no descriptor was found, return error message in field
+ desc = gcnew String("ERROR: No String descriptor for index " +
+ index);
+ }
+ else if ((foundDescriptor == false) && (foundNonEnglishDescriptor == true) && (enOnly))
+ {
+ desc = gcnew String("ERROR: The index " + index + " does not support English(US)");
+ }
+
+ return desc;
+}
+
+/*****************************************************************************
+
+ XmlGetDeviceClassString()
+
+ Returns the device class string for given device class ID
+ *****************************************************************************/
+
+String ^ XmlGetDeviceClassString(UCHAR deviceClass)
+{
+ String ^ deviceClassStr = nullptr;
+
+ // Not an IAD device
+ switch (deviceClass)
+ {
+ case USB_INTERFACE_CLASS_DEVICE:
+ deviceClassStr = gcnew String("Interface Class Defined Device");
+ break;
+
+ case USB_COMMUNICATION_DEVICE:
+ deviceClassStr = gcnew String("Communication Device");
+ break;
+
+ case USB_HUB_DEVICE:
+ deviceClassStr = gcnew String("Hub Device");
+ break;
+
+ case USB_DIAGNOSTIC_DEVICE:
+ deviceClassStr = gcnew String("Diagnostic Device");
+ break;
+
+ case USB_WIRELESS_CONTROLLER_DEVICE:
+ deviceClassStr = gcnew String("Wireless Controller(Bluetooth) Device");
+ break;
+
+ case USB_VENDOR_SPECIFIC_DEVICE:
+ deviceClassStr = gcnew String("Vendor specific device");
+ break;
+
+ case USB_DEVICE_CLASS_BILLBOARD:
+ deviceClassStr = gcnew String("Billboard class device");
+ break;
+
+ default:
+ deviceClassStr= gcnew String("ERROR: unknown bDeviceClass" + deviceClass);
+ break;
+ }
+ return deviceClassStr;
+}
+
+
+/*****************************************************************************
+
+ XmlAddDeviceClassDetails()
+
+ This routine adds device class details
+ *****************************************************************************/
+bool XmlAddDeviceClassDetails(
+ UsbDeviceClassDetailsType ^ deviceDetails,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PUSBDEVICEINFO deviceInfo)
+{
+ UINT uIADcount = 0;
+ bool tog = true;
+
+ uIADcount = IsIADDevice((PUSBDEVICEINFO) deviceInfo);
+
+ if (uIADcount)
+ {
+ // IAD device, check validity of device class
+ if (connectionInfo->DeviceDescriptor.bDeviceClass == USB_MISCELLANEOUS_DEVICE)
+ {
+ tog = false;
+ deviceDetails->DeviceType = gcnew String("Multi-interface Function Code Device");
+ }
+ else {
+ deviceDetails->DeviceTypeError = gcnew String("ERROR: device class should be Multi-interface Function " +
+ USB_MISCELLANEOUS_DEVICE +
+ "is used");
+ }
+ deviceDetails->UvcVersion = IsUVCDevice((PUSBDEVICEINFO) deviceInfo);
+
+ // This device configuration has 1 or more IAD descriptors
+ if (connectionInfo->DeviceDescriptor.bDeviceSubClass == USB_COMMON_SUB_CLASS)
+ {
+ deviceDetails->SubclassType = gcnew String("Common Class Sub Class");
+ }
+ else
+ {
+ deviceDetails->SubclassTypeError = gcnew String("ERROR: device SubClass should be USB Common Sub Class" +
+ USB_COMMON_SUB_CLASS +
+ " when IAD descriptor is used");
+ }
+
+ // Check device protocol
+ if (connectionInfo->DeviceDescriptor.bDeviceProtocol == USB_IAD_PROTOCOL)
+ {
+ deviceDetails->DeviceProtocol = gcnew String("Interface Association Descriptor protocol");
+ }
+ else
+ {
+ deviceDetails->DeviceProtocolError = gcnew String("ERROR: device Protocol should be USB IAD Protocol " +
+ USB_IAD_PROTOCOL +
+ " when IAD descriptor is used");
+ }
+
+ }
+ else
+ {
+ deviceDetails->DeviceType = XmlGetDeviceClassString(connectionInfo->DeviceDescriptor.bDeviceClass);
+
+ if (connectionInfo->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_BILLBOARD &&
+ (connectionInfo->DeviceDescriptor.bDeviceSubClass != 0x0 ||
+ connectionInfo->DeviceDescriptor.bDeviceProtocol != 0x0))
+ {
+ deviceDetails->DeviceTypeError = gcnew String("ERROR: Billboard device has invalid bDeviceSubclass/bDeviceProtocol");
+ }
+
+ if (connectionInfo->DeviceDescriptor.bDeviceClass == USB_MISCELLANEOUS_DEVICE)
+ {
+ deviceDetails->DeviceTypeError = gcnew String("ERROR: Multi-interface Function code " +
+ connectionInfo->DeviceDescriptor.bDeviceClass +
+ " used for device with no IAD descriptors");
+ }
+
+ if (connectionInfo->DeviceDescriptor.bDeviceClass == USB_COMMUNICATION_DEVICE ||
+ connectionInfo->DeviceDescriptor.bDeviceClass == USB_HUB_DEVICE ||
+ connectionInfo->DeviceDescriptor.bDeviceClass == USB_DIAGNOSTIC_DEVICE ||
+ connectionInfo->DeviceDescriptor.bDeviceClass == USB_WIRELESS_CONTROLLER_DEVICE ||
+ connectionInfo->DeviceDescriptor.bDeviceClass == USB_MISCELLANEOUS_DEVICE ||
+ connectionInfo->DeviceDescriptor.bDeviceClass == USB_VENDOR_SPECIFIC_DEVICE)
+ {
+ tog = false;
+ }
+
+ // Not an IAD device, so all subclass values are invalid
+ if (connectionInfo->DeviceDescriptor.bDeviceSubClass > 0x00 &&
+ connectionInfo->DeviceDescriptor.bDeviceSubClass < 0xFF)
+ {
+ deviceDetails->SubclassTypeError = gcnew String("ERROR: bDeviceSubClass is invalid - " +
+ connectionInfo->DeviceDescriptor.bDeviceSubClass);
+ }
+
+ // Not an IAD device, so all subclass values are invalid, check protocol
+ if (connectionInfo->DeviceDescriptor.bDeviceProtocol > 0x00 &&
+ connectionInfo->DeviceDescriptor.bDeviceProtocol < 0xFF && tog==1)
+ {
+ deviceDetails->DeviceProtocolError = gcnew String("ERROR: bDeviceProtocol is invalid - " +
+ connectionInfo->DeviceDescriptor.bDeviceProtocol);
+ }
+ }
+
+ return tog;
+}
+
+/*****************************************************************************
+
+ XmlAddConnectionInfo()
+
+ This routine adds connection information for the device
+ *****************************************************************************/
+void XmlAddConnectionInfo(
+ NodeConnectionInfoExType ^xmlConnectionInfo,
+ PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo,
+ PUSBDEVICEINFO deviceInfo,
+ PSTRING_DESCRIPTOR_NODE stringDesc,
+ PDEVICE_INFO_NODE pNode)
+{
+ NodeConnectionInfoExType ^ nc = xmlConnectionInfo;
+ bool tog = true;
+ nc->ConnectionInfoStruct = gcnew NodeConnectionInfoExStructType();
+
+ // Update the structure
+ XmlAddConnectionInfoSt(nc->ConnectionInfoStruct, connectionInfo, pNode);
+
+ // Add verbose fields
+ if (connectionInfo->ConnectionStatus == NoDeviceConnected)
+ {
+ // No device connected, nothing to do
+ return;
+ }
+
+ if (connectionInfo->DeviceDescriptor.iProduct)
+ {
+ // Add EN version of string descriptor
+
+ nc->IProductStringDescEn = XmlGetStringDescriptor(
+ connectionInfo->DeviceDescriptor.iProduct,
+ stringDesc,
+ true);
+ }
+
+ // Check open pipes count
+ if (connectionInfo->NumberOfOpenPipes == 0)
+ {
+ nc->PipeInfoError = gcnew String("ERROR: No open pipes");
+ }
+
+ // Check device descriptor length
+ if (connectionInfo->DeviceDescriptor.bLength != DEVICE_DESCRIPTOR_LENGTH)
+ {
+ nc->LengthError = gcnew String("ERROR: bLength " +
+ connectionInfo->DeviceDescriptor.bLength +
+ " incorrect, should be " +
+ DEVICE_DESCRIPTOR_LENGTH
+ );
+ }
+
+ // Check for device error
+ if ((connectionInfo->ConnectionStatus == DeviceFailedEnumeration) ||
+ (connectionInfo->ConnectionStatus == DeviceGeneralFailure))
+ {
+ nc->DeviceError = gcnew String("ERROR: Device enumeration failure");
+ }
+ else
+ {
+ nc->DeviceClassDetails = gcnew UsbDeviceClassDetailsType();
+
+ // Add device class details
+ tog = XmlAddDeviceClassDetails(
+ nc->DeviceClassDetails,
+ connectionInfo,
+ deviceInfo);
+
+ nc->MaxPacketSizeInBytes = connectionInfo->DeviceDescriptor.bMaxPacketSize0;
+
+ // Validate speed
+ switch (connectionInfo->Speed)
+ {
+ case UsbLowSpeed:
+ if (connectionInfo->DeviceDescriptor.bMaxPacketSize0 != 8)
+ {
+ nc->PacketSizeError = gcnew String("ERROR: Low Speed Devices require bMaxPacketSize0 = 8");
+ }
+ break;
+ case UsbFullSpeed:
+ if (!(connectionInfo->DeviceDescriptor.bMaxPacketSize0 == 8 ||
+ connectionInfo->DeviceDescriptor.bMaxPacketSize0 == 16 ||
+ connectionInfo->DeviceDescriptor.bMaxPacketSize0 == 32 ||
+ connectionInfo->DeviceDescriptor.bMaxPacketSize0 == 64))
+ {
+ nc->PacketSizeError = gcnew String("ERROR: Full Speed Devices require bMaxPacketSize0 = 8, 16, 32, or 64");
+ }
+ break;
+ case UsbHighSpeed:
+ if (connectionInfo->DeviceDescriptor.bMaxPacketSize0 != 64)
+ {
+ nc->PacketSizeError = gcnew String("ERROR: High Speed Devices require bMaxPacketSize0 = 64");
+ }
+ break;
+ }
+
+ // Get string descriptors
+ nc->VendorString = PACHAR_TO_STRING(GetVendorString(connectionInfo->DeviceDescriptor.idVendor));
+
+ nc->ManufacturerString = XmlGetStringDescriptor(connectionInfo->DeviceDescriptor.iManufacturer, stringDesc, false);
+ nc->ProductString = XmlGetStringDescriptor(connectionInfo->DeviceDescriptor.iProduct, stringDesc, false);
+ nc->LangIdString = XmlGetLangIdString(connectionInfo->DeviceDescriptor.iProduct, stringDesc);
+ nc->SerialString = XmlGetStringDescriptor(connectionInfo->DeviceDescriptor.iSerialNumber, stringDesc, false);
+
+ // Validate configuration
+ if (connectionInfo->DeviceDescriptor.bNumConfigurations != 1)
+ {
+ nc->ConfigurationCountError = gcnew String("WARNING: Most host controllers will only work with "\
+ "one configuration per speed");
+ }
+ }
+ return;
+}
+
+
+/*****************************************************************************
+
+ XmlAddExternalHub()
+
+ Add a external to the parent Host Controller or hub. This is determined by the
+ last object pushed on the stack
+ *****************************************************************************/
+HRESULT XmlAddExternalHub(PSTR ehName, PUSBEXTERNALHUBINFO ehInfo)
+{
+ HRESULT hr = S_OK;
+ Object ^ parent = gXmlStack->Peek();
+ ExternalHubType ^exHub = nullptr;
+
+ UNREFERENCED_PARAMETER(ehName);
+
+ if (NULL == ehInfo)
+ {
+ return E_FAIL;
+ }
+
+ exHub = AddExternalHub(parent);
+
+ if (exHub != nullptr)
+ {
+ exHub->HubName = PACHAR_TO_STRING(ehInfo->HubName);
+
+ if (NULL != ehInfo->UsbDeviceProperties)
+ {
+ exHub->HwId = PACHAR_TO_STRING(ehInfo->UsbDeviceProperties->HwId);
+ exHub->DeviceId = PACHAR_TO_STRING(ehInfo->UsbDeviceProperties->DeviceId);
+ exHub->ServiceName = PACHAR_TO_STRING(ehInfo->UsbDeviceProperties->Service);
+ exHub->DeviceName = PACHAR_TO_STRING(ehInfo->UsbDeviceProperties->DeviceDesc);
+ exHub->DeviceClass = PACHAR_TO_STRING(ehInfo->UsbDeviceProperties->DeviceClass);
+ }
+
+ exHub->HubNodeInformation = gcnew HubNodeInformationType();
+ XmlAddHubNodeInformation(exHub->HubNodeInformation, ehInfo->HubInfo);
+
+ exHub->HubInformationEx = gcnew HubInformationExType();
+ XmlAddHubInformationEx(exHub->HubInformationEx, ehInfo->HubInfoEx);
+
+ exHub->HubCapabilityEx = gcnew HubCapabilitiesExType();
+ XmlAddHubCapabilitiesEx(exHub->HubCapabilityEx, ehInfo->HubCapabilityEx);
+
+ exHub->ConnectionInfo = gcnew NodeConnectionInfoExType();
+
+ // Update protocol
+ if (NULL != ehInfo->ConnectionInfo)
+ {
+ switch(ehInfo->ConnectionInfo->Speed)
+ {
+ case UsbLowSpeed:
+ case UsbFullSpeed:
+ exHub->UsbProtocol = gcnew String(USB_1_1);
+ break;
+ case UsbHighSpeed:
+ exHub->UsbProtocol = gcnew String(USB_2_0);
+ break;
+ case UsbSuperSpeed:
+ exHub->UsbProtocol = gcnew String(USB_3_0);
+ break;
+ }
+ }
+
+ // Add connection info
+ XmlAddConnectionInfo(
+ exHub->ConnectionInfo,
+ ehInfo->ConnectionInfo,
+ (PUSBDEVICEINFO) ehInfo,
+ ehInfo->StringDescs,
+ ehInfo->DeviceInfoNode
+ );
+
+ // Add port connectors
+ if (NULL != ehInfo->PortConnectorProps)
+ {
+ exHub->PortConnector = gcnew PortConnectorType();
+
+ XmlAddPortConnectorProps(
+ exHub->PortConnector,
+ ehInfo->PortConnectorProps
+ );
+ }
+ // Add connection info V2
+ exHub->ConnectionInfoV2 = gcnew NodeConnectionInfoExV2Type();
+
+ XmlAddConnectionInfoV2(
+ exHub->ConnectionInfoV2,
+ ehInfo->ConnectionInfoV2
+ );
+
+ // Add configuration descriptor
+ if (NULL != ehInfo->ConfigDesc)
+ {
+ exHub->DeviceConfiguration = XmlGetConfigDescriptors(
+ (PUSBDEVICEINFO) ehInfo,
+ (PUSB_CONFIGURATION_DESCRIPTOR) (ehInfo->ConfigDesc + 1),
+ ehInfo->StringDescs
+ );
+ }
+
+ // Add BOS descriptor
+ if (NULL != ehInfo->BosDesc)
+ {
+ exHub->BosDescriptor = XmlGetBosDescriptor((PUSB_BOS_DESCRIPTOR) (ehInfo->BosDesc + 1), ehInfo->StringDescs);
+ }
+
+ gXmlStack->Push(exHub);
+ }
+ else
+ {
+ hr = E_FAIL;
+ }
+ return hr;
+}
+
+/*****************************************************************************
+
+ XmlGetBosDescriptor()
+
+ Gets the Bos descriptor object for given BOS descriptor
+ *****************************************************************************/
+UsbBosDescriptorType ^ XmlGetBosDescriptor(
+ PUSB_BOS_DESCRIPTOR bosDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ )
+{
+ PUSB_COMMON_DESCRIPTOR commonDesc = NULL;
+ PUSB_DEVICE_CAPABILITY_DESCRIPTOR capDesc = NULL;
+ UsbBosDescriptorType ^ bosXmlDesc = nullptr;
+ ArrayList ^usb20CapExtDescList = gcnew ArrayList();
+ ArrayList ^usbSuperSpeedExtDescList = gcnew ArrayList();
+ ArrayList ^usbContIdCapExtDescList = gcnew ArrayList();
+ ArrayList ^usbUnknownDescList = gcnew ArrayList();
+ ArrayList ^usbBillboardDescList = gcnew ArrayList();
+
+ if(NULL == bosDesc)
+ {
+ return nullptr;
+ }
+
+ // Initialize attributes
+ bosXmlDesc = gcnew UsbBosDescriptorType();
+ bosXmlDesc->BLength = bosDesc->bLength;
+ bosXmlDesc->BDescriptorType = bosDesc->bDescriptorType;
+ bosXmlDesc->WTotalLength = bosDesc->wTotalLength;
+ bosXmlDesc->BNumDeviceCaps = bosDesc->bNumDeviceCaps;
+
+ commonDesc = (PUSB_COMMON_DESCRIPTOR) bosDesc;
+
+ while ((commonDesc = GetNextDescriptor((PUSB_COMMON_DESCRIPTOR) bosDesc,
+ bosDesc->wTotalLength,
+ commonDesc,
+ -1)) != NULL)
+ {
+ switch (commonDesc->bDescriptorType)
+ {
+ case USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE:
+ capDesc = (PUSB_DEVICE_CAPABILITY_DESCRIPTOR)commonDesc;
+ switch (capDesc->bDevCapabilityType)
+ {
+ case USB_DEVICE_CAPABILITY_USB20_EXTENSION:
+ usb20CapExtDescList->Add(
+ XmlGetUsb20CapabilityExtensionDescriptor(
+ (PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR)capDesc
+ )
+ );
+ break;
+ case USB_DEVICE_CAPABILITY_SUPERSPEED_USB:
+ usbSuperSpeedExtDescList->Add(
+ XmlGetSuperSpeedCapabilityExtensionDescriptor(
+ (PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR)capDesc
+ )
+ );
+ break;
+ case USB_DEVICE_CAPABILITY_CONTAINER_ID:
+ usbContIdCapExtDescList->Add(
+ XmlGetContainerIdCapabilityExtensionDescriptor(
+ (PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR)capDesc
+ )
+ );
+ break;
+ case USB_DEVICE_CAPABILITY_BILLBOARD:
+ usbBillboardDescList->Add(
+ XmlGetBillboardCapabilityDescriptor(
+ (PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR) capDesc,
+ stringDesc
+ )
+ );
+ break;
+ default:
+ usbUnknownDescList->Add(
+ XmlGetUnknownDescriptor(
+ (PUSB_COMMON_DESCRIPTOR) capDesc
+ )
+ );
+ break;
+ }
+ break;
+ default:
+ usbUnknownDescList->Add(XmlGetUnknownDescriptor(commonDesc));
+ break;
+ }
+ }
+
+ // Convert lists to arrays for and add to Bos Descriptor
+ bosXmlDesc->UnknownDescriptor = reinterpret_cast<array<UsbDeviceUnknownDescriptorType ^>^> (
+ usbUnknownDescList->ToArray(UsbDeviceUnknownDescriptorType::typeid)
+ );
+ bosXmlDesc->UsbSuperSpeedExtensionDescriptor = reinterpret_cast<array<UsbSuperSpeedExtensionDescriptorType ^>^> (
+ usbSuperSpeedExtDescList->ToArray(UsbSuperSpeedExtensionDescriptorType::typeid)
+ );
+ bosXmlDesc->UsbUsb20ExtensionDescriptor = reinterpret_cast<array<UsbUsb20ExtensionDescriptorType ^>^> (
+ usb20CapExtDescList->ToArray(UsbUsb20ExtensionDescriptorType::typeid)
+ );
+ bosXmlDesc->UsbDispContIdCapExtDescriptor = reinterpret_cast<array<UsbDispContIdCapExtDescriptorType ^>^> (
+ usbContIdCapExtDescList->ToArray(UsbDispContIdCapExtDescriptorType::typeid)
+ );
+ bosXmlDesc->UsbBillboardCapabilityDescriptor = reinterpret_cast<array<UsbBillboardCapabilityDescriptorType ^>^> (
+ usbBillboardDescList->ToArray(UsbBillboardCapabilityDescriptorType::typeid)
+ );
+
+ return bosXmlDesc;
+}
+
+
+/*****************************************************************************
+
+ XmlGetUsb20CapabilityExtensionDescriptor()
+
+ Gets a Usb20Capability extension descriptor object from the given descriptor
+ *****************************************************************************/
+UsbUsb20ExtensionDescriptorType ^ XmlGetUsb20CapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR capDesc
+ )
+{
+ UsbUsb20ExtensionDescriptorType ^ capXmlDesc = nullptr;
+
+ if(NULL == capDesc)
+ {
+ return nullptr;
+ }
+
+ capXmlDesc = gcnew UsbUsb20ExtensionDescriptorType();
+
+ capXmlDesc->BLength = capDesc->bLength;
+ capXmlDesc->BDescriptorType = capDesc->bDescriptorType;
+ capXmlDesc->BDevCapabilityType = capDesc->bDevCapabilityType;
+ capXmlDesc->BmAttributes = capDesc->bmAttributes.AsUlong;
+
+ if (capDesc->bmAttributes.AsUlong & USB_DEVICE_CAPABILITY_USB20_EXTENSION_BMATTRIBUTES_RESERVED_MASK)
+ {
+ capXmlDesc->ReservedBitError = gcnew String("ERROR: bits 31..2 and bit 0 are reserved and must be 0");
+ }
+ if (capDesc->bmAttributes.LPMCapable == 1)
+ {
+ capXmlDesc->SupportsLinkPowerManagement = true;
+ }
+
+ return capXmlDesc;
+}
+
+/*****************************************************************************
+
+ XmlGetSuperSpeedCapabilityExtensionDescriptor()
+
+ Gets a Super speed capability extension descriptor object from the given descriptor
+ *****************************************************************************/
+UsbSuperSpeedExtensionDescriptorType ^ XmlGetSuperSpeedCapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR capDesc
+ )
+{
+ UsbSuperSpeedExtensionDescriptorType ^ capXmlDesc = nullptr;
+
+ if(NULL == capDesc)
+ {
+ return nullptr;
+ }
+
+ capXmlDesc = gcnew UsbSuperSpeedExtensionDescriptorType();
+
+ capXmlDesc->BLength = capDesc->bLength;
+ capXmlDesc->BDescriptorType = capDesc->bDescriptorType;
+ capXmlDesc->BDevCapabilityType = capDesc->bDevCapabilityType;
+ capXmlDesc->BmAttributes = capDesc->bmAttributes;
+ capXmlDesc->BU1DevExitLat = capDesc->bU1DevExitLat;
+ capXmlDesc->WSpeedsSupported = capDesc->wSpeedsSupported;
+ capXmlDesc->WU2DevExitLat = capDesc->wU2DevExitLat;
+ capXmlDesc->BFunctionalitySupport = capDesc->bFunctionalitySupport;
+
+ // Add descriptive fields
+ if (capDesc->bmAttributes & USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_RESERVED_MASK)
+ {
+ capXmlDesc->ReservedAttributesBitError = gcnew String("ERROR: bits 7:2 and bit 0 are reserved");
+ }
+ if (capDesc->bmAttributes & USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_LTM_CAPABLE)
+ {
+ capXmlDesc->LatencyToleranceMsgCapable = true;
+ }
+ if (capDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_LOW)
+ {
+ capXmlDesc->SupportsLowSpeed = true;
+ }
+ if (capDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_FULL)
+ {
+ capXmlDesc->SupportsFullSpeed = true;
+ }
+ if (capDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_HIGH)
+ {
+ capXmlDesc->SupportsHighSpeed = true;
+ }
+ if (capDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_SUPER)
+ {
+ capXmlDesc->SupportsSuperSpeed = true;
+ }
+ if (capDesc->wSpeedsSupported & USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_RESERVED_MASK)
+ {
+ capXmlDesc->ReservedSpeedError = gcnew String("ERROR: bits 15:4 are reserved");
+ }
+
+
+ switch (capDesc->bFunctionalitySupport)
+ {
+ case UsbLowSpeed:
+ capXmlDesc->LowestSpeed = gcnew String("low-speed");
+ break;
+ case UsbFullSpeed:
+ capXmlDesc->LowestSpeed = gcnew String("full-speed");
+ break;
+ case UsbHighSpeed:
+ capXmlDesc->LowestSpeed = gcnew String("high-speed");
+ break;
+ case UsbSuperSpeed:
+ capXmlDesc->LowestSpeed = gcnew String("SuperSpeed");
+ break;
+ default:
+ capXmlDesc->LowestSpeed = gcnew String("ERROR: Invalid value");
+ break;
+ }
+
+ if (capDesc->bU1DevExitLat <= USB_DEVICE_CAPABILITY_SUPERSPEED_U1_DEVICE_EXIT_MAX_VALUE)
+ {
+ capXmlDesc->U1DevExitLatencyString = String::Format("Less than {0} micro-seconds", capDesc->bU1DevExitLat);
+ }
+ else
+ {
+ capXmlDesc->U1DevExitLatencyString = gcnew String("ERROR: Invalid value");
+ }
+
+ if (capDesc->wU2DevExitLat <= USB_DEVICE_CAPABILITY_SUPERSPEED_U2_DEVICE_EXIT_MAX_VALUE)
+ {
+ capXmlDesc->U2DevExitLatencyString = String::Format("Less than {0} micro-seconds", capDesc->wU2DevExitLat);
+ }
+ else
+ {
+ capXmlDesc->U2DevExitLatencyString = gcnew String("ERROR: Invalid value");
+ }
+
+ return capXmlDesc;
+}
+
+/*****************************************************************************
+
+ XmlGetContainerIdCapabilityExtensionDescriptor()
+
+ Gets a Usb20Capability extension descriptor object from the given descriptor
+ *****************************************************************************/
+UsbDispContIdCapExtDescriptorType ^ XmlGetContainerIdCapabilityExtensionDescriptor(
+ PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR capDesc
+ )
+{
+ UsbDispContIdCapExtDescriptorType ^ capXmlDesc = nullptr;
+ LPGUID pGuid = NULL;
+
+ if(NULL == capDesc)
+ {
+ return nullptr;
+ }
+
+ capXmlDesc = gcnew UsbDispContIdCapExtDescriptorType();
+
+ capXmlDesc->BLength = capDesc->bLength;
+ capXmlDesc->BDescriptorType = capDesc->bDescriptorType;
+ capXmlDesc->BDevCapabilityType = capDesc->bDevCapabilityType;
+ capXmlDesc->BReserved = capDesc->bReserved;
+
+ if (capDesc->bReserved != 0)
+ {
+ capXmlDesc->ReservedBitError = gcnew String("ERROR: field is reserved and should be zero");
+ }
+
+ pGuid = (LPGUID) capDesc->ContainerID;
+
+ capXmlDesc->ContainerIdStr = String::Format("{0:X}-{1:X}-{2:X}-{3:X}{4:X}-{5:X}{6:X}{7:X}{8:X}{9:X}{10:X}",
+ pGuid->Data1,
+ pGuid->Data2,
+ pGuid->Data3,
+ pGuid->Data4[0],
+ pGuid->Data4[1],
+ pGuid->Data4[2],
+ pGuid->Data4[3],
+ pGuid->Data4[4],
+ pGuid->Data4[5],
+ pGuid->Data4[6],
+ pGuid->Data4[7]);
+
+ return capXmlDesc;
+}
+
+
+/*****************************************************************************
+
+XmlGetBillboardCapabilityDescriptor()
+
+Gets a billboard capability descriptor from a given descriptor
+*****************************************************************************/
+UsbBillboardCapabilityDescriptorType ^ XmlGetBillboardCapabilityDescriptor(
+ PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR capDesc,
+ PSTRING_DESCRIPTOR_NODE stringDesc
+ )
+{
+ UCHAR i = 0;
+ UCHAR bNumAlternateModes = 0;
+ UCHAR alternateModeConfiguration = 0;
+ UsbBillboardCapabilityDescriptorType ^ capXmlDesc = nullptr;
+ UsbBillboardSVIDType ^ svidXmlDesc = nullptr;
+ ArrayList ^ usbSVIDDescList = gcnew ArrayList();
+
+
+ if (NULL == capDesc)
+ {
+ return nullptr;
+ }
+
+ capXmlDesc = gcnew UsbBillboardCapabilityDescriptorType();
+
+
+ capXmlDesc->BLength = capDesc->bLength;
+ capXmlDesc->BDescriptorType = capDesc->bDescriptorType;
+ capXmlDesc->BDevCapabilityType = capDesc->bDevCapabilityType;
+ capXmlDesc->IAddtionalInfoURL = capDesc->iAddtionalInfoURL;
+ capXmlDesc->BNumberOfAlternateModes = capDesc->bNumberOfAlternateModes;
+ capXmlDesc->BPreferredAlternateMode = capDesc->bPreferredAlternateMode;
+ capXmlDesc->CalculatedBLength = sizeof(USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR) +
+ sizeof(capDesc->AlternateMode[0]) * (capDesc->bNumberOfAlternateModes - 1);
+ capXmlDesc->BillboardDescriptorErrors = gcnew String("");
+ capXmlDesc->AddtionalInfoURL = XmlGetStringDescriptor(
+ capDesc->iAddtionalInfoURL,
+ stringDesc,
+ false
+ );
+
+ if (capDesc->VconnPower.NoVconnPowerRequired)
+ {
+ capXmlDesc->VConnPower = gcnew String("The adapter does not require Vconn Power. Bits 2..0 ignored");
+ }
+ else
+ {
+ switch (capDesc->VconnPower.VConnPowerNeededForFullFunctionality)
+ {
+ case 0:
+ capXmlDesc->VConnPower = gcnew String("1W needed by adapter for full functionality");
+ break;
+ case 1:
+ capXmlDesc->VConnPower = gcnew String("1.5W needed by adapter for full functionality");
+ break;
+ case 7:
+ capXmlDesc->BillboardDescriptorErrors += "ERROR: VConnPowerNeededForFullFunctionality - Reserved value being used";
+ break;
+ default:
+ capXmlDesc->VConnPower = gcnew String(String::Format("{0} W needed by adapter for full functionality", capDesc->VconnPower.VConnPowerNeededForFullFunctionality));
+ }
+ }
+
+ if (capDesc->bNumberOfAlternateModes > BILLBOARD_MAX_NUM_ALT_MODE)
+ {
+ capXmlDesc->BillboardDescriptorErrors += "ERROR: Invalid bNumberofAlternateModes; ";
+ }
+ if (capDesc->VconnPower.Reserved)
+ {
+ capXmlDesc->BillboardDescriptorErrors += "ERROR: Reserved bits in VCONN Power being used; ";
+ }
+ if (capDesc->bReserved)
+ {
+ capXmlDesc->BillboardDescriptorErrors += "ERROR: bReserved being used; ";
+ }
+
+ bNumAlternateModes = capDesc->bNumberOfAlternateModes;
+ if (bNumAlternateModes > BILLBOARD_MAX_NUM_ALT_MODE)
+ {
+ bNumAlternateModes = BILLBOARD_MAX_NUM_ALT_MODE;
+ }
+ for (i = 0; i < bNumAlternateModes; i++)
+ {
+ svidXmlDesc = gcnew UsbBillboardSVIDType();
+ alternateModeConfiguration = ((capDesc->bmConfigured[i / 4]) >> ((i % 4) * 2)) & 0x3;
+ svidXmlDesc->WSVID = capDesc->AlternateMode[i].wSVID;
+ svidXmlDesc->BAlternateMode = capDesc->AlternateMode[i].bAlternateMode;
+ svidXmlDesc->IAlternateModeString = capDesc->AlternateMode[i].iAlternateModeSetting;
+ svidXmlDesc->AlternateModeString = XmlGetStringDescriptor(
+ capDesc->AlternateMode[i].iAlternateModeSetting,
+ stringDesc,
+ false
+ );
+
+ switch (alternateModeConfiguration)
+ {
+ case 0:
+ svidXmlDesc->Description = gcnew String("Unspecified Error");
+ break;
+ case 1:
+ svidXmlDesc->Description = gcnew String("Alternate Mode configuration not attempted");
+ break;
+ case 2:
+ svidXmlDesc->Description = gcnew String("Alternate Mode configuration attempted but unsuccessful");
+ break;
+ case 3:
+ svidXmlDesc->Description = gcnew String("Alternate Mode configuration successful");
+ break;
+ }
+ usbSVIDDescList->Add(svidXmlDesc);
+ }
+ capXmlDesc->UsbBillboardSVID = reinterpret_cast<array<UsbBillboardSVIDType ^>^> (
+ usbSVIDDescList->ToArray(UsbBillboardSVIDType::typeid));
+
+ return capXmlDesc;
+}
+
+/*****************************************************************************
+
+ XmlAddUsbDevice()
+
+ Add a external to the parent Host Controller or hub. This is determined by the
+ last object pushed on the stack
+ *****************************************************************************/
+HRESULT XmlAddUsbDevice(PSTR devName, PUSBDEVICEINFO deviceInfo)
+{
+ HRESULT hr = S_OK;
+ Object ^ parent = gXmlStack->Peek();
+ UsbDeviceType ^usbDevice = nullptr;
+ NoDeviceType ^noDevice = nullptr;
+
+ if (NULL == deviceInfo)
+ {
+ return E_FAIL;
+ }
+
+ if (deviceInfo->ConfigDesc == NULL)
+ {
+ // There is no USB device on this port, add a NoDevice type here instead of USB device
+ noDevice = AddDisconnectedPort(parent);
+
+ if (nullptr != noDevice)
+ {
+ noDevice->UsbPortNumber = gcnew String("");
+ noDevice->UsbPortNumber += deviceInfo->ConnectionInfo->ConnectionIndex;
+ noDevice->Name = PACHAR_TO_STRING(devName);
+ }
+ else
+ {
+ hr = E_FAIL;
+ }
+ }
+
+ else
+ {
+ usbDevice = AddUsbDevice(parent);
+
+ if (nullptr != usbDevice)
+ {
+ // Update device information
+ if (NULL != deviceInfo->UsbDeviceProperties)
+ {
+ usbDevice->HwId = PACHAR_TO_STRING(deviceInfo->UsbDeviceProperties->HwId);
+ usbDevice->DeviceId = PACHAR_TO_STRING(deviceInfo->UsbDeviceProperties->DeviceId);
+ usbDevice->ServiceName = PACHAR_TO_STRING(deviceInfo->UsbDeviceProperties->Service);
+ usbDevice->DeviceName = PACHAR_TO_STRING(deviceInfo->UsbDeviceProperties->DeviceDesc);
+ usbDevice->DeviceClass = PACHAR_TO_STRING(deviceInfo->UsbDeviceProperties->DeviceClass);
+ }
+
+ // Update port number
+ usbDevice->UsbPortNumber = gcnew String("");
+ usbDevice->UsbPortNumber += deviceInfo->ConnectionInfo->ConnectionIndex;
+ usbDevice->ConnectionInfo = gcnew NodeConnectionInfoExType();
+
+ // Update protocol
+ if (NULL != deviceInfo->ConnectionInfo)
+ {
+ switch(deviceInfo->ConnectionInfo->Speed)
+ {
+ case UsbLowSpeed:
+ case UsbFullSpeed:
+ usbDevice->UsbProtocol = gcnew String(USB_1_1);
+ break;
+ case UsbHighSpeed:
+ usbDevice->UsbProtocol = gcnew String(USB_2_0);
+ break;
+ case UsbSuperSpeed:
+ usbDevice->UsbProtocol = gcnew String(USB_3_0);
+ break;
+ }
+ }
+
+ // Add connection info
+ XmlAddConnectionInfo(
+ usbDevice->ConnectionInfo,
+ deviceInfo->ConnectionInfo,
+ (PUSBDEVICEINFO) deviceInfo,
+ deviceInfo->StringDescs,
+ deviceInfo->DeviceInfoNode
+ );
+
+ // Add port connector
+ if (NULL != deviceInfo->PortConnectorProps)
+ {
+ usbDevice->PortConnector = gcnew PortConnectorType();
+
+ XmlAddPortConnectorProps(
+ usbDevice->PortConnector,
+ deviceInfo->PortConnectorProps
+ );
+ }
+
+ // Add connectiontion info V2
+ if (NULL != deviceInfo->ConnectionInfoV2)
+ {
+ usbDevice->ConnectionInfoV2 = gcnew NodeConnectionInfoExV2Type();
+ XmlAddConnectionInfoV2(
+ usbDevice->ConnectionInfoV2,
+ deviceInfo->ConnectionInfoV2
+ );
+ }
+
+ // Add configuration descriptor
+ if (NULL != deviceInfo->ConfigDesc)
+ {
+ // The device configuration is allocated by XmlGetConfigDescriptors()
+ usbDevice->DeviceConfiguration = XmlGetConfigDescriptors(
+ (PUSBDEVICEINFO) deviceInfo,
+ (PUSB_CONFIGURATION_DESCRIPTOR) (deviceInfo->ConfigDesc + 1),
+ deviceInfo->StringDescs
+ );
+ }
+
+ // Add BOS descriptor
+ if (NULL != deviceInfo->BosDesc)
+ {
+ usbDevice->BosDescriptor = XmlGetBosDescriptor(
+ (PUSB_BOS_DESCRIPTOR) (deviceInfo->BosDesc + 1),
+ deviceInfo->StringDescs
+ );
+ }
+ }
+ else
+ {
+ hr = E_FAIL;
+ }
+ }
+ return hr;
+}
+
+/*****************************************************************************
+
+ XmlAddRootHub()
+
+ Add a root hub to the parent Host Controller
+ *****************************************************************************/
+HRESULT XmlAddRootHub(PSTR rhName, PUSBROOTHUBINFO rhInfo)
+{
+ HRESULT hr = S_OK;
+ Object ^ parent = gXmlStack->Peek();
+ HostControllerType ^ hcParent = nullptr;
+ PSTR rootHubName = rhInfo->HubName;
+
+ UNREFERENCED_PARAMETER(rhName);
+
+ hcParent = dynamic_cast<HostControllerType ^> (parent);
+
+ if (hcParent != nullptr)
+ {
+ RootHubType ^ rh = nullptr;
+ hcParent = (HostControllerType ^) parent;
+ hcParent->RootHub = gcnew RootHubType();
+
+ rh = hcParent->RootHub;
+ rh->HubName = PACHAR_TO_STRING(rootHubName);
+
+ if (NULL != rhInfo->UsbDeviceProperties)
+ {
+ rh->HwId = PACHAR_TO_STRING(rhInfo->UsbDeviceProperties->HwId);
+ rh->DeviceId = PACHAR_TO_STRING(rhInfo->UsbDeviceProperties->DeviceId);
+ rh->ServiceName = PACHAR_TO_STRING(rhInfo->UsbDeviceProperties->Service);
+ rh->DeviceName = PACHAR_TO_STRING(rhInfo->UsbDeviceProperties->DeviceDesc);
+ rh->DeviceClass = PACHAR_TO_STRING(rhInfo->UsbDeviceProperties->DeviceClass);
+
+ // Roothub protocol is same as HC protocol
+ rh->UsbProtocol = hcParent->UsbProtocol;
+ }
+
+ rh->HubNodeInformation = gcnew HubNodeInformationType();
+ XmlAddHubNodeInformation(rh->HubNodeInformation, rhInfo->HubInfo);
+
+ rh->HubInformationEx = gcnew HubInformationExType();
+ XmlAddHubInformationEx(rh->HubInformationEx, rhInfo->HubInfoEx);
+
+ rh->HubCapabilityEx = gcnew HubCapabilitiesExType();
+ XmlAddHubCapabilitiesEx(rh->HubCapabilityEx, rhInfo->HubCapabilityEx);
+
+ // Push root hub on to stack
+ gXmlStack->Push(rh);
+ }
+ else
+ {
+ // Root hub should be connected to a host controller
+ hr = E_FAIL;
+ }
+ return S_OK;
+}
+
+/*****************************************************************************
+
+ XmlSetVersion()
+
+ Set version information in XML tree
+ *****************************************************************************/
+VOID XmlSetVersion(
+ UCHAR uvcMajorVersion,
+ UCHAR uvcMinorVersion,
+ UCHAR uvcMajorSpecVersion,
+ UCHAR uvcMinorSpecVersion
+ )
+{
+ MachineInfoType ^ mInfo;
+ gXmlView->MachineInfo = gcnew MachineInfoType();
+
+ mInfo = gXmlView->MachineInfo;
+
+ mInfo->UvcMajorVersion = uvcMajorVersion;
+ mInfo->UvcMinorVersion = uvcMinorVersion;
+ mInfo->UvcMajorSpecVersion = uvcMajorSpecVersion;
+ mInfo->UvcMinorSpecVersion = uvcMinorSpecVersion;
+
+}
+
+/*****************************************************************************
+
+ InitXmlHelper()
+
+ Initialize XML helper
+ *****************************************************************************/
+HRESULT InitXmlHelper()
+{
+ HRESULT hr = S_OK;
+
+ (XmlGlobal::Instance())->ViewAll = gcnew UvcViewAll();
+ (XmlGlobal::Instance())->ViewAll->UvcView = gcnew UvcViewType();
+
+ //
+ // Initialize fields to null so we can check against them for allocation
+ //
+ (XmlGlobal::Instance())->ViewAll->UvcView->MachineInfo = nullptr;
+ (XmlGlobal::Instance())->ViewAll->UvcView->UsbTree = nullptr;
+
+ XmlSetVersion(
+ UVC_SPEC_MAJOR_VERSION,
+ UVC_SPEC_MINOR_VERSION,
+ USBVIEW_MAJOR_VERSION,
+ USBVIEW_MINOR_VERSION
+ );
+
+ gXmlStack->Push(gXmlView);
+
+ gXmlViewInitialized = TRUE;
+
+ return hr;
+}
+
+/*****************************************************************************
+
+ SaveXml()
+
+ Saves the inmemory USB view as XML file
+ *****************************************************************************/
+HRESULT SaveXml(LPTSTR szfileName, DWORD dwCreationDisposition)
+{
+ HRESULT hr = S_OK;
+
+ if (gXmlViewInitialized)
+ {
+ try
+ {
+ String ^fileName = PACHAR_TO_STRING(szfileName);
+ XmlSerializer ^ serializer = gcnew XmlSerializer(UvcViewAll::typeid);
+ TextWriter ^ writer = nullptr;
+
+ if (dwCreationDisposition != CREATE_ALWAYS)
+ {
+ // Check if file exits and return failure if it does
+ if (File::Exists(fileName))
+ {
+ hr = HRESULT_FROM_WIN32(ERROR_FILE_EXISTS);
+ }
+ }
+
+ // Check if file name is NULL
+ if (String::IsNullOrEmpty(fileName))
+ {
+ hr = E_INVALIDARG;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ writer = gcnew StreamWriter(fileName);
+ serializer->Serialize(writer, (XmlGlobal::Instance())->ViewAll);
+ writer->Close();
+ }
+
+ // Release and reinit XML View for next iteration if requested
+ ReleaseXmlWriter();
+ InitXmlHelper();
+
+ }
+ catch(Exception ^ ex)
+ {
+ hr = (HRESULT) Marshal::GetHRForException(ex);
+ }
+ }
+ else
+ {
+ hr = E_FAIL;
+ }
+
+ return hr;
+}
+
+
+/*****************************************************************************
+
+ ReleaseXmlWriter()
+
+ *****************************************************************************/
+HRESULT ReleaseXmlWriter()
+{
+ HRESULT hr = S_OK;
+
+ if (gXmlViewInitialized)
+ {
+ gXmlViewInitialized = FALSE;
+ delete XmlGlobal::Instance();
+ }
+
+ return hr;
+}
+
diff --git a/tests/projects/winsdk/usbview/xmlhelper.h b/tests/projects/winsdk/usbview/xmlhelper.h new file mode 100644 index 000000000..1da37d97b --- /dev/null +++ b/tests/projects/winsdk/usbview/xmlhelper.h @@ -0,0 +1,41 @@ +/*++
+
+Copyright (c) 1997-2011 Microsoft Corporation
+
+Module Name:
+
+ XMLHELPER.H
+
+Abstract:
+
+ This helper file declaration for XML helper APIs
+
+Environment:
+
+ user mode
+
+Revision History:
+
+ 05-05-11 : created
+
+--*/
+
+#pragma once
+
+/*****************************************************************************
+ I N C L U D E S
+*****************************************************************************/
+#include "uvcview.h"
+
+EXTERN_C HRESULT InitXmlHelper();
+EXTERN_C HRESULT ReleaseXmlWriter();
+EXTERN_C HRESULT SaveXml(LPTSTR szfileName, DWORD dwCreationDisposition);
+EXTERN_C HRESULT XmlAddHostController(
+ PSTR hcName,
+ PUSBHOSTCONTROLLERINFO hcInfo
+ );
+EXTERN_C HRESULT XmlAddRootHub(PSTR rhName, PUSBROOTHUBINFO rhInfo);
+EXTERN_C HRESULT XmlAddExternalHub(PSTR ehName, PUSBEXTERNALHUBINFO ehInfo);
+EXTERN_C HRESULT XmlAddUsbDevice(PSTR devName, PUSBDEVICEINFO deviceInfo);
+EXTERN_C VOID XmlNotifyEndOfNodeList(PVOID pContext);
+
|
