📄 usbhlib.pas
字号:
IOCTL_INTERNAL_USB_SUBMIT_URB = USB_KERNEL_CTL_CONST or (USB_SUBMIT_URB shl 2);
IOCTL_USB_DIAG_IGNORE_HUBS_ON = USB_CTL_CONST or (USB_DIAG_IGNORE_HUBS_ON shl 2);
IOCTL_USB_DIAG_IGNORE_HUBS_OFF = USB_CTL_CONST or (USB_DIAG_IGNORE_HUBS_OFF shl 2);
IOCTL_USB_DIAGNOSTIC_MODE_OFF = USB_CTL_CONST or (HCD_DIAGNOSTIC_MODE_OFF shl 2);
IOCTL_USB_DIAGNOSTIC_MODE_ON = USB_CTL_CONST or (HCD_DIAGNOSTIC_MODE_ON shl 2);
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = USB_CTL_CONST or (USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION shl 2);
IOCTL_USB_GET_HUB_CAPABILITIES = USB_CTL_CONST or (USB_GET_HUB_CAPABILITIES shl 2);
IOCTL_USB_GET_ROOT_HUB_NAME = USB_CTL_CONST or (HCD_GET_ROOT_HUB_NAME shl 2);
IOCTL_GET_HCD_DRIVERKEY_NAME = USB_CTL_CONST or (HCD_GET_DRIVERKEY_NAME shl 2);
IOCTL_USB_GET_NODE_INFORMATION = USB_CTL_CONST or (USB_GET_NODE_INFORMATION shl 2);
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION = USB_CTL_CONST or (USB_GET_NODE_CONNECTION_INFORMATION shl 2);
IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES = USB_CTL_CONST or (USB_GET_NODE_CONNECTION_ATTRIBUTES shl 2);
IOCTL_USB_GET_NODE_CONNECTION_NAME = USB_CTL_CONST or (USB_GET_NODE_CONNECTION_NAME shl 2);
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME = USB_CTL_CONST or (USB_GET_NODE_CONNECTION_DRIVERKEY_NAME shl 2);
IOCTL_USB_HCD_DISABLE_PORT = USB_CTL_CONST or (HCD_DISABLE_PORT shl 2);
IOCTL_USB_HCD_ENABLE_PORT = USB_CTL_CONST or (HCD_ENABLE_PORT shl 2);
IOCTL_USB_HCD_GET_STATS_1 = USB_CTL_CONST or (HCD_GET_STATS_1 shl 2);
IOCTL_USB_HCD_GET_STATS_2 = USB_CTL_CONST or (HCD_GET_STATS_2 shl 2);
type
PUSB_HUB_CAPABILITIES = ^USB_HUB_CAPABILITIES;
USB_HUB_CAPABILITIES = packed record
HubIs2xCapable :DWord;// ULONG HubIs2xCapable : 1;
end;
const
NoDeviceConnected = 0; //for USB_CONNECTION_STATUS
DeviceConnected = 1;
DeviceFailedEnumeration = 2;
DeviceGeneralFailure = 3;
DeviceCausedOvercurrent = 4;
DeviceNotEnoughPower = 5;
DeviceNotEnoughBandwidth = 6;
DeviceHubNestedTooDeeply = 7;
DeviceInLegacyHub = 8;
type
PUSB_CONNECTION_STATUS = ^PUSB_CONNECTION_STATUS;
USB_CONNECTION_STATUS = DWord;
TSetupPacket = packed record
bmRequest,
bRequest :Byte;
wValue,
wIndex,
wLength :Word;
end;
PUSB_DESCRIPTOR_REQUEST = ^USB_DESCRIPTOR_REQUEST;
USB_DESCRIPTOR_REQUEST = packed record
ConnectionIndex :DWord;
SetupPacket :TSetupPacket;
Data :array[0..2048 - 1] of Byte;//bylo 0
end;
PUSB_HCD_DRIVERKEY_NAME = ^USB_HCD_DRIVERKEY_NAME;
USB_HCD_DRIVERKEY_NAME = packed record
ActualLength :DWord;
DriverKeyName :TUnicodeName;
end;
PHCD_ISO_STAT_COUNTERS = ^HCD_ISO_STAT_COUNTERS;
HCD_ISO_STAT_COUNTERS = packed record
LateUrbs,
DoubleBufferedPackets,
TransfersCF_5ms,
TransfersCF_2ms,
TransfersCF_1ms,
MaxInterruptLatency,
BadStartFrame,
StaleUrbs,
IsoPacketNotAccesed,
IsoPacketHWError,
SmallestUrbPacketCount,
LargestUrbPacketCount,
IsoCRC_Error,
IsoOVERRUN_Error,
IsoINTERNAL_Error,
IsoUNKNOWN_Error :Word;
IsoBytesTransferred :DWord;
LateMissedCount,
HWIsoMissedCount :Word;
Reserved7 :array[0..7] of DWord;
end;
PHCD_STAT_COUNTERS = ^HCD_STAT_COUNTERS;
HCD_STAT_COUNTERS = packed record
BytesTransferred :DWord;
IsoMissedCount,
DataOverrunErrorCount,
CrcErrorCount,
ScheduleOverrunCount,
TimeoutErrorCount,
InternalHcErrorCount,
BufferOverrunErrorCount,
SWErrorCount,
StallPidCount,
PortDisableCount :Word;
end;
PHCD_STAT_INFORMATION_1 = ^HCD_STAT_INFORMATION_1;
HCD_STAT_INFORMATION_1 = packed record
Reserved1,
Reserved2,
ResetCounters :DWord;
TimeRead :LARGE_INTEGER;
Counters :HCD_STAT_COUNTERS;
end;
PHCD_STAT_INFORMATION_2 = ^HCD_STAT_INFORMATION_2;
HCD_STAT_INFORMATION_2 = packed record
Reserved1,
Reserved2,
ResetCounters :DWord;
TimeRead :LARGE_INTEGER;
LockedMemoryUsed :Longint;
Counters :HCD_STAT_COUNTERS;
IsoCounters :HCD_ISO_STAT_COUNTERS;
end;
PUSB_HUB_INFORMATION = ^USB_HUB_INFORMATION;
USB_HUB_INFORMATION = packed record
HubDescriptor :USB_HUB_DESCRIPTOR;
HubIsBusPowered :Boolean;
end;
PUSB_HUB_NAME = ^USB_HUB_NAME;
USB_HUB_NAME = packed record
ActualLength :DWord;
HubName :TUnicodeName;
end;
const
UsbHub = 0; //for USB_HUB_NODE
UsbMIParent = 1;
type
USB_HUB_NODE = DWord;
//typedef VOID STDCALL
//(*USB_IDLE_CALLBACK)(
// PVOID Context);
//typedef struct _USB_IDLE_CALLBACK_INFO {
// USB_IDLE_CALLBACK IdleCallback;
// PVOID IdleContext;
//} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO;
PUSB_NODE_CONNECTION_ATTRIBUTES = ^USB_NODE_CONNECTION_ATTRIBUTES;
USB_NODE_CONNECTION_ATTRIBUTES = packed record
ConnectionIndex :DWord;
ConnectionStatus :USB_CONNECTION_STATUS;
PortAttributes :DWord;
end;
PUSB_NODE_CONNECTION_DRIVERKEY_NAME = ^USB_NODE_CONNECTION_DRIVERKEY_NAME;
USB_NODE_CONNECTION_DRIVERKEY_NAME = packed record
ConnectionIndex :DWord;
ActualLength :DWord;
DriverKeyName :TUnicodeName;
end;
PUSB_PIPE_INFO = ^USB_PIPE_INFO;
USB_PIPE_INFO = packed record
EndpointDescriptor :USB_ENDPOINT_DESCRIPTOR;
ScheduleOffset :DWord;
end;
PUSB_NODE_CONNECTION_INFORMATION = ^USB_NODE_CONNECTION_INFORMATION;
USB_NODE_CONNECTION_INFORMATION = packed record
ConnectionIndex :DWord;
DeviceDescriptor :USB_DEVICE_DESCRIPTOR;
CurrentConfigurationValue :Byte;
LowSpeed,
DeviceIsHub :Boolean;
DeviceAddress :Word;
NumberOfOpenPipes :DWord;
ConnectionStatus :USB_CONNECTION_STATUS;
PipeList :array[0..2000 - 1] of USB_PIPE_INFO;//bylo 0
end;
PUSB_NODE_CONNECTION_NAME = ^USB_NODE_CONNECTION_NAME;
USB_NODE_CONNECTION_NAME = packed record
ConnectionIndex :DWord;
ActualLength :DWord;
NodeName :TUnicodeName;
end;
PUSB_MI_PARENT_INFORMATION = ^USB_MI_PARENT_INFORMATION;
USB_MI_PARENT_INFORMATION = packed record
NumberOfInterfaces :DWord;
end;
// PUSB_NODE_INFORMATION = ^USB_NODE_INFORMATION;
// USB_NODE_INFORMATION = packed record
// NodeType :USB_HUB_NODE;
// u : union!!!
// HubInformation :USB_HUB_INFORMATION;
// MiParentInformation :USB_MI_PARENT_INFORMATION;
// end;
// end;
PUSB_NODE_INFORMATIONH = ^USB_NODE_INFORMATIONH;
USB_NODE_INFORMATIONH = packed record
NodeType :USB_HUB_NODE;
HubInformation :USB_HUB_INFORMATION;
end;
PUSB_NODE_INFORMATIONP = ^USB_NODE_INFORMATIONP;
USB_NODE_INFORMATIONP = packed record
NodeType :USB_HUB_NODE;
MiParentInformation :USB_MI_PARENT_INFORMATION;
end;
const
WMI_USB_DRIVER_INFORMATION = 0;
WMI_USB_DRIVER_NOTIFICATION = 1;
WMI_USB_POWER_DEVICE_ENABLE = 2;
EnumerationFailure = 0; //for USB_NOTIFICATION_TYPE
InsufficentBandwidth = 1;
InsufficentPower = 2;
OverCurrent = 3;
ResetOvercurrent = 4;
AcquireBusInfo = 5;
AcquireHubName = 6;
AcquireControllerName = 7;
HubOvercurrent = 8;
HubPowerChange = 9;
HubNestedTooDeeply = 10;
ModernDeviceInLegacyHub = 11;
type
USB_NOTIFICATION_TYPE = DWord;
PUSB_ACQUIRE_INFO = ^USB_ACQUIRE_INFO;
USB_ACQUIRE_INFO = packed record
NotificationType :USB_NOTIFICATION_TYPE;
TotalSize :DWord;
Buffer :array[0..1023] of Word;//bylo 0..0
end;
PUSB_NOTIFICATION = ^USB_NOTIFICATION;
USB_NOTIFICATION = packed record
NotificationType :USB_NOTIFICATION_TYPE;
end;
PUSB_BUS_NOTIFICATION = ^USB_BUS_NOTIFICATION;
USB_BUS_NOTIFICATION = packed record
NotificationType :USB_NOTIFICATION_TYPE;
TotalBandwidth,
ConsumedBandwidth,
ControllerNameLength :DWord;
end;
PUSB_CONNECTION_NOTIFICATION = ^USB_CONNECTION_NOTIFICATION;
USB_CONNECTION_NOTIFICATION = packed record
NotificationType :USB_NOTIFICATION_TYPE;
ConnectionNumber,
RequestedBandwidth,
EnumerationFailReason,
PowerRequested,
HubNameLength :DWord;
end;
PUSB_ROOT_HUB_NAME = ^USB_ROOT_HUB_NAME;
USB_ROOT_HUB_NAME = packed record
ActualLength :DWord;
RootHubName :TUnicodeName;
end;
{------------------------------------------------------------------------}
{usbdisp.h}
const
ClassName :array[0..4*3 - 1] of string[20] = (
'Reserved', 'Audio', 'Communications', 'Human Interface',
'Monitor', 'Physical Interface', 'Power', 'Printer',
'Storage', 'Hub', 'Vendor Specific', '*ILLEGAL VALUE*'
);
ConnectionStatus :array[0..5] of string[30] = (
'No device connected', 'Device connected', 'Device FAILED enumeration',
'Device general FAILURE', 'Device caused overcurrent', 'Not enough power for device'
);
type
// Define all stuctures using UCHAR or BOOLEAN so that the variables are not 'aligned' by the compiler
TDSetupPacket = packed record
bmRequest,
bRequest :Byte;
wValueLo,
wValueHi :Byte;
wIndex,
wLength :Word;
end;
TDESCRIPTOR_REQUEST = packed record
ConnectionIndex :DWord;
SetupPacket :TDSetupPacket;
Data :array[0..2048 - 1] of Byte;
end;
TDEVICE_DESCRIPTOR = packed record {USB_DEV....?}
bLength,
bDescriptorType :Byte;
bcdUSB :array[0..1] of Byte;
bDeviceClass,
bDeviceSubClass,
bDeviceProtocol,
bMaxPacketSize0 :Byte;
idVendor,
idProduct,
bcdDevice :array[0..1] of Byte;
iManufacturer,
iProduct,
iSerialNumber,
bNumConfigurations :Byte;
end;
THUB_DESCRIPTOR = packed record
bDescriptorLength,
bDescriptorType,
bNumberOfPorts :Byte;
wHubCharacteristics :array[0..1] of Byte;
bPowerOnToPowerGood,
bHubControlCurrent :Byte;
bRemoveAndPowerMask :array[0..63] of Byte;
end;
TNODE_INFORMATION = packed record
NodeType :USB_HUB_NODE;
HubDescriptor :THUB_DESCRIPTOR;
HubIsBusPowered :Boolean;
end;
TNODE_CONNECTION_INFORMATION = packed record
ConnectionIndex :DWord;
DeviceDescriptor :TDEVICE_DESCRIPTOR;
CurrentConfigurationValue :Byte;
LowSpeed,
DeviceIsHub :Boolean;
DeviceAddress :array[0..1] of Byte;
NumberOfOpenPipes,
ConnectionStatus :array[0..3] of Byte;
PipeList :array[0..31] of USB_PIPE_INFO;
end;
{------------------------------------------------------------------------}
{my}
function USB_OpenHost(HostNum :Byte) :THandle;
function USB_OpenHub(HubName :string) :THandle;
function USB_OpenValid(h :THandle) :Boolean;
function USB_Close(h :THandle) :Boolean;
{------------------------------------------------------------------------}
{my}
const
USB_StrError :string[4] = 'err'#255;
USB_NumError = -1;
function USB_HostName(hHost :THandle) :string;
function USB_RootHubName(hHost :THandle) :string;
function USB_HubNodeInfo(hHub :THandle; var NodeInfo :TNODE_INFORMATION) :Boolean;
{PortIndex = 1..count}
function USB_HubNodeConInfo(hHub :THandle; PortIndex :DWord; var ConInfo :TNODE_CONNECTION_INFORMATION) :Boolean;
function USB_HubNodeConName(hHub :THandle; PortIndex :DWord) :string;
function USB_GetLangID(hHub :THandle; PortIndex :DWord) :DWord; {-1 = error}
function USB_GetDescrStr(hHub :THandle; PortIndex :DWord; LangID :Word; Index :Byte) :string;
function USB_GetDescrConf(hHub :THandle; PortIndex :DWord; ConfID :Byte; var Packet :TDESCRIPTOR_REQUEST) :Boolean;
procedure USB_ExtractDescrConf(Packet :TDESCRIPTOR_REQUEST;
var Conf : USB_CONFIGURATION_DESCRIPTOR;
var Interf :USB_INTERFACE_DESCRIPTOR;
var EndPnt :USB_ENDPOINT_DESCRIPTOR;
var Hid :USB_HID_DESCRIPTOR);
function USB_GetStatus(hHub :THandle; PortIndex :DWord; var Status :Word) :Boolean;
function USB_ClearFeature(hHub :THandle; PortIndex :DWord) :Boolean; {no filnal}
function USB_SetFeature(hHub :THandle; PortIndex :DWord) :Boolean; {no filnal}
function USB_SetAddress(hHub :THandle; PortIndex :DWord; Addr :Byte) :Boolean;
function USB_GetConfNum(hHub :THandle; PortIndex :DWord; var ConfNum :Byte) :Boolean;
function USB_SetConfNum(hHub :THandle; PortIndex :DWord; ConfNum :Byte) :Boolean;
function USB_GetInterfNum(hHub :THandle; PortIndex :DWord; var InterfNum :Byte) :Boolean;
function USB_SetInterfNum(hHub :THandle; PortIndex :DWord; InterfNum :Byte) :Boolean;
{------------------------------------------------------------------------}
implementation
{------------------------------------------------------------------------}
function UnicodeStr(uni :TUnicodeName) :string;
var
s :string;
i :word;
begin
s:='';
for i:=0 to TUnicodeNameMaxLong - 1 do
if uni[i]<>#0 then s:=s + uni[i] else break;
UnicodeStr := s;
end;
function UnicodeStrLen(len :DWord; uni :TUnicodeName) :string;
var
s :string;
i :DWord;
begin
s:='';
for i:=0 to len - 1 do
if uni[i]<>#0 then s:=s + uni[i] else break;
UnicodeStrLen := s;
end;
{------------------------------------------------------------------------}
function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i :Word) :Word;
begin
USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX := (d shl 8) or i;
end;
function USB_ENDPOINT_DIRECTION_OUT(x :Cardinal) :Cardinal;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -