Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

309 lines
6.5 KiB

/*++
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 PVOID Context,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
PrinterResubmitWrite(
PDEVICE_OBJECT DeviceObject,
PVOID Context
);
#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;
/*
* Queued write irp and associated srb.
*/
PIRP WriteIrp;
PSCSI_REQUEST_BLOCK WriteSrb;
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)
BOOLEAN SetWriteIrp(PPRINTER_DATA PrinterData, PIRP WriteIrp, PSCSI_REQUEST_BLOCK Srb);
PIRP GetWriteIrp(PPRINTER_DATA PrinterData, PSCSI_REQUEST_BLOCK *Srb);
#endif