Jacek Caban : gdi32/test: Add more handle table tests.

Alexandre Julliard julliard at winehq.org
Thu Jul 8 16:43:51 CDT 2021


Module: wine
Branch: master
Commit: c56cf0131bfa758ff35964124046a825a3f6eb86
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c56cf0131bfa758ff35964124046a825a3f6eb86

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul  8 17:11:26 2021 +0200

gdi32/test: Add more handle table tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/tests/gdiobj.c | 83 ++++++++++++++++++++++++++++++++++++++++++-----
 include/ntgdi.h           | 31 ++++++++++++++++--
 2 files changed, 103 insertions(+), 11 deletions(-)

diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c
index 80c8b284c62..5665361d5e6 100644
--- a/dlls/gdi32/tests/gdiobj.c
+++ b/dlls/gdi32/tests/gdiobj.c
@@ -378,12 +378,45 @@ static GDI_SHARED_MEMORY *get_gdi_shared(void)
     return (GDI_SHARED_MEMORY *)NtCurrentTeb()->Peb->GdiSharedHandleTable;
 }
 
+static void test_shared_handle_entry( HGDIOBJ obj, unsigned int type, BOOL is_stock )
+{
+    GDI_SHARED_MEMORY *gdi_shared = get_gdi_shared();
+    unsigned int handle = HandleToULong( obj );
+    GDI_HANDLE_ENTRY *entry;
+
+    entry = &gdi_shared->Handles[handle & 0xffff];
+    ok(entry->Unique == handle >> 16, "Unique = %x, expected %x\n",
+       entry->Unique, handle >> 16);
+    if (type != NTGDI_OBJ_MEMDC)
+    {
+        todo_wine
+        ok(entry->ExtType == type, "ExtType = %x, expected %x\n", entry->ExtType, type);
+    }
+    else
+    {
+        todo_wine
+        ok(entry->ExtType == NTGDI_OBJ_DC, "ExtType = %x, expected NTGDI_OBJ_DC\n", entry->ExtType);
+    }
+    todo_wine_if(is_stock)
+    ok(entry->StockFlag == is_stock, "StockFlag = %x\n", entry->StockFlag);
+    todo_wine
+    ok(entry->Type == (type & 0x1f), "Type = %x, expected %x\n", entry->Type, type & 0x1f);
+    ok(entry->Object, "Object = NULL\n");
+    ok(entry->Owner.Count == 0, "Count = %u\n", entry->Owner.Count);
+}
+
 static void test_shared_handle_table(void)
 {
     GDI_SHARED_MEMORY *gdi_shared;
     GDI_HANDLE_ENTRY *entry;
     unsigned int handle;
+    HENHMETAFILE enhmetafile;
+    HMETAFILE metafile;
+    HPEN pen;
     HRGN hrgn;
+    HBRUSH brush;
+    LOGBRUSH lb;
+    HDC dc;
 
     if (sizeof(void *) == 4 && !is_wow64)
     {
@@ -394,18 +427,13 @@ static void test_shared_handle_table(void)
 
     hrgn = CreateRectRgn(10, 10, 20, 20);
     ok(hrgn != 0, "CreateRectRgn failed\n");
-
-    handle = (UINT_PTR)hrgn;
+    handle = HandleToULong( hrgn );
     entry = &gdi_shared->Handles[handle & 0xffff];
-    ok(entry->Unique == handle >> 16, "Unique = %x, expected %x\n",
-       entry->Unique, handle >> 16);
-    todo_wine
-    ok(entry->Type == 4, "Type = %x\n", entry->Type);
-    ok(entry->Object, "Object = NULL\n");
     todo_wine
     ok(entry->Owner.ProcessId == GetCurrentProcessId(), "ProcessId = %x, expected %x\n",
        entry->Owner.ProcessId, GetCurrentProcessId());
-    ok(entry->Owner.Count == 0, "Count = %u\n", entry->Owner.Count);
+
+    test_shared_handle_entry( hrgn, NTGDI_OBJ_REGION, FALSE );
 
     DeleteObject(hrgn);
     ok(entry->Unique == handle >> 16, "Unique = %x, expected %x\n",
@@ -417,6 +445,45 @@ static void test_shared_handle_table(void)
     ok(entry->Owner.ProcessId == GetCurrentProcessId(), "ProcessId = %x, expected %x\n",
        entry->Owner.ProcessId, GetCurrentProcessId());
     ok(entry->Owner.Count == 0, "Count = %u\n", entry->Owner.Count);
+
+    test_shared_handle_entry( GetStockObject( WHITE_PEN ), NTGDI_OBJ_PEN, TRUE );
+    test_shared_handle_entry( GetStockObject( WHITE_BRUSH ), NTGDI_OBJ_BRUSH, TRUE );
+
+    brush = CreateSolidBrush(0);
+    test_shared_handle_entry( brush, NTGDI_OBJ_BRUSH, FALSE );
+    DeleteObject(brush);
+
+    lb.lbStyle = BS_SOLID;
+    lb.lbColor = RGB(12,34,56);
+    lb.lbHatch = HS_CROSS;
+    pen = ExtCreatePen( PS_DOT | PS_GEOMETRIC, 3, &lb, 0, NULL );
+    test_shared_handle_entry( pen, NTGDI_OBJ_EXTPEN, FALSE );
+    DeleteObject(pen);
+
+    test_shared_handle_entry( GetStockObject( SYSTEM_FONT ), NTGDI_OBJ_FONT, TRUE );
+    test_shared_handle_entry( GetStockObject( DEFAULT_PALETTE ), NTGDI_OBJ_PAL, TRUE );
+    test_shared_handle_entry( GetStockObject( STOCK_LAST + 1 ), NTGDI_OBJ_BITMAP, TRUE );
+
+    dc = CreateDCW(L"display", NULL, NULL, NULL);
+    ok(GetObjectType(dc) == OBJ_DC, "GetObjectType(dc) = %x\n", GetObjectType(dc));
+    test_shared_handle_entry( dc, NTGDI_OBJ_DC, FALSE );
+    DeleteDC(dc);
+
+    dc = CreateMetaFileW(NULL);
+    test_shared_handle_entry( dc, NTGDI_OBJ_METADC, FALSE );
+    metafile = CloseMetaFile(dc);
+    test_shared_handle_entry( metafile, NTGDI_OBJ_METAFILE, FALSE );
+    DeleteObject(metafile);
+
+    dc = CreateEnhMetaFileW(NULL, NULL, NULL, NULL);
+    test_shared_handle_entry( dc, NTGDI_OBJ_ENHMETADC, FALSE );
+    enhmetafile = CloseEnhMetaFile(dc);
+    test_shared_handle_entry( enhmetafile, NTGDI_OBJ_ENHMETAFILE, FALSE );
+    DeleteObject(metafile);
+
+    dc = CreateCompatibleDC(NULL);
+    test_shared_handle_entry( dc, NTGDI_OBJ_MEMDC, FALSE );
+    DeleteDC(dc);
 }
 
 START_TEST(gdiobj)
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 196fb69bf4e..7e8954468fb 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -34,14 +34,39 @@ typedef struct _GDI_HANDLE_ENTRY
         };
         ULONG Value;
     } Owner;
