📄 usbhlib.pas
字号:
{
USB hardware library by NopSoft
version 2.2beta
http://nopsoft.republika.pl
}
unit USBHLib;
interface
uses Windows;
{------------------------------------------------------------------------}
{initguid.h and others from BC5.0 + Win98 DDK}
type
TGuid = packed record
Data1 :DWord;
Data2,
Data3 :Word;
Data4 :array[0..7] of Byte;
end;
// macros to define byte pattern for a GUID.
// Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
//
// Each dll/exe must initialize the GUIDs once. This is done in one of
// two ways. If you are not using precompiled headers for the file(s) which
// initializes the GUIDs, define INITGUID before including compobj.h. This
// is how OLE builds the initialized versions of the GUIDs which are included
// in compobj.dll.
//
// The alternative (which some versions of the compiler don't handle properly;
// they wind up with the initialized GUIDs in a data, not a text segment),
// is to use a precompiled version of compobj.h and then include initguid.h
// after compobj.h followed by one or more of the guid defintion files.
{
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID CDECL __based(__segname("_CODE")) name \
= ( l, w1, w2, ( b1, b2, b3, b4, b5, b6, b7, b8 ) )
}
{------------------------------------------------------------------------}
{usbiodefs.h}
const
GUID_DEVINTERFACE_USB_HUB :TGuid =
(Data1: $F18A0E88;
Data2: $C30C;
Data3: $11D0;
Data4: ($88, $15, $00, $A0, $C9, $06, $BE, $D8));
GUID_CLASS_USBHUB :TGuid = {GUID_DEVINTERFACE_USB_HUB}
(Data1: $F18A0E88;
Data2: $C30C;
Data3: $11D0;
Data4: ($88, $15, $00, $A0, $C9, $06, $BE, $D8));
GUID_DEVINTERFACE_USB_DEVICE :TGuid =
(Data1: $A5DCBF10;
Data2: $6530;
Data3: $11D2;
Data4: ($90, $1F, $00, $C0, $4F, $B9, $51, $ED));
GUID_CLASS_USB_DEVICE :TGuid = {GUID_DEVINTERFACE_USB_DEVICE}
(Data1: $A5DCBF10;
Data2: $6530;
Data3: $11D2;
Data4: ($90, $1F, $00, $C0, $4F, $B9, $51, $ED));
GUID_DEVINTERFACE_USB_HOST_CONTROLLER :TGuid =
(Data1: $3ABF6F2D;
Data2: $71C4;
Data3: $462A;
Data4: ($8A, $92, $1E, $68, $61, $E6, $AF, $27));
GUID_CLASS_USB_HOST_CONTROLLER :TGuid = {GUID_DEVINTERFACE_USB_HOST_CONTROLLER}
(Data1: $3ABF6F2D;
Data2: $71C4;
Data3: $462A;
Data4: ($8A, $92, $1E, $68, $61, $E6, $AF, $27));
GUID_USB_WMI_STD_DATA :TGuid =
(Data1: $4E623B20;
Data2: $CB14;
Data3: $11D1;
Data4: ($B3, $31, $00, $A0, $C9, $59, $BB, $D2));
GUID_USB_WMI_STD_NOTIFICATION :TGuid =
(Data1: $4E623B20;
Data2: $CB14;
Data3: $11D1;
Data4: ($B3, $31, $00, $A0, $C9, $59, $BB, $D2));
const
USB_SUBMIT_URB = 0;
USB_RESET_PORT = 1;
USB_GET_ROOTHUB_PDO = 3;
USB_GET_PORT_STATUS = 4;
USB_ENABLE_PORT = 5;
USB_GET_HUB_COUNT = 6;
USB_CYCLE_PORT = 7;
USB_GET_HUB_NAME = 8;
USB_IDLE_NOTIFICATION = 9;
USB_GET_BUS_INFO = 264;
USB_GET_CONTROLLER_NAME = 265;
USB_GET_BUSGUID_INFO = 266;
USB_GET_PARENT_HUB_INFO = 267;
USB_GET_DEVICE_HANDLE = 268;
HCD_GET_STATS_1 = 255;
HCD_DIAGNOSTIC_MODE_ON = 256;
HCD_DIAGNOSTIC_MODE_OFF = 257;
HCD_GET_ROOT_HUB_NAME = 258;
HCD_GET_DRIVERKEY_NAME = 265;
HCD_GET_STATS_2 = 266;
HCD_DISABLE_PORT = 268;
HCD_ENABLE_PORT = 269;
HCD_USER_REQUEST = 270;
USB_GET_NODE_INFORMATION = 258;
USB_GET_NODE_CONNECTION_INFORMATION = 259;
USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = 260;
USB_GET_NODE_CONNECTION_NAME = 261;
USB_DIAG_IGNORE_HUBS_ON = 262;
USB_DIAG_IGNORE_HUBS_OFF = 263;
USB_GET_NODE_CONNECTION_DRIVERKEY_NAME = 264;
USB_GET_HUB_CAPABILITIES = 271;
USB_GET_NODE_CONNECTION_ATTRIBUTES = 272;
METHOD_BUFFERED = 0;
METHOD_IN_DIRECT = 1; {+}
METHOD_OUT_DIRECT = 2; {+}
METHOD_NEITHER = 3;
FILE_ANY_ACCESS = 0;
FILE_SPECIAL_ACCESS = (FILE_ANY_ACCESS); {+}
FILE_READ_ACCESS = ( $0001 ); // file & pipe {+}
FILE_WRITE_ACCESS = ( $0002 ); // file & pipe {+}
FILE_DEVICE_UNKNOWN = $00000022;
FILE_DEVICE_USB = FILE_DEVICE_UNKNOWN;
USB_CTL_BASE = (FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14);
USB_CTL_CONST = USB_CTL_BASE or METHOD_BUFFERED;
USB_KERNEL_CTL_CONST = USB_CTL_BASE or METHOD_NEITHER;
function CTL_CODE(const DeviceType, Func, Method, Access :Cardinal) :cardinal;
function USB_CTL(const Func {id}:Cardinal) :cardinal;
function USB_KERNEL_CTL(const Func {id}:Cardinal) :cardinal;
{------------------------------------------------------------------------}
{my}
const
TUnicodeNameMaxLong = 256;//MAXIMUM_USB_STRING_LENGTH +1 (zero)
USB_HID_DESCRIPTOR_TYPE = $21;
type
PUnicodeName = ^TUnicodeName;
TUnicodeName = array[0..TUnicodeNameMaxLong - 1] of WideChar;{WChar}
PUSB_HID_DESCRIPTOR = ^USB_HID_DESCRIPTOR;
USB_HID_DESCRIPTOR = record
bLength,
bDescriptorType :Byte;
wHIDversion :Word;
bCountryCode,
bHIDDescriptorCount,
bHIDReportType :Byte;
wHIDReportLength :Word;
end;
function UnicodeStr(uni :TUnicodeName) :string;
function UnicodeStrLen(len :DWord; uni :TUnicodeName) :string;
{------------------------------------------------------------------------}
{usb100.h}
const
MAXIMUM_USB_STRING_LENGTH = 255;
USB_DEVICE_CLASS_RESERVED = $00;
USB_DEVICE_CLASS_AUDIO = $01;
USB_DEVICE_CLASS_COMMUNICATIONS = $02;
USB_DEVICE_CLASS_HUMAN_INTERFACE = $03;
USB_DEVICE_CLASS_MONITOR = $04;
USB_DEVICE_CLASS_PHYSICAL_INTERFACE = $05;
USB_DEVICE_CLASS_POWER = $06;
USB_DEVICE_CLASS_PRINTER = $07;
USB_DEVICE_CLASS_STORAGE = $08;
USB_DEVICE_CLASS_HUB = $09;
USB_DEVICE_CLASS_VENDOR_SPECIFIC = $FF;
USB_RESERVED_DESCRIPTOR_TYPE = $06;
USB_CONFIG_POWER_DESCRIPTOR_TYPE = $07;
USB_INTERFACE_POWER_DESCRIPTOR_TYPE = $08;
USB_REQUEST_GET_STATUS = $00;
USB_REQUEST_CLEAR_FEATURE = $01;
USB_REQUEST_SET_FEATURE = $03;
USB_REQUEST_SET_ADDRESS = $05;
USB_REQUEST_GET_DESCRIPTOR = $06;
USB_REQUEST_SET_DESCRIPTOR = $07;
USB_REQUEST_GET_CONFIGURATION = $08;
USB_REQUEST_SET_CONFIGURATION = $09;
USB_REQUEST_GET_INTERFACE = $0A;
USB_REQUEST_SET_INTERFACE = $0B;
USB_REQUEST_SYNC_FRAME = $0C;
USB_GETSTATUS_SELF_POWERED = $01;
USB_GETSTATUS_REMOTE_WAKEUP_ENABLED = $02;
BMREQUEST_HOST_TO_DEVICE = 0;
BMREQUEST_DEVICE_TO_HOST = 1;
BMREQUEST_STANDARD = 0;
BMREQUEST_CLASS = 1;
BMREQUEST_VENDOR = 2;
BMREQUEST_TO_DEVICE = 0;
BMREQUEST_TO_INTERFACE = 1;
BMREQUEST_TO_ENDPOINT = 2;
BMREQUEST_TO_OTHER = 3;
// USB_COMMON_DESCRIPTOR.bDescriptorType constants
USB_DEVICE_DESCRIPTOR_TYPE = $01;
USB_CONFIGURATION_DESCRIPTOR_TYPE = $02;
USB_STRING_DESCRIPTOR_TYPE = $03;
USB_INTERFACE_DESCRIPTOR_TYPE = $04;
USB_ENDPOINT_DESCRIPTOR_TYPE = $05;
type
PUSB_COMMON_DESCRIPTOR = ^USB_COMMON_DESCRIPTOR;
USB_COMMON_DESCRIPTOR = packed record
bLength,
bDescriptorType :Byte;
end;
//#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) ((USHORT)((USHORT)d << 8 | i))
function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i :Word) :Word;
// USB_CONFIGURATION_DESCRIPTOR.bmAttributes constants
const
USB_CONFIG_POWERED_MASK = $C0;
USB_CONFIG_BUS_POWERED = $80;
USB_CONFIG_SELF_POWERED = $40;
USB_CONFIG_REMOTE_WAKEUP = $20;
type
PUSB_CONFIGURATION_DESCRIPTOR = ^USB_CONFIGURATION_DESCRIPTOR;
USB_CONFIGURATION_DESCRIPTOR = packed record
bLength,
bDescriptorType :Byte;
wTotalLength : Word;
bNumInterfaces,
bConfigurationValue,{configuration string index}{tego nie bylo! a musi byc}
iConfiguration,
bmAttributes,
MaxPower :Byte;
end;
PUSB_DEVICE_DESCRIPTOR = ^USB_DEVICE_DESCRIPTOR;
USB_DEVICE_DESCRIPTOR = packed record
bLength,
bDescriptorType :Byte;
bcdUSB :word;
bDeviceClass,
bDeviceSubClass,
bDeviceProtocol,
bMaxPacketSize0 :Byte;
idVendor,
idProduct,
bcdDevice :Word;{device version}
iManufacturer,
iProduct,
iSerialNumber,
bNumConfigurations :Byte;
end;
const
USB_ENDPOINT_DIRECTION_MASK = $80;
//#define USB_ENDPOINT_DIRECTION_OUT(x) (!((x) & USB_ENDPOINT_DIRECTION_MASK))
function USB_ENDPOINT_DIRECTION_OUT(x :Cardinal) :Cardinal;
//#define USB_ENDPOINT_DIRECTION_IN(x) ((x) & USB_ENDPOINT_DIRECTION_MASK)
function USB_ENDPOINT_DIRECTION_IN(x :Cardinal) :Cardinal;
const
// USB_ENDPOINT_DESCRIPTOR.bmAttributes constants
USB_ENDPOINT_TYPE_MASK = $03;
USB_ENDPOINT_TYPE_CONTROL = $00;
USB_ENDPOINT_TYPE_ISOCHRONOUS = $01;
USB_ENDPOINT_TYPE_BULK = $02;
USB_ENDPOINT_TYPE_INTERRUPT = $03;
type
PUSB_ENDPOINT_DESCRIPTOR = ^USB_ENDPOINT_DESCRIPTOR;
USB_ENDPOINT_DESCRIPTOR = packed record
bLength,
bDescriptorType,
bEndpointAddress,
bmAttributes :Byte;
wMaxPacketSize :Word;
bInterval :Byte;
end;
const
USB_FEATURE_ENDPOINT_STALL = $0000;
USB_FEATURE_REMOTE_WAKEUP = $0001;
type
PUSB_INTERFACE_DESCRIPTOR = ^USB_INTERFACE_DESCRIPTOR;
USB_INTERFACE_DESCRIPTOR = packed record
bLength,
bDescriptorType,
bInterfaceNumber,
bAlternateSetting,
bNumEndpoints,
bInterfaceClass,
bInterfaceSubClass,
bInterfaceProtocol,
iInterface :Byte;
end;
PUSB_STRING_DESCRIPTOR = ^USB_STRING_DESCRIPTOR;
USB_STRING_DESCRIPTOR = packed record
bLength,
bDescriptorType :Byte;
bString :TUniCodeName;
end;
PUSB_HUB_DESCRIPTOR = ^USB_HUB_DESCRIPTOR;
USB_HUB_DESCRIPTOR = packed record
bDescriptorLength,
bDescriptorType,
bNumberOfPorts :Byte;
wHubCharacteristics :Word;
bPowerOnToPowerGood,
bHubControlCurrent,
bRemoveAndPowerMask :array[0..63] of Byte;
end;
const
USB_SUPPORT_D0_COMMAND = $01;
USB_SUPPORT_D1_COMMAND = $02;
USB_SUPPORT_D2_COMMAND = $04;
USB_SUPPORT_D3_COMMAND = $08;
USB_SUPPORT_D1_WAKEUP = $10;
USB_SUPPORT_D2_WAKEUP = $20;
type
PUSB_CONFIGURATION_POWER_DESCRIPTOR = ^USB_CONFIGURATION_POWER_DESCRIPTOR;
USB_CONFIGURATION_POWER_DESCRIPTOR = packed record
bLength,
bDescriptorType :Byte;
SelfPowerConsumedD0 :array[0..2] of Byte;
bPowerSummaryId,
bBusPowerSavingD1,
bSelfPowerSavingD1,
bBusPowerSavingD2,
bSelfPowerSavingD2,
bBusPowerSavingD3,
bSelfPowerSavingD3 :Byte;
TransitionTimeFromD1,
TransitionTimeFromD2,
TransitionTimeFromD3 :Word;
end;
const
USB_FEATURE_INTERFACE_POWER_D0 = $0002;
USB_FEATURE_INTERFACE_POWER_D1 = $0003;
USB_FEATURE_INTERFACE_POWER_D2 = $0004;
USB_FEATURE_INTERFACE_POWER_D3 = $0005;
type
PUSB_INTERFACE_POWER_DESCRIPTOR = ^USB_INTERFACE_POWER_DESCRIPTOR;
USB_INTERFACE_POWER_DESCRIPTOR = packed record
bLength,
bDescriptorType,
bmCapabilitiesFlags,
bBusPowerSavingD1,
bSelfPowerSavingD1,
bBusPowerSavingD2,
bSelfPowerSavingD2,
bBusPowerSavingD3,
bSelfPowerSavingD3 :Byte;
TransitionTimeFromD1,
TransitionTimeFromD2,
TransitionTimeFromD3 :Word;
end;
{------------------------------------------------------------------------}
{usbioctl.h}
type
LARGE_INTEGER = packed record
LowPart :DWord;
HighPart :Longint;
end;
const
USBD_PORT_ENABLED = 1;
USBD_PORT_CONNECTED = 2;
const
IOCTL_INTERNAL_USB_CYCLE_PORT = USB_KERNEL_CTL_CONST or (USB_CYCLE_PORT shl 2);
IOCTL_INTERNAL_USB_ENABLE_PORT = USB_KERNEL_CTL_CONST or (USB_ENABLE_PORT shl 2);
IOCTL_INTERNAL_USB_GET_BUS_INFO = USB_CTL_CONST or (USB_GET_BUS_INFO shl 2);
IOCTL_INTERNAL_USB_GET_BUSGUID_INFO = USB_CTL_CONST or (USB_GET_BUSGUID_INFO shl 2);
IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME = USB_CTL_CONST or (USB_GET_CONTROLLER_NAME shl 2);
IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE = USB_KERNEL_CTL_CONST or (USB_GET_DEVICE_HANDLE shl 2);
IOCTL_INTERNAL_USB_GET_HUB_COUNT = USB_KERNEL_CTL_CONST or (USB_GET_HUB_COUNT shl 2);
IOCTL_INTERNAL_USB_GET_HUB_NAME = USB_CTL_CONST or (USB_GET_HUB_NAME shl 2);
IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO = USB_CTL_CONST or (USB_GET_PARENT_HUB_INFO shl 2);
IOCTL_INTERNAL_USB_GET_PORT_STATUS = USB_KERNEL_CTL_CONST or (USB_GET_PORT_STATUS shl 2);
IOCTL_INTERNAL_USB_RESET_PORT = USB_KERNEL_CTL_CONST or (USB_RESET_PORT shl 2);
IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO = USB_KERNEL_CTL_CONST or (USB_GET_ROOTHUB_PDO shl 2);
IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION = USB_KERNEL_CTL_CONST or (USB_IDLE_NOTIFICATION shl 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -