gdi32: Add support for 16-bit QUERYESCSUPPORT queries.

Dmitry Timoshkov dmitry at baikal.ru
Fri Feb 1 02:01:20 CST 2013


This patch makes PageMaker 6.51 not complain about old or incompatible
PostScript printer driver. PageMaker calls gdi32.Escape(QUERYESCSUPPORT)
with various capabilities it wants to use, and sets input buffer size
to 2 bytes. This apparently worked fine in 1996 when it was released and
main target for PageMaker was Windows 95.
---
 dlls/gdi32/driver.c      | 8 +++++---
 dlls/wineps.drv/escape.c | 9 ++++++---
 dlls/winex11.drv/init.c  | 2 +-
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 6b68499..82706c3 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -1101,9 +1101,11 @@ INT WINAPI Escape( HDC hdc, INT escape, INT in_count, LPCSTR in_data, LPVOID out
 
     case QUERYESCSUPPORT:
         {
-            const INT *ptr = (const INT *)in_data;
-            if (in_count < sizeof(INT)) return 0;
-            switch(*ptr)
+            DWORD code;
+
+            if (in_count < sizeof(SHORT)) return 0;
+            code = (in_count < sizeof(DWORD)) ? *(const USHORT *)in_data : *(const DWORD *)in_data;
+            switch (code)
             {
             case ABORTDOC:
             case ENDDOC:
diff --git a/dlls/wineps.drv/escape.c b/dlls/wineps.drv/escape.c
index d2a8d2a..6e89837 100644
--- a/dlls/wineps.drv/escape.c
+++ b/dlls/wineps.drv/escape.c
@@ -66,15 +66,18 @@ INT PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_data,
 {
     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
 
+    TRACE("%p,%d,%d,%p,%d,%p\n",
+          dev->hdc, nEscape, cbInput, in_data, cbOutput, out_data);
+
     switch(nEscape)
     {
     case QUERYESCSUPPORT:
-        if(cbInput < sizeof(INT))
+        if(cbInput < sizeof(SHORT))
         {
-	    WARN("cbInput < sizeof(INT) (=%d) for QUERYESCSUPPORT\n", cbInput);
+	    WARN("cbInput < sizeof(SHORT) (=%d) for QUERYESCSUPPORT\n", cbInput);
 	    return 0;
 	} else {
-	    UINT num = *(const UINT *)in_data;
+	    DWORD num = (cbInput < sizeof(DWORD)) ? *(const USHORT *)in_data : *(const DWORD *)in_data;
 	    TRACE("QUERYESCSUPPORT for %d\n", num);
 
 	    switch(num) {
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 7cf318f..8f8ff09 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -316,7 +316,7 @@ static INT X11DRV_ExtEscape( PHYSDEV dev, INT escape, INT in_count, LPCVOID in_d
     switch(escape)
     {
     case QUERYESCSUPPORT:
-        if (in_data)
+        if (in_data && in_count >= sizeof(DWORD))
         {
             switch (*(const INT *)in_data)
             {
-- 
1.8.0.2




More information about the wine-patches mailing list