Labrador/Old Matlab Interface/bindings/libusbK.pas

1631 lines
69 KiB
ObjectPascal

// Copyright (c) 2011 Ekkehard Domning (edomning@adcocom-broadcast.com)
// Portions Copyright (c) 2012 Alberto Semenzato
// All rights reserved.
//
// Pascal libusbK Bindings
// Created on: 12.8.2011
//
// History:
//
// 2011-08-12 Initial release (Ekkehard Domning)
//
// 2012-02-10 Added Hotplug Event Notifier API, LstK_InitEx, implicit linking
// and minor stuff (Alberto Semenzato)
//
// 2012-03-09 Added LibK_SetContext, LibK_GetContext, HotK_FreeAll,
// KSTM_BEFORE_COMPLETE_CB, OvlK_WaitOldest,
// LibK_SetDefaultContext, LibK_GetDefaultContext,
// 3.0.5.10 changes has been applied (Alberto Semenzato)
//
// Functions not in the original sources:
//
// GetIsoPacketFromIsoContext: helper to get a pointer to a specific packet
//
// UsbK_InitFromDevicePath: example showing a way to init a device
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Notes:
//
// Default setting uses dynamic linking, see below and remove the compiler
// directive to change to implicit linking
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON
// OR EKKEHARD DOMNING OR ALBERTO SEMENZATO BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
unit libusbK;
// Import of the functions of libusbK.dll
// Conditional compiling "DynamicLink"
// defined: the unit will load the DLL on startup and assign all functions,
// if all functions available the variable "DllAvailable" becomes
// true
// undefined: implicit linking, the application failes if the DLL is not
// available
{$DEFINE DynamicLink}
interface
uses
Windows;
const
LIBUSBK_DLL = 'libusbK.dll';
const
// pipe policy types
SHORT_PACKET_TERMINATE = $01;
AUTO_CLEAR_STALL = $02;
PIPE_TRANSFER_TIMEOUT = $03;
IGNORE_SHORT_PACKETS = $04;
ALLOW_PARTIAL_READS = $05;
AUTO_FLUSH = $06;
RAW_IO = $07;
MAXIMUM_TRANSFER_SIZE = $08;
RESET_PIPE_ON_RESUME = $09;
// libusbK ISO pipe policy types
ISO_START_LATENCY = $20;
ISO_ALWAYS_START_ASAP = $21;
ISO_NUM_FIXED_PACKETS = $22;
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff552359%28v=vs.85%29.aspx
// Settings.Parallel.NumberOfPresentedRequests
// Maximum number of transfers that can be asynchronously delivered at a
// time. Available in version 1.9 and later versions of KMDF.
SIMUL_PARALLEL_REQUESTS = $30;
// Power policy types
AUTO_SUSPEND = $81;
SUSPEND_DELAY = $83;
// Device Information types
DEVICE_SPEED = $01;
// Device Speeds
LowSpeed = $01;
FullSpeed = $02;
HighSpeed = $03;
USB_DESCRIPTOR_TYPE_DEVICE = $01;
USB_DESCRIPTOR_TYPE_CONFIGURATION = $02;
USB_DESCRIPTOR_TYPE_STRING = $03;
USB_DESCRIPTOR_TYPE_INTERFACE = $04;
USB_DESCRIPTOR_TYPE_ENDPOINT = $05;
USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER = $06;
USB_DESCRIPTOR_TYPE_CONFIG_POWER = $07;
USB_DESCRIPTOR_TYPE_INTERFACE_POWER = $08;
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION = $0B;
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;
type
USBD_PIPE_TYPE = (UsbdPipeTypeControl, UsbdPipeTypeIsochronous,
UsbdPipeTypeBulk, UsbdPipeTypeInterrupt);
PWINUSB_PIPE_INFORMATION = ^WINUSB_PIPE_INFORMATION;
WINUSB_PIPE_INFORMATION = packed record
PipeType: USBD_PIPE_TYPE;
dummy0: array [0 .. 2] of Byte;
PipeId: Byte;
dummy1: Byte;
MaximumPacketSize: Word;
Interval: Byte;
dummy2: array [0 .. 2] of Byte;
end;
WINUSB_SETUP_PACKET_INT64 = Int64;
PWINUSB_SETUP_PACKET = ^WINUSB_SETUP_PACKET;
WINUSB_SETUP_PACKET = packed record
case Integer of
0:
(AsInt64: WINUSB_SETUP_PACKET_INT64);
1:
(RequestType: Byte;
Request: Byte;
Value: Word;
Index: Word;
Length: Word
);
end;
// Structure describing an isochronous transfer packet.
PKISO_PACKET = ^KISO_PACKET;
KISO_PACKET = packed record
Offset: Cardinal;
Length: SmallInt;
Status: Word;
end;
PKISO_PACKET_ARRAY = ^KISO_PACKET_ARRAY;
KISO_PACKET_ARRAY = array [0 .. (MaxInt div SizeOf(KISO_PACKET)) - 1]
of KISO_PACKET;
const
KISO_FLAG_NONE = 0;
KISO_FLAG_SET_START_FRAME = $00000001;
type
KISO_FLAG = Cardinal;
// Structure describing a user defined isochronous transfer.
PKISO_CONTEXT = ^KISO_CONTEXT;
KISO_CONTEXT = packed record
Flags: Cardinal;
StartFrame: Cardinal;
ErrorCount: SmallInt;
NumberOfPackets: SmallInt;
UrbHdrStatus: Cardinal;
// Contains a variable-length array of KISO_PACKET structures that
// describe the isochronous transfer packets to be transferred on the
// USB bus.
// note This field is assigned by the user application, used by the driver
// upon transfer submission, and updated by the driver upon transfer
// completion.
// Translation to Delphi is difficult, since you can not declare array
// with the length of zero, so you must use a Type cast to access the
// (optional) array members PKISO_PACKET_ARRAY(@x.IsoPackets)^[n]
// I made the function GetIsoPacketFromIsoContext that returns a pointer
// to a specific packet.
IsoPackets: record end;
end;
KLIB_USER_CONTEXT = pointer;
// pointer to a \c KISO_CONTEXT structure
KLIB_HANDLE = pointer;
// Opaque UsbK handle, see \ref UsbK_Init.
KUSB_HANDLE = KLIB_HANDLE;
// Opaque LstK handle, see \ref LstK_Init.
KLST_HANDLE = KLIB_HANDLE;
// Opaque HotK handle, see \ref HotK_Init.
KHOT_HANDLE = KLIB_HANDLE;
// Opaque OvlK handle, see \ref OvlK_Acquire.
KOVL_HANDLE = KLIB_HANDLE;
// Opaque OvlPoolK handle, see \ref OvlK_Init.
KOVL_POOL_HANDLE = KLIB_HANDLE;
// Opaque StmK handle, see \ref StmK_Init.
KSTM_HANDLE = KLIB_HANDLE;
// Handle type enumeration.
KLIB_HANDLE_TYPE = (KLIB_HANDLE_TYPE_HOTK, KLIB_HANDLE_TYPE_USBK,
KLIB_HANDLE_TYPE_USBSHAREDK, KLIB_HANDLE_TYPE_LSTK,
KLIB_HANDLE_TYPE_LSTINFOK, KLIB_HANDLE_TYPE_OVLK,
KLIB_HANDLE_TYPE_OVLPOOLK, KLIB_HANDLE_TYPE_STMK, KLIB_HANDLE_TYPE_COUNT);
PKLIB_VERSION = ^KLIB_VERSION;
KLIB_VERSION = record
Major: Integer;
Minor: Integer;
Micro: Integer;
Nano: Integer;
end;
// Callback function typedef for \ref IsoK_EnumPackets
KISO_ENUM_PACKETS_CB = function(const PacketIndex: Cardinal;
const IsoPacket: PKISO_PACKET; const UserState: pointer): Bool; stdcall;
const
KLST_STRING_MAX_LEN = 256;
KLST_SYNC_FLAG_NONE = $0000;
KLST_SYNC_FLAG_UNCHANGED = $0001;
KLST_SYNC_FLAG_ADDED = $0002;
KLST_SYNC_FLAG_REMOVED = $0004;
KLST_SYNC_FLAG_CONNECT_CHANGE = $0008;
KLST_SYNC_FLAG_MASK = $000F;
type
KLST_SYNC_FLAG = Cardinal;
// Common usb device information structure
PKLST_DEV_COMMON_INFO = ^KLST_DEV_COMMON_INFO;
KLST_DEV_COMMON_INFO = packed record
Vid: Integer;
Pid: Integer;
MI: Integer;
InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
end;
KLST_DEVINFO_HANDLE = ^KLST_DEVINFO;
KLST_DEVINFO = packed record
Common: KLST_DEV_COMMON_INFO;
DriverID: Integer;
DeviceInterfaceGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
ClassGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
Mfg: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
DeviceDesc: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
Service: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
SymbolicLink: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
DevicePath: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
LUsb0FilterIndex: Integer;
Connected: Bool;
SyncFlags: KLST_SYNC_FLAG;
end;
const
KLST_FLAG_NONE = $0000;
KLST_FLAG_INCLUDE_RAWGUID = $0001;
KLST_FLAG_INCLUDE_DISCONNECT = $0002;
type
KLST_FLAG = Cardinal;
KLST_ENUM_DEVINFO_CB = function(const DeviceList: KLST_HANDLE;
const DeviceInfo: KLST_DEVINFO_HANDLE; const Contex: pointer)
: Bool; stdcall;
PUSB_INTERFACE_DESCRIPTOR = ^USB_INTERFACE_DESCRIPTOR;
USB_INTERFACE_DESCRIPTOR = packed record
bLength: Byte;
bDescriptorType: Byte;
bInterfaceNumber: Byte;
bAlternateSetting: Byte;
bNumEndpoints: Byte;
bInterfaceClass: Byte;
bInterfaceSubClass: Byte;
bInterfaceProtocol: Byte;
iInterface: Byte;
end;
PUSB_DEVICE_DESCRIPTOR = ^USB_DEVICE_DESCRIPTOR;
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;
PUSB_ENDPOINT_DESCRIPTOR = ^USB_ENDPOINT_DESCRIPTOR;
USB_ENDPOINT_DESCRIPTOR = packed record
bLength: Byte;
bDescriptorType: Byte;
bEndpointAddress: Byte;
bmAttributes: Byte;
wMaxPacketSize: SmallInt;
bInterval: Byte;
end;
KUSB_PROPERTY = (KUSB_PROPERTY_DEVICE_FILE_HANDLE, KUSB_PROPERTY_COUNT);
const
KHOT_FLAG_NONE: UINT = 0;
KHOT_FLAG_PLUG_ALL_ON_INIT: UINT = $0001;
KHOT_FLAG_PASS_DUPE_INSTANCE: UINT = $0002;
KHOT_FLAG_POST_USER_MESSAGE: UINT = $0004;
type
KLST_PATTERN_MATCH = packed record
InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
DeviceInterfaceGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
SymbolicLink: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar;
z_F_i_x_e_d: array [0 .. (1024 - (KLST_STRING_MAX_LEN * 3)) - 1] of Byte;
end;
PKLST_PATTERN_MATCH = ^KLST_PATTERN_MATCH;
KHOT_PLUG_CB = procedure(HotHandle: KHOT_HANDLE;
DeviceInfo: KLST_DEVINFO_HANDLE; PlugType: KLST_SYNC_FLAG); stdcall;
KHOT_PARAMS = packed record
UserHwnd: HWND;
UserMessage: UINT;
Flags: UINT;
PatternMatch: KLST_PATTERN_MATCH;
OnHotPlug: KHOT_PLUG_CB;
z_F_i_x_e_d: array [0 .. (2048 - SizeOf(KLST_PATTERN_MATCH) -
SizeOf(PUINT) * 2 - (SizeOf(UINT) * 2)) - 1] of Byte;
end;
PKHOT_PARAMS = ^KHOT_PARAMS;
const
USBD_ISO_START_FRAME_RANGE = 1024;
type
KUSB_DRIVER_API_INFO = packed record
DriverID: Integer;
FunctionCount: Integer;
end;
// Supported function id enumeration.
KUSB_FNID = (KUSB_FNID_Init, KUSB_FNID_Free, KUSB_FNID_ClaimInterface,
KUSB_FNID_ReleaseInterface, KUSB_FNID_SetAltInterface,
KUSB_FNID_GetAltInterface, KUSB_FNID_GetDescriptor,
KUSB_FNID_ControlTransfer, KUSB_FNID_SetPowerPolicy,
KUSB_FNID_GetPowerPolicy, KUSB_FNID_SetConfiguration,
KUSB_FNID_GetConfiguration, KUSB_FNID_ResetDevice, KUSB_FNID_Initialize,
KUSB_FNID_SelectInterface, KUSB_FNID_GetAssociatedInterface,
KUSB_FNID_Clone, KUSB_FNID_QueryInterfaceSettings,
KUSB_FNID_QueryDeviceInformation, KUSB_FNID_SetCurrentAlternateSetting,
KUSB_FNID_GetCurrentAlternateSetting, KUSB_FNID_QueryPipe,
KUSB_FNID_SetPipePolicy, KUSB_FNID_GetPipePolicy, KUSB_FNID_ReadPipe,
KUSB_FNID_WritePipe, KUSB_FNID_ResetPipe, KUSB_FNID_AbortPipe,
KUSB_FNID_FlushPipe, KUSB_FNID_IsoReadPipe, KUSB_FNID_IsoWritePipe,
KUSB_FNID_GetCurrentFrameNumber, KUSB_FNID_GetOverlappedResult,
KUSB_FNID_GetProperty,
// Supported function count
KUSB_FNID_COUNT);
KUSB_Init = function(var InterfaceHandle: KUSB_HANDLE;
const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
KUSB_Free = function(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall;
KUSB_ClaimInterface = function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
KUSB_ReleaseInterface = function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
KUSB_SetAltInterface = function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool;
const AltSettingNumber: Byte): Bool; stdcall;
KUSB_GetAltInterface = function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool;
var AltSettingNumber: Byte): Bool; stdcall;
KUSB_GetDescriptor = function(const InterfaceHandle: KUSB_HANDLE;
const DescriptorType: Byte; const Index: Byte; const LanguageID: Word;
var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal)
: Bool; stdcall;
KUSB_ControlTransfer = function(const InterfaceHandle: KUSB_HANDLE;
const SetupPacket: WINUSB_SETUP_PACKET_INT64; const PBuffer: PByte;
//optional may be Nil
const BufferLength: Cardinal; const LengthTransferred: PCardinal;
//Optional may be Nil
const Overlapped: POverlapped //Optional
): Bool; stdcall;
KUSB_SetPowerPolicy = function(const InterfaceHandle: KUSB_HANDLE;
const PolicyType: Cardinal; const ValueLength: Cardinal; const Value)
: Bool; stdcall;
KUSB_GetPowerPolicy = function(const InterfaceHandle: KUSB_HANDLE;
const PolicyType: Cardinal; var ValueLength: Cardinal;
//Input: Size of Value, output : copied bytes
var Value): Bool; stdcall;
KUSB_SetConfiguration = function(const InterfaceHandle: KUSB_HANDLE;
const ConfigurationNumber: Byte): Bool; stdcall;
KUSB_GetConfiguration = function(const InterfaceHandle: KUSB_HANDLE;
var ConfigurationNumber: Byte): Bool; stdcall;
KUSB_ResetDevice = function(const InterfaceHandle: KUSB_HANDLE)
: Bool; stdcall;
KUSB_Initialize = function(const DeviceHandle: KUSB_HANDLE;
var InterfaceHandle: KUSB_HANDLE): Bool; stdcall;
KUSB_SelectInterface = function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
KUSB_GetAssociatedInterface = function(const InterfaceHandle: KUSB_HANDLE;
const AssociatedInterfaceIndex: Byte;
var AssociatedInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
KUSB_Clone = function(const InterfaceHandle: KUSB_HANDLE;
var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
KUSB_QueryInterfaceSettings = function(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte;
var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall;
KUSB_QueryDeviceInformation = function(const InterfaceHandle: KUSB_HANDLE;
const InformationType: Cardinal; var BufferLength: Cardinal;
// Input: Length of Buffer, copied Bytes in Buffer
var Buffer): Bool; stdcall;
KUSB_SetCurrentAlternateSetting = function(const InterfaceHandle
: KUSB_HANDLE; const AltSettingNumber: Byte): Bool; stdcall;
KUSB_GetCurrentAlternateSetting = function(const InterfaceHandle
: KUSB_HANDLE; var AltSettingNumber: Byte): Bool; stdcall;
KUSB_QueryPipe = function(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte; const PipeIndex: Byte;
var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall;
KUSB_SetPipePolicy = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const PolicyType: Cardinal;
const ValueLength: Cardinal; const Value): Bool; stdcall;
KUSB_GetPipePolicy = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const PolicyType: Cardinal; var ValueLength: Cardinal;
// Input: Length of Value, copied Bytes in Value
var Value): Bool; stdcall;
KUSB_ReadPipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal; // optional may be Nil
const Overlapped: POverlapped //Optional
): Bool; stdcall;
KUSB_WritePipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal; // optional may be Nil
const Overlapped: POverlapped //Optional
): Bool; stdcall;
KUSB_ResetPipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
KUSB_AbortPipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
KUSB_FlushPipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
KUSB_IsoReadPipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const Overlapped: POverlapped; //Optional
const IsoContext: PKISO_CONTEXT // optional
): Bool; stdcall;
KUSB_IsoWritePipe = function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const Buffer; const BufferLength: Cardinal;
const Overlapped: POverlapped; //Optional
const IsoContext: PKISO_CONTEXT // optional
): Bool; stdcall;
KUSB_GetCurrentFrameNumber = function(const InterfaceHandle: KUSB_HANDLE;
var FrameNumber: Cardinal): Bool; stdcall;
KUSB_GetOverlappedResult = function(const InterfaceHandle: KUSB_HANDLE;
const lpOverlapped: POverlapped; //Optional
var lpNumberOfBytesTransferred: Cardinal; const bWait: Bool)
: Bool; stdcall;
KUSB_GetProperty = function(const InterfaceHandle: KUSB_HANDLE;
const PropertyType: KUSB_PROPERTY; var PropertySize: Cardinal;
// Input: Length of Property Buffer, copied Bytes in Property Buffer
var TheProperty
// Parameter name changed, since "property" is a reserved word in Delphi
): Bool; stdcall;
// Driver API function set structure.
PKUSB_DRIVER_API = ^KUSB_DRIVER_API;
KUSB_DRIVER_API = packed record
Info: KUSB_DRIVER_API_INFO;
Init: KUSB_Init;
Free: KUSB_Free;
ClaimInterface: KUSB_ClaimInterface;
ReleaseInterface: KUSB_ReleaseInterface;
SetAltInterface: KUSB_SetAltInterface;
GetAltInterface: KUSB_GetAltInterface;
GetDescriptor: KUSB_GetDescriptor;
ControlTransfer: KUSB_ControlTransfer;
SetPowerPolicy: KUSB_SetPowerPolicy;
GetPowerPolicy: KUSB_GetPowerPolicy;
SetConfiguration: KUSB_SetConfiguration;
GetConfiguration: KUSB_GetConfiguration;
ResetDevice: KUSB_ResetDevice;
Initialize: KUSB_Initialize;
SelectInterface: KUSB_SelectInterface;
GetAssociatedInterface: KUSB_GetAssociatedInterface;
Clone: KUSB_Clone;
QueryInterfaceSettings: KUSB_QueryInterfaceSettings;
QueryDeviceInformation: KUSB_QueryDeviceInformation;
SetCurrentAlternateSetting: KUSB_SetCurrentAlternateSetting;
GetCurrentAlternateSetting: KUSB_GetCurrentAlternateSetting;
QueryPipe: KUSB_QueryPipe;
SetPipePolicy: KUSB_SetPipePolicy;
GetPipePolicy: KUSB_GetPipePolicy;
ReadPipe: KUSB_ReadPipe;
WritePipe: KUSB_WritePipe;
ResetPipe: KUSB_ResetPipe;
AbortPipe: KUSB_AbortPipe;
FlushPipe: KUSB_FlushPipe;
IsoReadPipe: KUSB_IsoReadPipe;
IsoWritePipe: KUSB_IsoWritePipe;
GetCurrentFrameNumber: KUSB_GetCurrentFrameNumber;
GetOverlappedResult: KUSB_GetOverlappedResult;
GetProperty: KUSB_GetProperty;
// fixed structure padding.
z_F_i_x_e_d: array [0 .. 512 - SizeOf(KUSB_DRIVER_API_INFO) -
(SizeOf(pointer) * Ord(KUSB_FNID_COUNT)) - 1] of Byte;
end;
// StmK
type
KSTM_FLAG = Cardinal;
KSTM_COMPLETE_RESULT = Cardinal;
const
KSTM_FLAG_NONE = 0;
KSTM_FLAG_USE_TIMEOUT = $80000000;
KSTM_FLAG_NO_PARTIAL_XFERS = $00100000;
KSTM_FLAG_TIMEOUT_MASK = $0001FFFF;
KSTM_COMPLETE_RESULT_VALID = 0;
KSTM_COMPLETE_RESULT_INVALID = 1;
type
PKSTM_XFER_CONTEXT = ^KSTM_XFER_CONTEXT;
KSTM_XFER_CONTEXT = packed record
Buffer: PByte;
BufferSize: Integer;
TransferLength: Integer;
UserState: pointer;
end;
PKSTM_INFO = ^KSTM_INFO;
KSTM_INFO = packed record
UsbHandle: KUSB_HANDLE;
PipeId: Byte;
MaxPendingTransfers: Integer;
MaxTransferSize: Integer;
MaxPendingIO: Integer;
EndpointDescriptor: USB_ENDPOINT_DESCRIPTOR;
DriverAPI: KUSB_DRIVER_API;
DeviceHandle: THandle;
StreamHandle: KSTM_HANDLE;
UserState: pointer;
end;
PInteger = ^Integer;
KSTM_ERROR_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer;
const ErrorCode: Integer): Integer; stdcall;
KSTM_SUBMIT_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer;
Overlapped: POverlapped): Integer; stdcall;
KSTM_STARTED_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer)
: Integer; stdcall;
KSTM_STOPPED_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer)
: Integer; stdcall;
KSTM_COMPLETE_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer;
const ErrorCode: Integer): Integer; stdcall;
KSTM_BEFORE_COMPLETE_CB = function(const StreamInfo: PKSTM_INFO;
const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer;
const ErrorCode: PInteger): KSTM_COMPLETE_RESULT; stdcall;
PKSTM_CALLBACK = ^KSTM_CALLBACK;
KSTM_CALLBACK = packed record
Error: KSTM_ERROR_CB;
Submit: KSTM_SUBMIT_CB;
Complete: KSTM_COMPLETE_CB;
Started: KSTM_STARTED_CB;
Stopped: KSTM_STOPPED_CB;
BeforeComplete: KSTM_BEFORE_COMPLETE_CB;
z_F_i_x_e_d: array [0 .. (64 - SizeOf(pointer) * 6) - 1] of Byte;
end;
KOVL_POOL_FLAG = (KOVL_POOL_FLAG_NONE);
KOVL_WAIT_FLAG = Cardinal;
const
KOVL_WAIT_FLAG_NONE = 0;
KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS = $0001;
KOVL_WAIT_FLAG_RELEASE_ON_FAIL = $0002;
KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS_FAIL = $0003;
KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT = $0004;
KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT = $000C;
KOVL_WAIT_FLAG_RELEASE_ALWAYS = $000F;
KOVL_WAIT_FLAG_ALERTABLE = $0010;
var
DllAvailable: Boolean;
{$IFDEF DynamicLink}
var
HLIBUSBKDll: THandle;
HotK_Init: function(var Handle: KHOT_HANDLE; const InitParams: PKHOT_PARAMS)
: Bool; stdcall;
HotK_Free: function(const Handle: KHOT_HANDLE): Bool; stdcall;
HotK_FreeAll: procedure; stdcall;
IsoK_EnumPackets: function(const IsoContext: PKISO_CONTEXT;
const EnumPackets: KISO_ENUM_PACKETS_CB; const StartPacketIndex: Integer;
const UserState): Bool; stdcall;
IsoK_Free: function(const IsoContext: PKISO_CONTEXT): Bool; stdcall;
IsoK_GetPacket: function(const IsoContext: PKISO_CONTEXT;
const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall;
IsoK_Init: function(var IsoContext: PKISO_CONTEXT;
const NumberOfPackets: Integer; const StartFrame: Integer): Bool; stdcall;
IsoK_ReUse: function(const IsoContext: PKISO_CONTEXT): Bool; stdcall;
IsoK_SetPacket: function(const IsoContext: PKISO_CONTEXT;
const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall;
IsoK_SetPackets: function(const IsoContext: PKISO_CONTEXT;
const PacketSize: Integer): Bool; stdcall;
LibK_CopyDriverAPI: function: Bool; stdcall;
LibK_GetContext: function(const Handle: KLIB_HANDLE;
const HandleType: KLIB_HANDLE_TYPE): KLIB_USER_CONTEXT; stdcall;
LibK_GetProcAddress: function: Bool; stdcall;
LibK_GetVersion: function: Bool; stdcall;
LibK_LoadDriverAPI: function(var DriverAPI: KUSB_DRIVER_API;
const DriverID: Integer): Bool; stdcall;
LibK_SetCleanupCallback: function: Bool; stdcall;
LibK_SetContext: function(const Handle: KLIB_HANDLE;
const HandleType: KLIB_HANDLE_TYPE; const ContextValue: KLIB_USER_CONTEXT)
: Bool; stdcall;
LibK_SetDefaultContext: function(const HandleType: KLIB_HANDLE_TYPE;
const UserContext: KLIB_USER_CONTEXT): Bool; stdcall;
LibK_GetDefaultContext: function(const HandleType: KLIB_HANDLE_TYPE)
: KLIB_USER_CONTEXT; stdcall;
LstK_AttachInfo: function: Bool; stdcall;
LstK_Clone: function(const InterfaceHandle: KUSB_HANDLE;
var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
LstK_CloneInfo: function: Bool; stdcall;
LstK_Count: function(const DeviceList: KLST_HANDLE; var Count: Cardinal)
: Bool; stdcall;
LstK_Current: function: Bool; stdcall;
LstK_DetachInfo: function: Bool; stdcall;
LstK_Enumerate: function: Bool; stdcall;
LstK_FindByVidPid: function(const DeviceList: KLST_HANDLE;
const Vid: Integer; const Pid: Integer;
var DeviceInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
LstK_Free: function(const DeviceList: KLST_HANDLE): Bool; stdcall;
LstK_FreeInfo: function: Bool; stdcall;
LstK_Init: function(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG)
: Bool; stdcall;
LstK_InitEx: function(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG;
const PatternMatch: PKLST_PATTERN_MATCH): Bool; stdcall;
LstK_MoveNext: function(const DeviceList: KLST_HANDLE;
var DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
LstK_MoveReset: function(const DeviceList: KLST_HANDLE): Bool; stdcall;
LstK_Sync: function: Bool; stdcall;
OvlK_Acquire: function(var OverlappedK: KOVL_HANDLE;
const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall;
OvlK_Free: function(const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall;
OvlK_GetEventHandle: function: Bool; stdcall;
OvlK_Init: function(var PoolHandle: KOVL_POOL_HANDLE;
const UsbHandle: KUSB_HANDLE; const MaxOverlappedCount: Integer;
const Flags: KOVL_POOL_FLAG): Bool; stdcall;
OvlK_IsComplete: function: Bool; stdcall;
OvlK_ReUse: function(const OverlappedK: KOVL_HANDLE): Bool; stdcall;
OvlK_Release: function(const OverlappedK: KOVL_HANDLE): Bool; stdcall;
OvlK_Wait: function(const OverlappedK: KOVL_HANDLE;
const TimeoutMS: Integer; const WaitFlags: KOVL_WAIT_FLAG;
var TransferredLength: Cardinal): Bool; stdcall;
OvlK_WaitOldest: function(const PoolHandle: KOVL_POOL_HANDLE;
var OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer;
const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal)
: Bool; stdcall;
OvlK_WaitAndRelease: function(const OverlappedK: KOVL_HANDLE;
const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall;
OvlK_WaitOrCancel: function(const OverlappedK: KOVL_HANDLE;
const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall;
StmK_Free: function(const StreamHandle: KSTM_HANDLE): Bool; stdcall;
StmK_Init: function(var StreamHandle: KSTM_HANDLE;
const UsbHandle: KUSB_HANDLE; const PipeId: Byte;
const MaxTransferSize: Integer; const MaxPendingTransfers: Integer;
const MaxPendingIO: Integer; const Callbacks: PKSTM_CALLBACK;
const Flags: KSTM_FLAG): Bool; stdcall;
StmK_Read: function(const StreamHandle: KSTM_HANDLE; var Buffer;
const Offset: Integer; const Length: Integer;
var TransferredLength: Cardinal): Bool; stdcall;
StmK_Start: function(const StreamHandle: KSTM_HANDLE): Bool; stdcall;
StmK_Stop: function(const StreamHandle: KSTM_HANDLE;
const TimeoutCancelMS: Integer): Bool; stdcall;
StmK_Write: function(const StreamHandle: KSTM_HANDLE; const Buffer;
const Offset: Integer; const Length: Integer;
var TransferredLength: Cardinal): Bool; stdcall;
UsbK_AbortPipe: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
UsbK_ClaimInterface: function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
UsbK_Clone: function(const InterfaceHandle: KUSB_HANDLE;
var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
UsbK_ControlTransfer: function(const InterfaceHandle: KUSB_HANDLE;
const SetupPacket: WINUSB_SETUP_PACKET_INT64; var Buffer;
const BufferLength: Cardinal; const LengthTransferred: PCardinal;
//Optional may be Nil
const Overlapped: POverlapped): Bool; stdcall;
UsbK_FlushPipe: function: Bool; stdcall;
UsbK_Free: function(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall;
UsbK_GetAltInterface: function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool;
var AltSettingNumber: Byte): Bool; stdcall;
UsbK_GetAssociatedInterface: function: Bool; stdcall;
UsbK_GetConfiguration: function: Bool; stdcall;
UsbK_GetCurrentAlternateSetting: function: Bool; stdcall;
UsbK_GetCurrentFrameNumber: function(const InterfaceHandle: KUSB_HANDLE;
var FrameNumber: Cardinal): Bool; stdcall;
UsbK_GetDescriptor: function(const InterfaceHandle: KUSB_HANDLE;
const DescriptorType: Byte; const Index: Byte; const LanguageID: Word;
var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal)
: Bool; stdcall;
UsbK_GetOverlappedResult: function: Bool; stdcall;
UsbK_GetPipePolicy: function: Bool; stdcall;
UsbK_GetPowerPolicy: function: Bool; stdcall;
UsbK_GetProperty: function: Bool; stdcall;
UsbK_Init: function(var InterfaceHandle: KUSB_HANDLE;
const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
UsbK_Initialize: function: Bool; stdcall;
UsbK_IsoReadPipe: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const Overlapped: POverlapped; const IsoContext: PKISO_CONTEXT)
: Bool; stdcall;
UsbK_IsoWritePipe: function: Bool; stdcall;
UsbK_QueryDeviceInformation: function: Bool; stdcall;
UsbK_QueryInterfaceSettings: function(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte;
var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall;
UsbK_QueryPipe: function(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte; const PipeIndex: Byte;
var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall;
UsbK_ReadPipe: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal; //Optional may be Nil
const Overlapped: POverlapped): Bool; stdcall;
UsbK_ReleaseInterface: function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
UsbK_ResetDevice: function: Bool; stdcall;
UsbK_ResetPipe: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
UsbK_SelectInterface: function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
UsbK_SetAltInterface: function(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool;
const AltSettingNumber: Byte): Bool; stdcall;
UsbK_SetConfiguration: function(const InterfaceHandle: KUSB_HANDLE;
const ConfigurationNumber: Byte): Bool; stdcall;
UsbK_SetCurrentAlternateSetting
: function(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte): Bool; stdcall;
UsbK_SetPipePolicy: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const PolicyType: Cardinal;
const ValueLength: Cardinal; const Value): Bool; stdcall;
UsbK_SetPowerPolicy: function: Bool; stdcall;
UsbK_WritePipe: function(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal;
const Overlapped: POverlapped): Bool; stdcall;
WinUsb_AbortPipe: function: Bool; stdcall;
WinUsb_ControlTransfer: function: Bool; stdcall;
WinUsb_FlushPipe: function: Bool; stdcall;
WinUsb_Free: function: Bool; stdcall;
WinUsb_GetAssociatedInterface: function: Bool; stdcall;
WinUsb_GetCurrentAlternateSetting: function: Bool; stdcall;
WinUsb_GetDescriptor: function: Bool; stdcall;
WinUsb_GetOverlappedResult: function: Bool; stdcall;
WinUsb_GetPipePolicy: function: Bool; stdcall;
WinUsb_GetPowerPolicy: function: Bool; stdcall;
WinUsb_Initialize: function: Bool; stdcall;
WinUsb_QueryDeviceInformation: function: Bool; stdcall;
WinUsb_QueryInterfaceSettings: function: Bool; stdcall;
WinUsb_QueryPipe: function: Bool; stdcall;
WinUsb_ReadPipe: function: Bool; stdcall;
WinUsb_ResetPipe: function: Bool; stdcall;
WinUsb_SetCurrentAlternateSetting: function: Bool; stdcall;
WinUsb_SetPipePolicy: function: Bool; stdcall;
WinUsb_SetPowerPolicy: function: Bool; stdcall;
WinUsb_WritePipe: function: Bool; stdcall;
{$ELSE}
function HotK_Init(var Handle: KHOT_HANDLE; const InitParams: PKHOT_PARAMS)
: Bool; stdcall; external LIBUSBK_DLL name 'HotK_Init';
function HotK_Free(const Handle: KHOT_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'HotK_Free';
procedure HotK_FreeAll; stdcall; external LIBUSBK_DLL name 'HotK_FreeAll';
function IsoK_EnumPackets(const IsoContext: PKISO_CONTEXT;
const EnumPackets: KISO_ENUM_PACKETS_CB; const StartPacketIndex: Integer;
const UserState): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_EnumPackets';
function IsoK_Free(const IsoContext: PKISO_CONTEXT): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_Free';
function IsoK_GetPacket(const IsoContext: PKISO_CONTEXT;
const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_GetPacket';
function IsoK_Init(var IsoContext: PKISO_CONTEXT;
const NumberOfPackets: Integer; const StartFrame: Integer): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_Init';
function IsoK_ReUse(const IsoContext: PKISO_CONTEXT): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_ReUse';
function IsoK_SetPacket(const IsoContext: PKISO_CONTEXT;
const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_SetPacket';
function IsoK_SetPackets(const IsoContext: PKISO_CONTEXT;
const PacketSize: Integer): Bool; stdcall;
external LIBUSBK_DLL name 'IsoK_SetPackets';
function LibK_CopyDriverAPI: Bool; stdcall;
external LIBUSBK_DLL name 'LibK_CopyDriverAPI';
function LibK_GetContext(const Handle: KLIB_HANDLE;
const HandleType: KLIB_HANDLE_TYPE): KLIB_USER_CONTEXT; stdcall;
external LIBUSBK_DLL name 'LibK_GetContext';
function LibK_GetProcAddress: Bool; stdcall;
external LIBUSBK_DLL name 'LibK_GetProcAddress';
function LibK_GetVersion: Bool; stdcall;
external LIBUSBK_DLL name 'LibK_GetVersion';
function LibK_LoadDriverAPI(var DriverAPI: KUSB_DRIVER_API;
const DriverID: Integer): Bool; stdcall;
external LIBUSBK_DLL name 'LibK_LoadDriverAPI';
function LibK_SetCleanupCallback: Bool; stdcall;
external LIBUSBK_DLL name 'LibK_SetCleanupCallback';
function LibK_SetContext(const Handle: KLIB_HANDLE;
const HandleType: KLIB_HANDLE_TYPE; const ContextValue: KLIB_USER_CONTEXT)
: Bool; stdcall; external LIBUSBK_DLL name 'LibK_SetContext';
function LibK_SetDefaultContext(const HandleType: KLIB_HANDLE_TYPE;
const UserContext: KLIB_USER_CONTEXT): Bool; stdcall;
external LIBUSBK_DLL name 'LibK_SetDefaultContext';
function LibK_GetDefaultContext(const HandleType: KLIB_HANDLE_TYPE)
: KLIB_USER_CONTEXT; stdcall;
external LIBUSBK_DLL name 'LibK_GetDefaultContext';
function LstK_AttachInfo: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_AttachInfo';
function LstK_Clone(const InterfaceHandle: KUSB_HANDLE;
var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_Clone';
function LstK_CloneInfo: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_CloneInfo';
function LstK_Count(const DeviceList: KLST_HANDLE; var Count: Cardinal): Bool;
stdcall; external LIBUSBK_DLL name 'LstK_Count';
function LstK_Current: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_Current';
function LstK_DetachInfo: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_Current';
function LstK_Enumerate: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_Enumerate';
function LstK_FindByVidPid(const DeviceList: KLST_HANDLE; const Vid: Integer;
const Pid: Integer; var DeviceInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_FindByVidPid';
function LstK_Free(const DeviceList: KLST_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_Free';
function LstK_FreeInfo: Bool; stdcall;
external LIBUSBK_DLL name 'LstK_FreeInfo';
function LstK_Init(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG): Bool;
stdcall; external LIBUSBK_DLL name 'LstK_Init';
function LstK_InitEx(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG;
const PatternMatch: PKLST_PATTERN_MATCH): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_InitEx';
function LstK_MoveNext(const DeviceList: KLST_HANDLE;
var DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_MoveNext';
function LstK_MoveReset(const DeviceList: KLST_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'LstK_MoveReset';
function LstK_Sync: Bool; stdcall; external LIBUSBK_DLL name 'LstK_Sync';
function OvlK_Acquire(var OverlappedK: KOVL_HANDLE;
const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_Acquire';
function OvlK_Free(const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_Free';
function OvlK_GetEventHandle: Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_GetEventHandle';
function OvlK_Init(var PoolHandle: KOVL_POOL_HANDLE;
const UsbHandle: KUSB_HANDLE; const MaxOverlappedCount: Integer;
const Flags: KOVL_POOL_FLAG): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_Init';
function OvlK_IsComplete: Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_IsComplete';
function OvlK_ReUse(const OverlappedK: KOVL_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_ReUse';
function OvlK_Release(const OverlappedK: KOVL_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_Release';
function OvlK_Wait(const OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer;
const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal): Bool;
stdcall; external LIBUSBK_DLL name 'OvlK_Wait';
function OvlK_WaitOldest(const PoolHandle: KOVL_POOL_HANDLE;
var OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer;
const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal): Bool;
stdcall; external LIBUSBK_DLL name 'OvlK_WaitOldest';
function OvlK_WaitAndRelease(const OverlappedK: KOVL_HANDLE;
const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_WaitAndRelease';
function OvlK_WaitOrCancel(const OverlappedK: KOVL_HANDLE;
const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall;
external LIBUSBK_DLL name 'OvlK_WaitOrCancel';
function StmK_Free(const StreamHandle: KSTM_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Free';
function StmK_Init(var StreamHandle: KSTM_HANDLE;
const UsbHandle: KUSB_HANDLE; const PipeId: Byte;
const MaxTransferSize: Integer; const MaxPendingTransfers: Integer;
const MaxPendingIO: Integer; const Callbacks: PKSTM_CALLBACK;
const Flags: KSTM_FLAG): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Init';
function StmK_Read(const StreamHandle: KSTM_HANDLE; var Buffer;
const Offset: Integer; const Length: Integer;
var TransferredLength: Cardinal): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Read';
function StmK_Start(const StreamHandle: KSTM_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Start';
function StmK_Stop(const StreamHandle: KSTM_HANDLE;
const TimeoutCancelMS: Integer): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Stop';
function StmK_Write(const StreamHandle: KSTM_HANDLE; const Buffer;
const Offset: Integer; const Length: Integer;
var TransferredLength: Cardinal): Bool; stdcall;
external LIBUSBK_DLL name 'StmK_Write';
function UsbK_AbortPipe(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_AbortPipe';
function UsbK_ClaimInterface(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ClaimInterface';
function UsbK_Clone(const InterfaceHandle: KUSB_HANDLE;
var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_Clone';
function UsbK_ControlTransfer(const InterfaceHandle: KUSB_HANDLE;
const SetupPacket: WINUSB_SETUP_PACKET_INT64; var Buffer;
const BufferLength: Cardinal; const LengthTransferred: PCardinal;
//Optional may be Nil
const Overlapped: POverlapped): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ControlTransfer';
function UsbK_FlushPipe: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_FlushPipe';
function UsbK_Free(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_Free';
function UsbK_GetAltInterface(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool; var AltSettingNumber: Byte)
: Bool; stdcall; external LIBUSBK_DLL name 'UsbK_GetAltInterface';
function UsbK_GetAssociatedInterface: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetAssociatedInterface';
function UsbK_GetConfiguration: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetConfiguration';
function UsbK_GetCurrentAlternateSetting: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetCurrentAlternateSetting';
function UsbK_GetCurrentFrameNumber(const InterfaceHandle: KUSB_HANDLE;
var FrameNumber: Cardinal): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetCurrentFrameNumber';
function UsbK_GetDescriptor(const InterfaceHandle: KUSB_HANDLE;
const DescriptorType: Byte; const Index: Byte; const LanguageID: Word;
var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal)
: Bool; stdcall; external LIBUSBK_DLL name 'UsbK_GetDescriptor';
function UsbK_GetOverlappedResult: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetOverlappedResult';
function UsbK_GetPipePolicy: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetPipePolicy';
function UsbK_GetPowerPolicy: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetPowerPolicy';
function UsbK_GetProperty: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_GetProperty';
function UsbK_Init(var InterfaceHandle: KUSB_HANDLE;
const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_Init';
function UsbK_Initialize: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_Initialize';
function UsbK_IsoReadPipe(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; var Buffer; const BufferLength: Cardinal;
const Overlapped: POverlapped; const IsoContext: PKISO_CONTEXT): Bool;
stdcall; external LIBUSBK_DLL name 'UsbK_IsoReadPipe';
function UsbK_IsoWritePipe: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_IsoWritePipe';
function UsbK_QueryDeviceInformation: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_QueryDeviceInformation';
function UsbK_QueryInterfaceSettings(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte;
var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_QueryInterfaceSettings';
function UsbK_QueryPipe(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte; const PipeIndex: Byte;
var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_QueryPipe';
function UsbK_ReadPipe(const InterfaceHandle: KUSB_HANDLE; const PipeId: Byte;
var Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal; //Optional may be Nil
const Overlapped: POverlapped): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ReadPipe';
function UsbK_ReleaseInterface(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ReleaseInterface';
function UsbK_ResetDevice: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ResetDevice';
function UsbK_ResetPipe(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_ResetPipe';
function UsbK_SelectInterface(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_SelectInterface';
function UsbK_SetAltInterface(const InterfaceHandle: KUSB_HANDLE;
const NumberOrIndex: Byte; const IsIndex: Bool;
const AltSettingNumber: Byte): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_SetAltInterface';
function UsbK_SetConfiguration(const InterfaceHandle: KUSB_HANDLE;
const ConfigurationNumber: Byte): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_SetConfiguration';
function UsbK_SetCurrentAlternateSetting(const InterfaceHandle: KUSB_HANDLE;
const AltSettingNumber: Byte): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_SetCurrentAlternateSetting';
function UsbK_SetPipePolicy(const InterfaceHandle: KUSB_HANDLE;
const PipeId: Byte; const PolicyType: Cardinal; const ValueLength: Cardinal;
const Value): Bool; stdcall; external LIBUSBK_DLL name 'UsbK_SetPipePolicy';
function UsbK_SetPowerPolicy: Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_SetPowerPolicy';
function UsbK_WritePipe(const InterfaceHandle: KUSB_HANDLE; const PipeId: Byte;
var Buffer; const BufferLength: Cardinal;
const LengthTransferred: PCardinal;
const Overlapped: POverlapped): Bool; stdcall;
external LIBUSBK_DLL name 'UsbK_WritePipe';
function WinUsb_AbortPipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_AbortPipe';
function WinUsb_ControlTransfer: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_ControlTransfer';
function WinUsb_FlushPipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_FlushPipe';
function WinUsb_Free: Bool; stdcall; external LIBUSBK_DLL name 'WinUsb_Free';
function WinUsb_GetAssociatedInterface: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetAssociatedInterface';
function WinUsb_GetCurrentAlternateSetting: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetCurrentAlternateSetting';
function WinUsb_GetDescriptor: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetDescriptor';
function WinUsb_GetOverlappedResult: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetOverlappedResult';
function WinUsb_GetPipePolicy: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetPipePolicy';
function WinUsb_GetPowerPolicy: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_GetPowerPolicy';
function WinUsb_Initialize: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_Initialize';
function WinUsb_QueryDeviceInformation: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_QueryDeviceInformation';
function WinUsb_QueryInterfaceSettings: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_QueryInterfaceSettings';
function WinUsb_QueryPipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_QueryPipe';
function WinUsb_ReadPipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_ReadPipe';
function WinUsb_ResetPipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_ResetPipe';
function WinUsb_SetCurrentAlternateSetting: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_SetCurrentAlternateSetting';
function WinUsb_SetPipePolicy: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_SetPipePolicy';
function WinUsb_SetPowerPolicy: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_SetPowerPolicy';
function WinUsb_WritePipe: Bool; stdcall;
external LIBUSBK_DLL name 'WinUsb_WritePipe';
{$ENDIF}
function GetIsoPacketFromIsoContext(const AIsoContext: PKISO_CONTEXT;
const AIndex: Integer): PKISO_PACKET;
function UsbK_InitFromDevicePath(const ADevicePath: String;
var InterfaceHandle: KUSB_HANDLE): Boolean;
function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(const DescriptorType: Byte;
const Index: Byte): Word;
implementation
function GetIsoPacketFromIsoContext(const AIsoContext: PKISO_CONTEXT;
const AIndex: Integer): PKISO_PACKET;
begin
if not Assigned(AIsoContext) or (AIndex < 0) or
(AIndex >= AIsoContext.NumberOfPackets) then
Result:= Nil
else
Result:= @PKISO_PACKET_ARRAY(@AIsoContext.IsoPackets)^[AIndex];
// isoCtx.IsoPackets[posPacket];
end;
function UsbK_InitFromDevicePath(const ADevicePath: String;
var InterfaceHandle: KUSB_HANDLE): Boolean;
var
deviceCount: Cardinal;
lDeviceList: KLST_HANDLE;
lDeviceInfo: KLST_DEVINFO_HANDLE;
begin
Result:= False;
if not DllAvailable then
Exit;
InterfaceHandle:= Nil;
deviceCount:= 0;
lDeviceList:= Nil;
lDeviceInfo:= Nil;
// Get the device list
if (not LstK_Init(lDeviceList, 0)) then
Exit;
try
LstK_Count(lDeviceList, deviceCount);
if (deviceCount = 0) then
Exit; // List is freed in finally
while LstK_MoveNext(lDeviceList, lDeviceInfo) do
begin
if Assigned(lDeviceInfo) then
begin
if ADevicePath = lDeviceInfo.DevicePath then
begin
if UsbK_Init(InterfaceHandle, lDeviceInfo) then
begin
Result:= True;
Exit;
end;
InterfaceHandle:= Nil;
end;
end;
end;
finally
// If lDeviceList is still assigned than free
if Assigned(lDeviceList) then
LstK_Free(lDeviceList);
end;
end;
function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(const DescriptorType: Byte;
const Index: Byte): Word;
begin
Result:= (Word(DescriptorType) shl 8) or Index;
end;
function InitDllImport: Boolean;
begin
Result:= False;
{$IFDEF DynamicLink}
HLIBUSBKDll:= LoadLibrary(LIBUSBK_DLL);
if HLIBUSBKDll >= 32 then { success }
begin
HotK_Init:= GetProcAddress(HLIBUSBKDll, 'HotK_Init');
HotK_Free:= GetProcAddress(HLIBUSBKDll, 'HotK_Free');
HotK_FreeAll:= GetProcAddress(HLIBUSBKDll, 'HotK_FreeAll');
IsoK_EnumPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_EnumPackets');
IsoK_Free:= GetProcAddress(HLIBUSBKDll, 'IsoK_Free');
IsoK_GetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_GetPacket');
IsoK_Init:= GetProcAddress(HLIBUSBKDll, 'IsoK_Init');
IsoK_ReUse:= GetProcAddress(HLIBUSBKDll, 'IsoK_ReUse');
IsoK_SetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPacket');
IsoK_SetPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPackets');
LibK_CopyDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_CopyDriverAPI');
LibK_GetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_GetContext');
LibK_GetProcAddress:= GetProcAddress(HLIBUSBKDll, 'LibK_GetProcAddress');
LibK_GetVersion:= GetProcAddress(HLIBUSBKDll, 'LibK_GetVersion');
LibK_LoadDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_LoadDriverAPI');
LibK_SetCleanupCallback:= GetProcAddress(HLIBUSBKDll,
'LibK_SetCleanupCallback');
LibK_SetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_SetContext');
LibK_SetDefaultContext:= GetProcAddress(HLIBUSBKDll,
'LibK_SetDefaultContext');
LibK_GetDefaultContext:= GetProcAddress(HLIBUSBKDll,
'LibK_GetDefaultContext');
LstK_AttachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_AttachInfo');
LstK_Clone:= GetProcAddress(HLIBUSBKDll, 'LstK_Clone');
LstK_CloneInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_CloneInfo');
LstK_Count:= GetProcAddress(HLIBUSBKDll, 'LstK_Count');
LstK_Current:= GetProcAddress(HLIBUSBKDll, 'LstK_Current');
LstK_DetachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_DetachInfo');
LstK_Enumerate:= GetProcAddress(HLIBUSBKDll, 'LstK_Enumerate');
LstK_FindByVidPid:= GetProcAddress(HLIBUSBKDll, 'LstK_FindByVidPid');
LstK_Free:= GetProcAddress(HLIBUSBKDll, 'LstK_Free');
LstK_FreeInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_FreeInfo');
LstK_Init:= GetProcAddress(HLIBUSBKDll, 'LstK_Init');
LstK_InitEx:= GetProcAddress(HLIBUSBKDll, 'LstK_InitEx');
LstK_MoveNext:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveNext');
LstK_MoveReset:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveReset');
LstK_Sync:= GetProcAddress(HLIBUSBKDll, 'LstK_Sync');
OvlK_Acquire:= GetProcAddress(HLIBUSBKDll, 'OvlK_Acquire');
OvlK_Free:= GetProcAddress(HLIBUSBKDll, 'OvlK_Free');
OvlK_GetEventHandle:= GetProcAddress(HLIBUSBKDll, 'OvlK_GetEventHandle');
OvlK_Init:= GetProcAddress(HLIBUSBKDll, 'OvlK_Init');
OvlK_IsComplete:= GetProcAddress(HLIBUSBKDll, 'OvlK_IsComplete');
OvlK_ReUse:= GetProcAddress(HLIBUSBKDll, 'OvlK_ReUse');
OvlK_Release:= GetProcAddress(HLIBUSBKDll, 'OvlK_Release');
OvlK_Wait:= GetProcAddress(HLIBUSBKDll, 'OvlK_Wait');
OvlK_WaitOldest:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOldest');
OvlK_WaitAndRelease:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitAndRelease');
OvlK_WaitOrCancel:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOrCancel');
StmK_Free:= GetProcAddress(HLIBUSBKDll, 'StmK_Free');
StmK_Init:= GetProcAddress(HLIBUSBKDll, 'StmK_Init');
StmK_Read:= GetProcAddress(HLIBUSBKDll, 'StmK_Read');
StmK_Start:= GetProcAddress(HLIBUSBKDll, 'StmK_Start');
StmK_Stop:= GetProcAddress(HLIBUSBKDll, 'StmK_Stop');
StmK_Write:= GetProcAddress(HLIBUSBKDll, 'StmK_Write');
UsbK_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_AbortPipe');
UsbK_ClaimInterface:= GetProcAddress(HLIBUSBKDll, 'UsbK_ClaimInterface');
UsbK_Clone:= GetProcAddress(HLIBUSBKDll, 'UsbK_Clone');
UsbK_ControlTransfer:= GetProcAddress(HLIBUSBKDll,
'UsbK_ControlTransfer');
UsbK_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_FlushPipe');
UsbK_Free:= GetProcAddress(HLIBUSBKDll, 'UsbK_Free');
UsbK_GetAltInterface:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetAltInterface');
UsbK_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetAssociatedInterface');
UsbK_GetConfiguration:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetConfiguration');
UsbK_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetCurrentAlternateSetting');
UsbK_GetCurrentFrameNumber:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetCurrentFrameNumber');
UsbK_GetDescriptor:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetDescriptor');
UsbK_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll,
'UsbK_GetOverlappedResult');
UsbK_GetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPipePolicy');
UsbK_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPowerPolicy');
UsbK_GetProperty:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetProperty');
UsbK_Init:= GetProcAddress(HLIBUSBKDll, 'UsbK_Init');
UsbK_Initialize:= GetProcAddress(HLIBUSBKDll, 'UsbK_Initialize');
UsbK_IsoReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoReadPipe');
UsbK_IsoWritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoWritePipe');
UsbK_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll,
'UsbK_QueryDeviceInformation');
UsbK_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll,
'UsbK_QueryInterfaceSettings');
UsbK_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_QueryPipe');
UsbK_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ReadPipe');
UsbK_ReleaseInterface:= GetProcAddress(HLIBUSBKDll,
'UsbK_ReleaseInterface');
UsbK_ResetDevice:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetDevice');
UsbK_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetPipe');
UsbK_SelectInterface:= GetProcAddress(HLIBUSBKDll,
'UsbK_SelectInterface');
UsbK_SetAltInterface:= GetProcAddress(HLIBUSBKDll,
'UsbK_SetAltInterface');
UsbK_SetConfiguration:= GetProcAddress(HLIBUSBKDll,
'UsbK_SetConfiguration');
UsbK_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll,
'UsbK_SetCurrentAlternateSetting');
UsbK_SetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPipePolicy');
UsbK_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPowerPolicy');
UsbK_WritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_WritePipe');
WinUsb_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_AbortPipe');
WinUsb_ControlTransfer:= GetProcAddress(HLIBUSBKDll,
'WinUsb_ControlTransfer');
WinUsb_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_FlushPipe');
WinUsb_Free:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Free');
WinUsb_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetAssociatedInterface');
WinUsb_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetCurrentAlternateSetting');
WinUsb_GetDescriptor:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetDescriptor');
WinUsb_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetOverlappedResult');
WinUsb_GetPipePolicy:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetPipePolicy');
WinUsb_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll,
'WinUsb_GetPowerPolicy');
WinUsb_Initialize:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Initialize');
WinUsb_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll,
'WinUsb_QueryDeviceInformation');
WinUsb_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll,
'WinUsb_QueryInterfaceSettings');
WinUsb_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_QueryPipe');
WinUsb_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ReadPipe');
WinUsb_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ResetPipe');
WinUsb_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll,
'WinUsb_SetCurrentAlternateSetting');
WinUsb_SetPipePolicy:= GetProcAddress(HLIBUSBKDll,
'WinUsb_SetPipePolicy');
WinUsb_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll,
'WinUsb_SetPowerPolicy');
WinUsb_WritePipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_WritePipe');
Result:= True;
Result:= Result and Assigned(HotK_Init);
Result:= Result and Assigned(HotK_Free);
Result:= Result and Assigned(HotK_FreeAll);
Result:= Result and Assigned(IsoK_EnumPackets);
Result:= Result and Assigned(IsoK_Free);
Result:= Result and Assigned(IsoK_GetPacket);
Result:= Result and Assigned(IsoK_Init);
Result:= Result and Assigned(IsoK_ReUse);
Result:= Result and Assigned(IsoK_SetPacket);
Result:= Result and Assigned(IsoK_SetPackets);
Result:= Result and Assigned(LibK_CopyDriverAPI);
Result:= Result and Assigned(LibK_GetContext);
Result:= Result and Assigned(LibK_GetProcAddress);
Result:= Result and Assigned(LibK_GetVersion);
Result:= Result and Assigned(LibK_LoadDriverAPI);
Result:= Result and Assigned(LibK_SetCleanupCallback);
Result:= Result and Assigned(LibK_SetContext);
Result:= Result and Assigned(LibK_SetDefaultContext);
Result:= Result and Assigned(LibK_GetDefaultContext);
Result:= Result and Assigned(LstK_AttachInfo);
Result:= Result and Assigned(LstK_Clone);
Result:= Result and Assigned(LstK_CloneInfo);
Result:= Result and Assigned(LstK_Count);
Result:= Result and Assigned(LstK_Current);
Result:= Result and Assigned(LstK_DetachInfo);
Result:= Result and Assigned(LstK_Enumerate);
Result:= Result and Assigned(LstK_FindByVidPid);
Result:= Result and Assigned(LstK_Free);
Result:= Result and Assigned(LstK_FreeInfo);
Result:= Result and Assigned(LstK_Init);
Result:= Result and Assigned(LstK_InitEx);
Result:= Result and Assigned(LstK_MoveNext);
Result:= Result and Assigned(LstK_MoveReset);
Result:= Result and Assigned(LstK_Sync);
Result:= Result and Assigned(OvlK_Acquire);
Result:= Result and Assigned(OvlK_Free);
Result:= Result and Assigned(OvlK_GetEventHandle);
Result:= Result and Assigned(OvlK_Init);
Result:= Result and Assigned(OvlK_IsComplete);
Result:= Result and Assigned(OvlK_ReUse);
Result:= Result and Assigned(OvlK_Release);
Result:= Result and Assigned(OvlK_Wait);
Result:= Result and Assigned(OvlK_WaitOldest);
Result:= Result and Assigned(OvlK_WaitAndRelease);
Result:= Result and Assigned(OvlK_WaitOrCancel);
Result:= Result and Assigned(StmK_Free);
Result:= Result and Assigned(StmK_Init);
Result:= Result and Assigned(StmK_Read);
Result:= Result and Assigned(StmK_Start);
Result:= Result and Assigned(StmK_Stop);
Result:= Result and Assigned(StmK_Write);
Result:= Result and Assigned(UsbK_AbortPipe);
Result:= Result and Assigned(UsbK_ClaimInterface);
Result:= Result and Assigned(UsbK_Clone);
Result:= Result and Assigned(UsbK_ControlTransfer);
Result:= Result and Assigned(UsbK_FlushPipe);
Result:= Result and Assigned(UsbK_Free);
Result:= Result and Assigned(UsbK_GetAltInterface);
Result:= Result and Assigned(UsbK_GetAssociatedInterface);
Result:= Result and Assigned(UsbK_GetConfiguration);
Result:= Result and Assigned(UsbK_GetCurrentAlternateSetting);
Result:= Result and Assigned(UsbK_GetCurrentFrameNumber);
Result:= Result and Assigned(UsbK_GetDescriptor);
Result:= Result and Assigned(UsbK_GetOverlappedResult);
Result:= Result and Assigned(UsbK_GetPipePolicy);
Result:= Result and Assigned(UsbK_GetPowerPolicy);
Result:= Result and Assigned(UsbK_GetProperty);
Result:= Result and Assigned(UsbK_Init);
Result:= Result and Assigned(UsbK_Initialize);
Result:= Result and Assigned(UsbK_IsoReadPipe);
Result:= Result and Assigned(UsbK_IsoWritePipe);
Result:= Result and Assigned(UsbK_QueryDeviceInformation);
Result:= Result and Assigned(UsbK_QueryInterfaceSettings);
Result:= Result and Assigned(UsbK_QueryPipe);
Result:= Result and Assigned(UsbK_ReadPipe);
Result:= Result and Assigned(UsbK_ReleaseInterface);
Result:= Result and Assigned(UsbK_ResetDevice);
Result:= Result and Assigned(UsbK_ResetPipe);
Result:= Result and Assigned(UsbK_SelectInterface);
Result:= Result and Assigned(UsbK_SetAltInterface);
Result:= Result and Assigned(UsbK_SetConfiguration);
Result:= Result and Assigned(UsbK_SetCurrentAlternateSetting);
Result:= Result and Assigned(UsbK_SetPipePolicy);
Result:= Result and Assigned(UsbK_SetPowerPolicy);
Result:= Result and Assigned(UsbK_WritePipe);
Result:= Result and Assigned(WinUsb_AbortPipe);
Result:= Result and Assigned(WinUsb_ControlTransfer);
Result:= Result and Assigned(WinUsb_FlushPipe);
Result:= Result and Assigned(WinUsb_Free);
Result:= Result and Assigned(WinUsb_GetAssociatedInterface);
Result:= Result and Assigned(WinUsb_GetCurrentAlternateSetting);
Result:= Result and Assigned(WinUsb_GetDescriptor);
Result:= Result and Assigned(WinUsb_GetOverlappedResult);
Result:= Result and Assigned(WinUsb_GetPipePolicy);
Result:= Result and Assigned(WinUsb_GetPowerPolicy);
Result:= Result and Assigned(WinUsb_Initialize);
Result:= Result and Assigned(WinUsb_QueryDeviceInformation);
Result:= Result and Assigned(WinUsb_QueryInterfaceSettings);
Result:= Result and Assigned(WinUsb_QueryPipe);
Result:= Result and Assigned(WinUsb_ReadPipe);
Result:= Result and Assigned(WinUsb_ResetPipe);
Result:= Result and Assigned(WinUsb_SetCurrentAlternateSetting);
Result:= Result and Assigned(WinUsb_SetPipePolicy);
Result:= Result and Assigned(WinUsb_SetPowerPolicy);
Result:= Result and Assigned(WinUsb_WritePipe);
end
else
begin
HotK_Init:= Nil;
HotK_Free:= Nil;
HotK_FreeAll:= Nil;
IsoK_EnumPackets:= Nil;
IsoK_Free:= Nil;
IsoK_GetPacket:= Nil;
IsoK_Init:= Nil;
IsoK_ReUse:= Nil;
IsoK_SetPacket:= Nil;
IsoK_SetPackets:= Nil;
LibK_CopyDriverAPI:= Nil;
LibK_GetContext:= Nil;
LibK_GetProcAddress:= Nil;
LibK_GetVersion:= Nil;
LibK_LoadDriverAPI:= Nil;
LibK_SetCleanupCallback:= Nil;
LibK_SetContext:= Nil;
LibK_SetDefaultContext:= Nil;
LibK_GetDefaultContext:= Nil;
LstK_AttachInfo:= Nil;
LstK_Clone:= Nil;
LstK_CloneInfo:= Nil;
LstK_Count:= Nil;
LstK_Current:= Nil;
LstK_DetachInfo:= Nil;
LstK_Enumerate:= Nil;
LstK_FindByVidPid:= Nil;
LstK_Free:= Nil;
LstK_FreeInfo:= Nil;
LstK_Init:= Nil;
LstK_InitEx:= Nil;
LstK_MoveNext:= Nil;
LstK_MoveReset:= Nil;
LstK_Sync:= Nil;
OvlK_Acquire:= Nil;
OvlK_Free:= Nil;
OvlK_GetEventHandle:= Nil;
OvlK_Init:= Nil;
OvlK_IsComplete:= Nil;
OvlK_ReUse:= Nil;
OvlK_Release:= Nil;
OvlK_Wait:= Nil;
OvlK_WaitOldest:= Nil;
OvlK_WaitAndRelease:= Nil;
OvlK_WaitOrCancel:= Nil;
StmK_Free:= Nil;
StmK_Init:= Nil;
StmK_Read:= Nil;
StmK_Start:= Nil;
StmK_Stop:= Nil;
StmK_Write:= Nil;
UsbK_AbortPipe:= Nil;
UsbK_ClaimInterface:= Nil;
UsbK_Clone:= Nil;
UsbK_ControlTransfer:= Nil;
UsbK_FlushPipe:= Nil;
UsbK_Free:= Nil;
UsbK_GetAltInterface:= Nil;
UsbK_GetAssociatedInterface:= Nil;
UsbK_GetConfiguration:= Nil;
UsbK_GetCurrentAlternateSetting:= Nil;
UsbK_GetCurrentFrameNumber:= Nil;
UsbK_GetDescriptor:= Nil;
UsbK_GetOverlappedResult:= Nil;
UsbK_GetPipePolicy:= Nil;
UsbK_GetPowerPolicy:= Nil;
UsbK_GetProperty:= Nil;
UsbK_Init:= Nil;
UsbK_Initialize:= Nil;
UsbK_IsoReadPipe:= Nil;
UsbK_IsoWritePipe:= Nil;
UsbK_QueryDeviceInformation:= Nil;
UsbK_QueryInterfaceSettings:= Nil;
UsbK_QueryPipe:= Nil;
UsbK_ReadPipe:= Nil;
UsbK_ReleaseInterface:= Nil;
UsbK_ResetDevice:= Nil;
UsbK_ResetPipe:= Nil;
UsbK_SelectInterface:= Nil;
UsbK_SetAltInterface:= Nil;
UsbK_SetConfiguration:= Nil;
UsbK_SetCurrentAlternateSetting:= Nil;
UsbK_SetPipePolicy:= Nil;
UsbK_SetPowerPolicy:= Nil;
UsbK_WritePipe:= Nil;
WinUsb_AbortPipe:= Nil;
WinUsb_ControlTransfer:= Nil;
WinUsb_FlushPipe:= Nil;
WinUsb_Free:= Nil;
WinUsb_GetAssociatedInterface:= Nil;
WinUsb_GetCurrentAlternateSetting:= Nil;
WinUsb_GetDescriptor:= Nil;
WinUsb_GetOverlappedResult:= Nil;
WinUsb_GetPipePolicy:= Nil;
WinUsb_GetPowerPolicy:= Nil;
WinUsb_Initialize:= Nil;
WinUsb_QueryDeviceInformation:= Nil;
WinUsb_QueryInterfaceSettings:= Nil;
WinUsb_QueryPipe:= Nil;
WinUsb_ReadPipe:= Nil;
WinUsb_ResetPipe:= Nil;
WinUsb_SetCurrentAlternateSetting:= Nil;
WinUsb_SetPipePolicy:= Nil;
WinUsb_SetPowerPolicy:= Nil;
WinUsb_WritePipe:= Nil;
end;
{$ELSE}
Result:= True;
{$ENDIF}
end;
procedure DoneDllImport;
begin
{$IFDEF DynamicLink}
if DllAvailable then
FreeLibrary(HLIBUSBKDll);
{$ENDIF}
end;
initialization
{$IFDEF DynamicLink}
DllAvailable:= InitDllImport;
{$ELSE}
// Anyway the program will not start if the DLL is not available
DllAvailable:= True;
{$ENDIF}
// Delphi will show a Breakpoint if Assert violates, if no violation is
// detected by the compiler, the linker will eliminate the calls
Assert((SizeOf(WINUSB_PIPE_INFORMATION) = 12),
'WINUSB_PIPE_INFORMATION size violation');
Assert((SizeOf(WINUSB_SETUP_PACKET) = 8),
'WINUSB_SETUP_PACKET size violation');
Assert((SizeOf(KISO_CONTEXT) = 16), 'KISO_CONTEXT size violation');
Assert((SizeOf(KUSB_DRIVER_API) = 512), 'KUSB_DRIVER_API size violation');
Assert((SizeOf(KSTM_CALLBACK) = 64), 'KSTM_CALLBACK size violation');
Assert((SizeOf(KLST_PATTERN_MATCH) = 1024),
'KLST_PATTERN_MATCH size violation');
Assert((SizeOf(KHOT_PARAMS) = 2048), 'KHOT_PARAMS size violation');
finalization
{$IFDEF DynamicLink}
DoneDllImport;
{$ENDIF}
end.