446 lines
8.7 KiB
C
446 lines
8.7 KiB
C
/*++
|
|
|
|
Copyright (c) 1997-1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
USBPRINT.h
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
Environment:
|
|
|
|
Kernel & user mode
|
|
|
|
Revision History:
|
|
|
|
5-10-96 : created
|
|
|
|
--*/
|
|
|
|
|
|
#ifdef DRIVER
|
|
|
|
|
|
extern int iGMessageLevel;
|
|
#define BOOL CHAR
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
#define MAX_ID_SIZE 1024
|
|
#define ID_OVERHEAD 15 //this is enough for the 'USBPRINT' at the beginning of the ID, and the crc at the end
|
|
#define MAX_NUM_PRINTERS 512
|
|
|
|
|
|
#define USBP_TAG 0x50425355 /* "USBP" */
|
|
|
|
#define FAILURE_TIMEOUT -10000 * 5000 // 5 seconds
|
|
|
|
#define USBPRINT_NAME_MAX 64
|
|
#define USB_BASE_NAME L"USB"
|
|
|
|
#define DEVICE_CAPABILITY_VERSION 1
|
|
//
|
|
// we support up to 10 pipe handles
|
|
//
|
|
#define USBPRINT_MAX_PIPES 10
|
|
|
|
//
|
|
// defines used for ISO test
|
|
//
|
|
|
|
#define USBPRINT_MAX_IRP 2
|
|
#define USBPRINT_NUM_ISO_PACKETS_PER_REQUEST 32
|
|
#define USBPRINT_MAX_STREAM_PACKET 8
|
|
#define PORT_NUM_VALUE_NAME L"Port Number"
|
|
#define PORT_BASE_NAME L"Base Name"
|
|
|
|
#define USBPRINT_STREAM_TIMEOUT_INTERVAL 100
|
|
|
|
|
|
// {28D78FAD-5A12-11d1-AE5B-0000F803A8C2}
|
|
static const GUID USBPRINT_GUID =
|
|
{ 0x28d78fad, 0x5a12, 0x11d1, { 0xae, 0x5b, 0x0, 0x0, 0xf8, 0x3, 0xa8, 0xc2 } };
|
|
|
|
|
|
|
|
/*typedef struct _USBPRINT_PIPE { we don't use this struct anymore. Just use PUSBD_PIPE_INFORMATION directly
|
|
BOOLEAN Opened;
|
|
UCHAR Pad[3];
|
|
PUSBD_PIPE_INFORMATION PipeInfo;
|
|
WCHAR Name[USBPRINT_NAME_MAX];
|
|
LARGE_INTEGER BytesXfered;
|
|
LARGE_INTEGER ElapsedTime;
|
|
LARGE_INTEGER TimerStart;
|
|
LARGE_INTEGER ElapsedCycles;
|
|
LARGE_INTEGER CyclesStart;
|
|
BOOLEAN bPerfTimerEnabled; //yy Bunch of perf fields here. remove them
|
|
} USBPRINT_PIPE, *PUSBPRINT_PIPE; */
|
|
|
|
typedef struct _USBPRINT_RW_CONTEXT {
|
|
PURB Urb;
|
|
BOOLEAN IsWrite;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
} USBPRINT_RW_CONTEXT, *PUSBPRINT_RW_CONTEXT;
|
|
|
|
|
|
#define MAX_INTERFACE 2
|
|
|
|
// 999 is limit of USBMON's scope due to USB_XXX port name format.
|
|
#define MAX_PORT_NUMBER 999
|
|
// USB_001 is the lowest port number available.
|
|
#define MIN_PORT_NUMBER 1
|
|
|
|
//
|
|
// Structure representing blocks of unallocated ports.
|
|
//
|
|
typedef struct _FREE_PORTS
|
|
{
|
|
ULONG iBottomOfRange; // The bottom free port number in this block.
|
|
ULONG iTopOfRange; // The top free port number in this block.
|
|
struct _FREE_PORTS * pNextBlock; // Pointer to the next block pf free ports.
|
|
} FREE_PORTS, *PFREE_PORTS;
|
|
|
|
typedef struct _DEVICE_EXTENSION {
|
|
|
|
BOOLEAN IsChildDevice;
|
|
|
|
// Device object we call when submitting Urbs
|
|
PDEVICE_OBJECT TopOfStackDeviceObject;
|
|
|
|
PDEVICE_OBJECT PhysicalDeviceObject;
|
|
|
|
PDEVICE_OBJECT ChildDevice;
|
|
BOOL bChildDeviceHere;
|
|
UCHAR DeviceIdString[MAX_ID_SIZE];
|
|
BOOLEAN bBadDeviceID;
|
|
|
|
KSPIN_LOCK WakeSpinLock;
|
|
BOOLEAN bD0IrpPending;
|
|
DEVICE_POWER_STATE CurrentDevicePowerState;
|
|
|
|
|
|
// configuration handle for the configuration the
|
|
// device is currently in
|
|
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
|
|
|
|
// ptr to the USB device descriptor
|
|
// for this device
|
|
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor;
|
|
|
|
// we support one interface
|
|
// this is a copy of the info structure
|
|
// returned from select_configuration or
|
|
// select_interface
|
|
PUSBD_INTERFACE_INFORMATION Interface;
|
|
|
|
DEVICE_CAPABILITIES DeviceCapabilities;
|
|
BOOLEAN bReadSupported;
|
|
|
|
PIRP PowerIrp;
|
|
KEVENT RemoveEvent;
|
|
ULONG PendingIoCount;
|
|
|
|
// Name buffer for our named Functional device object link
|
|
WCHAR DeviceLinkNameBuffer[USBPRINT_NAME_MAX];
|
|
|
|
BOOLEAN AcceptingRequests;
|
|
|
|
UCHAR Pad[3];
|
|
|
|
PUSBD_PIPE_INFORMATION pWritePipe;
|
|
PUSBD_PIPE_INFORMATION pReadPipe;
|
|
BOOL bReadPipeExists;
|
|
UNICODE_STRING DeviceLinkName;
|
|
ULONG ulInstanceNumber;
|
|
ULONG OpenCnt;
|
|
|
|
HANDLE hInterfaceKey;
|
|
|
|
LONG ResetWorkItemPending;
|
|
|
|
// selective suspend support
|
|
PIRP PendingIdleIrp;
|
|
PUSB_IDLE_CALLBACK_INFO IdleCallbackInfo;
|
|
DEVICE_POWER_STATE DeviceWake;
|
|
|
|
|
|
|
|
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|
|
|
|
|
typedef struct _CHILD_DEVICE_EXTENSION
|
|
{
|
|
BOOLEAN IsChildDevice;
|
|
|
|
PDEVICE_OBJECT ParentDeviceObject;
|
|
ULONG ulInstanceNumber;
|
|
|
|
} CHILD_DEVICE_EXTENSION, *PCHILD_DEVICE_EXTENSION;
|
|
|
|
|
|
typedef struct _USBPRINT_TRANSFER_OBJECT {
|
|
struct _USBPRINT_STREAM_OBJECT *StreamObject;
|
|
PIRP Irp;
|
|
PURB Urb;
|
|
PUCHAR DataBuffer;
|
|
} USBPRINT_TRANSFER_OBJECT, *PUSBPRINT_TRANSFER_OBJECT;
|
|
|
|
typedef struct _USBPRINT_STREAM_OBJECT {
|
|
PDEVICE_OBJECT DeviceObject;
|
|
ULONG PendingIrps;
|
|
PIRP StopIrp;
|
|
PUSBPRINT_TRANSFER_OBJECT TransferObjectList[USBPRINT_MAX_IRP];
|
|
PUSBD_PIPE_INFORMATION PipeInfo;
|
|
KDPC TimeoutDpc;
|
|
KTIMER TimeoutTimer;
|
|
|
|
BOOLEAN EnableTimeoutDPC;
|
|
BOOLEAN StreamError;
|
|
} USBPRINT_STREAM_OBJECT, *PUSBPRINT_STREAM_OBJECT;
|
|
|
|
|
|
typedef struct _USBPRINT_WORKITEM_CONTEXT
|
|
{
|
|
PIO_WORKITEM ioWorkItem;
|
|
PDEVICE_OBJECT deviceObject;
|
|
PUSBD_PIPE_INFORMATION pPipeInfo;
|
|
PIRP irp;
|
|
|
|
} USBPRINT_WORKITEM_CONTEXT,*PUSBPRINT_WORKITEM_CONTEXT;
|
|
|
|
|
|
#if DBG
|
|
|
|
#define USBPRINT_KdPrint_old(_x_) \
|
|
{\
|
|
DbgPrint _x_ ;\
|
|
DbgPrint("Old USBPRINT\n");\
|
|
}
|
|
|
|
#define USBPRINT_KdPrint0(_x_) \
|
|
{ \
|
|
if(iGMessageLevel>=0) \
|
|
DbgPrint _x_; \
|
|
}
|
|
|
|
#define USBPRINT_KdPrint1(_x_) \
|
|
{ \
|
|
if(iGMessageLevel>=1) \
|
|
DbgPrint _x_; \
|
|
}
|
|
|
|
#define USBPRINT_KdPrint2(_x_) \
|
|
{ \
|
|
if(iGMessageLevel>=2) \
|
|
DbgPrint _x_; \
|
|
}
|
|
|
|
#define USBPRINT_KdPrint3(_x_) \
|
|
{ \
|
|
if(iGMessageLevel>=3) \
|
|
DbgPrint _x_; \
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef NTKERN
|
|
#define TRAP() _asm {int 3}
|
|
#else
|
|
#define TRAP() DbgBreakPoint()
|
|
#endif
|
|
|
|
#else
|
|
|
|
#define USBPRINT_KdPrint_old(_x_)
|
|
#define USBPRINT_KdPrint0(_x_)
|
|
#define USBPRINT_KdPrint1(_x_)
|
|
#define USBPRINT_KdPrint2(_x_)
|
|
#define USBPRINT_KdPrint3(_x_)
|
|
#define USBPRINT_KdPrint4(_x_)
|
|
|
|
#define TRAP()
|
|
|
|
#endif
|
|
|
|
NTSTATUS
|
|
USBPRINT_Dispatch(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
USBPRINT_Unload(
|
|
IN PDRIVER_OBJECT DriverObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_StartDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_StopDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_RemoveDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_CallUSBD(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PURB Urb,
|
|
IN PLARGE_INTEGER pTimeout
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_PnPAddDevice(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_CreateDeviceObject(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PDEVICE_OBJECT *DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_ConfigureDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_Write(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_Create(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_Read(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_ProcessIOCTL(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_SelectInterface(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
|
|
);
|
|
|
|
PUSB_CONFIGURATION_DESCRIPTOR
|
|
USBPRINT_GetConfigDescriptor(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_BuildPipeList(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_Close(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_ResetPipe(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUSBD_PIPE_INFORMATION Pipe,
|
|
IN BOOLEAN IsoClearStall
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_StopIsoStream(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUSBPRINT_STREAM_OBJECT StreamObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_StartIsoStream(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PUSBD_PIPE_INFORMATION PipeInfo,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_IsoIrp_Complete(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PVOID Context
|
|
);
|
|
|
|
VOID
|
|
USBPRINT_IncrementIoCount(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
LONG
|
|
USBPRINT_DecrementIoCount(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_ReconfigureDevice(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_ProcessPowerIrp(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
int
|
|
USBPRINT_Get1284Id(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
PVOID pIoBuffer,int iLen
|
|
);
|
|
|
|
|
|
NTSTATUS USBPRINT_ResetWorkItem(IN PDEVICE_OBJECT deviceObject, IN PVOID Context);
|
|
NTSTATUS USBPRINT_AbortPendingRequests(PDEVICE_OBJECT DeviceObject);
|
|
NTSTATUS USBPRINT_GetPhysicalUSBPortStatus(PDEVICE_OBJECT DeviceObject,ULONG *PortStatus);
|
|
|
|
|
|
|
|
VOID
|
|
USBPRINT_FdoIdleNotificationCallback(IN PDEVICE_EXTENSION DevExt);
|
|
|
|
NTSTATUS
|
|
USBPRINT_FdoIdleNotificationRequestComplete(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp,
|
|
PDEVICE_EXTENSION DevExt
|
|
);
|
|
|
|
NTSTATUS
|
|
USBPRINT_FdoSubmitIdleRequestIrp(IN PDEVICE_EXTENSION DevExt);
|
|
|
|
VOID
|
|
USBPRINT_FdoRequestWake(IN PDEVICE_EXTENSION DevExt);
|
|
|
|
#endif
|
|
|
|
|