gdi32: Initialize GdiSharedHandleTable in PEB.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-06-30 17:38:00 +02:00 committed by Alexandre Julliard
parent 7f819ea4e9
commit e82332f2b2
2 changed files with 77 additions and 1 deletions

View File

@ -598,6 +598,21 @@ static HFONT create_scaled_font( const LOGFONTW *deffont )
return CreateFontIndirectW( &lf );
}
static void set_gdi_shared(void)
{
#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;
return;
}
#endif
/* NOTE: Windows uses 32-bit for 32-bit kernel */
NtCurrentTeb()->Peb->GdiSharedHandleTable = &gdi_shared;
}
/***********************************************************************
* DllMain
*
@ -612,6 +627,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
gdi32_module = inst;
DisableThreadLibraryCalls( inst );
set_gdi_shared();
font_init();
/* create stock objects */

View File

@ -24,11 +24,14 @@
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "ntgdi.h"
#include "winuser.h"
#include "winternl.h"
#include "wine/test.h"
static BOOL is_wow64;
static void test_gdi_objects(void)
{
BYTE buff[256];
@ -362,11 +365,68 @@ static void test_handles_on_win64(void)
}
}
static GDI_SHARED_MEMORY *get_gdi_shared(void)
{
#ifndef _WIN64
if (NtCurrentTeb()->GdiBatchCount)
{
TEB64 *teb64 = (TEB64 *)(UINT_PTR)NtCurrentTeb()->GdiBatchCount;
PEB64 *peb64 = (PEB64 *)(UINT_PTR)teb64->Peb;
return (GDI_SHARED_MEMORY *)(UINT_PTR)peb64->GdiSharedHandleTable;
}
#endif
return (GDI_SHARED_MEMORY *)NtCurrentTeb()->Peb->GdiSharedHandleTable;
}
static void test_shared_handle_table(void)
{
GDI_SHARED_MEMORY *gdi_shared;
GDI_HANDLE_ENTRY *entry;
unsigned int handle;
HRGN hrgn;
if (sizeof(void *) == 4 && !is_wow64)
{
skip("Skipping shared memory tests on 32-bit Windows\n");
return;
}
gdi_shared = get_gdi_shared();
hrgn = CreateRectRgn(10, 10, 20, 20);
ok(hrgn != 0, "CreateRectRgn failed\n");
handle = (UINT_PTR)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);
DeleteObject(hrgn);
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);
}
START_TEST(gdiobj)
{
if (!IsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
test_gdi_objects();
test_thread_objects();
test_GetCurrentObject();
test_region();
test_handles_on_win64();
test_shared_handle_table();
}