|
|
/*++
Copyright (C) Microsoft Corporation, 1998 - 1999
Module Name:
prntpnp.c
Abstract:
printer class driver defines and functions decl.
Author:
George Chrysanthakopoulos (georgioc)
Environment:
kernel mode only
Notes:
Revision History:
--*/
#include "ntddk.h"
#include "scsi.h"
#include "classpnp.h"
#ifndef _PRINTPNP_
#define _PRINTPNP_
#if DBG
ULONG PrintDebugLevel;
#define DEBUGPRINT1(_x_) {if (PrintDebugLevel >= 1) \
KdPrint (_x_);}
#define DEBUGPRINT2(_x_) {if (PrintDebugLevel >= 2) \
KdPrint (_x_);}
#define DEBUGPRINT3(_x_) {if (PrintDebugLevel >= 3) \
KdPrint (_x_);} #define DEBUGPRINT4(_x_) {if (PrintDebugLevel >= 4) \
KdPrint (_x_);}
#else
#define DEBUGPRINT1(_x_)
#define DEBUGPRINT2(_x_)
#define DEBUGPRINT3(_x_)
#define DEBUGPRINT4(_x_)
#endif
NTSTATUS PrinterAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject );
NTSTATUS PrinterEnumerateDevice( IN PDEVICE_OBJECT Fdo );
NTSTATUS PrinterQueryId( IN PDEVICE_OBJECT Pdo, IN BUS_QUERY_ID_TYPE IdType, IN PUNICODE_STRING UnicodeIdString );
NTSTATUS PrinterCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event );
NTSTATUS PrinterGetId ( IN PUCHAR DeviceIdString, IN ULONG Type, OUT PUCHAR resultString, OUT PUCHAR descriptionString );
NTSTATUS PrinterStopDevice( IN PDEVICE_OBJECT DeviceObject, IN UCHAR Type );
NTSTATUS PrinterInitPdo( IN PDEVICE_OBJECT Pdo );
NTSTATUS PrinterInitFdo( IN PDEVICE_OBJECT Fdo );
VOID PrinterRegisterPort( IN PPHYSICAL_DEVICE_EXTENSION DeviceExtension );
NTSTATUS PrinterStartPdo( IN PDEVICE_OBJECT Pdo );
NTSTATUS PrinterQueryPnpCapabilities( IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_CAPABILITIES Capabilities );
NTSTATUS CreatePrinterDeviceObject( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PULONG DeviceCount );
NTSTATUS PrinterDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS PrinterStartDevice( IN PDEVICE_OBJECT Fdo );
NTSTATUS PrinterCreatePdo( IN PDEVICE_OBJECT Fdo, OUT PDEVICE_OBJECT *Pdo );
NTSTATUS PrinterRemoveDevice( IN PDEVICE_OBJECT DeviceObject, IN UCHAR Type );
NTSTATUS PrinterSystemControl( PDEVICE_OBJECT Fdo, PIRP Irp );
NTSTATUS PrinterPowerControl( PDEVICE_OBJECT Fdo, PIRP Irp );
NTSTATUS PrinterOpenClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS PrinterReadWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS PrinterIssueCommand( IN PDEVICE_OBJECT Fdo, IN UCHAR Scsiop );
VOID SplitRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG MaximumBytes );
NTSTATUS PrinterWriteComplete( IN PDEVICE_OBJECT Fdo, IN PIRP Irp, IN PVOID Context );
VOID PrinterRetryRequest( PDEVICE_OBJECT DeviceObject, PIRP Irp, PSCSI_REQUEST_BLOCK Srb );
VOID PrinterWriteTimeoutDpc( IN PKDPC Dpc, IN PCOMMON_DEVICE_EXTENSION Extension, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );
VOID PrinterResubmitWrite( PDEVICE_OBJECT DeviceObject, PVOID Context );
VOID PrinterCancel( PDEVICE_OBJECT DeviceObject, PIRP Irp );
#define DEVICE_EXTENSION_SIZE sizeof(FUNCTIONAL_DEVICE_EXTENSION) + sizeof(PRINTER_DATA)
#define PRINTER_TIMEOUT 100
#define PRINTER_SRB_LIST_SIZE 4
#define PRINTER_TAG 'tnrp'
#define BLOCKED_WRITE_TIMEOUT 3 // seconds
#define PORT_NUM_VALUE_NAME L"Port Number"
#define BASE_PORT_NAME_VALUE_NAME L"Base Name"
#define BASE_PORT_DESCRIPTION L"IEEE 1394 Printer Port"
#define BASE_PORT_DESCRIPTION_VALUE_NAME L"Port Description"
#define RECYCLABLE_VALUE_NAME L"Recyclable"
#define BASE_1394_PORT_NAME L"1394_"
#define BASE_SCSI_PORT_NAME L"SCSI"
#define MAX_PRINT_XFER 0x00ffffff
#define MAX_NUM_PRINTERS 20
typedef struct _PRINTER_DATA {
ULONG DeviceFlags; KSPIN_LOCK SplitRequestSpinLock; UNICODE_STRING UnicodeLinkName; UNICODE_STRING UnicodeDeviceString; UCHAR DeviceName[256]; PUCHAR DeviceIdString; ULONG PortNumber; ULONG LptNumber;
//
// See comments in PrinterWriteComplete() for a description
// of the following fields
//
PIO_COMPLETION_ROUTINE WriteCompletionRoutine; KTIMER Timer; LARGE_INTEGER DueTime; KDPC TimerDpc; PIRP WriteIrp; NTSTATUS LastWriteStatus;
} PRINTER_DATA, *PPRINTER_DATA;
static const GUID PNPPRINT_GUID = { 0x28d78fad, 0x5a12, 0x11d1, { 0xae, 0x5b, 0x0, 0x0, 0xf8, 0x3, 0xa8, 0xc2 } };
//
// Support for the following ioctl allows SCSIPRNT to behave like the
// USB, etc printing stacks, to keep USBMON.DLL happy
//
// From ntos\dd\usbprint\ioctl.h & windows\spooler\monitors\dynamon\ioctl.h
//
#define USBPRINT_IOCTL_INDEX 0x0000
#define IOCTL_USBPRINT_GET_LPT_STATUS CTL_CODE(FILE_DEVICE_UNKNOWN, \
USBPRINT_IOCTL_INDEX+12, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS)
//
// The following ioctl allows a smart client / port monitor to en/disable
// the blocking write behavior on 1394 printers
//
#define SCSIPRNT_IOCTL_INDEX 0x123
#define IOCTL_SCSIPRNT_1394_BLOCKING_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, \
SCSIPRNT_IOCTL_INDEX, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS)
#endif
|