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
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|