Вверх ↑
Этот топик читают: Гость
Ответов: 233
Рейтинг: 12
#1: 2021-09-28 23:40:54 ЛС | профиль | цитата
Как можно определить скорость USB порта к которому подключена флешка (UsbHighSpeed или UsbSuperSpeed)?
Через WMI не нашел подобного параметра. В интернете написано что можно через IOCTL-запрос IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX но за 2 дня так и не понял как это сделать.
Нашел еще delphi код, может его можно прикрутить в в InlineCode


uses
Windows, TypInfo;

type
USB_DEVICE_SPEED=(UsbLowSpeed,
UsbFullSpeed,
UsbHighSpeed,
UsbSuperSpeed);
USB_CONNECTION_STATUS=(NoDeviceConnected,
DeviceConnected,
DeviceFailedEnumeration,
DeviceGeneralFailure,
DeviceCausedOvercurrent,
DeviceNotEnoughPower,
DeviceNotEnoughBandwidth,
DeviceHubNestedTooDeeply,
DeviceInLegacyHub,
DeviceEnumerating,
DeviceReset);
SP_DEVICE_INTERFACE_DATA=packed record
cbSize: dword;
InterfaceClassGuid: TGUID;
Flags: dword;
Reserved: pointer;
end;
PSP_DEVICE_INTERFACE_DATA=^SP_DEVICE_INTERFACE_DATA;
SP_DEVICE_INTERFACE_DETAIL_DATA_W=packed record
cbSize: dword;
DevicePath: array[0..0] of WideChar;
end;
PSP_DEVICE_INTERFACE_DETAIL_DATA_W=^SP_DEVICE_INTERFACE_DETAIL_DATA_W;
SP_DEVINFO_DATA=packed record
cbSize: dword;
ClassGuid: TGUID;
DevInst: dword;
Reserved: pointer;
end;
PSP_DEVINFO_DATA=^SP_DEVINFO_DATA;
USB_DEVICE_DESCRIPTOR=packed record
bLength: byte;
bDescriptorType: byte;
bcdUSB: word;
bDeviceClass: byte;
bDeviceSubClass: byte;
bDeviceProtocol: byte;
bMaxPacketSize0: byte;
idVendor: word;
idProduct: word;
bcdDevice: word;
iManufacturer: byte;
iProduct: byte;
iSerialNumber: byte;
bNumConfigurations: byte;
end;
USB_ENDPOINT_DESCRIPTOR=packed record
bLength: byte;
bDescriptorType: byte;
bEndpointAddress: byte;
bmAttributes: byte;
wMaxPacketSize: word;
bInterval: byte;
end;
USB_PIPE_INFO=packed record
EndpointDescriptor: USB_ENDPOINT_DESCRIPTOR;
ScheduleOffset: Cardinal;
end;
USB_NODE_CONNECTION_INFORMATION_EX=packed record
ConnectionIndex: Cardinal;
DeviceDescriptor: USB_DEVICE_DESCRIPTOR;
CurrentConfigurationValue: byte;
Speed: byte;
DeviceIsHub: boolean;
DeviceAddress: word;
NumberOfOpenPipes: Cardinal;
ConnectionStatus: USB_CONNECTION_STATUS;
PipeList: array[0..0] of USB_PIPE_INFO;
end;
USB_DESCRIPTOR_REQUEST=packed record
ConnectionIndex: Cardinal;
bmRequest: byte;
bRequest: byte;
wValue: word;
wIndex: word;
wLength: word;
length: byte;
DescriptorType: byte;
Data: array[0..2047] of WideChar;
end;

const
DIGCF_PRESENT=2;
DIGCF_DEVICEINTERFACE=16;
GUID_DEVINTERFACE_USB_HUB: TGUID = '{F18A0E88-C30C-11D0-8815-00A0C906BED8}';
FILE_DEVICE_USB=$22;
FILE_ANY_ACCESS=0;
USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION=260;
USB_GET_NODE_CONNECTION_INFORMATION_EX=274;
METHOD_BUFFERED=0;
USB_STRING_DESCRIPTOR_TYPE=3;
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX=(FILE_DEVICE_USB shl 16)+(FILE_ANY_ACCESS shl 14)+(USB_GET_NODE_CONNECTION_INFORMATION_EX shl 2)+METHOD_BUFFERED;
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION=(FILE_DEVICE_USB shl 16)+(FILE_ANY_ACCESS shl 14)+(USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION shl 2)+METHOD_BUFFERED;

