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.
616 lines
14 KiB
616 lines
14 KiB
//=================================================================
|
|
|
|
//
|
|
|
|
// WinSpoolApi.cpp
|
|
|
|
//
|
|
|
|
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//=================================================================
|
|
|
|
#include "precomp.h"
|
|
#include <cominit.h>
|
|
|
|
#include "DllWrapperBase.h"
|
|
#include "WinSpoolApi.h"
|
|
#include "DllWrapperCreatorReg.h"
|
|
|
|
|
|
// {77609C22-CDAA-11d2-911E-0060081A46FD}
|
|
static const GUID g_guidWinSpoolApi =
|
|
{ 0x3b8515f1, 0xefd, 0x11d3, { 0x91, 0xc, 0x0, 0x10, 0x5a, 0xa6, 0x30, 0xbe } };
|
|
|
|
static const TCHAR g_tstrWinSpool[] = _T("WinSpool.Drv");
|
|
|
|
|
|
/******************************************************************************
|
|
* Register this class with the CResourceManager.
|
|
*****************************************************************************/
|
|
CDllApiWraprCreatrReg<CWinSpoolApi, &g_guidWinSpoolApi, g_tstrWinSpool> MyRegisteredWinSpoolWrapper;
|
|
|
|
|
|
/******************************************************************************
|
|
* Constructor
|
|
*****************************************************************************/
|
|
CWinSpoolApi::CWinSpoolApi(LPCTSTR a_tstrWrappedDllName)
|
|
: CDllWrapperBase(a_tstrWrappedDllName),
|
|
m_pfnClosePrinter (NULL),
|
|
m_pfnDeviceCapabilities (NULL),
|
|
m_pfnDocumentProperties (NULL),
|
|
m_pfnEnumJobs (NULL),
|
|
m_pfnEnumPrinterDrivers (NULL),
|
|
m_pfnEnumPrinters (NULL),
|
|
m_pfnEnumPorts (NULL),
|
|
m_pfnGetJob (NULL),
|
|
m_pfnGetPrinter (NULL),
|
|
m_pfnGetPrinterDriver (NULL),
|
|
m_pfnSetPrinter (NULL),
|
|
m_pfnOpenPrinter (NULL),
|
|
m_pfnGetDefaultPrinter(NULL),
|
|
m_hPrintMutex(NULL),
|
|
m_pfnSetJob (NULL),
|
|
m_pfnDeletePrinter (NULL),
|
|
m_pfnSetDefaultPrinter(NULL)
|
|
#if NTONLY >= 5
|
|
,
|
|
m_pfnXcvData(NULL),
|
|
m_pfnAddPrinterConnection(NULL),
|
|
m_pfnDeletePrinterConnection(NULL)
|
|
#endif
|
|
{
|
|
#ifdef WIN9XONLY
|
|
m_hPrintMutex = ::CreateMutex( NULL, FALSE, PRINTER_NAMED_MUTEX ) ;
|
|
#endif
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* Destructor
|
|
*****************************************************************************/
|
|
CWinSpoolApi::~CWinSpoolApi()
|
|
{
|
|
#ifdef WIN9XONLY
|
|
if( m_hPrintMutex )
|
|
{
|
|
ReleaseMutex( m_hPrintMutex ) ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Initialization function to check that we obtained function addresses.
|
|
******************************************************************************/
|
|
bool CWinSpoolApi::Init()
|
|
{
|
|
bool fRet = LoadLibrary();
|
|
if(fRet)
|
|
{
|
|
#ifdef UNICODE
|
|
m_pfnClosePrinter = ( PFN_WinSpool_ClosePrinter ) GetProcAddress ( "ClosePrinter" ) ;
|
|
m_pfnDeviceCapabilities = ( PFN_WinSpool_DeviceCapabilities ) GetProcAddress ( "DeviceCapabilitiesW" ) ;
|
|
m_pfnDocumentProperties = ( PFN_WinSpool_DocumentProperties ) GetProcAddress ( "DocumentPropertiesW" ) ;
|
|
m_pfnEnumJobs = ( PFN_WinSpool_EnumJobs ) GetProcAddress ( "EnumJobsW" ) ;
|
|
m_pfnEnumPrinterDrivers = ( PFN_WinSpool_EnumPrinterDrivers ) GetProcAddress ( "EnumPrinterDriversW" ) ;
|
|
m_pfnEnumPrinters = ( PFN_WinSpool_EnumPrinters ) GetProcAddress ( "EnumPrintersW" ) ;
|
|
m_pfnEnumPorts = ( PFN_WinSpool_EnumPorts ) GetProcAddress ( "EnumPortsW" ) ;
|
|
m_pfnGetJob = ( PFN_WinSpool_GetJob ) GetProcAddress ( "GetJobW" ) ;
|
|
m_pfnGetPrinter = ( PFN_WinSpool_GetPrinter ) GetProcAddress ( "GetPrinterW" ) ;
|
|
m_pfnGetPrinterDriver = ( PFN_WinSpool_GetPrinterDriver ) GetProcAddress ( "GetPrinterDriverW" ) ;
|
|
m_pfnSetPrinter = ( PFN_WinSpool_SetPrinter ) GetProcAddress ( "SetPrinterW" ) ;
|
|
m_pfnOpenPrinter = ( PFN_WinSpool_OpenPrinter ) GetProcAddress ( "OpenPrinterW" ) ;
|
|
m_pfnSetJob = ( PFN_WinSpool_SetJob ) GetProcAddress ( "SetJobW" );
|
|
m_pfnDeletePrinter = ( PFN_WinSpool_DeletePrinter ) GetProcAddress ( "DeletePrinter" );
|
|
|
|
#if NTONLY == 5
|
|
m_pfnGetDefaultPrinter = ( PFN_WinSpool_GetDefaultPrinter ) GetProcAddress ( "GetDefaultPrinterW" ) ;
|
|
m_pfnSetDefaultPrinter = ( PFN_WinSpool_SetDefaultPrinter ) GetProcAddress ( "SetDefaultPrinterW" ) ;
|
|
m_pfnXcvData = ( PFN_WinSpool_XcvData ) GetProcAddress ( "XcvDataW" ) ;
|
|
m_pfnAddPrinterConnection = ( PFN_WinSpool_AddPrinterConnection) GetProcAddress ( "AddPrinterConnectionW" );
|
|
m_pfnDeletePrinterConnection = ( PFN_WinSpool_DeletePrinterConnection) GetProcAddress ( "DeletePrinterConnectionW" );
|
|
#endif
|
|
|
|
#else
|
|
m_pfnClosePrinter = ( PFN_WinSpool_ClosePrinter ) GetProcAddress ( "ClosePrinter" ) ;
|
|
m_pfnDeviceCapabilities = ( PFN_WinSpool_DeviceCapabilities ) GetProcAddress ( "DeviceCapabilitiesA" ) ;
|
|
m_pfnDocumentProperties = ( PFN_WinSpool_DocumentProperties ) GetProcAddress ( "DocumentPropertiesA" ) ;
|
|
m_pfnEnumJobs = ( PFN_WinSpool_EnumJobs ) GetProcAddress ( "EnumJobsA" ) ;
|
|
m_pfnEnumPrinterDrivers = ( PFN_WinSpool_EnumPrinterDrivers ) GetProcAddress ( "EnumPrinterDriversA" ) ;
|
|
m_pfnEnumPrinters = ( PFN_WinSpool_EnumPrinters ) GetProcAddress ( "EnumPrintersA" ) ;
|
|
m_pfnEnumPorts = ( PFN_WinSpool_EnumPorts ) GetProcAddress ( "EnumPortsA" ) ;
|
|
m_pfnGetJob = ( PFN_WinSpool_GetJob ) GetProcAddress ( "GetJobA" ) ;
|
|
m_pfnGetPrinter = ( PFN_WinSpool_GetPrinter ) GetProcAddress ( "GetPrinterA" ) ;
|
|
m_pfnGetPrinterDriver = ( PFN_WinSpool_GetPrinterDriver ) GetProcAddress ( "GetPrinterDriverA" ) ;
|
|
m_pfnSetPrinter = ( PFN_WinSpool_SetPrinter ) GetProcAddress ( "SetPrinterA" ) ;
|
|
m_pfnOpenPrinter = ( PFN_WinSpool_OpenPrinter ) GetProcAddress ( "OpenPrinterA" ) ;
|
|
m_pfnSetJob = ( PFN_WinSpool_SetJob ) GetProcAddress ( "SetJobA" );
|
|
m_pfnDeletePrinter = ( PFN_WinSpool_DeletePrinter ) GetProcAddress ( "DeletePrinter" );
|
|
#endif
|
|
}
|
|
|
|
// We require these function for all versions of this dll.
|
|
|
|
#if NTONLY == 5
|
|
|
|
if ( m_pfnClosePrinter == NULL ||
|
|
m_pfnDeviceCapabilities == NULL ||
|
|
m_pfnDocumentProperties == NULL ||
|
|
m_pfnEnumJobs == NULL ||
|
|
m_pfnEnumPrinterDrivers == NULL ||
|
|
m_pfnEnumPrinters == NULL ||
|
|
m_pfnEnumPorts == NULL ||
|
|
m_pfnGetJob == NULL ||
|
|
m_pfnGetPrinter == NULL ||
|
|
m_pfnGetPrinterDriver == NULL ||
|
|
m_pfnSetPrinter == NULL ||
|
|
m_pfnOpenPrinter == NULL ||
|
|
m_pfnGetDefaultPrinter == NULL ||
|
|
m_pfnSetJob == NULL ||
|
|
m_pfnDeletePrinter == NULL ||
|
|
m_pfnSetDefaultPrinter == NULL ||
|
|
m_pfnXcvData == NULL ||
|
|
m_pfnAddPrinterConnection == NULL||
|
|
m_pfnDeletePrinterConnection == NULL )
|
|
{
|
|
fRet = false;
|
|
LogErrorMessage(L"Failed find entrypoint in winspoolapi");
|
|
}
|
|
|
|
#else
|
|
if ( m_pfnClosePrinter == NULL ||
|
|
m_pfnDeviceCapabilities == NULL ||
|
|
m_pfnDocumentProperties == NULL ||
|
|
m_pfnEnumJobs == NULL ||
|
|
m_pfnEnumPrinterDrivers == NULL ||
|
|
m_pfnEnumPrinters == NULL ||
|
|
m_pfnEnumPorts == NULL ||
|
|
m_pfnGetJob == NULL ||
|
|
m_pfnGetPrinter == NULL ||
|
|
m_pfnGetPrinterDriver == NULL ||
|
|
m_pfnSetPrinter == NULL ||
|
|
m_pfnOpenPrinter == NULL ||
|
|
m_pfnSetJob == NULL ||
|
|
m_pfnDeletePrinter == NULL )
|
|
{
|
|
fRet = false;
|
|
LogErrorMessage(L"Failed find entrypoint in winspoolapi");
|
|
}
|
|
#endif
|
|
|
|
return fRet;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Member functions wrapping WinSpool api functions. Add new functions here
|
|
* as required.
|
|
*****************************************************************************/
|
|
|
|
BOOL CWinSpoolApi :: ClosePrinter (
|
|
|
|
IN HANDLE hPrinter
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnClosePrinter ( hPrinter ) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
int CWinSpoolApi :: DeviceCapabilities (
|
|
|
|
IN LPCWSTR pDevice ,
|
|
IN LPCWSTR pPort,
|
|
IN WORD fwCapability ,
|
|
OUT LPWSTR pOutput ,
|
|
IN CONST DEVMODEW *pDevMode
|
|
)
|
|
#else
|
|
int CWinSpoolApi :: DeviceCapabilities (
|
|
|
|
IN LPCSTR pDevice ,
|
|
IN LPCSTR pPort,
|
|
IN WORD fwCapability ,
|
|
OUT LPCSTR pOutput,
|
|
IN CONST DEVMODEA *pDevMode
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnDeviceCapabilities (
|
|
|
|
pDevice ,
|
|
pPort,
|
|
fwCapability ,
|
|
pOutput,
|
|
pDevMode
|
|
) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
LONG CWinSpoolApi :: DocumentProperties (
|
|
|
|
IN HWND hWnd,
|
|
IN HANDLE hPrinter,
|
|
IN LPWSTR pDeviceName,
|
|
OUT PDEVMODEW pDevModeOutput,
|
|
IN PDEVMODEW pDevModeInput,
|
|
IN DWORD fMode
|
|
)
|
|
#else
|
|
LONG CWinSpoolApi :: DocumentProperties (
|
|
|
|
IN HWND hWnd,
|
|
IN HANDLE hPrinter,
|
|
IN LPSTR pDeviceName,
|
|
OUT PDEVMODEA pDevModeOutput,
|
|
IN PDEVMODEA pDevModeInput,
|
|
IN DWORD fMode
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnDocumentProperties (
|
|
|
|
hWnd,
|
|
hPrinter,
|
|
pDeviceName,
|
|
pDevModeOutput,
|
|
pDevModeInput,
|
|
fMode
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: EnumJobs (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN DWORD FirstJob,
|
|
IN DWORD NoJobs,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pJob,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnEnumJobs (
|
|
|
|
hPrinter,
|
|
FirstJob,
|
|
NoJobs,
|
|
Level,
|
|
pJob,
|
|
cbBuf,
|
|
pcbNeeded,
|
|
pcReturned
|
|
) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
BOOL CWinSpoolApi :: EnumPrinterDrivers (
|
|
|
|
IN LPWSTR pName,
|
|
IN LPWSTR pEnvironment,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pDriverInfo,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#else
|
|
BOOL CWinSpoolApi :: EnumPrinterDrivers (
|
|
|
|
IN LPSTR pName,
|
|
IN LPSTR pEnvironment,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pDriverInfo,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnEnumPrinterDrivers (
|
|
|
|
pName,
|
|
pEnvironment,
|
|
Level,
|
|
pDriverInfo,
|
|
cbBuf,
|
|
pcbNeeded,
|
|
pcReturned
|
|
) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
BOOL CWinSpoolApi :: EnumPrinters (
|
|
|
|
IN DWORD Flags,
|
|
IN LPWSTR Name,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPrinterEnum,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#else
|
|
BOOL CWinSpoolApi :: EnumPrinters (
|
|
|
|
IN DWORD Flags,
|
|
IN LPSTR Name,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPrinterEnum,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnEnumPrinters (
|
|
|
|
Flags,
|
|
Name,
|
|
Level,
|
|
pPrinterEnum,
|
|
cbBuf,
|
|
pcbNeeded,
|
|
pcReturned
|
|
) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
BOOL CWinSpoolApi :: EnumPorts (
|
|
|
|
IN LPWSTR Name,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPortEnum,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#else
|
|
BOOL CWinSpoolApi :: EnumPorts (
|
|
|
|
IN LPSTR Name,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPortEnum,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded,
|
|
OUT LPDWORD pcReturned
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnEnumPorts (
|
|
|
|
Name,
|
|
Level,
|
|
pPortEnum,
|
|
cbBuf,
|
|
pcbNeeded,
|
|
pcReturned
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: GetJob (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN DWORD JobId,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pJob,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnGetJob (
|
|
|
|
hPrinter,
|
|
JobId,
|
|
Level,
|
|
pJob,
|
|
cbBuf,
|
|
pcbNeeded
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: SetJob (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN DWORD JobId,
|
|
IN DWORD Level,
|
|
IN LPBYTE pJob,
|
|
IN DWORD cbBuf
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnSetJob (
|
|
|
|
hPrinter,
|
|
JobId,
|
|
Level,
|
|
pJob,
|
|
cbBuf
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: GetPrinter (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPrinter,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnGetPrinter(
|
|
|
|
hPrinter,
|
|
Level,
|
|
pPrinter,
|
|
cbBuf,
|
|
pcbNeeded
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: GetPrinterDriver (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN LPTSTR pEnvironment,
|
|
IN DWORD Level,
|
|
OUT LPBYTE pPrinter,
|
|
IN DWORD cbBuf,
|
|
OUT LPDWORD pcbNeeded
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnGetPrinterDriver(
|
|
|
|
hPrinter,
|
|
pEnvironment,
|
|
Level,
|
|
pPrinter,
|
|
cbBuf,
|
|
pcbNeeded
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: SetPrinter (
|
|
|
|
IN HANDLE hPrinter,
|
|
IN DWORD Level,
|
|
IN LPBYTE pPrinter,
|
|
IN DWORD cbBuf
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnSetPrinter(
|
|
|
|
hPrinter,
|
|
Level,
|
|
pPrinter,
|
|
cbBuf
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: DeletePrinter (
|
|
|
|
IN HANDLE hPrinter
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnDeletePrinter(
|
|
|
|
hPrinter
|
|
) ;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
BOOL CWinSpoolApi :: OpenPrinter (
|
|
|
|
IN LPWSTR pPrinterName,
|
|
OUT LPHANDLE phPrinter,
|
|
IN LPPRINTER_DEFAULTSW pDefault
|
|
)
|
|
#else
|
|
BOOL CWinSpoolApi :: OpenPrinter (
|
|
|
|
IN LPSTR pPrinterName,
|
|
OUT LPHANDLE phPrinter,
|
|
IN LPPRINTER_DEFAULTSA pDefault
|
|
)
|
|
#endif
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnOpenPrinter(
|
|
|
|
pPrinterName,
|
|
phPrinter,
|
|
pDefault
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: GetDefaultPrinter (
|
|
|
|
IN LPTSTR pszBuffer,
|
|
IN LPDWORD pcchBuffer
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnGetDefaultPrinter(
|
|
|
|
pszBuffer,
|
|
pcchBuffer
|
|
) ;
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: SetDefaultPrinter (
|
|
|
|
IN LPTSTR pszBuffer
|
|
)
|
|
{
|
|
LOCK_WINSPOOL_9X ;
|
|
|
|
return m_pfnSetDefaultPrinter(
|
|
|
|
pszBuffer
|
|
) ;
|
|
}
|
|
|
|
#if NTONLY >= 5
|
|
BOOL CWinSpoolApi :: XcvData (
|
|
IN HANDLE hXcv,
|
|
IN PCWSTR pszDataName,
|
|
IN PBYTE pInputData,
|
|
IN DWORD cbInputData,
|
|
OUT PBYTE pOutputData,
|
|
IN DWORD cbOutputData,
|
|
OUT PDWORD pcbOutputNeeded,
|
|
OUT PDWORD pdwStatus
|
|
)
|
|
{
|
|
return m_pfnXcvData(hXcv,
|
|
pszDataName,
|
|
pInputData,
|
|
cbInputData,
|
|
pOutputData,
|
|
cbOutputData,
|
|
pcbOutputNeeded,
|
|
pdwStatus);
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: AddPrinterConnection(
|
|
IN LPWSTR pszBuffer
|
|
)
|
|
{
|
|
return m_pfnAddPrinterConnection(pszBuffer);
|
|
}
|
|
|
|
BOOL CWinSpoolApi :: DeletePrinterConnection(
|
|
IN LPWSTR pszBuffer
|
|
)
|
|
{
|
|
return m_pfnDeletePrinterConnection(pszBuffer);
|
|
}
|
|
|
|
#endif
|
|
|
|
|