-    USHORT Unique;
-    UCHAR  Type;
-    UCHAR  Flags;
+    union
+    {
+        struct
+        {
+            UCHAR ExtType : 7;
+            UCHAR StockFlag : 1;
+            UCHAR Generation;
+        };
+        USHORT Unique;
+    };
+    UCHAR Type;
+    UCHAR Flags;
     UINT64 UserPointer;
 } GDI_HANDLE_ENTRY, *PGDI_HANDLE_ENTRY;
 
 #define GDI_MAX_HANDLE_COUNT 0x10000
 
+#define NTGDI_OBJ_DC              0x01
+#define NTGDI_OBJ_ENHMETADC       0x21
+#define NTGDI_OBJ_REGION          0x04
+#define NTGDI_OBJ_METAFILE        0x26
+#define NTGDI_OBJ_ENHMETAFILE     0x46
+#define NTGDI_OBJ_METADC          0x66
+#define NTGDI_OBJ_PAL             0x08
+#define NTGDI_OBJ_BITMAP          0x09
+#define NTGDI_OBJ_FONT            0x0a
+#define NTGDI_OBJ_BRUSH           0x10
+#define NTGDI_OBJ_PEN             0x30
+#define NTGDI_OBJ_EXTPEN          0x50
+
+/* Wine extension, native uses NTGDI_OBJ_DC */
+#define NTGDI_OBJ_MEMDC           0x41
+
 typedef struct _GDI_SHARED_MEMORY
 {
     GDI_HANDLE_ENTRY Handles[GDI_MAX_HANDLE_COUNT];




More information about the wine-cvs mailing list