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