ReactOS  0.4.15-dev-3308-g9455def
main.c File Reference
#include "precomp.h"
#include <prtprocenv.h>
Include dependency graph for main.c:

Go to the source code of this file.

Functions

static BOOL _InitializeLocalSpooler (void)
 
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 
BOOL WINAPI InitializePrintProvidor (LPPRINTPROVIDOR pPrintProvidor, DWORD cbPrintProvidor, LPWSTR pFullRegistryPath)
 

Variables

HKEY hPrintKey = NULL
 
HKEY hPrintersKey = NULL
 
WCHAR wszJobDirectory [MAX_PATH]
 
DWORD cchJobDirectory
 
WCHAR wszSpoolDirectory [MAX_PATH]
 
DWORD cchSpoolDirectory
 
const DWORD dwSpoolerMajorVersion = 3
 
const DWORD dwSpoolerMinorVersion = 0
 
const WCHAR wszDefaultDocumentName [] = L"Local Downlevel Document"
 
PCWSTR wszPrintProviderInfo [3]
 
static const PRINTPROVIDOR _PrintProviderFunctions
 

Function Documentation

◆ _InitializeLocalSpooler()

static BOOL _InitializeLocalSpooler ( void  )
static

Definition at line 124 of file main.c.

125 {
126  const WCHAR wszPrintersPath[] = L"\\PRINTERS";
127  const DWORD cchPrintersPath = _countof(wszPrintersPath) - 1;
128  const WCHAR wszSpoolPath[] = L"\\spool";
129  const DWORD cchSpoolPath = _countof(wszSpoolPath) - 1;
130  const WCHAR wszSymbolicLinkValue[] = L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers";
131  const DWORD cbSymbolicLinkValue = sizeof(wszSymbolicLinkValue) - sizeof(WCHAR);
132 
133  BOOL bReturnValue = FALSE;
134  DWORD cbData;
135  DWORD dwErrorCode;
136  HKEY hKey = NULL;
137 
138  // On startup, always create a volatile symbolic link in the registry if it doesn't exist yet.
139  // "SYSTEM\CurrentControlSet\Control\Print\Printers" -> "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers"
140  //
141  // According to https://social.technet.microsoft.com/Forums/windowsserver/en-US/a683ab54-c43c-4ebe-af8f-1f7a65af2a51
142  // this is needed when having >900 printers to work around a size limit of the SYSTEM registry hive.
143  dwErrorCode = (DWORD)RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Print\\Printers", 0, NULL, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, KEY_CREATE_LINK | KEY_SET_VALUE, NULL, &hKey, NULL);
144  if (dwErrorCode == ERROR_SUCCESS)
145  {
146  // Note that wszSymbolicLink has to be stored WITHOUT the terminating null character for the symbolic link to work!
147  // See cbSymbolicLinkValue above.
148  dwErrorCode = (DWORD)RegSetValueExW(hKey, L"SymbolicLinkValue", 0, REG_LINK, (PBYTE)wszSymbolicLinkValue, cbSymbolicLinkValue);
149  if (dwErrorCode != ERROR_SUCCESS)
150  {
151  ERR("RegSetValueExW failed for the Printers symlink with error %lu!\n", dwErrorCode);
152  goto Cleanup;
153  }
154  }
155  else if (dwErrorCode != ERROR_ALREADY_EXISTS)
156  {
157  ERR("RegCreateKeyExW failed for the Printers symlink with error %lu!\n", dwErrorCode);
158  goto Cleanup;
159  }
160 
161  // Open some registry keys and leave them open. We need them multiple times throughout the Local Spooler.
162  dwErrorCode = (DWORD)RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Print", 0, KEY_ALL_ACCESS, &hPrintKey);
163  if (dwErrorCode != ERROR_SUCCESS)
164  {
165  ERR("RegOpenKeyExW failed for \"Print\" with error %lu!\n", dwErrorCode);
166  goto Cleanup;
167  }
168 
169  dwErrorCode = (DWORD)RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers", 0, KEY_ALL_ACCESS, &hPrintersKey);
170  if (dwErrorCode != ERROR_SUCCESS)
171  {
172  ERR("RegOpenKeyExW failed for \"Printers\" with error %lu!\n", dwErrorCode);
173  goto Cleanup;
174  }
175 
176  // Construct the path to "%SystemRoot%\system32\spool".
177  // Forget about length checks here. If this doesn't fit into MAX_PATH, our OS has more serious problems...
179  CopyMemory(&wszSpoolDirectory[cchSpoolDirectory], wszSpoolPath, (cchSpoolPath + 1) * sizeof(WCHAR));
180  cchSpoolDirectory += cchSpoolPath;
181 
182  // Query the job directory.
183  cbData = sizeof(wszJobDirectory);
185  if (dwErrorCode == ERROR_SUCCESS)
186  {
187  cchJobDirectory = cbData / sizeof(WCHAR) - 1;
188  }
189  else if (dwErrorCode == ERROR_FILE_NOT_FOUND)
190  {
191  // Use the default "%SystemRoot%\system32\spool\PRINTERS".
193  CopyMemory(&wszJobDirectory[cchSpoolDirectory], wszPrintersPath, (cchPrintersPath + 1) * sizeof(WCHAR));
194  cchJobDirectory = cchSpoolDirectory + cchPrintersPath;
195 
196  // Save this for next time.
198  }
199  else
200  {
201  ERR("RegQueryValueExW failed for \"%S\" with error %lu!\n", SPLREG_DEFAULT_SPOOL_DIRECTORY, dwErrorCode);
202  goto Cleanup;
203  }
204 
205  // Initialize all lists.
207  goto Cleanup;
208 
209  if (!InitializePortList())
210  goto Cleanup;
211 
213  goto Cleanup;
214 
215  if (!InitializePrinterList())
216  goto Cleanup;
217 
219  goto Cleanup;
220 
221  if (!InitializeFormList())
222  goto Cleanup;
223 
225  goto Cleanup;
226 
227  // Local Spooler Initialization finished successfully!
228  bReturnValue = TRUE;
229 
230 Cleanup:
231  if (hKey)
232  RegCloseKey(hKey);
233 
234  return bReturnValue;
235 }
BOOL InitializePrintMonitorList(void)
Definition: monitors.c:126
BOOL InitializeGlobalJobList(void)
Definition: jobs.c:161
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define TRUE
Definition: types.h:120
HKEY hPrintKey
Definition: main.c:11
HKEY hPrintersKey
Definition: main.c:12
#define DWORD
Definition: nt_native.h:44
#define REG_OPTION_CREATE_LINK
Definition: nt_native.h:1063
BOOL InitializePrinterList(void)
Definition: printers.c:107
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1091
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
#define SPLREG_DEFAULT_SPOOL_DIRECTORY
Definition: winspool.h:1342
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL InitializeFormList(VOID)
Definition: forms.c:228
DWORD cchSpoolDirectory
Definition: main.c:16
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
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
#define REG_LINK
Definition: nt_native.h:1500
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
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
#define CopyMemory
Definition: winbase.h:1662
DWORD cchJobDirectory
Definition: main.c:14
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
BOOL InitializePrintProcessorList(void)
static const WCHAR Cleanup[]
Definition: register.c:80
#define ERR(fmt,...)
Definition: debug.h:110
BOOL InitializePrinterDrivers(VOID)
FxAutoRegKey hKey
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_CREATE_LINK
Definition: nt_native.h:1021
WCHAR wszJobDirectory[MAX_PATH]
Definition: main.c:13
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2312
#define NULL
Definition: types.h:112
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
WCHAR wszSpoolDirectory[MAX_PATH]
Definition: main.c:15
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
BOOL InitializePortList(void)
Definition: ports.c:60
BYTE * PBYTE
Definition: pedump.c:66
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define REG_SZ
Definition: layer.c:22

Referenced by DllMain().

◆ DllMain()

BOOL WINAPI DllMain ( HINSTANCE  hinstDLL,
DWORD  fdwReason,
LPVOID  lpvReserved 
)

Definition at line 238 of file main.c.

239 {
240  switch (fdwReason)
241  {
242  case DLL_PROCESS_ATTACH:
243  DisableThreadLibraryCalls(hinstDLL);
244  return _InitializeLocalSpooler();
245 
246  default:
247  return TRUE;
248  }
249 }
#define TRUE
Definition: types.h:120
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
static BOOL _InitializeLocalSpooler(void)
Definition: main.c:124

◆ InitializePrintProvidor()

BOOL WINAPI InitializePrintProvidor ( LPPRINTPROVIDOR  pPrintProvidor,
DWORD  cbPrintProvidor,
LPWSTR  pFullRegistryPath 
)

Definition at line 252 of file main.c.

253 {
254  TRACE("InitializePrintProvidor(%p, %lu, %S)\n", pPrintProvidor, cbPrintProvidor, pFullRegistryPath);
255 
256  CopyMemory(pPrintProvidor, &_PrintProviderFunctions, min(cbPrintProvidor, sizeof(PRINTPROVIDOR)));
257 
259  return TRUE;
260 }
static const PRINTPROVIDOR _PrintProviderFunctions
Definition: main.c:34
#define ERROR_SUCCESS
Definition: deptool.c:10
#define TRUE
Definition: types.h:120
#define TRACE(s)
Definition: solgame.cpp:4
#define CopyMemory
Definition: winbase.h:1662
#define SetLastError(x)
Definition: compat.h:611
#define min(a, b)
Definition: monoChain.cc:55

Variable Documentation

◆ _PrintProviderFunctions

const PRINTPROVIDOR _PrintProviderFunctions
static

Definition at line 34 of file main.c.

Referenced by InitializePrintProvidor().

◆ cchJobDirectory

DWORD cchJobDirectory

Definition at line 14 of file main.c.

Referenced by _InitializeLocalSpooler(), GetJobFilePath(), and InitializeGlobalJobList().

◆ cchSpoolDirectory

DWORD cchSpoolDirectory

Definition at line 16 of file main.c.

Referenced by _InitializeLocalSpooler(), and LocalGetPrintProcessorDirectory().

◆ dwSpoolerMajorVersion

const DWORD dwSpoolerMajorVersion = 3

This is what the Spooler of Windows Server 2003 returns (for example using GetPrinterDataExW, SPLREG_MAJOR_VERSION/SPLREG_MINOR_VERSION)

Definition at line 22 of file main.c.

Referenced by _LocalGetPrintServerHandleData().

◆ dwSpoolerMinorVersion

const DWORD dwSpoolerMinorVersion = 0

Definition at line 23 of file main.c.

Referenced by _LocalGetPrintServerHandleData().

◆ hPrintersKey

◆ hPrintKey

◆ wszDefaultDocumentName

const WCHAR wszDefaultDocumentName[] = L"Local Downlevel Document"

Definition at line 25 of file main.c.

Referenced by CreateJob().

◆ wszJobDirectory

WCHAR wszJobDirectory[MAX_PATH]

Definition at line 13 of file main.c.

Referenced by _InitializeLocalSpooler(), GetJobFilePath(), and InitializeGlobalJobList().

◆ wszPrintProviderInfo

PCWSTR wszPrintProviderInfo[3]
Initial value:
= {
L"Windows NT Local Print Providor",
L"Locally connected Printers",
L"Windows NT Local Printers"
}
static const WCHAR L[]
Definition: oid.c:1250

Definition at line 27 of file main.c.

Referenced by _DumpLevel1PrintProviderInformation(), _LocalEnumPrintersCheckName(), _LocalGetPrinterDriverLevel6(), and _LocalGetPrinterDriverLevel8().

◆ wszSpoolDirectory

WCHAR wszSpoolDirectory[MAX_PATH]

Definition at line 15 of file main.c.

Referenced by _InitializeLocalSpooler(), and LocalGetPrintProcessorDirectory().