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