⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbhlib.pas

📁 usb4开发
💻 PAS
📖 第 1 页 / 共 3 页
字号:
 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 + -