ReactOS 0.4.15-dev-7918-g2a2556c
main.c File Reference
#include "precomp.h"
Include dependency graph for main.c:

Go to the source code of this file.

Functions

static DWORD _AddPrintProviderToList (PCWSTR pwszFileName)
 
static BOOL _InitializePrintProviderList (VOID)
 
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 
BOOL WINAPI InitializeRouter (HANDLE SpoolerStatusHandle)
 
BOOL WINAPI SplInitializeWinSpoolDrv (PVOID *pTable)
 
BOOL WINAPI SplIsUpgrade (VOID)
 
BOOL WINAPI SpoolerInit (VOID)
 
BOOL WINAPI BuildOtherNamesFromMachineName (LPVOID *ptr1, ULONG *ptr2)
 

Variables

HANDLE hProcessHeap
 
LIST_ENTRY PrintProviderList
 

Function Documentation

◆ _AddPrintProviderToList()

static DWORD _AddPrintProviderToList ( PCWSTR  pwszFileName)
static

Definition at line 16 of file main.c.

17{
18 DWORD dwErrorCode;
19 HINSTANCE hinstPrintProvider;
20 PInitializePrintProvidor pfnInitializePrintProvidor;
21 PSPOOLSS_PRINT_PROVIDER pPrintProvider = NULL;
22
23 // Try to load it.
24 hinstPrintProvider = LoadLibraryW(pwszFileName);
25 if (!hinstPrintProvider)
26 {
27 dwErrorCode = GetLastError();
28 ERR("LoadLibraryW failed for \"%S\" with error %lu!\n", pwszFileName, dwErrorCode);
29 goto Cleanup;
30 }
31
32 // Get the initialization routine.
33 pfnInitializePrintProvidor = (PInitializePrintProvidor)GetProcAddress(hinstPrintProvider, "InitializePrintProvidor");
34 if (!pfnInitializePrintProvidor)
35 {
36 dwErrorCode = GetLastError();
37 ERR("GetProcAddress failed for \"%S\" with error %lu!\n", pwszFileName, dwErrorCode);
38 goto Cleanup;
39 }
40
41 // Create a new SPOOLSS_PRINT_PROVIDER structure for it.
42 pPrintProvider = DllAllocSplMem(sizeof(SPOOLSS_PRINT_PROVIDER));
43 if (!pPrintProvider)
44 {
45 dwErrorCode = ERROR_NOT_ENOUGH_MEMORY;
46 ERR("DllAllocSplMem failed!\n");
47 goto Cleanup;
48 }
49
50 // Call the Print Provider initialization function.
51 if (!pfnInitializePrintProvidor(&pPrintProvider->PrintProvider, sizeof(PRINTPROVIDOR), NULL))
52 {
53 dwErrorCode = GetLastError();
54 ERR("InitializePrintProvidor failed for \"%S\" with error %lu!\n", pwszFileName, dwErrorCode);
55 goto Cleanup;
56 }
57
58 // Add this Print Provider to the list.
59 InsertTailList(&PrintProviderList, &pPrintProvider->Entry);
60
61 // Don't let the cleanup routine free this.
62 pPrintProvider = NULL;
63 dwErrorCode = ERROR_SUCCESS;
64
66 if (pPrintProvider)
67 DllFreeSplMem(pPrintProvider);
68
69 return dwErrorCode;
70}
#define ERR(fmt,...)
Definition: debug.h:110
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define GetProcAddress(x, y)
Definition: compat.h:753
#define LoadLibraryW(x)
Definition: compat.h:747
static const WCHAR Cleanup[]
Definition: register.c:80
#define InsertTailList(ListHead, Entry)
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL(WINAPI * PInitializePrintProvidor)(LPPRINTPROVIDOR, DWORD, LPWSTR)
LIST_ENTRY Entry
Definition: precomp.h:35
PRINTPROVIDOR PrintProvider
Definition: precomp.h:36
LIST_ENTRY PrintProviderList
Definition: main.c:12
BOOL WINAPI DllFreeSplMem(PVOID pMem)
Definition: memory.c:112
PVOID WINAPI DllAllocSplMem(DWORD dwBytes)
Definition: memory.c:95
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by _InitializePrintProviderList().

