format pe console
include 'win32ax.inc'
entry start
;//----------
section '.inc' data readable
include 'equates\setupapi.inc'
include 'equates\usbstor.inc'
;//----------
.data
ntName db '\\?\GLOBALROOT'
dosName db 32 dup(0)
hubName db '\\?\'
hubStr db 64 dup(0)
hubGuid db '#{f18a0e88-c30c-11d0-8815-00a0c906bed8}',0
hubHndl dd 0
usbPort dd 0
epCount dd 0
volume dd 0
volTotal dd 0,0
volFree dd 0,0
volLabel db 16 dup(0)
volFsys db 08 dup(0)
volSn dd 0
maxLen dd 0
flags dd 0
sysTime SYSTEMTIME
gByte dd 1024*1024*1024
fResult1 dq 0
fResult2 dq 0
hndl dd 0
index dd 0
dpt dd 0
retSize dd 0
align 16
request USB_DESCRIPTOR_REQUEST
align 16
devData SP_DEVINFO_DATA
align 16
buff dd 0
;//----------
.code
start: invoke SetConsoleTitle,<'*** USB-Flash storage info ***',0>
invoke GetLogicalDriveStringsA,64,buff
mov esi,buff
@@: push esi
invoke GetDriveType,esi
pop esi
cmp eax,DRIVE_REMOVABLE ;// съёмный диск?
je @ok ;// да!
add esi,4
cmp byte[esi],0
jne @b
cinvoke printf,<10,' ERROR! USB-Flash not found.',0>
jmp @exit
@ok: push esi
mov eax,[esi]
mov [volume],eax
cinvoke printf,<10,' Volume DOS-name.....: %s',0>,esi
pop esi
mov byte[esi+2],0
invoke QueryDosDevice,esi,dosName,32
cinvoke printf,<10,' Volume kernel name..: %s',10,0>,ntName
;//**** Получаем хэндл набора USB ******************
invoke SetupDiGetClassDevs,GUID_DEVCLASS_USB,0,0,DIGCF_PRESENT
mov [hndl],eax
;//**** Поиск USB-Flash в цикле ********************
@findNextDevice:
invoke SetupDiEnumDeviceInfo,[hndl],[index],devData
or eax,eax
jz @exit
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,SPDRP_SERVICE,\
0,buff,256,0
call @f
db 'USBSTOR'
@@: pop esi
mov edi,buff
mov ecx,7
repe cmpsb
or ecx,ecx
jnz @next
;//**** Нашли! Выводим информацию из реестра **************
cinvoke printf,<10,' Driver info:',0>
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_DriverProvider, dpt,buff,256*4,0,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' Provider........: %ls',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_DriverInfPath, dpt,buff,256*4,0,0
cinvoke printf,<10,' File name.......: %ls',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_DriverVersion, dpt,buff,256*4,0,0
cinvoke printf,<10,' Version.........: %ls',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_DriverDate, dpt,buff,256*4,0,0
invoke FileTimeToSystemTime,buff,sysTime
movzx eax,[sysTime.wDay]
movzx ebx,[sysTime.wMonth]
movzx ecx,[sysTime.wYear]
cinvoke printf,<10,' Create date.....: %02d.%02d.%d',0>,eax,ebx,ecx
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_DriverRank, dpt,buff,256*4,0,0
cinvoke printf,<10,' Driver rank.....: 0x%08x',0>,[buff]
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_SERVICE, 0,buff,256,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' System service..: %s',0>,buff
mov [buff],0
;//**********************************
cinvoke printf,<10,10,' Hub info:',0>
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_LOCATION_PATHS,0,buff,256,0
mov eax,'# '
push eax
call ParseBuffString
cinvoke printf,<10,' Location path...: %s',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_Parent,dpt,buff,256*4,0,0
call Unicode2Ansi
push ecx
mov eax,'\#'
push eax
call ParseBuffString
pop ecx
mov esi,buff
mov edi,hubStr
rep movsb
invoke lstrcat,hubName,hubGuid
cinvoke printf,<10,' Kernel name.....: %s',0>,hubName
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_COMPATIBLEIDS,0,buff,256,0
mov eax,'& '
push eax
call ParseBuffString
cinvoke printf,<10,' Device class....: %s',0>,buff
;//*****************************
cinvoke printf,<10,10,' Device info:',0>
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_LOCATION_INFORMATION,0,buff,256,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' Location path...: %s',0>,buff
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,\
0,buff,256,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' Kernel name.....: %s',0>,buff
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_ADDRESS,0,buff,256,0
mov eax,dword[buff]
mov [usbPort],eax ;//<---------- Запомнить порт устройства!!!
cinvoke printf,<10,' Hub port index..: %d',0>,[buff]
;//*****************************
cinvoke printf,<10,10,' Vendor info:',0>
invoke SetupDiGetDeviceRegistryProperty,[hndl],devData,\
SPDRP_DEVICEDESC,0,buff,256,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' Device type.....: %s',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_BusReportedDeviceDesc, dpt,buff,256*4,0,0
invoke CharToOem,buff,buff
cinvoke printf,<10,' Device name.....: %ls',0>,buff
invoke SetupDiGetDeviceProperty,[hndl],devData,\
DEVPKEY_Device_InstanceId, dpt,buff,256*4,0,0
call Unicode2Ansi
mov edi,buff
mov al,'&'
repne scasb
mov byte[edi-1],' '
mov al,'\'
repne scasb
mov byte[edi-1],0
push edi
cinvoke printf,<10,' Vendor Id.......: %s',0>,buff
pop edi
cinvoke printf,<10,' Serial number...: %s',0>,edi
;//******************************************
cinvoke printf,<10,10,' Volume info:',0>
invoke GetDiskFreeSpaceEx,volume,0,volTotal,volFree
invoke GetVolumeInformation,volume,volLabel,16,volSn,maxLen,flags,volFsys,8
finit
fild qword[volTotal]
fidiv [gByte]
fstp [fResult1]
fild qword[volFree]
fidiv [gByte]
fstp [fResult2]
cinvoke printf,<10,' Capacity........: %.2f Gb',\
10,' Free space......: %.2f Gb',0>,\
dword[fResult1],dword[fResult1+4],\
dword[fResult2],dword[fResult2+4]
mov eax,[volSn]
movzx ebx,ax
shr eax,16
cinvoke printf,<10,' Volume label....: %s',\
10,' Volume serial...: %04X-%04X',\
10,' File system.....: %s',0>,\
volLabel,eax,ebx,volFsys
;//######[ READ DESCRIPTORS ]##########################
cinvoke printf,<10,10,' [xxxxxxxxxxxxxxx STANDART DESCRIPTORS xxxxxxxxxxxxxx]',10,0>
invoke CreateFile,hubName,GENERIC_READ + GENERIC_WRITE,\
FILE_SHARE_READ + FILE_SHARE_WRITE,\
0,OPEN_EXISTING,0,0
mov [hubHndl],eax
;// Запрос стандартных дескрипторов устройства
mov eax,[usbPort]
mov [request.ConnectionIndex],eax
mov [request.SetupPacket.bRequest ], GET_DESCRIPTOR
mov [request.SetupPacket.wValueHigh], USB_DEVICE_DESCRIPTOR_TYPE
mov [request.SetupPacket.wValueLow ], 0
mov [request.SetupPacket.wIndex ], 0
mov [request.SetupPacket.wLenght ], sizeof.USB_DEVICE_DESCRIPTOR
invoke DeviceIoControl,[hubHndl],IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,\
request, sizeof.USB_DESCRIPTOR_REQUEST,\
request, sizeof.USB_DESCRIPTOR_REQUEST, retSize, 0
mov esi,request.Data
movzx eax,[esi + USB_DEVICE_DESCRIPTOR.bcdUSB]
movzx ebx,al
shr eax,8
movzx ecx,[esi + USB_DEVICE_DESCRIPTOR.bNumConfigurations]
movzx edx,[esi + USB_DEVICE_DESCRIPTOR.bMaxPacketSize]
cinvoke printf,<10,' Device type.....: USB-%x.%x',\
10,' Total config....: %d',\
10,' EP0 packet size.: %d byte',0>,eax,ebx,ecx,edx
;// Запрос дескриптора "конфигурации" и сразу всех остальных
mov [request.SetupPacket.wValueHigh], USB_CONFIG_DESCRIPTOR_TYPE
mov [request.SetupPacket.wValueLow ], 0 ;// Номер конфигурации
mov [request.SetupPacket.wIndex ], 0
mov [request.SetupPacket.wLenght ], sizeof.USB_CONFIGURATION_DESCRIPTOR * 16
invoke DeviceIoControl,[hubHndl],IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,\
request, sizeof.USB_DESCRIPTOR_REQUEST,\
request, sizeof.USB_DESCRIPTOR_REQUEST, retSize, 0
mov esi,request.Data
movzx eax,[esi + USB_CONFIGURATION_DESCRIPTOR.MaxPower]
shl eax,1
cinvoke printf,<10,' Max power.......: %d mA',0>,eax
;// Читаем сразу дескриптор "интерфейса"
mov esi,request.Data
add esi,sizeof.USB_CONFIGURATION_DESCRIPTOR
push esi
movzx eax,[esi + USB_INTERFACE_DESCRIPTOR.bNumEndpoints]
mov [epCount],eax
dec [epCount] ;//<------- Всего конечных точек для цикла!!!
mov ebx,eax
inc ebx
cinvoke printf,<10,' Total Endpoints.: %d + EP0 = %d',0>,eax,ebx
;// Читаем сразу дескрипторы "конечных точек EP"
jmp @f
bulk db 'Bulk',0
iso db 'Isochronius',0
input db 'In',0
output db 'Out',0
@@: pop esi
add esi,sizeof.USB_INTERFACE_DESCRIPTOR
push esi
movzx eax,[esi + USB_ENDPOINT_DESCRIPTOR.bEndpointAddress]
movzx ebx,[esi + USB_ENDPOINT_DESCRIPTOR.wMaxPacketSize]
movzx ecx,[esi + USB_ENDPOINT_DESCRIPTOR.bmAttributes]
movzx edi,[esi + USB_ENDPOINT_DESCRIPTOR.bInterval]
imul edi,125
mov edx,input
test al,10000000b ;//<---- проверить In или Out
jnz @f
mov edx,output
@@: and al,11b ;//<---- оставить только номер
mov ebp,bulk
cmp ecx,2 ;//<---- Bulk или изохронная
je @f
mov ebp,iso
@@: cinvoke printf,<10,' Endpoint info...: EP%d, 0.%d ms, %d byte, %s, %s',0>,eax,edi,ebx,ebp,edx
pop esi ;//<---- Цикл вывода EP1..EP16 по счётчику
@printEP_info:
add esi,sizeof.USB_ENDPOINT_DESCRIPTOR
push esi
movzx eax,[esi + USB_ENDPOINT_DESCRIPTOR.bEndpointAddress]
movzx ebx,[esi + USB_ENDPOINT_DESCRIPTOR.wMaxPacketSize]
movzx ecx,[esi + USB_ENDPOINT_DESCRIPTOR.bmAttributes]
movzx edi,[esi + USB_ENDPOINT_DESCRIPTOR.bInterval]
imul edi,125
mov edx,input
test al,10000000b
jnz @f
mov edx,output
@@: and al,11b
mov ebp,bulk
cmp ecx,2
je @f
mov ebp,iso
@@: cinvoke printf,<10,' Endpoint info...: EP%d, 0.%d ms, %d byte, %s, %s',0>,eax,edi,ebx,ebp,edx
pop esi
dec [epCount] ;//<--- есть ещё точки?
jnz @printEP_info ;//<--- да, на повтор..
;// Запрос дескриптора "строк"
mov [request.SetupPacket.wValueHigh], USB_STRING_DESCRIPTOR_TYPE
mov [request.SetupPacket.wValueLow ], 2 ;// Индекс строки
mov [request.SetupPacket.wIndex ], 0x0409 ;// ID языка
mov [request.SetupPacket.wLenght ], 128
invoke DeviceIoControl,[hubHndl],IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,\
request, sizeof.USB_DESCRIPTOR_REQUEST,\
request, sizeof.USB_DESCRIPTOR_REQUEST, retSize, 0
mov esi,request.Data
lea esi,[esi + USB_STRING_DESCRIPTOR.bString]
cinvoke printf,<10,10,' String..........: %ls',10,0>,esi
;//********* Безопасное извлечение устройства *************
cinvoke printf,<10,' Safe eject Usb-Flash: y/n... ',0>
cinvoke getch
cmp al,'y'
jne @f
cinvoke printf,<'y',0>
mov eax,[devData.DevInst]
invoke CM_Request_Device_Eject,eax,0,0,0,0
@@: cinvoke printf,<10,' Press any key for exit...',10,0>
;//**** Индексированный поиск устройств, пока не найдём.
@next: inc [index]
jmp @findNextDevice
@exit: cinvoke getch ;//<---- GAME OVER!!!
cinvoke exit,0
;//###########<--- ПРОЦЕДУРЫ --->#######################
proc Unicode2Ansi
xor ecx,ecx
mov esi,buff
mov edi,esi
@@: lodsw
or ax,ax
je @f
stosb
inc ecx
jmp @b
@@: mov byte[edi],0
ret
endp
proc ParseBuffString char
invoke lstrlen,buff
xchg ecx,eax
mov edi,buff
mov eax,[char]
@@: repne scasb
or ecx,ecx
je @f
mov byte[edi-1],ah
jmp @b
@@: ret
endp
;//---------------
section '.idata' import data readable
library msvcrt,'msvcrt.dll',setupapi,'setupapi.dll',\
kernel32,'kernel32.dll',user32,'user32.dll'
import msvcrt, printf,'printf',fflush,'fflush',getch,'_getch',exit,'exit'
import setupapi,SetupDiGetClassDevs,'SetupDiGetClassDevsA',\
SetupDiEnumDeviceInfo,'SetupDiEnumDeviceInfo',\
SetupDiGetDeviceProperty,'SetupDiGetDevicePropertyW',\
SetupDiGetDeviceRegistryProperty,'SetupDiGetDeviceRegistryPropertyA',\
CM_Request_Device_Eject,'CM_Request_Device_EjectA'
include 'api\kernel32.inc'
include 'api\user32.inc'
Комментарии
2