/******************************************************************************* * * (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 //#include #include #include #include #pragma warning(disable : 4200) #include #include #include #include #include "str.h" #include "vec.h" extern "C" { #include } #include // 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 String; typedef _Str 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 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