#ifndef __KUSB_PRIVATE_H__
#define __KUSB_PRIVATE_H__
#pragma warning(disable:4200)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#include <initguid.h>
#include <ntddk.h>
#include <ntintsafe.h>
#include "usbdi.h"
#include "usbdlib.h"
#include "drv_api.h"
#pragma warning(default:4200)
#pragma warning(default:4201)
#pragma warning(default:4214)
#include <wdf.h>
#include <wdfusb.h>
#include <wchar.h>
#include "lusbk_version.h"
#include "lusbk_debug.h"
#include "..\includes\lusbk_shared.h"
#define POOL_TAG (ULONG) 'KBSU'
extern ULONG DebugLevel;
#undef ExAllocatePool
#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, POOL_TAG)
#define GetListHeadEntry(ListHead) ((ListHead)->Flink)
#define MAX_POLICY (16)
#define LIBUSB_MAX_INTERFACE_COUNT 32
#define LIBUSB_MAX_ENDPOINT_COUNT 32
#define REMOTE_WAKEUP_MASK 0x20
#define MAX_CONTROL_TRANSFER_SIZE 4096
#define LIBUSB_MAX_CONTROL_TRANSFER_TIMEOUT 5000
#define LIBUSB_SYMBOLIC_LINK_NAME L"\\DosDevices\\libusb0-"
#define LIBUSB_SYMBOLIC_LINK_NAMEA "\\DosDevices\\libusb0-"
#define CONTEXT_SECTION_START
extern CONST PCHAR PipeTypeStrings[8];
extern CONST PCHAR DeviceSpeedStrings[8];
extern CONST PCHAR EndpointDirStrings[2];
extern CONST PCHAR BmRequestDirStrings[2];
extern CONST PCHAR BmRequestTypeStrings[4];
extern CONST PCHAR BmRequestRecipientStrings[4];
extern CONST PCHAR BoolStrings[2];
#define GetPipeTypeString(PipeType) PipeTypeStrings[(PipeType) & 0x7]
#define GetDeviceSpeedString(UsbDeviceSpeed) DeviceSpeedStrings[(UsbDeviceSpeed) & 0x7]
#define GetEndpointDirString(EndpointAddress) EndpointDirStrings[((EndpointAddress)>>7) & 0x1]
#define GetBmRequestDirString(BmRequestDir) BmRequestDirStrings[((BmRequestDir)?1:0)]
#define GetBmRequestTypeString(BmRequestType) BmRequestTypeStrings[((BmRequestType) & 0x3)]
#define GetBmRequestRecipientString(BmRequestRecipient) BmRequestRecipientStrings[((BmRequestRecipient) & 0x3)]
#define GetRequestTypeString(WdfRequestType) EndpointDirStrings[(((WdfRequestType)>>2) & 0x1)?0:1]
#define GetBoolString(TrueOrFalse) BoolStrings[(TrueOrFalse) ? 1:0]
#define GetPolicyValue(PolicyType, PolicyULongArray) PolicyULongArray[(PolicyType) & (MAX_POLICY-1)]
#ifdef PAGED_CODE
#undef PAGED_CODE
#endif
#if defined(PAGING_ENABLED)
#define PAGED_CODE() \
{ \
if (KeGetCurrentIrql() > APC_LEVEL) { \
DbgPrint("ERROR:%s[%s] Pageable code called at IRQL %d\n",LOG_APPNAME,__FUNCTION__,KeGetCurrentIrql()); \
} \
}
#else
#define PAGED_CODE() NOP_FUNCTION
#endif
typedef struct _DEVICE_REGSETTINGS
{
ULONG SystemWakeEnabled;
ULONG DeviceIdleEnabled;
ULONG DeviceIdleIgnoreWakeEnable;
ULONG UserSetDeviceIdleEnabled;
ULONG DefaultIdleState;
ULONG DefaultIdleTimeout;
WDFCOLLECTION DeviceInterfaceGUIDs;
} DEVICE_REGSETTINGS, *PDEVICE_REGSETTINGS;
#pragma warning(push)
#pragma warning(disable:4201)
typedef union _PIPE_POLICIES
{
volatile long values;
struct
{
unsigned int IsoStartLatency : 10;
unsigned int IsoAlwaysStartAsap: 1;
unsigned int AutoClearStall: 1;
unsigned int AllowPartialReads: 1;
unsigned int AutoFlush: 1;
unsigned int IgnoreShortPackets: 1;
unsigned int RawIO: 1;
unsigned int IsoNumFixedPackets: 11;
unsigned int ResetPipeOnResume: 1;
unsigned int ShortPacketTerminate: 1;
unsigned: 3;
};
} PIPE_POLICIES;
#pragma warning(pop)
#ifdef CONTEXT_SECTION_START
typedef struct _PIPE_CONTEXT
{
volatile WDFQUEUE Queue; volatile ULONG TimeoutPolicy;
BOOLEAN IsValid; BOOLEAN PipePoliciesInitialized; WDF_USB_PIPE_INFORMATION PipeInformation; WDFUSBPIPE Pipe;
PIPE_POLICIES Policies;
BOOLEAN IsQueueDirty;
ULONG SimulParallelRequests;
} PIPE_CONTEXT, *PPIPE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PIPE_CONTEXT,
GetPipeContext)
typedef struct _INTERFACE_CONTEXT
{
WDFUSBINTERFACE Interface; UCHAR InterfaceIndex; UCHAR SettingIndex; USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; UCHAR PipeCount; PPIPE_CONTEXT PipeContextByIndex[LIBUSB_MAX_ENDPOINT_COUNT]; PFILE_OBJECT ClaimedByFileObject; } INTERFACE_CONTEXT, *PINTERFACE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(INTERFACE_CONTEXT,
GetInterfaceContext)
typedef struct _DEVICE_CONTEXT
{
USB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
ULONG InstanceNumber; PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
ULONG ConfigurationDescriptorSize;
UCHAR ConfigDescriptorIndex;
WDFDEVICE WdfDevice; WDFUSBDEVICE WdfUsbTargetDevice; USB_DEVICE_SPEED DeviceSpeed; BOOLEAN RemoteWakeCapable; BOOLEAN SelfPowered;
UCHAR InterfaceCount;
PIPE_CONTEXT PipeContextByID[LIBUSB_MAX_ENDPOINT_COUNT]; INTERFACE_CONTEXT InterfaceContext[LIBUSB_MAX_INTERFACE_COUNT];
ULONG DevicePolicy[MAX_POLICY]; USBD_VERSION_INFORMATION UsbVersionInfo;
DEVICE_REGSETTINGS DeviceRegSettings; BOOLEAN IsIdleSettingsInitialized;
volatile long OpenedFileHandleCount;
} DEVICE_CONTEXT, *PDEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT,
GetDeviceContext)
typedef DEVICE_CONTEXT libusb_device_t;
typedef struct _FILE_CONTEXT
{
PDEVICE_CONTEXT DeviceContext;
UCHAR PipeID;
WDF_USB_PIPE_TYPE PipeType;
} FILE_CONTEXT, *PFILE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FILE_CONTEXT,
GetFileContext)
typedef struct _QUEUE_CONTEXT
{
WDFUSBPIPE PipeHandle; WDF_USB_PIPE_INFORMATION Info;
PPIPE_CONTEXT PipeContext;
BOOLEAN IsFreshPipeReset;
ULONG NextFrameNumber;
BOOLEAN ResetPipeForResume;
BOOLEAN ResetPipeForStall;
WDFMEMORY_OFFSET OverOfs;
WDFMEMORY OverMem;
PUCHAR OverBuf;
struct
{
WDFMEMORY_OFFSET UserOfs;
WDFMEMORY UserMem;
struct
{
UCHAR Required;
UCHAR Sent;
} Zlps;
ULONG Length;
ULONG Transferred;
} Xfer;
} QUEUE_CONTEXT, *PQUEUE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(QUEUE_CONTEXT, GetQueueContext)
typedef struct _XFER_AUTOISO_COLLECTION_CONTEXT
{
WDFREQUEST MainRequest;
struct _REQUEST_CONTEXT* MainRequestContext;
PMDL OriginalTransferMDL;
PUCHAR TransferBuffer;
ULONG AdjustedReadOffset;
WDFCOLLECTION SubRequestCollection; WDFSPINLOCK SubRequestCollectionLock;
PMDL Mdl;
ULONG TotalTransferred; } XFER_AUTOISO_COLLECTION_CONTEXT, *PXFER_AUTOISO_COLLECTION_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(XFER_AUTOISO_COLLECTION_CONTEXT, GetAutoIsoCollectionContext)
#pragma warning(push)
#pragma warning(disable:4201)
typedef struct _REQUEST_CONTEXT
{
ULONG Length;
WDF_REQUEST_TYPE ActualRequestType;
WDF_REQUEST_TYPE RequestType;
ULONG IoControlCode;
libusb_request IoControlRequest;
PVOID InputBuffer;
ULONG InputBufferLength;
PQUEUE_CONTEXT QueueContext;
PIPE_POLICIES Policies;
ULONG Timeout;
union
{
struct
{
WDFMEMORY UrbMemory;
WDFMEMORY ContextMemory;
} IsoEx;
struct
{
WDFMEMORY UrbMemory;
PXFER_AUTOISO_COLLECTION_CONTEXT Context;
} AutoIso;
struct
{
WDFMEMORY UrbMemory;
ULONG RequestedLength;
SHORT NumPackets;
struct
{
WDFMEMORY Memory;
PUCHAR Buffer;
} FixedIsoPackets;
} AutoIsoEx;
};
} REQUEST_CONTEXT, *PREQUEST_CONTEXT;
#pragma warning(pop)
C_ASSERT(sizeof(REQUEST_CONTEXT) <= 256);
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(REQUEST_CONTEXT ,
GetRequestContext)
typedef struct _WORKITEM_CONTEXT
{
WDFDEVICE Device;
WDFUSBPIPE Pipe;
} WORKITEM_CONTEXT, *PWORKITEM_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKITEM_CONTEXT,
GetWorkItemContext)
#endif
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_UNLOAD DriverExit;
NTSTATUS Registry_ReadAllDeviceKeys(__in PDEVICE_CONTEXT deviceContext);
NTSTATUS GUIDFromWdfString(__in WDFSTRING guidString,
__out PGUID guid);
NTSTATUS GetTransferMemory(__in WDFREQUEST Request,
__in WDF_REQUEST_TYPE RequestType,
__out WDFMEMORY* wdfMemory);
NTSTATUS GetTransferMdl(__in WDFREQUEST Request,
__in WDF_REQUEST_TYPE RequestType,
__out PMDL* wdmMdl);
NTSTATUS AddDefaultDeviceInterfaceGUID(__in PDEVICE_CONTEXT deviceContext);
FORCEINLINE PPIPE_CONTEXT GetPipeContextByID(__in PDEVICE_CONTEXT deviceContext,
__in UCHAR pipeID)
{
return (pipeID == 0x80)
? &deviceContext->PipeContextByID[0]
: &deviceContext->PipeContextByID[((pipeID) & 0xF) | ((pipeID & 0x80) >> 3)];
}
#endif