windows-nt/Source/XPSP1/NT/shell/osshell/cpls/usb/usbitem.h
2020-09-26 16:20:57 +08:00

286 lines
8.4 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: USBITEM.H
* VERSION: 1.0
* AUTHOR: jsenior
* DATE: 10/28/1998
*
********************************************************************************
*
* CHANGE LOG:
*
* DATE REV DESCRIPTION
* ---------- ------- ----------------------------------------------------------
* 10/28/1998 jsenior Original implementation.
*
*******************************************************************************/
#ifndef _USBITEM_H
#define _USBITEM_H
#include <windows.h>
//#include <windowsx.h>
#include <objbase.h>
#include <setupapi.h>
#include <devioctl.h>
#pragma warning(disable : 4200)
#include <usbioctl.h>
#include <usb.h>
#include <wdmguid.h>
#include <tchar.h>
#include "str.h"
#include "vec.h"
extern "C" {
#include <cfgmgr32.h>
}
#include <stdio.h> // Used for sprintf
HANDLE
UsbCreateFileA(
IN LPCWSTR lpFileName,
IN DWORD dwDesiredAccess,
IN DWORD dwShareMode,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
IN DWORD dwCreationDisposition,
IN DWORD dwFlagsAndAttributes,
IN HANDLE hTemplateFile);
#ifndef WINNT
#define USBHID TEXT("HID")
#define MyComputerClass TEXT("System")
#define UsbSprintf sprintf
#define UsbCreateFile UsbCreateFileA
#define USBPROC DLGPROC
// Win64 stuff
#define UsbSetWindowLongPtr SetWindowLong
#define UsbGetWindowLongPtr GetWindowLong
#define USBDWLP_MSGRESULT DWL_MSGRESULT
#define USBDWLP_USER DWL_USER
#define USBULONG_PTR ULONG
#define USBLONG_PTR LONG
#define USBINT_PTR BOOL
#else
#define USBHID TEXT("HIDClass")
#define MyComputerClass TEXT("Computer")
#define UsbSprintf wsprintf
#define UsbCreateFile CreateFile
#define USBPROC WNDPROC
// Win64 stuff
#define UsbSetWindowLongPtr SetWindowLongPtr
#define UsbGetWindowLongPtr GetWindowLongPtr
#define USBDWLP_MSGRESULT DWLP_MSGRESULT
#define USBDWLP_USER DWLP_USER
#define USBULONG_PTR ULONG_PTR
#define USBLONG_PTR LONG_PTR
#define USBINT_PTR INT_PTR
#endif
typedef _Str <WCHAR> String;
typedef _Str <TCHAR> UsbString;
class UsbConfigInfo {
public:
UsbConfigInfo();
UsbConfigInfo(const UsbString& Desc, const UsbString& Class, DWORD Failure =0, ULONG Status =0, ULONG Problem =0);
UsbString deviceDesc, deviceClass;
String driverName;
DEVINST devInst;
DWORD usbFailure;
ULONG status;
ULONG problemNumber;
};
//#define CONNECTION_INFO_SIZE (sizeof(USB_NODE_CONNECTION_INFORMATION) + sizeof(USB_PIPE_INFO) * 16)
class UsbDeviceInfo {
public:
UsbDeviceInfo();
// UsbDeviceInfo(const UsbDeviceInfo& UDI);
~UsbDeviceInfo();
String hubName; // guid if a hub
BOOL isHub;
USB_NODE_INFORMATION hubInfo; // filled if a hub
PUSB_NODE_CONNECTION_INFORMATION connectionInfo; // NULL if root HUB
PUSB_CONFIGURATION_DESCRIPTOR configDesc;
PUSB_DESCRIPTOR_REQUEST configDescReq;
};
typedef struct
{
LPTSTR szClassName;
INT imageIndex;
} IconItem;
typedef _Vec<IconItem> IconTable;
class UsbImageList {
private:
IconTable iconTable;
SP_CLASSIMAGELIST_DATA ClassImageList;
BOOL GetClassImageList();
public:
UsbImageList() : iconTable() { GetClassImageList(); }
~UsbImageList() { SetupDiDestroyClassImageList(&ClassImageList); }
HIMAGELIST ImageList() { return ClassImageList.ImageList; }
BOOL GetClassImageIndex(LPCTSTR DeviceClass, PINT ImageIndex);
};
class UsbItem;
typedef
BOOL
(*PUsbItemActionIsValid) (
UsbItem *Item);
class UsbItem {
public:
UsbItem() : configInfo(0), deviceInfo(0), bandwidth(0), itemType(None),
imageIndex(0) { UnusedPort=FALSE; child=0; parent=0; sibling=0;
#ifdef HUB_CAPS
ZeroMemory(&hubCaps, sizeof(USB_HUB_CAPABILITIES));
#endif
}
// UsbItem(const UsbItem& Other, UsbItem *Parent);
~UsbItem();
enum UsbItemType {
Root = 1,
HCD,
RootHub,
Hub,
Device,
Empty,
None
};
struct UsbItemAction {
virtual BOOL operator()(UsbItem* item) {return TRUE;}
};
BOOL IsUnusedPort() { return UnusedPort; }
UsbItem* AddLeaf(UsbItem* Parent, UsbDeviceInfo* DeviceInfo,
UsbItemType Type, UsbConfigInfo* ConfigInfo,
UsbImageList* ImageList);
BOOL EnumerateAll(UsbImageList* ClassImageList);
BOOL EnumerateController(UsbItem *Parent,
const String &RootName,
UsbImageList* ClassImageList,
DEVINST DevInst);
BOOL EnumerateHub(const String &HubName,
UsbImageList* ClassImageList,
DEVINST DevInst,
UsbItem *Parent,
UsbItem::UsbItemType itemType);
// BOOL EnumerateDevice(DEVINST DevInst);
BOOL ComputeBandwidth();
BOOL ComputePower();
UINT TotalTreeBandwidth();
ULONG PortPower();
ULONG NumPorts();
ULONG NumChildren();
ULONG UsbVersion();
ULONG DistanceFromController() { return IsController() ? 0 :
(parent ? 1+parent->DistanceFromController() : 0); }
BOOL IsHub();
BOOL IsController();
BOOL Walk(UsbItemAction& Action);
BOOL ShallowWalk(UsbItemAction& Action);
BOOL IsDescriptionValidDevice();
BOOL GetDeviceInfo( String &HubName, ULONG index);
static ULONG CalculateBWPercent(ULONG bw);
static BOOL InsertTreeItem (HWND hWndTree,
UsbItem *usbItem,
HTREEITEM hParent,
LPTV_INSERTSTRUCT item,
PUsbItemActionIsValid IsValid,
PUsbItemActionIsValid IsBold,
PUsbItemActionIsValid IsExpanded);
static UINT EndpointBandwidth(ULONG MaxPacketSize,
UCHAR EndpointType,
BOOLEAN LowSpeed);
UsbItem *parent, *sibling, *child;
UsbDeviceInfo* deviceInfo;
UsbConfigInfo* configInfo;
#ifdef HUB_CAPS
USB_HUB_CAPABILITIES hubCaps;
#endif
UsbItemType itemType;
int imageIndex;
UINT bandwidth;
UINT power;
USB_NODE_CONNECTION_ATTRIBUTES cxnAttributes;
protected:
BOOL GetHubInfo(HANDLE hHubDevice);
static int CalculateTotalBandwidth(ULONG NumPipes,
BOOLEAN LowSpeed,
USB_PIPE_INFO *PipeInfo);
static ULONG CalculateUsbBandwidth(ULONG MaxPacketSize,
UCHAR EndpointType,
UCHAR Interval,
BOOLEAN LowSpeed);
// enum functions
/* BOOL Enumerate(HANDLE Controller,
UsbImageList* ClassImageList,
DEVINST RootDevInst);*/
void EnumerateHubPorts(HANDLE HHubDevice,
ULONG NPorts,
UsbImageList* ClassImageList);
// wrappers around IOCTL and cfgmgr
static String GetHCDDriverKeyName(HANDLE HController);
static String GetExternalHubName (HANDLE Hub, ULONG ConnectionIndex);
static String GetRootHubName(HANDLE HostController);
PUSB_DESCRIPTOR_REQUEST GetConfigDescriptor(HANDLE hHubDevice,
ULONG ConnectionIndex);
static BOOL SearchAndReplace (LPCWSTR FindThis,
LPCWSTR FindWithin,
LPCWSTR ReplaceWith,
String &NewString);
private:
void GetClassImageIndex(UsbImageList *ClassImageList);
PUSB_NODE_CONNECTION_INFORMATION GetConnectionInformation(HANDLE HHubDevice,
ULONG index);
BOOL GetPortAttributes(HANDLE HHubDevice,
PUSB_NODE_CONNECTION_ATTRIBUTES connectionAttributes,
ULONG index);
BOOL UnusedPort;
};
//
// Helper functions
//
BOOL UsbTreeView_DeleteAllItems(HWND hTreeDevices);
HTREEITEM TreeView_FindItem(HWND hWndTree, LPCTSTR text);
void GetConfigMgrInfo(const String& DriverName, UsbConfigInfo* ConfigInfo);
String GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex);
HANDLE GetHandleForDevice(const String &DeviceName);
#endif // _USBITEM_H