function SetupDiGetDeviceInterfaceDetailW(DeviceInfoSet: LongInt; DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA; DeviceInterfaceDetailData: PSP_DEVICE_INTERFACE_DETAIL_DATA_W; DeviceInterfaceDetailDataSize: dword; RequiredSize: Pdword; DeviceInfoData: PSP_DEVINFO_DATA): LongBool;stdcall;external 'setupapi.dll';
function SetupDiGetClassDevsW(ClassGuid: PGUID; Enumerator: PWideChar; hwndParent: LongInt; Flags: dword): LongInt;stdcall;external 'setupapi.dll';
function SetupDiEnumDeviceInterfaces(DeviceInfoSet: LongInt; DeviceInfoData: PSP_DEVINFO_DATA; InterfaceClassGuid: PGUID; MemberIndex: dword; DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA): LongBool;stdcall;external 'setupapi.dll';

var
len: Cardinal;
DevInfoSet,i,j,f,stdout: LongInt;
DevInterface: SP_DEVICE_INTERFACE_DATA=(cbSize: sizeof(SP_DEVICE_INTERFACE_DATA));
DevIntDetail: array[0..2047] of WideChar;
ConInfo: USB_NODE_CONNECTION_INFORMATION_EX;
Request: USB_DESCRIPTOR_REQUEST=(wIndex: 1033;wLength: sizeof(Request.Data));

begin
stdout:=GetStdHandle( STD_OUTPUT_HANDLE);
DevInfoSet:=SetupDiGetClassDevsW(@GUID_DEVINTERFACE_USB_HUB,0,0,DIGCF_PRESENT+DIGCF_DEVICEINTERFACE);
i:=0;
while SetupDiEnumDeviceInterfaces(DevInfoSet,0,@GUID_DEVINTERFACE_USB_HUB,i,@DevInterface) do
begin
pdword(@DevIntDetail)^:=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
SetupDiGetDeviceInterfaceDetailW(DevInfoSet,@DevInterface,@DevIntDetail,sizeof(DevIntDetail),@f,0);
f:=CreateFileW(@DevIntDetail[2],GENERIC_WRITE+GENERIC_READ,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
ConInfo.ConnectionIndex:=1;
while DeviceIoControl(f,IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,@ConInfo,sizeof(ConInfo),@ConInfo,sizeof(ConInfo),len,0) do
begin
if ConInfo.DeviceDescriptor.bLength=0 then
break;
if ConInfo.ConnectionStatus=DeviceConnected then
begin
Request.ConnectionIndex:=ConInfo.ConnectionIndex;
Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iManufacturer;
DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);
WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);
write(' ');
Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iProduct;
DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);
WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);
write(' ');
Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iSerialNumber;
DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);
WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);
writeln(' ',GetEnumName(TypeInfo(USB_DEVICE_SPEED),ConInfo.Speed));
end;
inc(ConInfo.ConnectionIndex);
end;
CloseHandle(f);
inc(i);
end;
readln;
end.
карма: 2

0
Ответов: 233
Рейтинг: 12
#2: 2021-09-30 14:53:58 ЛС | профиль | цитата
Помогите пожалуйста с InlineCode или направьте в нужное русло... бьюсь уже 3 дня


