/*++
Copyright (c) 1990-2003 Microsoft Corporation
All Rights Reserved
Windows Server 2003 (Printing) Driver Development Kit Samples
--*/
#include "pp.h"
HMODULE hmod = NULL;
WCHAR *pszRegistryPath = NULL;
WCHAR *pszRegistryPortNames=L"PortNames";
WCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 3];
CRITICAL_SECTION SplSem;
HMODULE hSpoolssDll = NULL;
FARPROC pfnSpoolssEnumPorts = NULL;
static
PRINTPROVIDOR PrintProvidor =
{
PP_OpenPrinter,
PP_SetJob,
PP_GetJob,
PP_EnumJobs,
PP_AddPrinter,
PP_DeletePrinter,
PP_SetPrinter,
PP_GetPrinter,
PP_EnumPrinters,
PP_AddPrinterDriver,
PP_EnumPrinterDrivers,
PP_GetPrinterDriver,
PP_GetPrinterDriverDirectory,
PP_DeletePrinterDriver,
PP_AddPrintProcessor,
PP_EnumPrintProcessors,
PP_GetPrintProcessorDirectory,
PP_DeletePrintProcessor,
PP_EnumPrintProcessorDatatypes,
PP_StartDocPrinter,
PP_StartPagePrinter,
PP_WritePrinter,
PP_EndPagePrinter,
PP_AbortPrinter,
PP_ReadPrinter,
PP_EndDocPrinter,
PP_AddJob,
PP_ScheduleJob,
PP_GetPrinterData,
PP_SetPrinterData,
PP_WaitForPrinterChange,
PP_ClosePrinter,
PP_AddForm,
PP_DeleteForm,
PP_GetForm,
PP_SetForm,
PP_EnumForms,
PP_EnumMonitors,
PP_EnumPorts,
PP_AddPort,
PP_ConfigurePort,
PP_DeletePort,
PP_CreatePrinterIC,
PP_PlayGdiScriptOnPrinterIC,
PP_DeletePrinterIC,
PP_AddPrinterConnection,
PP_DeletePrinterConnection,
PP_PrinterMessageBox,
PP_AddMonitor,
PP_DeleteMonitor
};
BOOL DllMain
(
HINSTANCE hdll,
DWORD dwReason,
LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hdll);
hmod = hdll;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
DWORD
InitializePortNames
(
VOID
)
{
DWORD err;
HKEY hkeyPath;
HKEY hkeyPortNames;
err = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
pszRegistryPath,
0,
KEY_READ,
&hkeyPath );
if (!err)
{
err = RegOpenKeyEx( hkeyPath,
pszRegistryPortNames,
0,
KEY_READ,
&hkeyPortNames );
if (!err)
{
DWORD i = 0;
WCHAR Buffer[MAX_PATH];
DWORD BufferSize;
while (!err)
{
BufferSize = sizeof Buffer;
err = RegEnumValue( hkeyPortNames,
i,
Buffer,
&BufferSize,
NULL,
NULL,
NULL,
NULL );
if (!err)
{
CreatePortEntry(Buffer);
}
i++;
}
if (ERROR_NO_MORE_ITEMS == err)
{
err = NO_ERROR;
}
RegCloseKey(hkeyPortNames);
}
RegCloseKey(hkeyPath);
}
return err;
}
BOOL
InitializePrintProvidor
(
LPPRINTPROVIDOR pPrintProvidor,
DWORD cbPrintProvidor,
LPWSTR pszFullRegistryPath
)
{
DWORD dwLen;
if (!pPrintProvidor || !pszFullRegistryPath || !*pszFullRegistryPath)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
memcpy(pPrintProvidor, &PrintProvidor, min(sizeof(PRINTPROVIDOR), cbPrintProvidor));
if (!(pszRegistryPath = AllocSplStr(pszFullRegistryPath)))
{
return FALSE;
}
//
// Try and initialize the crit-sect
//
__try
{
InitializeCriticalSection(&SplSem);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
szMachineName[0] = szMachineName[1] = L'\\';
dwLen = MAX_COMPUTERNAME_LENGTH;
GetComputerName(szMachineName + 2, &dwLen);
InitializePortNames();
return TRUE;
}
BOOL
PP_OpenPrinter
(
LPWSTR pszPrinterName,
LPHANDLE phPrinter,
LPPRINTER_DEFAULTS pDefault
)
{
DWORD err = NO_ERROR;
UNREFERENCED_PARAMETER(pDefault);
if (!pszPrinterName)
{
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_ClosePrinter
(
HANDLE hPrinter
)
{
DWORD err = NO_ERROR;
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_GetPrinter
(
HANDLE hPrinter,
DWORD dwLevel,
LPBYTE pbPrinter,
DWORD cbBuf,
LPDWORD pcbNeeded
)
{
DWORD err = NO_ERROR;
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_SetPrinter
(
HANDLE hPrinter,
DWORD dwLevel,
LPBYTE pbPrinter,
DWORD dwCommand
)
{
DWORD err = NO_ERROR;
UNREFERENCED_PARAMETER(pbPrinter);
switch (dwLevel)
{
case 0:
case 1:
case 2:
case 3:
break;
default:
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
}
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_EnumPrinters
(
DWORD dwFlags,
LPWSTR pszName,
DWORD dwLevel,
LPBYTE pbPrinter,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
)
{
DWORD err = NO_ERROR;
if ((dwLevel != 1) && (dwLevel != 2))
{
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
else if (!pcbNeeded || !pcReturned)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
DWORD
PP_StartDocPrinter
(
HANDLE hPrinter,
DWORD dwLevel,
LPBYTE lpbDocInfo
)
{
DWORD err = NO_ERROR;
DOC_INFO_1 *pDocInfo1 = (DOC_INFO_1 *)lpbDocInfo;
LPWSTR pszUser = NULL;
BOOL fGateway = FALSE;
if (dwLevel != 1)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_WritePrinter
(
HANDLE hPrinter,
LPVOID pBuf,
DWORD cbBuf,
LPDWORD pcbWritten
)
{
DWORD err = NO_ERROR;
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_AbortPrinter
(
HANDLE hPrinter
)
{
DWORD err = NO_ERROR;
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_EndDocPrinter
(
HANDLE hPrinter
)
{
DWORD err = NO_ERROR;
if (err)
{
SetLastError(err);
}
return (err == NO_ERROR);
}
BOOL
PP_GetJob
(
HANDLE hPrinter,
DWORD dwJobId,
DWORD dwLevel,
LPBYTE pbJob,
DWORD cbBuf,
LPDWORD pcbNeeded
)
{
DWORD err = NO_ERROR;
if ((dwLevel != 1) && (dwLevel != 2))
{
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
}
if (err)
{
SetLastError(err);
}
return (err