enum.c
资源名称:USBView.rar [点击查看]
上传用户:gzccxsp
上传日期:2015-07-14
资源大小:182k
文件大小:50k
源码类别:
MacOS编程
开发平台:
Visual C++
- /*++
- Copyright (c) 1997-1998 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
- 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.
- 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)
- Given the name of a hub, use CreateFile() to hub 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
- 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
- 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). 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 <windows.h>
- #include <basetyps.h>
- #include <winioctl.h>
- #include <string.h>
- #include "usbview.h"
- //*****************************************************************************
- // D E F I N E S
- //*****************************************************************************
- #define NUM_HCS_TO_CHECK 10
- //*****************************************************************************
- // L O C A L F U N C T I O N P R O T O T Y P E S
- //*****************************************************************************
- VOID
- EnumerateHub (
- HTREEITEM hTreeParent,
- PCHAR HubName,
- PUSB_NODE_CONNECTION_INFORMATION ConnectionInfo,
- PUSB_DESCRIPTOR_REQUEST ConfigDesc,
- PSTRING_DESCRIPTOR_NODE StringDescs,
- PCHAR DeviceDesc
- );
- 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
- );
- 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
- );
- PSTRING_DESCRIPTOR_NODE
- GetStringDescriptors (
- HANDLE hHubDevice,
- ULONG ConnectionIndex,
- UCHAR DescriptorIndex,
- ULONG NumLanguageIDs,
- USHORT *LanguageIDs,
- PSTRING_DESCRIPTOR_NODE StringDescNodeTail
- );
- //*****************************************************************************
- // 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[] =
- {
- "NoDeviceConnected",
- "DeviceConnected",
- "DeviceFailedEnumeration",
- "DeviceGeneralFailure",
- "DeviceCausedOvercurrent",
- "DeviceNotEnoughPower"
- };
- ULONG TotalDevicesConnected;
- //*****************************************************************************
- //
- // EnumerateHostControllers()
- //
- // hTreeParent - Handle of the TreeView item under which host controllers
- // should be added.
- //
- //*****************************************************************************
- VOID
- EnumerateHostControllers (
- HTREEITEM hTreeParent,
- ULONG *DevicesConnected
- )
- {
- char HCName[16];
- int HCNum;
- HANDLE hHCDev;
- HTREEITEM hHCItem;
- PCHAR rootHubName;
- PCHAR leafName;
- TotalDevicesConnected = 0;
- TotalHubs = 0;
- // Iterate over some Host Controller names and try to open them.
- //
- for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
- {
- wsprintf(HCName, "\\.\HCD%d", HCNum);
- hHCDev = CreateFile(HCName,
- 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)
- {
- PCHAR driverKeyName, deviceDesc;
- driverKeyName = GetHCDDriverKeyName(hHCDev);
- leafName = HCName + sizeof("\\.\") - sizeof("");
- if (driverKeyName)
- {
- deviceDesc = DriverNameToDeviceDesc(driverKeyName);
- if (deviceDesc)
- {
- leafName = deviceDesc;
- }
- FREE(driverKeyName);
- }
- hHCItem = AddLeaf(hTreeParent,
- 0,
- leafName
- );
- if (hHCItem)
- {
- rootHubName = GetRootHubName(hHCDev); //Get the hub name.
- if (rootHubName != NULL)
- {
- EnumerateHub(hHCItem,
- rootHubName,
- NULL, // ConnectionInfo
- NULL, // ConfigDesc
- NULL, // StringDescs
- "RootHub" // DeviceDesc
- );
- }
- }
- CloseHandle(hHCDev);
- }
- }
- *DevicesConnected = TotalDevicesConnected;
- }
- //*****************************************************************************
- //
- // 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.
- //
- //*****************************************************************************
- VOID
- EnumerateHub (
- HTREEITEM hTreeParent,
- PCHAR HubName,
- PUSB_NODE_CONNECTION_INFORMATION ConnectionInfo,
- PUSB_DESCRIPTOR_REQUEST ConfigDesc,
- PSTRING_DESCRIPTOR_NODE StringDescs,
- PCHAR DeviceDesc
- )
- {
- HANDLE hHubDevice;
- HTREEITEM hItem;
- PCHAR deviceName;
- BOOL success;
- ULONG nBytes;
- PUSBDEVICEINFO info;
- CHAR leafName[512]; // XXXXX how big does this have to be?
- // Initialize locals to not allocated state so the error cleanup routine
- // only tries to cleanup things that were successfully allocated.
- //
- info = NULL;
- hHubDevice = INVALID_HANDLE_VALUE;
- // 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();
- goto EnumerateHubError;
- }
- // Keep copies of the Hub Name, Connection Info, and Configuration
- // Descriptor pointers
- //
- info->HubName = HubName;
- info->ConnectionInfo = ConnectionInfo;
- info->ConfigDesc = ConfigDesc;
- info->StringDescs = StringDescs;
- // Allocate some space for a USB_NODE_INFORMATION structure for this Hub,
- //
- info->HubInfo = (PUSB_NODE_INFORMATION)ALLOC(sizeof(USB_NODE_INFORMATION));
- if (info->HubInfo == NULL)
- {
- OOPS();
- goto EnumerateHubError;
- }
- // Allocate a temp buffer for the full hub device name.
- //
- deviceName = (PCHAR)ALLOC(strlen(HubName) + sizeof("\\.\"));
- if (deviceName == NULL)
- {
- OOPS();
- goto EnumerateHubError;
- }
- // Create the full hub device name
- //
- strcpy(deviceName, "\\.\");
- strcpy(deviceName + sizeof("\\.\") - 1, info->HubName);
- // 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,
- info->HubInfo,
- sizeof(USB_NODE_INFORMATION),
- info->HubInfo,
- sizeof(USB_NODE_INFORMATION),
- &nBytes,
- NULL);
- if (!success)
- {
- OOPS();
- goto EnumerateHubError;
- }
- // Build the leaf name from the port number and the device description
- //
- if (ConnectionInfo)
- {
- wsprintf(leafName, "[Port%d] ", ConnectionInfo->ConnectionIndex);
- strcat(leafName, ConnectionStatuses[ConnectionInfo->ConnectionStatus]);
- strcat(leafName, " : ");
- }
- else
- {
- leafName[0] = 0;
- }
- if (DeviceDesc)
- {
- strcat(leafName, DeviceDesc);
- }
- else
- {
- strcat(leafName, info->HubName);
- }
- // 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);
- if (hItem == NULL)
- {
- OOPS();
- goto EnumerateHubError;
- }
- // Now recursively enumrate the ports of this hub.
- //
- EnumerateHubPorts(
- hItem,
- hHubDevice,
- info->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 (info != NULL)
- {
- if (info->HubName != NULL)
- {
- FREE(info->HubName);
- info->HubName = NULL;
- }
- if (info->HubInfo != NULL)
- {
- FREE(info->HubInfo);
- info->HubInfo;
- }
- FREE(info);
- info = NULL;
- }
- if (ConnectionInfo)
- {
- FREE(ConnectionInfo);
- }
- if (ConfigDesc)
- {
- FREE(ConfigDesc);
- }
- 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
- )
- {
- HTREEITEM hItem;
- ULONG index;
- BOOL success;
- PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
- PUSB_DESCRIPTOR_REQUEST configDesc;
- PSTRING_DESCRIPTOR_NODE stringDescs;
- PUSBDEVICEINFO info;
- PCHAR driverKeyName;
- PCHAR deviceDesc;
- CHAR leafName[512]; // XXXXX how big does this have to be?
- // Loop over all ports of the hub.
- //
- // Port indices are 1 based, not 0 based.
- //
- for (index=1; index <= NumPorts; index++)
- {
- ULONG nBytes;
- // 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.
- //
- nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
- sizeof(USB_PIPE_INFO) * 30;
- connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)ALLOC(nBytes);
- if (connectionInfo == NULL)
- {
- OOPS();
- break;
- }
- //
- // Now query USBHUB for the USB_NODE_CONNECTION_INFORMATION structure
- // for this port. This will tell us if a device is attached to this
- // port, among other things.
- //
- connectionInfo->ConnectionIndex = index;
- success = DeviceIoControl(hHubDevice,
- IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
- connectionInfo,
- nBytes,
- connectionInfo,
- nBytes,
- &nBytes,
- NULL);
- if (!success)
- {
- FREE(connectionInfo);
- continue;
- }
- // Update the count of connected devices
- //
- if (connectionInfo->ConnectionStatus == DeviceConnected)
- {
- TotalDevicesConnected++;
- }
- if (connectionInfo->DeviceIsHub)
- {
- TotalHubs++;
- }
- // If there is a device connected, get the Device Description
- //
- deviceDesc = NULL;
- if (connectionInfo->ConnectionStatus != NoDeviceConnected)
- {
- driverKeyName = GetDriverKeyName(hHubDevice,
- index);
- if (driverKeyName)
- {
- deviceDesc = DriverNameToDeviceDesc(driverKeyName);
- FREE(driverKeyName);
- }
- }
- // If there is a device connected to the port, try to retrieve the
- // Configuration Descriptor from the device.
- //
- if (gDoConfigDesc &&
- connectionInfo->ConnectionStatus == DeviceConnected)
- {
- configDesc = GetConfigDescriptor(hHubDevice,
- index,
- 0);
- }
- else
- {
- configDesc = NULL;
- }
- if (configDesc != NULL &&
- AreThereStringDescriptors(&connectionInfo->DeviceDescriptor,
- (PUSB_CONFIGURATION_DESCRIPTOR)(configDesc+1)))
- {
- stringDescs = GetAllStringDescriptors(
- hHubDevice,
- index,
- &connectionInfo->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 (connectionInfo->DeviceIsHub)
- {
- PCHAR extHubName;
- extHubName = GetExternalHubName(hHubDevice,
- index);
- if (extHubName != NULL)
- {
- EnumerateHub(hTreeParent, //hPortItem,
- extHubName, //hub name.
- connectionInfo,
- configDesc,
- stringDescs,
- deviceDesc);
- // On to the next port
- //
- continue;
- }
- }
- // 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);
- }
- FREE(connectionInfo);
- break;
- }
- info->ConnectionInfo = connectionInfo;
- info->ConfigDesc = configDesc;
- info->StringDescs = stringDescs;
- wsprintf(leafName, "[Port%d] ", index);
- strcat(leafName, ConnectionStatuses[connectionInfo->ConnectionStatus]);
- if (deviceDesc)
- {
- strcat(leafName, " : ");
- strcat(leafName, deviceDesc);
- }
- hItem = AddLeaf(hTreeParent, //hPortItem,
- (LPARAM)info,
- leafName);
- }
- }
- //*****************************************************************************
- //
- // WideStrToMultiStr()
- //
- //*****************************************************************************
- PCHAR WideStrToMultiStr (PWCHAR WideStr)
- {
- ULONG nBytes;
- PCHAR MultiStr;
- // Get the length of the converted string
- //
- nBytes = WideCharToMultiByte(
- CP_ACP,
- 0,
- WideStr,
- -1,
- NULL,
- 0,
- NULL,
- NULL);
- if (nBytes == 0)
- {
- return NULL;
- }
- // Allocate space to hold the converted string
- //
- MultiStr = ALLOC(nBytes);
- if (MultiStr == NULL)
- {
- return NULL;
- }
- // Convert the string
- //
- nBytes = WideCharToMultiByte(
- CP_ACP,
- 0,
- WideStr,
- -1,
- MultiStr,
- nBytes,
- NULL,
- NULL);
- if (nBytes == 0)
- {
- FREE(MultiStr);
- return NULL;
- }
- return MultiStr;
- }
- //*****************************************************************************
- //
- // GetRootHubName()
- //
- //*****************************************************************************
- PCHAR GetRootHubName (
- HANDLE HostController
- )
- {
- BOOL success;
- ULONG nBytes;
- USB_ROOT_HUB_NAME rootHubName;
- PUSB_ROOT_HUB_NAME rootHubNameW;
- PCHAR rootHubNameA;
- rootHubNameW = NULL;
- 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);
- // 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;
- ULONG nBytes;
- USB_NODE_CONNECTION_NAME extHubName;
- PUSB_NODE_CONNECTION_NAME extHubNameW;
- PCHAR extHubNameA;
- extHubNameW = NULL;
- 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);
- // 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;
- ULONG nBytes;
- USB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyName;
- PUSB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyNameW;
- PCHAR driverKeyNameA;
- driverKeyNameW = NULL;
- 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);
- // 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;
- ULONG nBytes;
- USB_HCD_DRIVERKEY_NAME driverKeyName;
- PUSB_HCD_DRIVERKEY_NAME driverKeyNameW;
- PCHAR driverKeyNameA;
- driverKeyNameW = NULL;
- driverKeyNameA = NULL;
- // 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
- //
- driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName);
- // 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;
- ULONG nBytes;
- ULONG nBytesReturned;
- UCHAR configDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
- sizeof(USB_CONFIGURATION_DESCRIPTOR)];
- PUSB_DESCRIPTOR_REQUEST configDescReq;
- PUSB_CONFIGURATION_DESCRIPTOR configDesc;
- // 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;
- }
- //*****************************************************************************
- //
- // 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;
- PUSB_COMMON_DESCRIPTOR commonDesc;
- //
- // 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:
- if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR))
- {
- OOPS();
- break;
- }
- if (((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc)->iConfiguration)
- {
- return TRUE;
- }
- (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;
- }
- (PUCHAR)commonDesc += commonDesc->bLength;
- continue;
- default:
- (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;
- PSTRING_DESCRIPTOR_NODE stringDescNodeTail;
- ULONG numLanguageIDs;
- USHORT *languageIDs;
- PUCHAR descEnd;
- PUSB_COMMON_DESCRIPTOR commonDesc;
- //
- // 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];
- stringDescNodeTail = supportedLanguagesString;
- //
- // Get the Device Descriptor strings
- //
- if (DeviceDesc->iManufacturer)
- {
- stringDescNodeTail = GetStringDescriptors(hHubDevice,
- ConnectionIndex,
- DeviceDesc->iManufacturer,
- numLanguageIDs,
- languageIDs,
- stringDescNodeTail);
- }
- if (DeviceDesc->iProduct)
- {
- stringDescNodeTail = GetStringDescriptors(hHubDevice,
- ConnectionIndex,
- DeviceDesc->iProduct,
- numLanguageIDs,
- languageIDs,
- stringDescNodeTail);
- }
- if (DeviceDesc->iSerialNumber)
- {
- stringDescNodeTail = GetStringDescriptors(hHubDevice,
- ConnectionIndex,
- DeviceDesc->iSerialNumber,
- numLanguageIDs,
- languageIDs,
- stringDescNodeTail);
- }
- //
- // 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)
- {
- stringDescNodeTail = GetStringDescriptors(
- hHubDevice,
- ConnectionIndex,
- ((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc)->iConfiguration,
- numLanguageIDs,
- languageIDs,
- stringDescNodeTail);
- }
- (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)
- {
- stringDescNodeTail = GetStringDescriptors(
- hHubDevice,
- ConnectionIndex,
- ((PUSB_INTERFACE_DESCRIPTOR)commonDesc)->iInterface,
- numLanguageIDs,
- languageIDs,
- stringDescNodeTail);
- }
- (PUCHAR)commonDesc += commonDesc->bLength;
- continue;
- default:
- (PUCHAR)commonDesc += commonDesc->bLength;
- continue;
- }
- break;
- }
- 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;
- ULONG nBytes;
- ULONG nBytesReturned;
- UCHAR stringDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
- MAXIMUM_USB_STRING_LENGTH];
- PUSB_DESCRIPTOR_REQUEST stringDescReq;
- PUSB_STRING_DESCRIPTOR stringDesc;
- PSTRING_DESCRIPTOR_NODE stringDescNode;
- 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.
- //
- //*****************************************************************************
- PSTRING_DESCRIPTOR_NODE
- GetStringDescriptors (
- HANDLE hHubDevice,
- ULONG ConnectionIndex,
- UCHAR DescriptorIndex,
- ULONG NumLanguageIDs,
- USHORT *LanguageIDs,
- PSTRING_DESCRIPTOR_NODE StringDescNodeTail
- )
- {
- ULONG i;
- for (i=0; i<NumLanguageIDs; i++)
- {
- StringDescNodeTail->Next = GetStringDescriptor(hHubDevice,
- ConnectionIndex,
- DescriptorIndex,
- *LanguageIDs);
- if (StringDescNodeTail->Next)
- {
- StringDescNodeTail = StringDescNodeTail->Next;
- }
- LanguageIDs++;
- }
- return StringDescNodeTail;
- }
- //*****************************************************************************
- //
- // CleanupItem()
- //
- //*****************************************************************************
- VOID
- CleanupItem (
- HWND hTreeWnd,
- HTREEITEM hTreeItem
- )
- {
- TV_ITEM tvi;
- PUSBDEVICEINFO info;
- tvi.mask = TVIF_HANDLE | TVIF_PARAM;
- tvi.hItem = hTreeItem;
- TreeView_GetItem(hTreeWnd,
- &tvi);
- info = (PUSBDEVICEINFO)tvi.lParam;
- if (info)
- {
- if (info->HubInfo != NULL)
- {
- FREE(info->HubInfo);
- info->HubInfo = NULL;
- }
- if (info->HubName != NULL)
- {
- FREE(info->HubName);
- info->HubName = NULL;
- }
- if (info->ConfigDesc != NULL)
- {
- FREE(info->ConfigDesc);
- info->ConfigDesc = NULL;
- }
- if (info->StringDescs != NULL)
- {
- PSTRING_DESCRIPTOR_NODE Next;
- do {
- Next = info->StringDescs->Next;
- FREE(info->StringDescs);
- info->StringDescs = Next;
- } while (info->StringDescs != NULL);
- }
- if (info->ConnectionInfo != NULL)
- {
- FREE(info->ConnectionInfo);
- info->ConnectionInfo = NULL;
- }
- FREE(info);
- info = NULL;
- }
- }