Add(InlineCode,16713883,581,203)
{
WorkPoints=#29:DoWork=Проверить скорость USB|
EventPoints=#26:EndWork=Результат проверки|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,Windows;|0:|4:type|32: USB_DEVICE_SPEED=(UsbLowSpeed,|33: UsbFullSpeed,|33: UsbHighSpeed,|35: UsbSuperSpeed);|0:|44: USB_CONNECTION_STATUS=(NoDeviceConnected,|41: DeviceConnected,|49: DeviceFailedEnumeration,|46: DeviceGeneralFailure,|49: DeviceCausedOvercurrent,|46: DeviceNotEnoughPower,|50: DeviceNotEnoughBandwidth,|50: DeviceHubNestedTooDeeply,|43: DeviceInLegacyHub,|43: DeviceEnumerating,|38: DeviceReset);|0:|40: SP_DEVICE_INTERFACE_DATA=packed record|53: cbSize: dword;|53: InterfaceClassGuid: TGUID;|53: Flags: dword;|55: Reserved: pointer;|31: end;|2: |54: PSP_DEVICE_INTERFACE_DATA=^SP_DEVICE_INTERFACE_DATA;|0:|49: SP_DEVICE_INTERFACE_DETAIL_DATA_W=packed record|54: cbSize: dword;|72: DevicePath: array[0..0] of WideChar;|40: end;|0:|72: PSP_DEVICE_INTERFACE_DETAIL_DATA_W=^SP_DEVICE_INTERFACE_DETAIL_DATA_W;|2: |31: SP_DEVINFO_DATA=packed record|35: cbSize: dword;|35: ClassGuid: TGUID;|35: DevInst: dword;|37: Reserved: pointer;|22: end;|0:|36: PSP_DEVINFO_DATA=^SP_DEVINFO_DATA;|0:|37: USB_DEVICE_DESCRIPTOR=packed record|49: bLength: byte;|49: bDescriptorType: byte;|49: bcdUSB: word;|49: bDeviceClass: byte;|49: bDeviceSubClass: byte;|49: bDeviceProtocol: byte;|49: bMaxPacketSize0: byte;|49: idVendor: word;|49: idProduct: word;|49: bcdDevice: word;|49: iManufacturer: byte;|49: iProduct: byte;|49: iSerialNumber: byte;|49: bNumConfigurations: byte;|28: end;|0:|39: USB_ENDPOINT_DESCRIPTOR=packed record|49: bLength: byte;|49: bDescriptorType: byte;|49: bEndpointAddress: byte;|49: bmAttributes: byte;|49: wMaxPacketSize: word;|49: bInterval: byte;|30: end;|0:|29: USB_PIPE_INFO=packed record|60: EndpointDescriptor: USB_ENDPOINT_DESCRIPTOR;|45: ScheduleOffset: Cardinal;|20: end;|0:|50: USB_NODE_CONNECTION_INFORMATION_EX=packed record|73: ConnectionIndex: Cardinal;|86: DeviceDescriptor: USB_DEVICE_DESCRIPTOR;|69: CurrentConfigurationValue: byte;|69: Speed: byte;|72: DeviceIsHub: boolean;|69: DeviceAddress: word;|73: NumberOfOpenPipes: Cardinal;|86: ConnectionStatus: USB_CONNECTION_STATUS;|93: PipeList: array[0..0] of USB_PIPE_INFO;|41: end;|0:|38: USB_DESCRIPTOR_REQUEST=packed record|51: ConnectionIndex: Cardinal;|47: bmRequest: byte;|47: bRequest: byte;|47: wValue: word;|47: wIndex: word;|47: wLength: word;|47: length: byte;|47: DescriptorType: byte;|69: Data: array[0..2047] of WideChar;|29: end;|0:|5:const|18: DIGCF_PRESENT=2;|27: DIGCF_DEVICEINTERFACE=16;|78: GUID_DEVINTERFACE_USB_HUB: TGUID = '{F18A0E88-C30C-11D0-8815-00A0C906BED8}';|22: FILE_DEVICE_USB=$22;|20: FILE_ANY_ACCESS=0;|46: USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION=260;|45: USB_GET_NODE_CONNECTION_INFORMATION_EX=274;|20: METHOD_BUFFERED=0;|31: USB_STRING_DESCRIPTOR_TYPE=3;|160: IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX=(FILE_DEVICE_USB shl 16)+(FILE_ANY_ACCESS shl 14)+(USB_GET_NODE_CONNECTION_INFORMATION_EX shl 2)+METHOD_BUFFERED;|162: IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION=(FILE_DEVICE_USB shl 16)+(FILE_ANY_ACCESS shl 14)+(USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION shl 2)+METHOD_BUFFERED;|0:|4:type|28: THiAsmClass = class(TDebug)|0:|10: private|28: |9: public|3: |21: EndWork:THI_Event;|0:|49: procedure DoWork(var _Data:TData; Index:word);|0:|5: end;|0:|315: function SetupDiGetDeviceInterfaceDetailW(DeviceInfoSet: LongInt; DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA; DeviceInterfaceDetailData: PSP_DEVICE_INTERFACE_DETAIL_DATA_W; DeviceInterfaceDetailDataSize: dword; RequiredSize: Pdword; DeviceInfoData: PSP_DEVINFO_DATA): LongBool;stdcall;external 'setupapi.dll';|149: function SetupDiGetClassDevsW(ClassGuid: PGUID; Enumerator: PWideChar; hwndParent: LongInt; Flags: dword): LongInt;stdcall;external 'setupapi.dll';|234: function SetupDiEnumDeviceInterfaces(DeviceInfoSet: LongInt; DeviceInfoData: PSP_DEVINFO_DATA; InterfaceClassGuid: PGUID; MemberIndex: dword; DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA): LongBool;stdcall;external 'setupapi.dll';|0:|0:|14:implementation|0:|29:procedure THiAsmClass.DoWork;|0:|3:var|36: len: Cardinal;|35: DevInfoSet,i,j,f,stdout: LongInt;|95: DevInterface: SP_DEVICE_INTERFACE_DATA=(cbSize: sizeof(SP_DEVICE_INTERFACE_DATA));|54: DevIntDetail: array[0..2047] of WideChar;|62: ConInfo: USB_NODE_CONNECTION_INFORMATION_EX;|95: Request: USB_DESCRIPTOR_REQUEST=(wIndex: 1033;wLength: sizeof(Request.Data));|0:|5:begin|43: stdout:=GetStdHandle( STD_OUTPUT_HANDLE);|103: DevInfoSet:=SetupDiGetClassDevsW(@GUID_DEVINTERFACE_USB_HUB,0,0,DIGCF_PRESENT+DIGCF_DEVICEINTERFACE);|7: i:=0;|95: while SetupDiEnumDeviceInterfaces(DevInfoSet,0,@GUID_DEVINTERFACE_USB_HUB,i,@DevInterface) do|7: begin|70: pdword(@DevIntDetail)^:=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);|103: SetupDiGetDeviceInterfaceDetailW(DevInfoSet,@DevInterface,@DevIntDetail,sizeof(DevIntDetail),@f,0);|117: f:=CreateFileW(@DevIntDetail[2],GENERIC_WRITE+GENERIC_READ,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);|31: ConInfo.ConnectionIndex:=1;|132: while DeviceIoControl(f,IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,@ConInfo,sizeof(ConInfo),@ConInfo,sizeof(ConInfo),len,0) do|9: begin|48: if ConInfo.DeviceDescriptor.bLength=0 then|14: break;|54: if ConInfo.ConnectionStatus=DeviceConnected then|11: begin|57: Request.ConnectionIndex:=ConInfo.ConnectionIndex;|98: Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iManufacturer;|129: DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);|73: WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);|19: write(' ');|93: Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iProduct;|129: DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);|74: WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);|19: write(' ');|98: Request.wValue:=(USB_STRING_DESCRIPTOR_TYPE shl 8)+ConInfo.DeviceDescriptor.iSerialNumber;|129: DeviceIoControl(f,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,@Request,sizeof(Request),@Request,sizeof(Request),len,0);|74: WriteConsoleW(stdout,@Request.Data,Request.Length shr 1-1,len,0);|75: writeln(' ',GetEnumName(TypeInfo(USB_DEVICE_SPEED),ConInfo.Speed));|10: end;|35: inc(ConInfo.ConnectionIndex);|8: end;|19: CloseHandle(f);|11: inc(i);|6: end;|9: readln;|4:end;|0:|4:end.|
}

