ReactOS  0.4.15-dev-3453-gff89651
printerdata.c File Reference
#include "precomp.h"
Include dependency graph for printerdata.c:

Go to the source code of this file.

Functions

DWORD WINAPI LocalGetPrinterData (HANDLE hPrinter, PWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
 
static DWORD _MakePrinterSubKey (PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PWSTR *ppwszSubKey)
 
static DWORD _LocalGetPrinterHandleData (PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
 
static DWORD _LocalGetPrintServerHandleData (PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
 
DWORD WINAPI LocalGetPrinterDataEx (HANDLE hPrinter, PCWSTR pKeyName, PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
 
DWORD WINAPI LocalSetPrinterData (HANDLE hPrinter, PWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
 
static DWORD _LocalSetPrinterHandleData (PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
 
static DWORD _LocalSetPrintServerHandleData (PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
 
DWORD WINAPI LocalSetPrinterDataEx (HANDLE hPrinter, PCWSTR pKeyName, PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
 

Function Documentation

◆ _LocalGetPrinterHandleData()

static DWORD _LocalGetPrinterHandleData ( PLOCAL_PRINTER_HANDLE  pPrinterHandle,
PCWSTR  pKeyName,
PCWSTR  pValueName,
PDWORD  pType,
PBYTE  pData,
DWORD  nSize,
PDWORD  pcbNeeded 
)
static

Definition at line 49 of file printerdata.c.

50 {
51  DWORD dwErrorCode;
52  HKEY hKey = NULL;
53  PWSTR pwszSubKey = NULL;
54 
55  dwErrorCode = _MakePrinterSubKey(pPrinterHandle, pKeyName, &pwszSubKey);
56  if (dwErrorCode != ERROR_SUCCESS)
57  goto Cleanup;
58 
59  // Open the subkey.
60  dwErrorCode = (DWORD)RegOpenKeyExW(hPrintersKey, pwszSubKey, 0, KEY_READ, &hKey);
61  if (dwErrorCode != ERROR_SUCCESS)
62  {
63  ERR("RegOpenKeyExW failed for \"%S\" with error %lu!\n", pwszSubKey, dwErrorCode);
64  goto Cleanup;
65  }
66 
67  // Query the desired value.
68  *pcbNeeded = nSize;
69  dwErrorCode = (DWORD)RegQueryValueExW(hKey, pValueName, NULL, pType, pData, pcbNeeded);
70 
71 Cleanup:
72  if (hKey)
74 
75  if (pwszSubKey)
76  DllFreeSplMem(pwszSubKey);
77 
78  return dwErrorCode;
79 }
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_READ
Definition: nt_native.h:1023
uint16_t * PWSTR
Definition: typedefs.h:56
BOOL WINAPI DllFreeSplMem(PVOID pMem)
Definition: memory.c:112
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2053
HKEY hPrintersKey
Definition: main.c:12
#define DWORD
Definition: nt_native.h:44
static DWORD _MakePrinterSubKey(PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PWSTR *ppwszSubKey)
Definition: printerdata.c:22
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4120
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR Cleanup[]
Definition: register.c:80
#define ERR(fmt,...)
Definition: debug.h:110
_In_ DWORD _Out_ PDWORD pcbNeeded
Definition: winddi.h:3827
FxAutoRegKey hKey
#define NULL
Definition: types.h:112
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define RegCloseKey(hKey)
Definition: registry.h:40

Referenced by LocalGetPrinterDataEx().

◆ _LocalGetPrintServerHandleData()

static DWORD _LocalGetPrintServerHandleData ( PCWSTR  pValueName,
PDWORD  pType,
PBYTE  pData,
DWORD  nSize,
PDWORD  pcbNeeded 
)
static

Definition at line 82 of file printerdata.c.

83 {
84  DWORD dwErrorCode;
85 
86  if (wcsicmp(pValueName, SPLREG_DEFAULT_SPOOL_DIRECTORY) == 0 ||
87  wcsicmp(pValueName, SPLREG_PORT_THREAD_PRIORITY) == 0 ||
88  wcsicmp(pValueName, SPLREG_SCHEDULER_THREAD_PRIORITY) == 0 ||
89  wcsicmp(pValueName, SPLREG_BEEP_ENABLED) == 0 ||
90  wcsicmp(pValueName, SPLREG_ALLOW_USER_MANAGEFORMS) == 0)
91  {
92  *pcbNeeded = nSize;
93  return (DWORD)RegQueryValueExW(hPrintersKey, pValueName, NULL, pType, pData, pcbNeeded);
94  }
95  else if (wcsicmp(pValueName, SPLREG_PORT_THREAD_PRIORITY_DEFAULT) == 0 ||
97  {
98  // Store a DWORD value as REG_NONE.
99  *pType = REG_NONE;
100  *pcbNeeded = sizeof(DWORD);
101  if (nSize < *pcbNeeded)
102  return ERROR_MORE_DATA;
103 
104  // Apparently, these values don't serve a purpose anymore.
105  *((PDWORD)pData) = 0;
106  return ERROR_SUCCESS;
107  }
108  else if (wcsicmp(pValueName, SPLREG_NET_POPUP) == 0 ||
109  wcsicmp(pValueName, SPLREG_RETRY_POPUP) == 0 ||
110  wcsicmp(pValueName, SPLREG_NET_POPUP_TO_COMPUTER) == 0 ||
111  wcsicmp(pValueName, SPLREG_EVENT_LOG) == 0 ||
112  wcsicmp(pValueName, SPLREG_RESTART_JOB_ON_POOL_ERROR) == 0 ||
114  {
115  HKEY hKey;
116 
117  dwErrorCode = (DWORD)RegOpenKeyExW(hPrintKey, L"Providers", 0, KEY_READ, &hKey);
118  if (dwErrorCode != ERROR_SUCCESS)
119  {
120  ERR("RegOpenKeyExW failed for \"Providers\" with error %lu!\n", dwErrorCode);
121  return dwErrorCode;
122  }
123 
124  *pcbNeeded = nSize;
125  dwErrorCode = (DWORD)RegQueryValueExW(hKey, pValueName, NULL, pType, pData, pcbNeeded);
126  RegCloseKey(hKey);
127  return dwErrorCode;
128  }
129  else if (wcsicmp(pValueName, SPLREG_MAJOR_VERSION) == 0)
130  {
131  // Store a DWORD value as REG_NONE.
132  *pType = REG_NONE;
133  *pcbNeeded = sizeof(DWORD);
134  if (nSize < *pcbNeeded)
135  return ERROR_MORE_DATA;
136 
137  // Apparently, these values don't serve a purpose anymore.
139  return ERROR_SUCCESS;
140  }
141  else if (wcsicmp(pValueName, SPLREG_MINOR_VERSION) == 0)
142  {
143  // Store a DWORD value as REG_NONE.
144  *pType = REG_NONE;
145  *pcbNeeded = sizeof(DWORD);
146  if (nSize < *pcbNeeded)
147  return ERROR_MORE_DATA;
148 
149  // Apparently, these values don't serve a purpose anymore.
151  return ERROR_SUCCESS;
152  }
153  else if (wcsicmp(pValueName, SPLREG_ARCHITECTURE) == 0)
154  {
155  // Store a string as REG_NONE with the length of the environment name string.
156  *pType = REG_NONE;
158  if (nSize < *pcbNeeded)
159  return ERROR_MORE_DATA;
160 
161  // Copy the environment name as the output value for SPLREG_ARCHITECTURE.
163  return ERROR_SUCCESS;
164  }
165  else if (wcsicmp(pValueName, SPLREG_OS_VERSION) == 0)
166  {
168 
169  // Store the OSVERSIONINFOW structure as REG_NONE.
170  *pType = REG_NONE;
171  *pcbNeeded = sizeof(OSVERSIONINFOW);
172  if (nSize < *pcbNeeded)
173  return ERROR_MORE_DATA;
174 
175  // Return OS version information.
176  pInfo->dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
177  GetVersionExW(pInfo);
178  return ERROR_SUCCESS;
179  }
180  else if (wcsicmp(pValueName, SPLREG_OS_VERSIONEX) == 0)
181  {
183 
184  // Store the OSVERSIONINFOEXW structure as REG_NONE.
185  *pType = REG_NONE;
186  *pcbNeeded = sizeof(OSVERSIONINFOEXW);
187  if (nSize < *pcbNeeded)
188  return ERROR_MORE_DATA;
189 
190  // Return extended OS version information.
191  pInfo->dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
193  return ERROR_SUCCESS;
194  }
195  else if (wcsicmp(pValueName, SPLREG_DS_PRESENT) == 0)
196  {
198 
199  // We want to store a REG_DWORD value.
200  *pType = REG_DWORD;
201  *pcbNeeded = sizeof(DWORD);
202  if (nSize < *pcbNeeded)
203  return ERROR_MORE_DATA;
204 
205  // Get information about the domain membership of this computer.
207  if (dwErrorCode != ERROR_SUCCESS)
208  {
209  ERR("DsRoleGetPrimaryDomainInformation failed with error %lu!\n", dwErrorCode);
210  return dwErrorCode;
211  }
212 
213  // Return whether this computer is a workstation or server inside a domain.
215  DsRoleFreeMemory(pInfo);
216  return ERROR_SUCCESS;
217  }
218  else if (wcsicmp(pValueName, SPLREG_DS_PRESENT_FOR_USER) == 0)
219  {
220  DWORD cch;
221  PWSTR p;
222  WCHAR wszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
223  WCHAR wszUserSam[UNLEN + 1];
224 
225  // We want to store a REG_DWORD value.
226  *pType = REG_DWORD;
227  *pcbNeeded = sizeof(DWORD);
228  if (nSize < *pcbNeeded)
229  return ERROR_MORE_DATA;
230 
231  // Get the local Computer Name.
233  if (!GetComputerNameW(wszComputerName, &cch))
234  {
235  dwErrorCode = GetLastError();
236  ERR("GetComputerNameW failed with error %lu!\n", dwErrorCode);
237  return dwErrorCode;
238  }
239 
240  // Get the User Name in the SAM format.
241  // This could either be:
242  // COMPUTERNAME\User
243  // DOMAINNAME\User
244  cch = UNLEN + 1;
245  if (!GetUserNameExW(NameSamCompatible, wszUserSam, &cch))
246  {
247  dwErrorCode = GetLastError();
248  ERR("GetUserNameExW failed with error %lu!\n", dwErrorCode);
249  return dwErrorCode;
250  }
251 
252  // Terminate the SAM-formatted User Name at the backslash.
253  p = wcschr(wszUserSam, L'\\');
254  *p = 0;
255 
256  // Compare it with the Computer Name.
257  // If they differ, this User is part of a domain.
258  *((PDWORD)pData) = (wcscmp(wszUserSam, wszComputerName) != 0);
259  return ERROR_SUCCESS;
260  }
261  else if (wcsicmp(pValueName, SPLREG_REMOTE_FAX) == 0)
262  {
263  // Store a DWORD value as REG_NONE.
264  *pType = REG_NONE;
265  *pcbNeeded = sizeof(DWORD);
266  if (nSize < *pcbNeeded)
267  return ERROR_MORE_DATA;
268 
269  // TODO: We don't support any fax service yet, but let's return the same value as Windows Server 2003 here.
270  *((PDWORD)pData) = 1;
271  return ERROR_SUCCESS;
272  }
273  else if (wcsicmp(pValueName, SPLREG_DNS_MACHINE_NAME) == 0)
274  {
275  DWORD cchDnsName = 0;
276 
277  // Get the length of the fully-qualified computer DNS name.
278  GetComputerNameExW(ComputerNameDnsFullyQualified, NULL, &cchDnsName);
279  dwErrorCode = GetLastError();
280  if (dwErrorCode != ERROR_MORE_DATA)
281  {
282  ERR("GetComputerNameExW failed with error %lu!\n", dwErrorCode);
283  return dwErrorCode;
284  }
285 
286  // Check if our supplied buffer is large enough.
287  *pType = REG_SZ;
288  *pcbNeeded = cchDnsName * sizeof(WCHAR);
289  if (nSize < *pcbNeeded)
290  return ERROR_MORE_DATA;
291 
292  // Get the actual DNS name.
293  if (!GetComputerNameExW(ComputerNameDnsFullyQualified, (PWSTR)pData, &cchDnsName))
294  {
295  dwErrorCode = GetLastError();
296  ERR("GetComputerNameExW failed with error %lu!\n", dwErrorCode);
297  return dwErrorCode;
298  }
299 
300  // Lowercase the output just like Windows does.
301  _wcslwr((PWSTR)pData);
302  return ERROR_SUCCESS;
303  }
304  else
305  {
306  // For all other, unknown settings, we just return ERROR_INVALID_PARAMETER.
307  // That also includes SPLREG_WEBSHAREMGMT, which is supported in Windows Server 2003 according to the documentation,
308  // but is actually not!
310  }
311 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SPLREG_ARCHITECTURE
Definition: winspool.h:1354
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
#define SPLREG_SCHEDULER_THREAD_PRIORITY
Definition: winspool.h:1346
#define ERROR_SUCCESS
Definition: deptool.c:10
struct _OSVERSIONINFOEXW * POSVERSIONINFOEXW
#define KEY_READ
Definition: nt_native.h:1023
uint16_t * PWSTR
Definition: typedefs.h:56
struct _OSVERSIONINFOW * POSVERSIONINFOW
#define SPLREG_RETRY_POPUP
Definition: winspool.h:1349
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2053
#define SPLREG_DS_PRESENT
Definition: winspool.h:1357
#define SPLREG_REMOTE_FAX
Definition: winspool.h:1359
HKEY hPrintKey
Definition: main.c:11
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
HKEY hPrintersKey
Definition: main.c:12
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
const DWORD dwSpoolerMinorVersion
Definition: main.c:23
#define DWORD
Definition: nt_native.h:44
BOOL WINAPI GetComputerNameExW(COMPUTER_NAME_FORMAT NameType, LPWSTR lpBuffer, LPDWORD nSize)
Definition: compname.c:216
const DWORD cbCurrentEnvironment
VOID WINAPI DsRoleFreeMemory(_In_ PVOID Buffer)
Definition: dssetup.c:82
#define SPLREG_MINOR_VERSION
Definition: winspool.h:1353
const WCHAR wszCurrentEnvironment[]
Definition: prtprocenv.h:11
#define L(x)
Definition: ntvdm.h:50
#define SPLREG_DEFAULT_SPOOL_DIRECTORY
Definition: winspool.h:1342
#define SPLREG_ALLOW_USER_MANAGEFORMS
Definition: winspool.h:1363
#define SPLREG_RESTART_JOB_ON_POOL_ENABLED
Definition: winspool.h:1361
#define SPLREG_PORT_THREAD_PRIORITY_DEFAULT
Definition: winspool.h:1343
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4120
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD WINAPI DsRoleGetPrimaryDomainInformation(LPCWSTR lpServer, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL InfoLevel, PBYTE *Buffer)
Definition: dssetup.c:92
const DWORD dwSpoolerMajorVersion
Definition: main.c:22
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:246
#define CopyMemory
Definition: winbase.h:1662
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SPLREG_DS_PRESENT_FOR_USER
Definition: winspool.h:1358
struct _OSVERSIONINFOW OSVERSIONINFOW
#define wcsicmp
Definition: compat.h:15
#define SPLREG_EVENT_LOG
Definition: winspool.h:1351
struct _OSVERSIONINFOEXW OSVERSIONINFOEXW
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERR(fmt,...)
Definition: debug.h:110
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:240
_CRTIMP wchar_t *__cdecl _wcslwr(_Inout_z_ wchar_t *_String)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_In_ DWORD _Out_ PDWORD pcbNeeded
Definition: winddi.h:3827
#define SPLREG_SCHEDULER_THREAD_PRIORITY_DEFAULT
Definition: winspool.h:1345
FxAutoRegKey hKey
#define UNLEN
Definition: sspi.c:28
#define SPLREG_OS_VERSIONEX
Definition: winspool.h:1356
#define NULL
Definition: types.h:112
DWORD * PDWORD
Definition: pedump.c:68
#define SPLREG_OS_VERSION
Definition: winspool.h:1355
BOOLEAN WINAPI GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:1079
#define SPLREG_NET_POPUP
Definition: winspool.h:1348
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
#define SPLREG_RESTART_JOB_ON_POOL_ERROR
Definition: winspool.h:1360
DSROLE_MACHINE_ROLE MachineRole
Definition: dsrole.h:63
#define SPLREG_BEEP_ENABLED
Definition: winspool.h:1347
#define REG_NONE
Definition: nt_native.h:1492
GLfloat GLfloat p
Definition: glext.h:8902
#define SPLREG_DNS_MACHINE_NAME
Definition: winspool.h:1362
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
IN PCTCH IN DWORD cch
Definition: pager.h:36
#define REG_DWORD
Definition: sdbapi.c:596
BYTE * PBYTE
Definition: pedump.c:66
#define RegCloseKey(hKey)
Definition: registry.h:40
#define SPLREG_MAJOR_VERSION
Definition: winspool.h:1352
#define SPLREG_PORT_THREAD_PRIORITY
Definition: winspool.h:1344
#define SPLREG_NET_POPUP_TO_COMPUTER
Definition: winspool.h:1350
#define REG_SZ
Definition: layer.c:22

Referenced by LocalGetPrinterDataEx().

◆ _LocalSetPrinterHandleData()

static DWORD _LocalSetPrinterHandleData ( PLOCAL_PRINTER_HANDLE  pPrinterHandle,
PCWSTR  pKeyName,
PCWSTR  pValueName,
DWORD  Type,
PBYTE  pData,
DWORD  cbData 
)
static

Definition at line 372 of file printerdata.c.

373 {
374  DWORD dwErrorCode;
375  HKEY hKey = NULL;
376  PWSTR pwszSubKey = NULL;
377 
378  dwErrorCode = _MakePrinterSubKey(pPrinterHandle, pKeyName, &pwszSubKey);
379  if (dwErrorCode != ERROR_SUCCESS)
380  goto Cleanup;
381 
382  // Open the subkey.
383  dwErrorCode = (DWORD)RegOpenKeyExW(hPrintersKey, pwszSubKey, 0, KEY_SET_VALUE, &hKey);
384  if (dwErrorCode != ERROR_SUCCESS)
385  {
386  ERR("RegOpenKeyExW failed for \"%S\" with error %lu!\n", pwszSubKey, dwErrorCode);
387  goto Cleanup;
388  }
389 
390  // Set the value.
391  dwErrorCode = (DWORD)RegSetValueExW(hKey, pValueName, 0, Type, pData, cbData);
392 
393 Cleanup:
394  if (hKey)
395  RegCloseKey(hKey);
396 
397  if (pwszSubKey)
398  DllFreeSplMem(pwszSubKey);
399 
400  return dwErrorCode;
401 }
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
uint16_t * PWSTR
Definition: typedefs.h:56
BOOL WINAPI DllFreeSplMem(PVOID pMem)
Definition: memory.c:112
HKEY hPrintersKey
Definition: main.c:12
#define DWORD
Definition: nt_native.h:44
static DWORD _MakePrinterSubKey(PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PWSTR *ppwszSubKey)
Definition: printerdata.c:22
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4899
Type
Definition: Type.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR Cleanup[]
Definition: register.c:80
#define ERR(fmt,...)
Definition: debug.h:110
FxAutoRegKey hKey
#define NULL
Definition: types.h:112
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define RegCloseKey(hKey)
Definition: registry.h:40

Referenced by LocalSetPrinterDataEx().

◆ _LocalSetPrintServerHandleData()

static DWORD _LocalSetPrintServerHandleData ( PCWSTR  pValueName,
DWORD  Type,
PBYTE  pData,
DWORD  cbData 
)
static

Definition at line 404 of file printerdata.c.

405 {
406  DWORD dwErrorCode;
407 
408  if (wcsicmp(pValueName, SPLREG_DEFAULT_SPOOL_DIRECTORY) == 0 ||
409  wcsicmp(pValueName, SPLREG_PORT_THREAD_PRIORITY) == 0 ||
410  wcsicmp(pValueName, SPLREG_SCHEDULER_THREAD_PRIORITY) == 0 ||
411  wcsicmp(pValueName, SPLREG_BEEP_ENABLED) == 0 ||
412  wcsicmp(pValueName, SPLREG_ALLOW_USER_MANAGEFORMS) == 0)
413  {
414  return (DWORD)RegSetValueExW(hPrintersKey, pValueName, 0, Type, pData, cbData);
415  }
416  else if (wcsicmp(pValueName, SPLREG_NET_POPUP) == 0 ||
417  wcsicmp(pValueName, SPLREG_RETRY_POPUP) == 0 ||
418  wcsicmp(pValueName, SPLREG_NET_POPUP_TO_COMPUTER) == 0 ||
419  wcsicmp(pValueName, SPLREG_EVENT_LOG) == 0 ||
420  wcsicmp(pValueName, SPLREG_RESTART_JOB_ON_POOL_ERROR) == 0 ||
421  wcsicmp(pValueName, SPLREG_RESTART_JOB_ON_POOL_ENABLED) == 0 ||
422  wcsicmp(pValueName, L"NoRemotePrinterDrivers") == 0)
423  {
424  HKEY hKey;
425 
426  dwErrorCode = (DWORD)RegOpenKeyExW(hPrintKey, L"Providers", 0, KEY_SET_VALUE, &hKey);
427  if (dwErrorCode != ERROR_SUCCESS)
428  {
429  ERR("RegOpenKeyExW failed for \"Providers\" with error %lu!\n", dwErrorCode);
430  return dwErrorCode;
431  }
432 
433  dwErrorCode = (DWORD)RegSetValueExW(hKey, pValueName, 0, Type, pData, cbData);
434  RegCloseKey(hKey);
435  return dwErrorCode;
436  }
437  else if (wcsicmp(pValueName, SPLREG_WEBSHAREMGMT) == 0)
438  {
439  WARN("Attempting to set WebShareMgmt, which is based on IIS and therefore not supported. Returning fake success!\n");
440  return ERROR_SUCCESS;
441  }
442  else
443  {
444  // For all other, unknown settings, we just return ERROR_INVALID_PARAMETER.
446  }
447 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SPLREG_SCHEDULER_THREAD_PRIORITY
Definition: winspool.h:1346
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define WARN(fmt,...)
Definition: debug.h:112
#define SPLREG_RETRY_POPUP
Definition: winspool.h:1349
HKEY hPrintKey
Definition: main.c:11
HKEY hPrintersKey
Definition: main.c:12
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
#define SPLREG_DEFAULT_SPOOL_DIRECTORY
Definition: winspool.h:1342
#define SPLREG_ALLOW_USER_MANAGEFORMS
Definition: winspool.h:1363
#define SPLREG_RESTART_JOB_ON_POOL_ENABLED
Definition: winspool.h:1361
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4899
Type
Definition: Type.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SPLREG_WEBSHAREMGMT
Definition: winspool.h:1364
#define wcsicmp
Definition: compat.h:15
#define SPLREG_EVENT_LOG
Definition: winspool.h:1351
#define ERR(fmt,...)
Definition: debug.h:110
FxAutoRegKey hKey
#define SPLREG_NET_POPUP
Definition: winspool.h:1348
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
#define SPLREG_RESTART_JOB_ON_POOL_ERROR
Definition: winspool.h:1360
#define SPLREG_BEEP_ENABLED
Definition: winspool.h:1347
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define RegCloseKey(hKey)
Definition: registry.h:40
#define SPLREG_PORT_THREAD_PRIORITY
Definition: winspool.h:1344
#define SPLREG_NET_POPUP_TO_COMPUTER
Definition: winspool.h:1350

Referenced by LocalSetPrinterDataEx().

◆ _MakePrinterSubKey()

static DWORD _MakePrinterSubKey ( PLOCAL_PRINTER_HANDLE  pPrinterHandle,
PCWSTR  pKeyName,
PWSTR ppwszSubKey 
)
static

Definition at line 22 of file printerdata.c.

23 {
24  const WCHAR wszBackslash[] = L"\\";
25 
26  size_t cbSubKey;
27  PWSTR p;
28 
29  // Sanity check
30  if (!pKeyName || !*pKeyName)
32 
33  // Allocate a buffer for the subkey "PrinterName\KeyName".
34  cbSubKey = (wcslen(pPrinterHandle->pPrinter->pwszPrinterName) + 1 + wcslen(pKeyName) + 1) * sizeof(WCHAR);
35  *ppwszSubKey = DllAllocSplMem(cbSubKey);
36  if (!*ppwszSubKey)
38 
39  // Concatenate the subkey.
40  p = *ppwszSubKey;
41  StringCbCopyExW(p, cbSubKey, pPrinterHandle->pPrinter->pwszPrinterName, &p, &cbSubKey, 0);
42  StringCbCopyExW(p, cbSubKey, wszBackslash, &p, &cbSubKey, 0);
43  StringCbCopyExW(p, cbSubKey, pKeyName, &p, &cbSubKey, 0);
44 
45  return ERROR_SUCCESS;
46 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_SUCCESS
Definition: deptool.c:10
uint16_t * PWSTR
Definition: typedefs.h:56
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
STRSAFEAPI StringCbCopyExW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:210
#define L(x)
Definition: ntvdm.h:50
__wchar_t WCHAR
Definition: xmlstorage.h:180
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
PVOID WINAPI DllAllocSplMem(DWORD dwBytes)
Definition: memory.c:95
GLfloat GLfloat p
Definition: glext.h:8902
PLOCAL_PRINTER pPrinter
Definition: precomp.h:171
PWSTR pwszPrinterName
Definition: precomp.h:119

Referenced by _LocalGetPrinterHandleData(), and _LocalSetPrinterHandleData().

◆ LocalGetPrinterData()

DWORD WINAPI LocalGetPrinterData ( HANDLE  hPrinter,
PWSTR  pValueName,
PDWORD  pType,
PBYTE  pData,
DWORD  nSize,
PDWORD  pcbNeeded 
)

Definition at line 11 of file printerdata.c.

12 {
13  TRACE("LocalGetPrinterData(%p, %S, %p, %p, %lu, %p)\n", hPrinter, pValueName, pType, pData, nSize, pcbNeeded);
14 
15  // The ReactOS Printing Stack forwards all GetPrinterData calls to GetPrinterDataEx as soon as possible.
16  // This function may only be called if localspl.dll is used together with Windows Printing Stack components.
17  WARN("This function should never be called!\n");
18  return LocalGetPrinterDataEx(hPrinter, L"PrinterDriverData", pValueName, pType, pData, nSize, pcbNeeded);
19 }
DWORD WINAPI LocalGetPrinterDataEx(HANDLE hPrinter, PCWSTR pKeyName, PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
Definition: printerdata.c:314
#define WARN(fmt,...)
Definition: debug.h:112
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2053
#define L(x)
Definition: ntvdm.h:50
#define TRACE(s)
Definition: solgame.cpp:4
_In_ DWORD _Out_ PDWORD pcbNeeded
Definition: winddi.h:3827
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827

◆ LocalGetPrinterDataEx()

DWORD WINAPI LocalGetPrinterDataEx ( HANDLE  hPrinter,
PCWSTR  pKeyName,
PCWSTR  pValueName,
PDWORD  pType,
PBYTE  pData,
DWORD  nSize,
PDWORD  pcbNeeded 
)

Definition at line 314 of file printerdata.c.

315 {
316  BYTE Temp;
317  DWORD dwErrorCode;
318  DWORD dwTemp;
319  PLOCAL_HANDLE pHandle = (PLOCAL_HANDLE)hPrinter;
320 
321  TRACE("LocalGetPrinterDataEx(%p, %S, %S, %p, %p, %lu, %p)\n", hPrinter, pKeyName, pValueName, pType, pData, nSize, pcbNeeded);
322 
323  // Even if GetPrinterDataExW in winspool ensures that the RPC function is never called without a valid pointer for pType,
324  // it's officially optional. Windows' fpGetPrinterDataEx also works with NULL for pType!
325  // Ensure here that it is always set to simplify the code later.
326  if (!pType)
327  pType = &dwTemp;
328 
329  // pData is later fed to RegQueryValueExW in many cases. When calling it with zero buffer size, RegQueryValueExW returns a
330  // different error code based on whether pData is NULL or something else.
331  // Ensure here that ERROR_MORE_DATA is always returned.
332  if (!pData)
333  pData = &Temp;
334 
335  if (!pHandle)
336  {
337  dwErrorCode = ERROR_INVALID_HANDLE;
338  }
339  else if (!pcbNeeded)
340  {
341  dwErrorCode = ERROR_INVALID_PARAMETER;
342  }
343  else if (pHandle->HandleType == HandleType_Printer)
344  {
345  dwErrorCode = _LocalGetPrinterHandleData(pHandle->pSpecificHandle, pKeyName, pValueName, pType, pData, nSize, pcbNeeded);
346  }
347  else if (pHandle->HandleType == HandleType_PrintServer)
348  {
349  dwErrorCode = _LocalGetPrintServerHandleData(pValueName, pType, pData, nSize, pcbNeeded);
350  }
351  else
352  {
353  dwErrorCode = ERROR_INVALID_HANDLE;
354  }
355 
356  SetLastError(dwErrorCode);
357  return dwErrorCode;
358 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
static DWORD _LocalGetPrinterHandleData(PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
Definition: printerdata.c:49
static DWORD _LocalGetPrintServerHandleData(PCWSTR pValueName, PDWORD pType, PBYTE pData, DWORD nSize, PDWORD pcbNeeded)
Definition: printerdata.c:82
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2053
struct _LOCAL_HANDLE * PLOCAL_HANDLE
Definition: precomp.h:56
PVOID pSpecificHandle
Definition: precomp.h:208
#define TRACE(s)
Definition: solgame.cpp:4
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:611
unsigned char BYTE
Definition: xxhash.c:193
_In_ DWORD _Out_ PDWORD pcbNeeded
Definition: winddi.h:3827
enum _LOCAL_HANDLE::@4880 HandleType
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827

Referenced by LocalGetPrinterData().

◆ LocalSetPrinterData()

DWORD WINAPI LocalSetPrinterData ( HANDLE  hPrinter,
PWSTR  pValueName,
DWORD  Type,
PBYTE  pData,
DWORD  cbData 
)

Definition at line 361 of file printerdata.c.

362 {
363  TRACE("LocalSetPrinterData(%p, %S, %lu, %p, %lu)\n", hPrinter, pValueName, Type, pData, cbData);
364 
365  // The ReactOS Printing Stack forwards all SetPrinterData calls to SetPrinterDataEx as soon as possible.
366  // This function may only be called if localspl.dll is used together with Windows Printing Stack components.
367  WARN("This function should never be called!\n");
368  return LocalSetPrinterDataEx(hPrinter, L"PrinterDriverData", pValueName, Type, pData, cbData);
369 }
#define WARN(fmt,...)
Definition: debug.h:112
#define L(x)
Definition: ntvdm.h:50
#define TRACE(s)
Definition: solgame.cpp:4
Type
Definition: Type.h:6
DWORD WINAPI LocalSetPrinterDataEx(HANDLE hPrinter, PCWSTR pKeyName, PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
Definition: printerdata.c:450
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827

◆ LocalSetPrinterDataEx()

DWORD WINAPI LocalSetPrinterDataEx ( HANDLE  hPrinter,
PCWSTR  pKeyName,
PCWSTR  pValueName,
DWORD  Type,
PBYTE  pData,
DWORD  cbData 
)

Definition at line 450 of file printerdata.c.

451 {
452  DWORD dwErrorCode;
453  PLOCAL_HANDLE pHandle = (PLOCAL_HANDLE)hPrinter;
454 
455  TRACE("LocalSetPrinterDataEx(%p, %S, %S, %lu, %p, %lu)\n", hPrinter, pKeyName, pValueName, Type, pData, cbData);
456 
457  if (!pHandle)
458  {
459  dwErrorCode = ERROR_INVALID_HANDLE;
460  }
461  else if (pHandle->HandleType == HandleType_Printer)
462  {
463  dwErrorCode = _LocalSetPrinterHandleData(pHandle->pSpecificHandle, pKeyName, pValueName, Type, pData, cbData);
464  }
465  else if (pHandle->HandleType == HandleType_PrintServer)
466  {
467  dwErrorCode = _LocalSetPrintServerHandleData(pValueName, Type, pData, cbData);
468  }
469  else
470  {
471  dwErrorCode = ERROR_INVALID_HANDLE;
472  }
473 
474  SetLastError(dwErrorCode);
475  return dwErrorCode;
476 }
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
struct _LOCAL_HANDLE * PLOCAL_HANDLE
Definition: precomp.h:56
PVOID pSpecificHandle
Definition: precomp.h:208
#define TRACE(s)
Definition: solgame.cpp:4
Type
Definition: Type.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:611
static DWORD _LocalSetPrintServerHandleData(PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
Definition: printerdata.c:404
enum _LOCAL_HANDLE::@4880 HandleType
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
static DWORD _LocalSetPrinterHandleData(PLOCAL_PRINTER_HANDLE pPrinterHandle, PCWSTR pKeyName, PCWSTR pValueName, DWORD Type, PBYTE pData, DWORD cbData)
Definition: printerdata.c:372

Referenced by LocalSetPrinterData().