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.
 
 
 
 
 
 

221 lines
6.0 KiB

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
w32draut
Abstract:
This module defines a special subclass of the Win32 client-side RDP
printer redirection "device" class. The subclass, W32DrAutoPrn manages
a queue that is automatically discovered by the client via enumerating
client-side printer queues.
Author:
Tad Brockway 3/23/99
Revision History:
--*/
#ifndef __W32DRAUT_H__
#define __W32DRAUT_H__
#include "w32drprn.h"
///////////////////////////////////////////////////////////////
//
// Defines
//
#define REG_RDPDR_AUTO_PORT _T("AutoPrinterPort")
#define REG_RDPDR_FILTER_QUEUE_TYPE _T("FilterQueueType")
#define FILTER_LPT_QUEUES 0x00000001
#define FILTER_COM_QUEUES 0x00000002
#define FILTER_USB_QUEUES 0x00000004
#define FILTER_NET_QUEUES 0x00000008
#define FILTER_RDP_QUEUES 0x00000010
#define FILTER_ALL_QUEUES 0xFFFFFFFF
///////////////////////////////////////////////////////////////
//
// W32DrAutoPrn
//
//
#define LOCAL_PRINTING_DOCNAME_LEN MAX_PATH
class W32DrAutoPrn : public W32DrPRN
{
private:
typedef struct _PrinterInfo {
LPTSTR pPrinterName;
LPTSTR pPortName;
LPTSTR pDriverName;
DWORD Attributes;
} PRINTERINFO, *PPRINTERINFO;
HANDLE _printerHandle;
protected:
ULONG _jobID;
BOOL _bRunningOn9x;
TCHAR _szLocalPrintingDocName[LOCAL_PRINTING_DOCNAME_LEN];
// Get the name of the printing document to use for server print jobs.
LPTSTR GetLocalPrintingDocName();
// End any jobs in progress and close the printer.
VOID ClosePrinter();
//
// IO Processing Functions
//
// This subclass of DrDevice handles the following IO requests. These
// functions may be overridden in a subclass.
//
// pIoRequestPacket - Request packet received from server.
// packetLen - Length of the packet
//
//
virtual VOID MsgIrpCreate(
IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
IN UINT32 packetLen
);
virtual VOID MsgIrpCleanup(
IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
IN UINT32 packetLen
) {
// Use the default handler.
DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_SUCCESS);
}
virtual VOID MsgIrpClose(
IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
IN UINT32 packetLen
);
virtual VOID MsgIrpRead(
IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
IN UINT32 packetLen
) {
// Use the default handler and fail the read.
DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL);
}
virtual VOID MsgIrpFlushBuffers(
IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket,
IN UINT32 packetLen
) {
// Use the default handler.
DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_SUCCESS);
}
//
// Async IO Management Functions
//
DWORD AsyncWriteIOFunc(W32DRDEV_ASYNCIO_PARAMS *params);
DWORD AsyncMsgIrpCloseFunc(W32DRDEV_ASYNCIO_PARAMS *params);
DWORD AsyncMsgIrpCreateFunc(W32DRDEV_ASYNCIO_PARAMS *params);
//
// Open a printer with highest access possible.
//
BOOL W32DrOpenPrinter(LPTSTR pPrinterName, LPHANDLE phPrinter) ;
//
// Disable annoying printer pop up for the specified printer
// and print job.
//
VOID DisablePrinterPopup(HANDLE hPrinterHandle, ULONG ulJobID);
//
// Create a "friendly" printer name from the printer name of a
// network printer.
//
static LPTSTR CreateFriendlyNameFromNetworkName(LPTSTR printerName,
BOOL serverIsWin2K);
//
// Create a printer name from the names stored in the registry.
//
static LPTSTR CreateNestedName(LPTSTR printerName, BOOL* pfNetwork);
//
// Get the printer name of the default printer.
//
// This function allocates memory and returns a pointer
// to the allocated string, if successful. Otherwise, it returns
// NULL.
//
static LPTSTR GetRDPDefaultPrinter();
//
// Check if printer is visible in our session
//
static BOOL ShouldAddThisPrinter(
DWORD queueFilter,
DWORD userSessionID,
PPRINTERINFO pPrinterInfo,
DWORD printerSessionID
);
// Returns the configurable print redirection filter mask.
static DWORD GetPrinterFilterMask(ProcObj *procObj);
//
// Get printer info for a printer and its corresponding TS session ID, if it
// exists.
//
static DWORD GetPrinterInfoAndSessionID(
IN ProcObj *procObj,
IN LPTSTR printerName,
IN DWORD printerAttribs,
IN OUT BYTE **pPrinterInfoBuf,
IN OUT DWORD *pPrinterInfoBufSize,
OUT DWORD *sessionID,
OUT PPRINTERINFO printerInfo
);
public:
//
// Constructor/Destructor
//
W32DrAutoPrn(ProcObj *processObject,
const DRSTRING printerName, const DRSTRING driverName,
const DRSTRING portName, BOOL isDefault, ULONG deviceID,
const TCHAR *devicePath);
virtual ~W32DrAutoPrn();
//
// Enumerate devices of this type.
//
static DWORD Enumerate(ProcObj *procObj, DrDeviceMgr *deviceMgr);
//
// Get the device type. See "Device Types" section of rdpdr.h
//
virtual ULONG GetDeviceType() { return RDPDR_DTYP_PRINT; }
//
// Return the class name.
//
virtual DRSTRING ClassName() { return TEXT("W32DrAutoPrn"); }
};
#endif