- // HUB.cpp : 定义控制台应用程序的入口点。
- //
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>- #include <dbt.h>
#include <initguid.h>
#include <winioctl.h>
#include <setupapi.h> - extern "C" {
#include "cfgmgr32.h"
#include "hidsdi.h"
} - #pragma comment(lib,"hid.lib")
#pragma comment(lib,"cfgmgr32.lib") - #define USB_DEVICE_DESCRIPTOR_TYPE 0x01
- #define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
- #define USB_STRING_DESCRIPTOR_TYPE 0x03
- #define USB_INTERFACE_DESCRIPTOR_TYPE 0x04
- #define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05
- #define USB_GET_HUB_NAME 8
- #define USB_GET_NODE_INFORMATION 258
- #define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN
- #define FILE_DEVICE_USB_SCAN 0x8000
- #define IOCTL_INDEX 0x0800
- #define IOCTL_GET_USB_DESCRIPTOR CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+8, METHOD_BUFFERED,FILE_ANY_ACCESS)
- DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);
- #define IOCTL_INTERNAL_USB_GET_HUB_NAME CTL_CODE(FILE_DEVICE_USB, /
- USB_GET_HUB_NAME, /
- METHOD_BUFFERED, /
- FILE_ANY_ACCESS)
- #define IOCTL_USB_GET_NODE_INFORMATION CTL_CODE(FILE_DEVICE_USB, /
- USB_GET_NODE_INFORMATION, /
- METHOD_BUFFERED, /
- FILE_ANY_ACCESS)
- typedef struct _USBSCAN_GET_DESCRIPTOR {
- IN UCHAR DescriptorType;
- IN UCHAR Index;
- IN USHORT LanguageId;
- } USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR;
- typedef struct _USB_DEVICE_DESCRIPTOR {
- UCHAR bLength ;
- UCHAR bDescriptorType ;
- USHORT bcdUSB ;
- UCHAR bDeviceClass ;
- UCHAR bDeviceSubClass ;
- UCHAR bDeviceProtocol ;
- UCHAR bMaxPacketSize0 ;
- USHORT idVendor ;
- USHORT idProduct ;
- USHORT bcdDevice ;
- UCHAR iManufacturer ;
- UCHAR iProduct ;
- UCHAR iSerialNumber ;
- UCHAR bNumConfigurations ;
- } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR ;
- typedef enum _USB_HUB_NODE {
- UsbHub,
- UsbMIParent
- } USB_HUB_NODE;
- typedef struct _USB_HUB_DESCRIPTOR { UCHAR bDescriptorLength; UCHAR bDescriptorType; UCHAR bNumberOfPorts; USHORT wHubCharacteristics; UCHAR bPowerOnToPowerGood; UCHAR bHubControlCurrent; UCHAR bRemoveAndPowerMask[64]; } USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;
- typedef struct _USB_HUB_INFORMATION {
- /*
- copy of data from hub descriptor
- */
- USB_HUB_DESCRIPTOR HubDescriptor;
- BOOLEAN HubIsBusPowered;
- } USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
- typedef struct _USB_MI_PARENT_INFORMATION {
- ULONG NumberOfInterfaces;
- } USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
- typedef struct _USB_NODE_INFORMATION {
- USB_HUB_NODE NodeType; /* hub, mi parent */
- union {
- USB_HUB_INFORMATION HubInformation;
- USB_MI_PARENT_INFORMATION MiParentInformation;
- } u;
- } USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
- int _tmain(int argc, _TCHAR* argv[])
- {
- HANDLE hHub;
- HDEVINFO hDeviceInfo;
- SP_DEVICE_INTERFACE_DATA _sdid;
- PSP_DEVICE_INTERFACE_DETAIL_DATA _psdidd;
- DWORD dwLength;
- DWORD dwBytesX;
- __try{
- hDeviceInfo = SetupDiGetClassDevs(
- &GUID_DEVINTERFACE_USB_HUB,
- NULL,
- NULL,
- DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
- );
- if( hDeviceInfo == INVALID_HANDLE_VALUE ){
- printf("error:hDevInfo == INVALID_HANDLE_VALUE");
- return -1;
- }
- _sdid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
- for( int i = 0; SetupDiEnumDeviceInterfaces( hDeviceInfo, NULL, &GUID_DEVINTERFACE_USB_HUB, i, &_sdid ); i++ ){
- SetupDiGetDeviceInterfaceDetail(
- hDeviceInfo,
- &_sdid,
- NULL,
- 0,
- &dwBytesX,
- NULL
- );
- dwLength = dwBytesX;
- _psdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc( GPTR, dwLength );
- if( _psdidd == NULL ){
- continue;
- }
- _psdidd->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
- if( !SetupDiGetDeviceInterfaceDetail(
- hDeviceInfo,
- &_sdid,
- _psdidd,
- dwLength,
- &dwBytesX,
- NULL ) )
- {
- GlobalFree( _psdidd );
- continue;
- }
- hHub = CreateFile(
- _psdidd->DevicePath,
- GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- 0,
- NULL
- );
- GlobalFree( _psdidd );
- if( hDeviceInfo == INVALID_HANDLE_VALUE ){
- continue;
- }
- USBSCAN_GET_DESCRIPTOR _usb_nif;
- memset( &_usb_nif, 0, sizeof(USBSCAN_GET_DESCRIPTOR) );
- _usb_nif.DescriptorType = USB_DEVICE_DESCRIPTOR_TYPE;
- _usb_nif.Index = 1;
- _usb_nif.LanguageId = 0;
- USB_DEVICE_DESCRIPTOR _usbdd;
- memset( &_usbdd, 0, sizeof(USB_DEVICE_DESCRIPTOR) );
- dwLength = sizeof(USB_DEVICE_DESCRIPTOR);
- if( !DeviceIoControl(
- hHub,
- IOCTL_GET_USB_DESCRIPTOR,
- &_usb_nif,
- sizeof(USBSCAN_GET_DESCRIPTOR),
- &_usbdd,
- dwLength,
- &dwBytesX,
- NULL ) )
- {
- CloseHandle( hHub );
- printf( "%d/n", GetLastError() );
- continue;
- }
- wprintf( _T("%d,%d/n"), _usbdd.idVendor, _usbdd.iProduct );
- CloseHandle( hHub );
- }
- }
- __finally{
- if( hDeviceInfo != INVALID_HANDLE_VALUE ){
- SetupDiDestroyDeviceInfoList( hDeviceInfo );
- }
- }
- system( "pause" );
- return 0;
- }