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.
 
 
 
 
 
 

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