Huw Davies : winspool.drv: Outlook 2003 relies on the buffer size returned by EnumPrintersA being big enough to hold the buffer returned by EnumPrintersW .

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 5 04:50:58 CST 2006


Module: wine
Branch: master
Commit: 9108eede84422b6b727e9cb447cc09fc2aa80aad
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9108eede84422b6b727e9cb447cc09fc2aa80aad

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Dec  4 14:32:36 2006 +0000

winspool.drv: Outlook 2003 relies on the buffer size returned by EnumPrintersA being big enough to hold the buffer returned by EnumPrintersW.

---

 dlls/winspool.drv/info.c       |    7 ++++---
 dlls/winspool.drv/tests/info.c |   24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 9234509..f357c3c 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -4039,13 +4039,14 @@ BOOL WINAPI EnumPrintersA(DWORD dwType,
 			  DWORD cbBuf, LPDWORD lpdwNeeded,
 			  LPDWORD lpdwReturned)
 {
-    BOOL ret;
+    BOOL ret, unicode = FALSE;
     UNICODE_STRING lpszNameW;
     PWSTR pwstrNameW;
-    
+
     pwstrNameW = asciitounicode(&lpszNameW,lpszName);
+    if(!cbBuf) unicode = TRUE; /* return a buffer that's big enough for the unicode version */
     ret = WINSPOOL_EnumPrinters(dwType, pwstrNameW, dwLevel, lpbPrinters, cbBuf,
-				lpdwNeeded, lpdwReturned, FALSE);
+				lpdwNeeded, lpdwReturned, unicode);
     RtlFreeUnicodeString(&lpszNameW);
     return ret;
 }
diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c
index b9c4807..eafddd6 100644
--- a/dlls/winspool.drv/tests/info.c
+++ b/dlls/winspool.drv/tests/info.c
@@ -1638,6 +1638,28 @@ static void test_DocumentProperties(void
     ok(ret, "ClosePrinter error %d\n", GetLastError());
 }
 
+static void test_EnumPrinters(void)
+{
+    DWORD neededA, neededW, num;
+    DWORD ret;
+
+    SetLastError(0xdeadbeef);
+    ret = EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &neededA, &num);
+    ok(ret == 0, "ret %d\n", ret);
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "gle %d\n", GetLastError());
+    ok(num == 0, "num %d\n", num);
+
+    SetLastError(0xdeadbeef);
+    EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &neededW, &num);
+    ok(ret == 0, "ret %d\n", ret);
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "gle %d\n", GetLastError());
+    ok(num == 0, "num %d\n", num);
+
+    /* Outlook2003 relies on the buffer size returned by EnumPrintersA being big enough
+       to hold the buffer returned by EnumPrintersW */
+    ok(neededA == neededW, "neededA %d neededW %d\n", neededA, neededW);
+}
+
 START_TEST(info)
 {
     LPSTR   default_printer;
@@ -1664,4 +1686,6 @@ START_TEST(info)
     test_OpenPrinter();
     test_GetPrinterDriver();
     test_SetDefaultPrinter();
+
+    test_EnumPrinters();
 }




More information about the wine-cvs mailing list