343 lines
6.3 KiB
C
343 lines
6.3 KiB
C
/*++
|
||
|
||
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
|
||
|