windows-nt/Source/XPSP1/NT/printscan/print/drivers/kernelmode/usbprint/usbprint.h
2020-09-26 16:20:57 +08:00

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