Как победить ошибки:

D:\HiAsm 4\Elements\delphi\code\hiInlineCode_5CA79D0.pas(143) Error: Cannot initialize local variables
D:\HiAsm 4\Elements\delphi\code\hiInlineCode_5CA79D0.pas(146) Error: Cannot initialize local variables
D:\HiAsm 4\Elements\delphi\code\hiInlineCode_5CA79D0.pas(176) Error: Undeclared identifier: 'GetEnumName'
карма: 2

0
Ответов: 4628
Рейтинг: 749
#3: 2021-09-30 16:00:27 ЛС | профиль | цитата
Iliya писал(а):
Cannot initialize local variables

var
DevInterface: SP_DEVICE_INTERFACE_DATA;
Request: USB_DESCRIPTOR_REQUEST;
...
begin
DevInterface.cbSize := sizeof(SP_DEVICE_INTERFACE_DATA);
Request.wIndex := 1033;
Request.wLength := sizeof(Request.Data);

Iliya писал(а):
Undeclared identifier: 'GetEnumName'

write(), writeln(), WriteConsoleW() - это выдача результатов работы кода в консоль. Заменяешь это на выдачу событий HiAsm, что не нужно - комментируешь. "GetEnumName(TypeInfo(USB_DEVICE_SPEED)" не нужно, в данном коде его можно было бы заменить на 'USB_DEVICE_SPEED'. А в твоем случае будет просто выдаваться событие с нужными данными.

Редактировалось 1 раз(а), последний 2021-09-30 16:00:49
карма: 26

1
Голосовали:Iliya
Ответов: 233
Рейтинг: 12
#4: 2021-10-01 02:46:43 ЛС | профиль | цитата
Netspirit писал(а):
write(), writeln(), WriteConsoleW() - это выдача результатов работы кода в консоль. Заменяешь это на выдачу событий HiAsm, что не нужно - комментируешь. "GetEnumName(TypeInfo(USB_DEVICE_SPEED)" не нужно, в данном коде его можно было бы заменить на 'USB_DEVICE_SPEED'. А в твоем случае будет просто выдаваться событие с нужными данными.


Спасибо большое!!! Странное дело, в Windows 7 код работает как положено и определяет флешки 3.0 а вот в Windows 10 все флешки показывает 2.0 так еще и такст с кракозябрами и перемешанный в строках
карма: 2

0
Ответов: 783
Рейтинг: 168
#5: 2021-10-01 20:36:20 ЛС | профиль | цитата
Iliya, В состав пакета SDK для Windows 10 входит утилита usbview.
При помощи которой можно узнать практически всё об USB.
В архиве схема и сама программа usbview .exe для 32. Можешь скачать её самостоятельно для x32 или x64.
https://forum.hiasm.com/getfile/39285
После запуска программы в папке должны появится 2 файла (usb-info.xml и USBViewAll.txt) их можно парсить как угодно.
Пример в схеме.
карма: 15

1
Голосовали:Iliya
5
Сообщение
...
Прикрепленные файлы
(файлы не залиты)