What can I add to this so the console stays open? I am running XP version 2002 home addition.
; ======================================================================================================
; usbenum v1.0 (by Roman Ovseytsev (arafel), tsech@mail.ru)
; ======================================================================================================
;
; Notes:
; ------
; * "Serial Number" field will show question mark if no SN descriptor string was provided by the device.
; * Querying descriptor information is not implemented for zero base class.
; ======================================================================================================
; http://board.flatassembler.net/topic.php?t=12650
format PE CONSOLE 4.0
entry start
include 'win32ax.inc'
HOSTCONTROLLERS_MAX equ 10
CP_ACP equ 0
MAX_DEVICE_ID_LEN equ 200
CR_SUCCESS equ 0
CM_DRP_DRIVER equ 0Ah
CM_DRP_DEVICEDESC equ 1
DIGCF_PRESENT equ 2h
DIGCF_ALLCLASSES equ 4h
DIGCF_PROFILE equ 8h
DIGCF_DEVICEINTERFACE equ 10h
ERROR_NO_MORE_ITEMS equ 259
HCD_GET_ROOT_HUB_NAME equ 258
USB_GET_NODE_CONNECTION_INFORMATION equ 259
USB_GET_NODE_CONNECTION_INFORMATION_EX equ 274
USB_GET_NODE_CONNECTION_DRIVERKEY_NAME equ 264
USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION equ 260
USB_CONFIGURATION_DESCRIPTOR_TYPE equ 2
METHOD_BUFFERED equ 0
FILE_ANY_ACCESS equ 0
FILE_DEVICE_UNKNOWN equ 22h
FILE_DEVICE_USB equ FILE_DEVICE_UNKNOWN
USB_GET_NODE_INFORMATION equ 258
HCD_GET_DRIVERKEY_NAME equ 265
MAXIMUM_USB_STRING_LENGTH equ 255
USB_STRING_DESCRIPTOR_TYPE equ 3
USB_GET_NODE_CONNECTION_NAME equ 261
IOCTL_USB_GET_NODE_INFORMATION = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_NODE_INFORMATION shl 2) or METHOD_BUFFERED
IOCTL_GET_HCD_DRIVERKEY_NAME = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (HCD_GET_DRIVERKEY_NAME shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_ROOT_HUB_NAME = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (HCD_GET_ROOT_HUB_NAME shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_NODE_CONNECTION_INFORMATION shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_NODE_CONNECTION_INFORMATION_EX shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_NODE_CONNECTION_DRIVERKEY_NAME shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION shl 2) or METHOD_BUFFERED
IOCTL_USB_GET_NODE_CONNECTION_NAME = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or (USB_GET_NODE_CONNECTION_NAME shl 2) or METHOD_BUFFERED
struct USB_NODE_CONNECTION_NAME
ConnectionIndex dd ?
ActualLength dd ?
NodeName dw ?
ends
struct USB_STRING_DESCRIPTOR
bLength db ?
bDescriptorType db ?
bString dw ?
ends
struct SETUP_PACKET
bmRequest db ?
bRequest db ?
wValue dw ?
wIndex dw ?
wLength dw ?
ends
struct USB_CONFIGURATION_DESCRIPTOR
bLength db ?
bDescriptorType db ?
wTotalLength dw ?
bNumInterfaces db ?
bConfigurationValue db ?
iConfiguration db ?
bmAttributes db ?
MaxPower db ?
ends
struct USB_DESCRIPTOR_REQUEST
ConnectionIndex dd ?
SetupPacket SETUP_PACKET
ends
struct USB_NODE_CONNECTION_DRIVERKEY_NAME
ConnectionIndex dd ?
ActualLength dd ?
DriverKeyName dw ?
ends
struct USB_DEVICE_DESCRIPTOR
bLength db ?
bDescriptorType db ?
bcdUSB dw ?
bDeviceClass db ?
bDeviceSubClass db ?
bDeviceProtocol db ?
bMaxPacketSize db ?
idVendor dw ?
idProduct dw ?
bcdDevice dw ?
iManufacturer db ?
iProduct db ?
iSerialNumber db ?
bNumConfigurations db ?
ends
struct USB_ENDPOINT_DESCRIPTOR
bLength db ?
bDescriptorType db ?
bEndpointAddress db ?
bmAttributes db ?
wMaxPacketSize dw ?
bInterval db ?
ends
struct USB_PIPE_INFO
EndpointDescriptor USB_ENDPOINT_DESCRIPTOR
ScheduleOffset dd ?
ends
struct USB_NODE_CONNECTION_INFORMATION_EX
ConnectionIndex dd ?
DeviceDescriptor USB_DEVICE_DESCRIPTOR
CurrentConfigurationValue db ?
Speed db ?
DeviceIsHub db ?
DeviceAddress dw ?
NumberOfOpenPipes dd ?
ConnectionStatus dd ?
PipeList USB_PIPE_INFO
ends
struct USB_NODE_CONNECTION_INFORMATION
ConnectionIndex dd ?
DeviceDescriptor USB_DEVICE_DESCRIPTOR
CurrentConfigurationValue db ?
LowSpeed db ?
DeviceIsHub db ?
DeviceAddress dw ?
NumberOfOpenPipes dd ?
ConnectionStatus dd ?
PipeList USB_PIPE_INFO
ends
struct USB_ROOT_HUB_NAME
ActualLength dd ?
RootHubName dw ?
ends
struct USB_HCD_DRIVERKEY_NAME
ActualLength dd ?
DriverKeyName dw ?
ends
struct USB_HUB_DESCRIPTOR
bDescriptorLength db ?
bDescriptorType db ?
bNumberOfPorts db ?
wHubCharacteristics dw ?
bPowerOnToPowerGood db ?
bHubControlCurrent db ?
bRemoveAndPowerMask db 64 dup(?)
ends
struct USB_HUB_INFORMATION
HubDescriptor USB_HUB_DESCRIPTOR
HubIsBusPowered db ?
ends
struct USB_MI_PARENT_INFORMATION
NumberOfInterfaces dd ?
ends
struct USB_NODE_INFORMATION
NodeType dd ?
usb_hub_information USB_HUB_INFORMATION
usb_mi_parent_information USB_MI_PARENT_INFORMATION
ends
struct SP_DEVICE_INTERFACE_DATA
cbSize dd ?
InterfaceClassGuid db 16 dup(?)
Flags dd ?
Reserved dd ?
ends
struct SP_INTERFACE_DEVICE_DETAIL_DATA
cbSize dd ?
DevicePath db ?
ends
section '.data' data readable writeable
spacing dd s1
space_cnt dd -1
hConsole dd ?
tmp dd ?
tmp_buf db 256 dup(?)
tmp_buf2 db 256 dup(?)
spacelut dd s1
dd s2
dd s3
dd s4
s1 db " ",0
s2 db " ",0
s3 db " ",0
s4 db " ",0
; class code triplets:
;
; [base class code], [sub class code], [protocol]
;
; (0ffffh specifies values outside of defined specs.)
class_codes:
dw 00000h, 0ffffh, 0ffffh
dw 00001h, 0ffffh, 0ffffh
dw 00002h, 0ffffh, 0ffffh
dw 00003h, 0ffffh, 0ffffh
dw 00005h, 0ffffh, 0ffffh
dw 00006h, 00001h, 00001h
dw 00007h, 0ffffh, 0ffffh
dw 00008h, 0ffffh, 0ffffh
dw 00009h, 00000h, 00000h
dw 00009h, 00000h, 00001h
dw 00009h, 00000h, 00002h
dw 0000ah, 0ffffh, 0ffffh
dw 0000bh, 0ffffh, 0ffffh
dw 0000dh, 00000h, 00000h
dw 0000eh, 0ffffh, 0ffffh
dw 000dch, 00001h, 00001h
dw 000e0h, 00001h, 00001h
dw 000e0h, 00001h, 00002h
dw 000e0h, 00001h, 00003h
dw 000e0h, 00002h, 00001h
dw 000e0h, 00002h, 00002h
dw 000e0h, 00002h, 00003h
dw 000efh, 00001h, 00001h
dw 000efh, 00001h, 00002h
dw 000efh, 00002h, 00001h
dw 000efh, 00002h, 00002h
dw 000efh, 00003h, 00001h
dw 000feh, 00001h, 00001h
dw 000feh, 00002h, 00000h
dw 000feh, 00003h, 00000h
dw 000feh, 00003h, 00001h
dw 000ffh, 0ffffh, 0ffffh
_l: class_codes_sz equ (_l-class_codes)/6
class_codes_lut:
dd _0
dd _1
dd _2
dd _3
dd _4
dd _5
dd _6
dd _7
dd _8
dd _9
dd _10
dd _11
dd _12
dd _13
dd _14
dd _15
dd _16
dd _17
dd _18
dd _19
dd _20
dd _21
dd _22
dd _23
dd _24
dd _25
dd _26
dd _27
dd _28
dd _29
dd _30
dd _31
_0 db " ",0 ; if 0, we should get CC info
_1 db "Audio device",0 ; from interface descriptor
_2 db "Communication device class",0
_3 db "HID device class",0
_4 db "Physical device class",0
_5 db "Still Imaging device",0
_6 db "Printer device",0
_7 db "Mass Storage device",0
_8 db "Full speed Hub",0
_9 db "Hi-speed hub with single TT",0
_10 db "Hi-speed hub with multiple TTs",0
_11 db "CDC data device",0
_12 db "Smart Card device",0
_13 db "Content Security device",0
_14 db "Video device",0
_15 db "USB2 Compliance Device",0
_16 db "Bluetooth Programming Interface",0
_17 db "UWB Radio Control Interface",0
_18 db "Remote NDIS",0
_19 db "Host Wire Adapter Control/Data interface",0
_20 db "Device Wire Adapter Control/Data interface",0
_21 db "Device Wire Adapter Isochronous interface",0
_22 db "Active Sync device",0
_23 db "Palm Sync",0
_24 db "Interface Association Descriptor",0
_25 db "Wire Adapter Multifunction Peripheral programming interface",0
_26 db "Cable Based Association Framework",0
_27 db "Device Firmware Upgrade",0
_28 db "IRDA Bridge device",0
_29 db "USB Test and Measurement Device",0
_30 db "USB Test and Measurement Device (conforming to the USBTMC USB488)",0
_31 db " ",0
section '.code' code readable executable
start:
invoke GetStdHandle, -11
cmp eax, INVALID_HANDLE_VALUE
je exit
mov [hConsole], eax
invoke WriteConsole, [hConsole], <"USB devices enumerator v1.0 (arafel, tsech@mail.ru)",13,10,13,10>,60, tmp,0
xor ebx, ebx
enum_hc:
cinvoke wsprintf, tmp_buf, "\\.\HCD%d", ebx
mov edi, eax
invoke CreateFile, tmp_buf, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0
cmp eax, INVALID_HANDLE_VALUE
je nxt_hc
mov esi, eax
cinvoke wsprintf, tmp_buf2, <"USB Host Controler: %s",13,10>, tmp_buf
invoke WriteConsole, [hConsole], tmp_buf2, eax, tmp, 0
stdcall usb_enumerateDevInt, esi
invoke CloseHandle, esi
nxt_hc: inc ebx
cmp ebx, HOSTCONTROLLERS_MAX
jb enum_hc
exit: invoke ExitProcess, 0
proc usb_enumerateDevInt hHC
local driverkeyName:USB_HCD_DRIVERKEY_NAME
local driverkeyName_ptr:DWORD
local driverkeyName_sz:DWORD
local device_id[MAX_DEVICE_ID_LEN]:BYTE
local device_id_sz:DWORD
local dnDevInst:DWORD
local dnDevInst_Next:DWORD
local roothubName:USB_ROOT_HUB_NAME
local roothubName_ptr:DWORD
local roothubName_sz:DWORD
pushad
;===========================================================================================================================
;=================================================================================== get HC driver identification key which
;=================================================================================== will be used to locate needed USB UHC
;===========================================================================================================================
lea edi, [driverkeyName]
mov ecx, sizeof.USB_HCD_DRIVERKEY_NAME
xor eax, eax
rep stosb
invoke DeviceIoControl, [hHC], IOCTL_GET_HCD_DRIVERKEY_NAME, addr driverkeyName, sizeof.USB_HCD_DRIVERKEY_NAME, addr driverkeyName, sizeof.USB_HCD_DRIVERKEY_NAME, tmp, 0
test eax, eax
je error0
cmp [tmp], sizeof.USB_HCD_DRIVERKEY_NAME
jb error0
lea esi, [driverkeyName]
mov edx, [esi+USB_HCD_DRIVERKEY_NAME.ActualLength]
mov [driverkeyName_sz], edx
test edx, edx
je error0
invoke VirtualAlloc, 0, edx, MEM_COMMIT, PAGE_READWRITE
test eax, eax
je error0
mov [driverkeyName_ptr], eax
invoke DeviceIoControl, [hHC], IOCTL_GET_HCD_DRIVERKEY_NAME, [driverkeyName_ptr], [driverkeyName_sz], [driverkeyName_ptr], [driverkeyName_sz], tmp, 0
test eax, eax
je error11
mov esi, [driverkeyName_ptr]
lea eax, [esi+USB_HCD_DRIVERKEY_NAME.DriverKeyName]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, [driverkeyName_ptr], [driverkeyName_sz], 0, 0
mov [driverkeyName_sz], eax
cinvoke wsprintf, tmp_buf, <" Driver Key: %s",13,10>, [driverkeyName_ptr]
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
;===========================================================================================================================
;=================================================================================== get USB HC's ID and description
;===========================================================================================================================
invoke CM_Locate_DevNode, addr dnDevInst, 0, 0
cmp eax, CR_SUCCESS
jne error22
search_hc:
mov [device_id_sz], MAX_DEVICE_ID_LEN
invoke CM_Get_DevNode_Registry_Property, [dnDevInst], CM_DRP_DRIVER, 0, addr device_id, addr device_id_sz, 0
cmp eax, CR_SUCCESS
jne no_match
lea esi, [device_id]
mov edi, [driverkeyName_ptr]
mov ecx, [driverkeyName_sz]
repe cmpsb
jne no_match
invoke CM_Get_Device_ID, [dnDevInst], addr device_id, MAX_DEVICE_ID_LEN, 0
cmp eax, CR_SUCCESS
jne error22
cinvoke wsprintf, tmp_buf, <" ID: %s",13,10>, addr device_id
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
mov [device_id_sz], MAX_DEVICE_ID_LEN
invoke CM_Get_DevNode_Registry_Property, [dnDevInst], CM_DRP_DEVICEDESC, 0, addr device_id, addr device_id_sz, 0
cmp eax, CR_SUCCESS
jne error22
cinvoke wsprintf, tmp_buf, <" Description: %s",13,10>, addr device_id
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
jmp hc_search_done
no_match:
invoke CM_Get_Child, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne get_sibling
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
jmp search_hc
sibling_error:
invoke CM_Get_Parent, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne error22
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
get_sibling:
invoke CM_Get_Sibling, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne sibling_error
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
jmp search_hc
hc_search_done:
invoke VirtualFree, [driverkeyName_ptr], 0, MEM_RELEASE
;===========================================================================================================================
;=================================================================================== get USB root hub
;===========================================================================================================================
invoke DeviceIoControl, [hHC], IOCTL_USB_GET_ROOT_HUB_NAME, 0, 0, addr roothubName, sizeof.USB_ROOT_HUB_NAME, tmp,0
test eax, eax
je error0
cmp [tmp], sizeof.USB_ROOT_HUB_NAME
jb error0
lea esi, [roothubName]
mov eax, [esi+USB_ROOT_HUB_NAME.ActualLength]
mov [roothubName_sz], eax
test eax, eax
je error0
invoke VirtualAlloc, 0, eax, MEM_COMMIT, PAGE_READWRITE
test eax, eax
je error0
mov [roothubName_ptr], eax
invoke DeviceIoControl, [hHC], IOCTL_USB_GET_ROOT_HUB_NAME, 0, 0, eax, [roothubName_sz], tmp, 0
test eax, eax
je error33
mov edx, [roothubName_ptr]
lea eax, [edx+USB_ROOT_HUB_NAME.RootHubName]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, [roothubName_ptr], [roothubName_sz], 0, 0
mov [roothubName_sz], eax
cinvoke wsprintf, tmp_buf, <" Root Hub: \\.\%s",13,10>, [roothubName_ptr]
mov edi, eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
mov eax, tmp_buf
add eax, edi
mov [eax-2], byte 0
mov eax, tmp_buf+11
stdcall usb_enumHub, eax
invoke VirtualFree, [roothubName_ptr], 0, MEM_RELEASE
jmp __ret
error33:call error_display
invoke VirtualFree, [roothubName_ptr], 0, MEM_RELEASE
jmp __ret
error22:invoke VirtualFree, [driverkeyName_ptr], 0, MEM_RELEASE
jmp __ret
error11:call error_display
invoke VirtualFree, [driverkeyName_ptr], 0, MEM_RELEASE
jmp __ret
error0: call error_display
__ret: popad
ret
endp
proc usb_enumHub, devname
local driverkeyName_ptr:DWORD
local driverkeyName_sz:DWORD
local device_id[MAX_DEVICE_ID_LEN]:BYTE
local device_id_sz:DWORD
local dnDevInst:DWORD
local dnDevInst_Next:DWORD
local HubInfo:USB_NODE_INFORMATION
local connectionInfo[(sizeof.USB_NODE_CONNECTION_INFORMATION_EX)+((sizeof.USB_PIPE_INFO)*29)]:BYTE
local condriverkeyName:USB_NODE_CONNECTION_DRIVERKEY_NAME
local hHubDevice:DWORD
local stringDescRequest[sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH]:BYTE
local nodeconName:USB_NODE_CONNECTION_NAME
local nodeconName_ptr:DWORD
local nodeconName_sz:DWORD
local externalhub:DWORD
pushad
;===========================================================================================================================
;=================================================================================== enumerate all available ports for
;=================================================================================== current hub
;===========================================================================================================================
mov [externalhub], FALSE
inc [space_cnt]
mov eax, [space_cnt]
cmp eax, 3
jne k1
mov [space_cnt], 3
k1: mov edx, [spacelut+eax*4]
mov [spacing], edx
invoke CreateFile, [devname], GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0
cmp eax, INVALID_HANDLE_VALUE
je error
mov [hHubDevice], eax
lea edi, [HubInfo]
mov ecx, sizeof.USB_NODE_INFORMATION
xor eax, eax
rep stosb
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_INFORMATION, addr HubInfo, sizeof.USB_NODE_INFORMATION, addr HubInfo, sizeof.USB_NODE_INFORMATION, tmp, 0
test eax, eax
je error4
mov ebx, 1
ports_enum:
lea edi, [connectionInfo]
mov ecx, sizeof.USB_NODE_CONNECTION_INFORMATION_EX+((sizeof.USB_PIPE_INFO)*29)
xor eax, eax
rep stosb
lea eax, [connectionInfo]
mov [eax+USB_NODE_CONNECTION_INFORMATION_EX.ConnectionIndex], ebx
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, addr connectionInfo, sizeof.USB_NODE_CONNECTION_INFORMATION_EX+((sizeof.USB_PIPE_INFO)*29), addr connectionInfo, sizeof.USB_NODE_CONNECTION_INFORMATION_EX+((sizeof.USB_PIPE_INFO)*29), tmp, 0
test eax, eax
je error4
lea eax, [connectionInfo] ; check if we got some device connected
cmp [eax+USB_NODE_CONNECTION_INFORMATION_EX.ConnectionStatus], 1
je device_con
cinvoke wsprintf, tmp_buf, <" [Port#%d] No Device Connected",13,10>, ebx
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
jmp port_nxt
device_con:
lea eax, [condriverkeyName]
mov [eax+USB_NODE_CONNECTION_DRIVERKEY_NAME.ConnectionIndex], ebx
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, addr condriverkeyName, sizeof.USB_NODE_CONNECTION_DRIVERKEY_NAME, addr condriverkeyName, sizeof.USB_NODE_CONNECTION_DRIVERKEY_NAME, tmp, 0
test eax, eax
je error4
cmp [tmp], sizeof.USB_NODE_CONNECTION_DRIVERKEY_NAME
jb error4
lea eax, [condriverkeyName]
mov edx, [eax+USB_NODE_CONNECTION_DRIVERKEY_NAME.ActualLength]
mov [driverkeyName_sz], edx
test edx, edx
je error4
invoke VirtualAlloc, 0, edx, MEM_COMMIT, PAGE_READWRITE
test eax, eax
je error4
mov [driverkeyName_ptr], eax
mov [eax+USB_NODE_CONNECTION_DRIVERKEY_NAME.ConnectionIndex], ebx
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, [driverkeyName_ptr], [driverkeyName_sz], [driverkeyName_ptr], [driverkeyName_sz], tmp, 0
mov edx, [driverkeyName_ptr]
lea eax, [edx+USB_NODE_CONNECTION_DRIVERKEY_NAME.DriverKeyName]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, [driverkeyName_ptr], [driverkeyName_sz], 0, 0
mov [driverkeyName_sz], eax
cinvoke wsprintf, tmp_buf, <" [Port#%d] Driver Key: %s",13,10>, ebx, [driverkeyName_ptr]
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
;===========================================================================================================================
;=================================================================================== get device description
;===========================================================================================================================
invoke CM_Locate_DevNode, addr dnDevInst, 0, 0
cmp eax, CR_SUCCESS
jne error5
search_dev:
mov [tmp], MAX_DEVICE_ID_LEN
invoke CM_Get_DevNode_Registry_Property, [dnDevInst], CM_DRP_DRIVER, 0, addr device_id, tmp, 0
cmp eax, CR_SUCCESS
jne no_match1
lea esi, [device_id]
mov edi, [driverkeyName_ptr]
mov ecx, [driverkeyName_sz]
repe cmpsb
jne no_match1
mov [tmp], MAX_DEVICE_ID_LEN
invoke CM_Get_DevNode_Registry_Property, [dnDevInst], CM_DRP_DEVICEDESC, 0, addr device_id, tmp, 0
cmp eax, CR_SUCCESS
jne error5
jmp got_desc
no_match1:
invoke CM_Get_Child, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne get_sibling1
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
jmp search_dev
sibling_error1:
invoke CM_Get_Parent, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne error5
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
get_sibling1:
invoke CM_Get_Sibling, addr dnDevInst_Next, [dnDevInst], 0
cmp eax, CR_SUCCESS
jne sibling_error1
mov eax, [dnDevInst_Next]
mov [dnDevInst], eax
jmp search_dev
got_desc:
cinvoke wsprintf, tmp_buf, <" %sDevice Description: %s",13,10>, [spacing], addr device_id
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
invoke VirtualFree, [driverkeyName_ptr], 0, MEM_RELEASE
;===========================================================================================================================
;=================================================================================== display device descriptor information
;===========================================================================================================================
lea esi, [connectionInfo]
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bDeviceClass]
movzx ecx, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bDeviceSubClass]
movzx edx, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bDeviceProtocol]
mov esi, class_codes
xor edi, edi
check_class_code:
cmp [esi], word ax
jne nxt_class_code
cmp [esi+2], word cx
je check_protocol
cmp [esi+2], word 0ffffh
je cc_match
jmp nxt_class_code
check_protocol:
cmp [esi+4], word dx
je cc_match
cmp [esi+2], word 0ffffh
je cc_match
nxt_class_code:
add esi, 6
inc edi
cmp edi, class_codes_sz
jb check_class_code
cc_match:
cmp edi, 8
je external_hub
cmp edi, 9
je external_hub
cmp edi, 10
jne not_external
external_hub:
mov [externalhub], TRUE
not_external:
cinvoke wsprintf, tmp_buf, <" %sClass Code Triplet: 0x%x,0x%x,0x%x (%s)",13,10>,[spacing], eax, ecx, edx, dword [class_codes_lut+edi*4]
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
lea esi, [connectionInfo]
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bMaxPacketSize]
cinvoke wsprintf, tmp_buf, <" %sMaximum Packet Size: %d",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
movzx eax, word [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.idVendor]
cinvoke wsprintf, tmp_buf, <" %sVendor ID: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
movzx eax, word [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.idProduct]
cinvoke wsprintf, tmp_buf, <" %sProduct ID: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
movzx eax, word [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bcdDevice]
cinvoke wsprintf, tmp_buf, <" %sDevice Release #: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
lea edi, [stringDescRequest] ; obtain list of supported languages
mov ecx, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH
xor eax, eax
rep stosb
lea esi, [stringDescRequest]
mov [esi+USB_DESCRIPTOR_REQUEST.ConnectionIndex], ebx
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wValue], USB_STRING_DESCRIPTOR_TYPE shl 8
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wIndex], 0
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wLength], MAXIMUM_USB_STRING_LENGTH
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, tmp, 0
test eax, eax
je error_obtaining_languageIDs
cmp [tmp], sizeof.USB_DESCRIPTOR_REQUEST+4
jb error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bLength], 2
jbe error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bDescriptorType], USB_STRING_DESCRIPTOR_TYPE
jne error_obtaining_languageIDs
; obtain Manufacturer string
mov edi, esi
mov ecx, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH
xor eax, eax
rep stosb
mov [esi+USB_DESCRIPTOR_REQUEST.ConnectionIndex], ebx
mov edx, USB_STRING_DESCRIPTOR_TYPE shl 8
lea ecx, [connectionInfo]
movzx eax, byte [ecx+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iManufacturer]
or edx, eax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wValue], dx
mov ax, word [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wIndex], word ax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wLength], MAXIMUM_USB_STRING_LENGTH
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, tmp, 0
test eax, eax
je error_obtaining_languageIDs
cmp [tmp], sizeof.USB_DESCRIPTOR_REQUEST+2
jb error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bLength], 2
jbe error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bDescriptorType], USB_STRING_DESCRIPTOR_TYPE
jne error_obtaining_languageIDs
lea eax, [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, tmp_buf2, 256, 0, 0
cinvoke wsprintf, tmp_buf, <" %sManufacturer: %s",13,10>, [spacing], tmp_buf2
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
; obtain Product string
mov edi, esi
mov ecx, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH
xor eax, eax
rep stosb
mov [esi+USB_DESCRIPTOR_REQUEST.ConnectionIndex], ebx
mov edx, USB_STRING_DESCRIPTOR_TYPE shl 8
lea ecx, [connectionInfo]
movzx eax, byte [ecx+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iProduct]
or edx, eax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wValue], dx
mov ax, word [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wIndex], word ax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wLength], MAXIMUM_USB_STRING_LENGTH
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, tmp, 0
test eax, eax
je error_obtaining_languageIDs
cmp [tmp], sizeof.USB_DESCRIPTOR_REQUEST+2
jb error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bLength], 2
jbe error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bDescriptorType], USB_STRING_DESCRIPTOR_TYPE
jne error_obtaining_languageIDs
lea eax, [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, tmp_buf2, 256, 0, 0
cinvoke wsprintf, tmp_buf, <" %sProduct: %s",13,10>, [spacing], tmp_buf2
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
; obtain the SerialNumber string
mov edi, esi
mov ecx, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH
xor eax, eax
rep stosb
mov [esi+USB_DESCRIPTOR_REQUEST.ConnectionIndex], ebx
mov edx, USB_STRING_DESCRIPTOR_TYPE shl 8
lea ecx, [connectionInfo]
movzx eax, byte [ecx+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iSerialNumber]
or edx, eax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wValue], dx
mov ax, word [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wIndex], word ax
mov [esi+USB_DESCRIPTOR_REQUEST.SetupPacket.wLength], MAXIMUM_USB_STRING_LENGTH
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, addr stringDescRequest, sizeof.USB_DESCRIPTOR_REQUEST + MAXIMUM_USB_STRING_LENGTH, tmp, 0
test eax, eax
je error_obtaining_languageIDs
cmp [tmp], sizeof.USB_DESCRIPTOR_REQUEST+2
jb error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bLength], 2
jbe error_obtaining_languageIDs
cmp [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bDescriptorType], USB_STRING_DESCRIPTOR_TYPE
jne error_obtaining_languageIDs
lea eax, [esi+sizeof.USB_DESCRIPTOR_REQUEST+USB_STRING_DESCRIPTOR.bString]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, tmp_buf2, 256, 0, 0
cinvoke wsprintf, tmp_buf, <" %sSerial Number: %s",13,10>, [spacing], tmp_buf2
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
jmp confnum
error_obtaining_languageIDs: ; failed to get langIDs or failed
; to get a particular string, so
; show hex index values instead
lea esi, [connectionInfo]
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iManufacturer]
cinvoke wsprintf, tmp_buf, <" %sManufacturer Index: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iProduct]
cinvoke wsprintf, tmp_buf, <" %sProduct Index: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.iSerialNumber]
cinvoke wsprintf, tmp_buf, <" %sSerial Number Index: 0x%x",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
confnum:
lea esi, [connectionInfo]
movzx eax, byte [esi+USB_NODE_CONNECTION_INFORMATION_EX.DeviceDescriptor.bNumConfigurations]
cinvoke wsprintf, tmp_buf, <" %sPossible Configurations #: %d",13,10>, [spacing], eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
cmp [externalhub], TRUE
jne port_nxt
;===========================================================================================================================
;=================================================================================== enumerate external hub's devices
;===========================================================================================================================
lea edi, [nodeconName]
mov ecx, sizeof.USB_NODE_CONNECTION_NAME
xor eax, eax
rep stosb
lea esi, [nodeconName]
mov [esi+USB_NODE_CONNECTION_NAME.ConnectionIndex], ebx
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_CONNECTION_NAME, addr nodeconName, sizeof.USB_NODE_CONNECTION_NAME, addr nodeconName, sizeof.USB_NODE_CONNECTION_NAME, tmp, 0
test eax, eax
je error4
mov edx, [esi+USB_NODE_CONNECTION_NAME.ActualLength]
mov [nodeconName_sz], edx
test edx, edx
je error4
invoke VirtualAlloc, 0, edx, MEM_COMMIT, PAGE_READWRITE
test eax, eax
je error4
mov [nodeconName_ptr], eax
mov [eax+USB_NODE_CONNECTION_NAME.ConnectionIndex], ebx
invoke DeviceIoControl, [hHubDevice], IOCTL_USB_GET_NODE_CONNECTION_NAME, [nodeconName_ptr], [nodeconName_sz], [nodeconName_ptr], [nodeconName_sz], tmp, 0
test eax, eax
je error6
mov edx, [nodeconName_ptr]
lea eax, [edx+USB_NODE_CONNECTION_NAME.NodeName]
invoke WideCharToMultiByte, CP_ACP, 0, eax, -1, [nodeconName_ptr], [nodeconName_sz], 0, 0
mov [nodeconName_sz], eax
cinvoke wsprintf, tmp_buf, <" %sExternal Hub: \\.\%s",13,10>, [spacing], [nodeconName_ptr]
mov esi, eax
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp, 0
mov edi, tmp_buf
add esi, edi
mov [esi-2], byte 0
mov al, byte "\"
mov ecx, -1
repne scasb
mov esi, edi
dec esi
stdcall usb_enumHub, esi
invoke VirtualFree, [nodeconName_ptr], 0, MEM_RELEASE
port_nxt:
inc ebx
lea eax, [HubInfo]
cmp bl, byte [eax+USB_NODE_INFORMATION.usb_hub_information.HubDescriptor.bNumberOfPorts]
jng ports_enum
invoke CloseHandle, [hHubDevice]
jmp _ret
error6: invoke VirtualFree, [nodeconName_ptr], 0, MEM_RELEASE
invoke CloseHandle, [hHubDevice]
jmp _ret
error5: invoke VirtualFree, [driverkeyName_ptr], 0, MEM_RELEASE
invoke CloseHandle, [hHubDevice]
jmp _ret
error4: call error_display
invoke CloseHandle, [hHubDevice]
jmp _ret
error: call error_display
_ret: popad
ret
endp
proc error_display
invoke GetLastError
invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM, 0, eax, LANG_NEUTRAL, tmp, 0, 0
cinvoke wsprintf, tmp_buf, <13,10," Something went wrong...: %s",13,10>, [tmp]
invoke WriteConsole, [hConsole], tmp_buf, eax, tmp_buf, 0
invoke LocalFree, [tmp]
ret
endp
section '.idata' import data readable writeable
library kernel32,'kernel32.DLL',\
user32,'user32.DLL',\
setupapi, 'Setupapi.dll',\
cfgmgr32, 'cfgmgr32.dll'
import kernel32,\
ExitProcess,'ExitProcess',\
GetLastError,'GetLastError',\
SetLastError,'SetLastError',\
FormatMessage,'FormatMessageA',\
LocalFree,'LocalFree',\
VirtualAlloc,'VirtualAlloc',\
VirtualFree,'VirtualFree',\
CreateFile,'CreateFileA',\
LoadLibrary,'LoadLibraryA',\
GetProcAddress,'GetProcAddress',\
DeviceIoControl,'DeviceIoControl',\
WriteConsole,'WriteConsoleA',\
GetStdHandle,'GetStdHandle',\
CloseHandle,'CloseHandle',\
WideCharToMultiByte,'WideCharToMultiByte'
import user32,wsprintf,'wsprintfA'
import cfgmgr32,\
CM_Locate_DevNode,'CM_Locate_DevNodeA',\
CM_Get_DevNode_Registry_Property,'CM_Get_DevNode_Registry_PropertyA',\
CM_Get_Device_ID,'CM_Get_Device_IDA',\
CM_Get_Child,'CM_Get_Child',\
CM_Get_Sibling,'CM_Get_Sibling',\
CM_Get_Parent,'CM_Get_Parent'
import setupapi,\
SetupDiGetClassDevs,'SetupDiGetClassDevsA',\
SetupDiEnumDeviceInterfaces,'SetupDiEnumDeviceInterfaces',\
SetupDiDestroyDeviceInfoList,'SetupDiDestroyDeviceInfoList',\
SetupDiGetDeviceInterfaceDetail, 'SetupDiGetDeviceInterfaceDetailA'
section '.rsrc' resource data readable
directory RT_ICON,icons,RT_GROUP_ICON,group_icons
resource icons,1,LANG_NEUTRAL,icon_data
resource group_icons,17,LANG_NEUTRAL,main_icon
icon main_icon,icon_data,"main.ico"