From 892d4a0188ffd8aa60dc11b4bace30dfb0f9d50e Mon Sep 17 00:00:00 2001 From: Jacob Nevins Date: Thu, 15 Jun 2017 23:33:57 +0100 Subject: [PATCH] Seek all Windows print functions in winspool.drv. Rather than loading some from spoolss.dll, which some MSDN documentation suggests, but which doesn't work very well in practice. (Also, remove an unused variable.) --- windows/winprint.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/windows/winprint.c b/windows/winprint.c index a17166e6..6a1a74c2 100644 --- a/windows/winprint.c +++ b/windows/winprint.c @@ -33,20 +33,25 @@ DECL_WINDOWS_FUNCTION(static, BOOL, WritePrinter, static void init_winfuncs(void) { static int initialised = FALSE; - char buf[4096]; if (initialised) return; { HMODULE winspool_module = load_system32_dll("winspool.drv"); - HMODULE spoolss_module = load_system32_dll("spoolss.dll"); + /* Some MSDN documentation claims that some of the below functions + * should be loaded from spoolss.dll, but this doesn't seem to + * be reliable in practice. + * Nevertheless, we load spoolss.dll ourselves using our safe + * loading method, against the possibility that winspool.drv + * later loads it unsafely. */ + (void) load_system32_dll("spoolss.dll"); GET_WINDOWS_FUNCTION_PP(winspool_module, EnumPrinters); GET_WINDOWS_FUNCTION_PP(winspool_module, OpenPrinter); - GET_WINDOWS_FUNCTION_PP(spoolss_module, ClosePrinter); + GET_WINDOWS_FUNCTION_PP(winspool_module, ClosePrinter); GET_WINDOWS_FUNCTION_PP(winspool_module, StartDocPrinter); - GET_WINDOWS_FUNCTION_PP(spoolss_module, EndDocPrinter); - GET_WINDOWS_FUNCTION_PP(spoolss_module, StartPagePrinter); - GET_WINDOWS_FUNCTION_PP(spoolss_module, EndPagePrinter); - GET_WINDOWS_FUNCTION_PP(spoolss_module, WritePrinter); + GET_WINDOWS_FUNCTION_PP(winspool_module, EndDocPrinter); + GET_WINDOWS_FUNCTION_PP(winspool_module, StartPagePrinter); + GET_WINDOWS_FUNCTION_PP(winspool_module, EndPagePrinter); + GET_WINDOWS_FUNCTION_PP(winspool_module, WritePrinter); } initialised = TRUE; }