Module: wine Branch: master Commit: f6ccadda8adfcc4d3463873b22fc5c3b5509bd72 URL: https://gitlab.winehq.org/wine/wine/-/commit/f6ccadda8adfcc4d3463873b22fc5c3...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Aug 28 11:33:59 2023 +0200
wow64: Create the cross-process work list.
---
dlls/ntdll/tests/wow64.c | 1 + dlls/wow64/syscall.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
diff --git a/dlls/ntdll/tests/wow64.c b/dlls/ntdll/tests/wow64.c index 418c2c6145f..cc160c061cc 100644 --- a/dlls/ntdll/tests/wow64.c +++ b/dlls/ntdll/tests/wow64.c @@ -436,6 +436,7 @@ static void test_peb_teb(void) status = NtMapViewOfSection( handle, GetCurrentProcess(), &addr, 0, 0, NULL, &size, ViewShare, 0, PAGE_READWRITE ); ok( !status, "NtMapViewOfSection failed %lx\n", status ); + ok( size == 0x4000, "unexpected size %Ix\n", size ); data = malloc( size ); ret = ReadProcessMemory( pi.hProcess, (void *)(ULONG_PTR)wow64info->CrossProcessWorkList, data, size, &size ); diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 113e9f538fb..70c63535ae6 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -798,6 +798,40 @@ static const WCHAR *get_cpu_dll_name(void) }
+/********************************************************************** + * create_cross_process_work_list + */ +static NTSTATUS create_cross_process_work_list( WOW64INFO *wow64info ) +{ + SIZE_T map_size = 0x4000; + LARGE_INTEGER size; + NTSTATUS status; + HANDLE section; + CROSS_PROCESS_WORK_LIST *list = NULL; + CROSS_PROCESS_WORK_ENTRY *end; + UINT i; + + size.QuadPart = map_size; + status = NtCreateSection( §ion, SECTION_ALL_ACCESS, NULL, &size, PAGE_READWRITE, SEC_COMMIT, 0 ); + if (status) return status; + status = NtMapViewOfSection( section, GetCurrentProcess(), (void **)&list, default_zero_bits, 0, NULL, + &map_size, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE ); + if (status) + { + NtClose( section ); + return status; + } + + end = (CROSS_PROCESS_WORK_ENTRY *)((char *)list + map_size); + for (i = 0; list->entries + i + 1 <= end; i++) + RtlWow64PushCrossProcessWorkOntoFreeList( &list->free_list, &list->entries[i] ); + + wow64info->SectionHandle = (ULONG_PTR)section; + wow64info->CrossProcessWorkList = (ULONG_PTR)list; + return STATUS_SUCCESS; +} + + /********************************************************************** * process_init */ @@ -863,6 +897,8 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex
init_syscall_table( module, p__wine_syscall_dispatcher, &ntdll_syscall_table );
+ if (wow64info->CpuFlags & WOW64_CPUFLAGS_SOFTWARE) create_cross_process_work_list( wow64info ); + init_file_redirects(); return TRUE;