◆ _InitializePrintProviderList()

static BOOL _InitializePrintProviderList ( VOID  )
static

Definition at line 73 of file main.c.

74{
75 DWORD cbFileName;
76 DWORD cchMaxSubKey;
77 DWORD cchPrintProviderName;
78 DWORD dwErrorCode;
79 DWORD dwSubKeys;
80 DWORD i;
81 HKEY hKey = NULL;
82 HKEY hSubKey = NULL;
83 PWSTR pwszPrintProviderName = NULL;
85
86 // Initialize an empty list for our Print Providers.
88
89 // First add the Local Spooler.
90 // This one must exist and must be the first one in the list.
91 dwErrorCode = _AddPrintProviderToList(L"localspl");
92 if (dwErrorCode != ERROR_SUCCESS)
93 {
94 ERR("The Local Spooler could not be loaded!\n");
95 goto Cleanup;
96 }
97
98 // Now add additional Print Providers from the registry.
99 // First of all, open the key containing print providers.
100 dwErrorCode = (DWORD)RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Print\\Providers", 0, KEY_READ, &hKey);
101 if (dwErrorCode != ERROR_SUCCESS)
102 {
103 ERR("RegOpenKeyExW failed with status %lu!\n", dwErrorCode);
104 goto Cleanup;
105 }
106
107 // Get the number of Print Providers and maximum sub key length.
108 dwErrorCode = (DWORD)RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &dwSubKeys, &cchMaxSubKey, NULL, NULL, NULL, NULL, NULL, NULL);
109 if (dwErrorCode != ERROR_SUCCESS)
110 {
111 ERR("RegQueryInfoKeyW failed with status %lu!\n", dwErrorCode);
112 goto Cleanup;
113 }
114
115 // Allocate a temporary buffer for the Print Provider names.
116 pwszPrintProviderName = DllAllocSplMem((cchMaxSubKey + 1) * sizeof(WCHAR));
117 if (!pwszPrintProviderName)
118 {
119 dwErrorCode = ERROR_NOT_ENOUGH_MEMORY;
120 ERR("DllAllocSplMem failed!\n");
121 goto Cleanup;
122 }
123
124 // Loop through all available Print Providers.
125 for (i = 0; i < dwSubKeys; i++)
126 {
127 // Cleanup tasks from the previous run
128 if (hSubKey)
129 {
130 RegCloseKey(hSubKey);
131 hSubKey = NULL;
132 }
133
134 // Get the name of this Print Provider.
135 cchPrintProviderName = cchMaxSubKey + 1;
136 dwErrorCode = (DWORD)RegEnumKeyExW(hKey, i, pwszPrintProviderName, &cchPrintProviderName, NULL, NULL, NULL, NULL);
137 if (dwErrorCode != ERROR_SUCCESS)
138 {
139 ERR("RegEnumKeyExW failed for iteration %lu with status %lu!\n", i, dwErrorCode);
140 continue;
141 }
142
143 // Open this Print Provider's registry key.
144 dwErrorCode = (DWORD)RegOpenKeyExW(hKey, pwszPrintProviderName, 0, KEY_READ, &hSubKey);
145 if (dwErrorCode != ERROR_SUCCESS)
146 {
147 ERR("RegOpenKeyExW failed for Print Provider \"%S\" with status %lu!\n", pwszPrintProviderName, dwErrorCode);
148 continue;
149 }
150
151 // Get the file name of the Print Provider.
152 cbFileName = MAX_PATH * sizeof(WCHAR);
153 dwErrorCode = (DWORD)RegQueryValueExW(hKey, L"Driver", NULL, NULL, (PBYTE)wszFileName, &cbFileName);
154 if (dwErrorCode != ERROR_SUCCESS)
155 {
156 ERR("RegQueryValueExW failed with status %lu!\n", dwErrorCode);
157 continue;
158 }
159
160 // Load and add it to the list.
162 if (dwErrorCode != ERROR_SUCCESS)
163 continue;
164 }
165
166 dwErrorCode = ERROR_SUCCESS;
167
168Cleanup:
169 // Inside the loop
170 if (hSubKey)
171 RegCloseKey(hSubKey);
172
173 // Outside the loop
174 if (pwszPrintProviderName)
175 DllFreeSplMem(pwszPrintProviderName);
176
177 if (hKey)
179
180 SetLastError(dwErrorCode);
181 return (dwErrorCode == ERROR_SUCCESS);
182}
static WCHAR wszFileName[MAX_PATH]
Definition: wordpad.c:71
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define SetLastError(x)
Definition: compat.h:752
#define MAX_PATH
Definition: compat.h:34
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
FxAutoRegKey hKey
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define KEY_READ
Definition: nt_native.h:1023
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
BYTE * PBYTE
Definition: pedump.c:66
uint16_t * PWSTR
Definition: typedefs.h:56
static DWORD _AddPrintProviderToList(PCWSTR pwszFileName)
Definition: main.c:16
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by InitializeRouter().

