Jacek Caban : gdi32: Use NtAllocateVirtualMemory to allocate GDI_SHARED_MEMORY.

Alexandre Julliard julliard at winehq.org
Fri Oct 1 18:02:22 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct  1 01:58:03 2021 +0200

gdi32: Use NtAllocateVirtualMemory to allocate GDI_SHARED_MEMORY.

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/gdiobj.c | 35 ++++++++++++++++++++++-------------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 47b413ab0aa..8381c9e2746 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -42,9 +42,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdi);
 
 #define FIRST_GDI_HANDLE 32
 
-static GDI_SHARED_MEMORY gdi_shared;
+static GDI_SHARED_MEMORY *gdi_shared;
 static GDI_HANDLE_ENTRY *next_free;
-static GDI_HANDLE_ENTRY *next_unused = gdi_shared.Handles + FIRST_GDI_HANDLE;
+static GDI_HANDLE_ENTRY *next_unused;
 static LONG debug_count;
 SYSTEM_BASIC_INFORMATION system_info;
 
@@ -52,7 +52,7 @@ const struct user_callbacks *user_callbacks = NULL;
 
 static inline HGDIOBJ entry_to_handle( GDI_HANDLE_ENTRY *entry )
 {
-    unsigned int idx = entry - gdi_shared.Handles;
+    unsigned int idx = entry - gdi_shared->Handles;
     return LongToHandle( idx | (entry->Unique << NTGDI_HANDLE_TYPE_SHIFT) );
 }
 
@@ -60,10 +60,10 @@ static inline GDI_HANDLE_ENTRY *handle_entry( HGDIOBJ handle )
 {
     unsigned int idx = LOWORD(handle);
 
-    if (idx < GDI_MAX_HANDLE_COUNT && gdi_shared.Handles[idx].Type)
+    if (idx < GDI_MAX_HANDLE_COUNT && gdi_shared->Handles[idx].Type)
     {
-        if (!HIWORD( handle ) || HIWORD( handle ) == gdi_shared.Handles[idx].Unique)
-            return &gdi_shared.Handles[idx];
+        if (!HIWORD( handle ) || HIWORD( handle ) == gdi_shared->Handles[idx].Unique)
+            return &gdi_shared->Handles[idx];
     }
     if (handle) WARN( "invalid handle %p\n", handle );
     return NULL;
@@ -605,19 +605,26 @@ static HFONT create_scaled_font( const LOGFONTW *deffont, unsigned int dpi )
     return create_font( &lf );
 }
 
-static void set_gdi_shared(void)
+static void init_gdi_shared(void)
 {
+    SIZE_T size = sizeof(*gdi_shared);
+
+    if (NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&gdi_shared, 0, &size,
+                                 MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE ))
+        return;
+    next_unused = gdi_shared->Handles + FIRST_GDI_HANDLE;
+
 #ifndef _WIN64
     if (NtCurrentTeb()->GdiBatchCount)
     {
         TEB64 *teb64 = (TEB64 *)(UINT_PTR)NtCurrentTeb()->GdiBatchCount;
         PEB64 *peb64 = (PEB64 *)(UINT_PTR)teb64->Peb;
-        peb64->GdiSharedHandleTable = (UINT_PTR)&gdi_shared;
+        peb64->GdiSharedHandleTable = (UINT_PTR)gdi_shared;
         return;
     }
 #endif
     /* NOTE: Windows uses 32-bit for 32-bit kernel */
-    NtCurrentTeb()->Peb->GdiSharedHandleTable = &gdi_shared;
+    NtCurrentTeb()->Peb->GdiSharedHandleTable = gdi_shared;
 }
 
 HGDIOBJ get_stock_object( INT obj )
@@ -695,7 +702,7 @@ static void init_stock_objects( unsigned int dpi )
     /* clear the NOSYSTEM bit on all stock objects*/
     for (i = 0; i < STOCK_LAST + 5; i++)
     {
-        GDI_HANDLE_ENTRY *entry = &gdi_shared.Handles[FIRST_GDI_HANDLE + i];
+        GDI_HANDLE_ENTRY *entry = &gdi_shared->Handles[FIRST_GDI_HANDLE + i];
         entry_obj( entry )->system = TRUE;
         entry->StockFlag = 1;
     }
@@ -730,7 +737,7 @@ static void dump_gdi_objects( void )
     TRACE( "%u objects:\n", GDI_MAX_HANDLE_COUNT );
 
     EnterCriticalSection( &gdi_section );
-    for (entry = gdi_shared.Handles; entry < next_unused; entry++)
+    for (entry = gdi_shared->Handles; entry < next_unused; entry++)
     {
         if (!entry->Type)
             TRACE( "handle %p FREE\n", entry_to_handle( entry ));
@@ -760,7 +767,7 @@ HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, DWORD type, const struct g
     entry = next_free;
     if (entry)
         next_free = (GDI_HANDLE_ENTRY *)(UINT_PTR)entry->Object;
-    else if (next_unused < gdi_shared.Handles + GDI_MAX_HANDLE_COUNT)
+    else if (next_unused < gdi_shared->Handles + GDI_MAX_HANDLE_COUNT)
         entry = next_unused++;
     else
     {
@@ -1269,7 +1276,9 @@ NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *p
     if (reason != DLL_PROCESS_ATTACH) return 0;
 
     NtQuerySystemInformation( SystemBasicInformation, &system_info, sizeof(system_info), NULL );
-    set_gdi_shared();
+    init_gdi_shared();
+    if (!gdi_shared) return STATUS_NO_MEMORY;
+
     dpi = font_init();
     init_stock_objects( dpi );
     user_callbacks = ptr_in;




More information about the wine-cvs mailing list