windows-nt/Source/XPSP1/NT/printscan/fax/print/faxprint/lib/prndata.c

343 lines
6.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
prndata.c
Abstract:
Functions for accessing printer property data in the registry
Environment:
Fax driver, user and kernel mode
Revision History:
01/09/96 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "faxlib.h"
LPTSTR
GetPrinterDataStr(
HANDLE hPrinter,
LPTSTR pRegKey
)
/*++
Routine Description:
Get a string value from the PrinterData registry key
Arguments:
hPrinter - Identifies the printer object
pRegKey - Specifies the name of registry value
Return Value:
pBuffer
--*/
{
DWORD type, cb;
PVOID pBuffer = NULL;
//
// We should really pass NULL for pData parameter here. But to workaround
// a bug in the spooler API GetPrinterData, we must pass in a valid pointer here.
//
if (GetPrinterData(hPrinter, pRegKey, &type, (PBYTE) &type, 0, &cb) == ERROR_MORE_DATA &&
(pBuffer = MemAlloc(cb)) &&
GetPrinterData(hPrinter, pRegKey, &type, pBuffer, cb, &cb) == ERROR_SUCCESS &&
(type == REG_SZ || type == REG_MULTI_SZ || type == REG_EXPAND_SZ))
{
return pBuffer;
}
Error(("Couldn't get printer data string %ws: %d\n", pRegKey, GetLastError()));
MemFree(pBuffer);
return NULL;
}
DWORD
GetPrinterDataDWord(
HANDLE hPrinter,
PWSTR pRegKey,
DWORD defaultValue
)
/*++
Routine Description:
Retrieve a DWORD value under PrinterData registry key
Arguments:
hPrinter - Specifies the printer in question
pRegKey - Specifies the name of registry value
defaultValue - Specifies the default value to be used if no data exists in registry
Return Value:
Current value for the requested registry key
--*/
{
DWORD value, type, cb;
if (GetPrinterData(hPrinter,
pRegKey,
&type,
(PBYTE) &value,
sizeof(value),
&cb) == ERROR_SUCCESS)
{
return value;
}
return defaultValue;
}
PVOID
MyGetPrinter(
HANDLE hPrinter,
DWORD level
)
/*++
Routine Description:
Wrapper function for GetPrinter spooler API
Arguments:
hPrinter - Identifies the printer in question
level - Specifies the level of PRINTER_INFO_x structure requested
Return Value:
Pointer to a PRINTER_INFO_x structure, NULL if there is an error
--*/
{
PBYTE pPrinterInfo = NULL;
DWORD cbNeeded;
#ifdef SPOOLERBUG
if (level == 9) {
cbNeeded = sizeof(DRVDEVMODE);
pPrinterInfo = MemAlloc( cbNeeded );
if (GetPrinter(hPrinter,9,pPrinterInfo,cbNeeded,&cbNeeded)) {
return pPrinterInfo;
}
} else
#endif
if (!GetPrinter(hPrinter, level, NULL, 0, &cbNeeded) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pPrinterInfo = MemAlloc(cbNeeded)) &&
GetPrinter(hPrinter, level, pPrinterInfo, cbNeeded, &cbNeeded))
{
return pPrinterInfo;
}
Error(("GetPrinter failed: %d\n", GetLastError()));
MemFree(pPrinterInfo);
return NULL;
}
#ifndef KERNEL_MODE
BOOL
SetPrinterDataStr(
HANDLE hPrinter,
LPTSTR pRegKey,
LPTSTR pValue
)
/*++
Routine Description:
Save a string value to the PrinterData registry key
Arguments:
hPrinter - Identifies the printer object
pRegKey - Specifies the name of registry value
pValue - Points to string value to be saved
Return Value:
TRUE if successful, FALSE if there is an error
--*/
{
if (SetPrinterData(hPrinter,
pRegKey,
REG_SZ,
(PBYTE) pValue,
sizeof(TCHAR) * (_tcslen(pValue) + 1)) != ERROR_SUCCESS)
{
Error(("Couldn't save registry key %ws: %d\n", pRegKey, GetLastError()));
return FALSE;
}
return TRUE;
}
BOOL
SetPrinterDataDWord(
HANDLE hPrinter,
PWSTR pRegKey,
DWORD value
)
/*++
Routine Description:
Save a DWORD value under PrinterData registry key
Arguments:
hPrinter - Specifies the printer in question
pRegKey - Specifies the name of registry value
value - Specifies the value to be saved
Return Value:
TRUE if successful, FALSE otherwise
--*/
{
if (SetPrinterData(hPrinter,
pRegKey,
REG_DWORD,
(PBYTE) &value,
sizeof(value)) != ERROR_SUCCESS)
{
Error(("Couldn't save registry key %ws: %d\n", pRegKey, GetLastError()));
return FALSE;
}
return TRUE;
}
PVOID
MyGetPrinterDriver(
HANDLE hPrinter,
DWORD level
)
/*++
Routine Description:
Wrapper function for GetPrinterDriver spooler API
Arguments:
hPrinter - Identifies the printer in question
level - Specifies the level of DRIVER_INFO_x structure requested
Return Value:
Pointer to a DRIVER_INFO_x structure, NULL if there is an error
--*/
{
PBYTE pDriverInfo = NULL;
DWORD cbNeeded;
if (!GetPrinterDriver(hPrinter, NULL, level, NULL, 0, &cbNeeded) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pDriverInfo = MemAlloc(cbNeeded)) &&
GetPrinterDriver(hPrinter, NULL, level, pDriverInfo, cbNeeded, &cbNeeded))
{
return pDriverInfo;
}
Error(("GetPrinterDriver failed: %d\n", GetLastError()));
MemFree(pDriverInfo);
return NULL;
}
LPTSTR
MyGetPrinterDriverDirectory(
LPTSTR pServerName,
LPTSTR pEnvironment
)
/*++
Routine Description:
Wrapper function for GetPrinterDriverDirectory spooler API
Arguments:
pServerName - Specifies the name of the print server, NULL for local machine
pEnvironment - Specifies the processor architecture
Return Value:
Pointer to the printer driver directory on the specified print server
NULL if there is an error
--*/
{
PVOID pDriverDir = NULL;
DWORD cb;
if (! GetPrinterDriverDirectory(pServerName, pEnvironment, 1, NULL, 0, &cb) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pDriverDir = MemAlloc(cb)) &&
GetPrinterDriverDirectory(pServerName, pEnvironment, 1, pDriverDir, cb, &cb))
{
return pDriverDir;
}
Error(("GetPrinterDriverDirectory failed: %d\n", GetLastError()));
MemFree(pDriverDir);
return NULL;
}
#endif // !KERNEL_MODE