◆ BuildOtherNamesFromMachineName()

BOOL WINAPI BuildOtherNamesFromMachineName ( LPVOID ptr1,
ULONG ptr2 
)

Definition at line 256 of file main.c.

257{
258 FIXME("(%p, %p) stub\n", ptr1, ptr2);
259
260 *ptr1 = NULL;
261 *ptr2 = 0;
262 return FALSE;
263}
#define FIXME(fmt,...)
Definition: debug.h:111
#define FALSE
Definition: types.h:117

◆ DllMain()

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

Definition at line 185 of file main.c.

186{
187 switch (fdwReason)
188 {
192 break;
193 }
194
195 return TRUE;
196}
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
HANDLE hProcessHeap
Definition: main.c:13

◆ InitializeRouter()

BOOL WINAPI InitializeRouter ( HANDLE  SpoolerStatusHandle)

Definition at line 199 of file main.c.

200{
202}
static BOOL _InitializePrintProviderList(VOID)
Definition: main.c:73

Referenced by _ServiceMain().

◆ SplInitializeWinSpoolDrv()

BOOL WINAPI SplInitializeWinSpoolDrv ( PVOID pTable)

Definition at line 205 of file main.c.

206{
207 HINSTANCE hWinspool;
208 int i;
209
210 hWinspool = LoadLibraryW(L"winspool.drv");
211 if (!hWinspool)
212 {
213 ERR("Could not load winspool.drv, last error is %lu!\n", GetLastError());
214 return FALSE;
215 }
216
217 // Get the function pointers which are meant to be returned by this function.
218 pTable[0] = GetProcAddress(hWinspool, "OpenPrinterW");
219 pTable[1] = GetProcAddress(hWinspool, "ClosePrinter");
220 pTable[2] = GetProcAddress(hWinspool, "SpoolerDevQueryPrintW");
221 pTable[3] = GetProcAddress(hWinspool, "SpoolerPrinterEvent");
222 pTable[4] = GetProcAddress(hWinspool, "DocumentPropertiesW");
223 pTable[5] = GetProcAddress(hWinspool, (LPSTR)212);
224 pTable[6] = GetProcAddress(hWinspool, (LPSTR)213);
225 pTable[7] = GetProcAddress(hWinspool, (LPSTR)214);
226 pTable[8] = GetProcAddress(hWinspool, (LPSTR)215);
227
228 // Verify that all calls succeeded.
229 for (i = 0; i < 9; i++)
230 {
231 if (!pTable[i])
232 {
233 FreeLibrary(hWinspool);
234 return FALSE;
235 }
236 }
237
238 return TRUE;
239}
#define FreeLibrary(x)
Definition: compat.h:748
static const EHCI_PERIOD pTable[]
Definition: usbehci.c:29
char * LPSTR
Definition: xmlstorage.h:182

Referenced by START_TEST().

◆ SplIsUpgrade()

BOOL WINAPI SplIsUpgrade ( VOID  )

Definition at line 242 of file main.c.

243{
244 return FALSE;
245}

◆ SpoolerInit()

BOOL WINAPI SpoolerInit ( VOID  )

Definition at line 248 of file main.c.

249{
250 // Nothing to do here yet
252 return TRUE;
253}

Referenced by _RpcSpoolerInit().

Variable Documentation

◆ hProcessHeap

HANDLE hProcessHeap

Definition at line 11 of file main.c.

◆ PrintProviderList