/*++ Copyright (C) 2000 Microsoft Corporation All rights reserved. Module Name: drvevnt.cxx Abstract: This file contains the implementation for the Driver Event class Author: Khaled Sedky (khaleds) 18 January 2000 Revision History: --*/ #include "precomp.h" #pragma hdrstop #ifndef __DRVEVNT_HPP__ #include "drvevnt.hpp" #endif #ifndef __LDFUNCS_HPP__ #include "ldfuncs.hpp" #endif #ifndef __LDMGR_HPP__ #include "ldmgr.hpp" #endif /* -------------------------------------- */ /* Implemetation of class PrinterEvnetMgr */ /* -------------------------------------- */ /*++ Function Name: TPrinterEventMgr :: TPrinterEventMgr Description: Constructor of the Printer(Driver) Event object Parameters: TLoad64BitDllsMgr* : Pointer to the main loader object which manage the process Return Value: None --*/ TPrinterEventMgr:: TPrinterEventMgr( IN TLoad64BitDllsMgr *pIpLdrObj ) : m_pLdrObj(pIpLdrObj), TClassID("TPrinterEventMgr") { m_pLdrObj->AddRef(); } /*++ Function Name: TPrinterEventMgr :: ~TPrinterEventMgr Description: Destructor of the Printer(Driver) Event object Parameters: None Return Value: None --*/ TPrinterEventMgr:: ~TPrinterEventMgr( VOID ) { m_pLdrObj->Release(); } /*++ Function Name: TPrinterEventMgr :: SpoolerPrinterEvent Description: Calls into the driver DrvPrinterEvent entry point Parameters: PrinterName : The name of the printer involved PrinterEvent : What happened Flags : Misc. flag bits lParam : Event specific parameters Return Value: BOOL : TRUE in case of success : FALSE in case of failure --*/ BOOL TPrinterEventMgr :: SpoolerPrinterEvent( IN LPWSTR pszPrinterName, IN int PrinterEvent, IN DWORD Flags, IN LPARAM lParam, OUT PDWORD pErrorCode ) { HANDLE hPrinter, hDriver; BOOL ReturnValue=FALSE; PFNDRVPRINTEREVENT pfn; RPC_STATUS RpcStatus; SPLASSERT(m_pLdrObj); if((RpcStatus = RpcImpersonateClient(0)) == RPC_S_OK) { m_pLdrObj->IncUIRefCnt(); { if (OpenPrinter((LPWSTR)pszPrinterName, &hPrinter, NULL)) { if(hDriver = LoadPrinterDriver(hPrinter)) { if (pfn = (PFNDRVPRINTEREVENT)GetProcAddress(hDriver, "DrvPrinterEvent")) { __try { ReturnValue = (*pfn)( pszPrinterName, PrinterEvent, Flags, lParam ); } __except(1) { *pErrorCode = GetExceptionCode(); } } else { *pErrorCode = GetLastError(); } FreeLibrary(hDriver); } else { *pErrorCode = GetLastError(); } ClosePrinter(hPrinter); } else { *pErrorCode = GetLastError(); } } m_pLdrObj->DecUIRefCnt(); RpcStatus = RpcRevertToSelf(); } else { *pErrorCode = RpcStatus; } return ReturnValue; } /*++ Function Name: TPrinterEventMgr :: DocumentEvent Description: Calls into the driver DrvDocumentEvent entry point Parameters: PrinterName : The name of the printer involved InDC : The printer DC. EscapeCode : Why this function is called InSize, : Size of the input buffer InBuf, : Pointer to the input buffer OutSize, : Size of the output buffer OutBuf, : Pointer to the output buffer ErrorCode : output Last Error from operation Return Value: DOCUMENTEVENT_SUCCESS : success DOCUMENTEVENT_UNSUPPORTED : EscapeCode is not supported DOCUMENTEVENT_FAILURE : an error occured --*/ int TPrinterEventMgr :: DocumentEvent( IN LPWSTR pszPrinterName, IN ULONG_PTR InDC, IN int EscapeCode, IN DWORD InSize, IN LPBYTE pInBuf, OUT PDWORD pOutSize, OUT LPBYTE *ppOutBuf, OUT PDWORD pErrorCode ) { HANDLE hPrinter, hDriver; int ReturnValue=0; PFNDRVDOCUMENTEVENT pfn; HDC hDC = reinterpret_cast(InDC); RPC_STATUS RpcStatus ; SPLASSERT(m_pLdrObj); if((RpcStatus = RpcImpersonateClient(0)) == RPC_S_OK) { m_pLdrObj->IncUIRefCnt(); { if (OpenPrinter((LPWSTR)pszPrinterName, &hPrinter, NULL)) { if(hDriver = LoadPrinterDriver(hPrinter)) { if (pfn = (PFNDRVDOCUMENTEVENT)GetProcAddress(hDriver, "DrvDocumentEvent")) { __try { ULONG cbOut = sizeof(ULONG); PDEVMODEW pOut = NULL; ReturnValue = (*pfn)( hPrinter, (HDC)InDC, EscapeCode, (ULONG)InSize, (PVOID)pInBuf, cbOut, (PVOID)&pOut); if(ReturnValue != -1 && pOut) { *pOutSize = pOut->dmSize + pOut->dmDriverExtra; if(*ppOutBuf = new BYTE[*pOutSize]) { memcpy(*ppOutBuf,pOut,*pOutSize); } else { *pErrorCode = ERROR_OUTOFMEMORY; } // // Now what should I do about the memory allocated // for pOut ???? // } } __except(1) { SetLastError(GetExceptionCode()); } } FreeLibrary(hDriver); } else { *pErrorCode = GetLastError(); } ClosePrinter(hPrinter); } else { *pErrorCode = GetLastError(); } } m_pLdrObj->DecUIRefCnt(); RpcStatus = RpcRevertToSelf(); } else { *pErrorCode = RpcStatus; } return ReturnValue; }