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:
parent
7f819ea4e9
commit
e82332f2b2
|
@ -598,6 +598,21 @@ static HFONT create_scaled_font( const LOGFONTW *deffont )
|
||||||
return CreateFontIndirectW( &lf );
|
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
|
* DllMain
|
||||||
*
|
*
|
||||||
|
@ -612,6 +627,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
|
||||||
|
|
||||||
gdi32_module = inst;
|
gdi32_module = inst;
|
||||||
DisableThreadLibraryCalls( inst );
|
DisableThreadLibraryCalls( inst );
|
||||||
|
set_gdi_shared();
|
||||||
font_init();
|
font_init();
|
||||||
|
|
||||||
/* create stock objects */
|
/* create stock objects */
|
||||||
|
|
|
@ -24,11 +24,14 @@
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "wingdi.h"
|
#include "ntgdi.h"
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
|
#include "winternl.h"
|
||||||
|
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
|
|
||||||
|
static BOOL is_wow64;
|
||||||
|
|
||||||
static void test_gdi_objects(void)
|
static void test_gdi_objects(void)
|
||||||
{
|
{
|
||||||
BYTE buff[256];
|
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)
|
START_TEST(gdiobj)
|
||||||
{
|
{
|
||||||
|
if (!IsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
|
||||||
|
|
||||||
test_gdi_objects();
|
test_gdi_objects();
|
||||||
test_thread_objects();
|
test_thread_objects();
|
||||||
test_GetCurrentObject();
|
test_GetCurrentObject();
|
||||||
test_region();
|
test_region();
|
||||||
test_handles_on_win64();
|
test_handles_on_win64();
|
||||||
|
test_shared_handle_table();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue