[PATCH 0/5] MR11728: ntdll: Partial support for MEM_PHYSICAL and MEM_LARGE_PAGES.
As an alternative to !11600. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
From: Alexandre Julliard <julliard@winehq.org> --- dlls/kernel32/tests/process.c | 16 ---------------- dlls/kernel32/tests/virtual.c | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 942af51e7dd..4a1c22a0d9d 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -87,7 +87,6 @@ static BOOL (WINAPI *pProcess32Next)(HANDLE, PROCESSENTRY32*); static BOOL (WINAPI *pThread32First)(HANDLE, THREADENTRY32*); static BOOL (WINAPI *pThread32Next)(HANDLE, THREADENTRY32*); static BOOL (WINAPI *pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*); -static SIZE_T (WINAPI *pGetLargePageMinimum)(void); static BOOL (WINAPI *pGetSystemCpuSetInformation)(SYSTEM_CPU_SET_INFORMATION*,ULONG,ULONG*,HANDLE,ULONG); static BOOL (WINAPI *pInitializeProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD, SIZE_T*); static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD_PTR, void *,SIZE_T,void*,SIZE_T*); @@ -275,7 +274,6 @@ static BOOL init(void) pThread32First = (void *)GetProcAddress(hkernel32, "Thread32First"); pThread32Next = (void *)GetProcAddress(hkernel32, "Thread32Next"); pGetLogicalProcessorInformationEx = (void *)GetProcAddress(hkernel32, "GetLogicalProcessorInformationEx"); - pGetLargePageMinimum = (void *)GetProcAddress(hkernel32, "GetLargePageMinimum"); pGetSystemCpuSetInformation = (void *)GetProcAddress(hkernel32, "GetSystemCpuSetInformation"); pInitializeProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "InitializeProcThreadAttributeList"); pUpdateProcThreadAttribute = (void *)GetProcAddress(hkernel32, "UpdateProcThreadAttribute"); @@ -4501,19 +4499,6 @@ static void test_GetSystemCpuSetInformation(void) free(info); } -static void test_largepages(void) -{ - SIZE_T size; - - if (!pGetLargePageMinimum) { - win_skip("No GetLargePageMinimum support.\n"); - return; - } - size = pGetLargePageMinimum(); - - ok((size == 0) || (size == 2*1024*1024) || (size == 4*1024*1024), "GetLargePageMinimum reports %Id size\n", size); -} - struct proc_thread_attr { DWORD_PTR attr; @@ -5845,7 +5830,6 @@ START_TEST(process) test_session_info(); test_GetLogicalProcessorInformationEx(); test_GetSystemCpuSetInformation(); - test_largepages(); test_ProcThreadAttributeList(); test_SuspendProcessState(); test_SuspendProcessNewThread(); diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 74b03ec8f54..c6e8e2306bc 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -40,6 +40,7 @@ static SYSTEM_INFO si; static BOOL is_wow64; static UINT (WINAPI *pGetWriteWatch)(DWORD,LPVOID,SIZE_T,LPVOID*,ULONG_PTR*,ULONG*); static UINT (WINAPI *pResetWriteWatch)(LPVOID,SIZE_T); +static SIZE_T (WINAPI *pGetLargePageMinimum)(void); static NTSTATUS (WINAPI *pNtAreMappedFilesTheSame)(PVOID,PVOID); static NTSTATUS (WINAPI *pNtCreateSection)(HANDLE *, ACCESS_MASK, const OBJECT_ATTRIBUTES *, const LARGE_INTEGER *, ULONG, ULONG, HANDLE ); @@ -2422,6 +2423,20 @@ static void test_write_watch(void) VirtualFree( base, 0, MEM_RELEASE ); } +static void test_largepages(void) +{ + SIZE_T size; + + if (!pGetLargePageMinimum) { + win_skip("No GetLargePageMinimum support.\n"); + return; + } + size = pGetLargePageMinimum(); + + ok((size == 0) || (size == 2*1024*1024) || (size == 4*1024*1024), + "GetLargePageMinimum reports %Id size\n", size); +} + #if defined(__i386__) || defined(__x86_64__) static DWORD WINAPI stack_commit_func( void *arg ) @@ -4795,6 +4810,7 @@ START_TEST(virtual) pGetWriteWatch = (void *) GetProcAddress(hkernel32, "GetWriteWatch"); pResetWriteWatch = (void *) GetProcAddress(hkernel32, "ResetWriteWatch"); + pGetLargePageMinimum = (void *)GetProcAddress(hkernel32, "GetLargePageMinimum"); pIsWow64Process = (void *)GetProcAddress( hkernel32, "IsWow64Process" ); pNtAreMappedFilesTheSame = (void *)GetProcAddress( hntdll, "NtAreMappedFilesTheSame" ); pNtCreateSection = (void *)GetProcAddress( hntdll, "NtCreateSection" ); @@ -4834,6 +4850,7 @@ START_TEST(virtual) test_IsBadWritePtr(); test_IsBadCodePtr(); test_write_watch(); + test_largepages(); test_PrefetchVirtualMemory(); test_ReadProcessMemory(); test_FlushProcessWriteBuffers(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
From: Alexandre Julliard <julliard@winehq.org> --- dlls/kernel32/tests/virtual.c | 5 +++++ dlls/kernelbase/memory.c | 3 ++- include/memoryapi.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index c6e8e2306bc..42b52e468d1 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -30,6 +30,7 @@ #include "winerror.h" #include "winuser.h" #include "excpt.h" +#include "ddk/wdm.h" #include "wine/test.h" #define NUM_THREADS 4 @@ -2425,6 +2426,7 @@ static void test_write_watch(void) static void test_largepages(void) { + const KUSER_SHARED_DATA *user_shared_data = (void *)0x7ffe0000; SIZE_T size; if (!pGetLargePageMinimum) { @@ -2435,6 +2437,9 @@ static void test_largepages(void) ok((size == 0) || (size == 2*1024*1024) || (size == 4*1024*1024), "GetLargePageMinimum reports %Id size\n", size); + + ok( user_shared_data->LargePageMinimum == size, "wrong large page minimum %lx / %Ix\n", + user_shared_data->LargePageMinimum, size ); } #if defined(__i386__) || defined(__x86_64__) diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index ad61f786798..2ce2dcad30e 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -40,6 +40,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(heap); WINE_DECLARE_DEBUG_CHANNEL(virtual); WINE_DECLARE_DEBUG_CHANNEL(globalmem); +static const struct _KUSER_SHARED_DATA *user_shared_data = (struct _KUSER_SHARED_DATA *)0x7ffe0000; static CRITICAL_SECTION memstatus_section; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -150,7 +151,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH FlushInstructionCache( HANDLE process, LPCVOID add */ SIZE_T WINAPI GetLargePageMinimum(void) { - return 2 * 1024 * 1024; + return user_shared_data->LargePageMinimum; } diff --git a/include/memoryapi.h b/include/memoryapi.h index 79c01aaed23..6d48d6126f3 100644 --- a/include/memoryapi.h +++ b/include/memoryapi.h @@ -50,6 +50,7 @@ typedef struct WIN32_MEMORY_REGION_INFORMATION WINBASEAPI HANDLE WINAPI CreateFileMapping2(HANDLE,LPSECURITY_ATTRIBUTES,ULONG,ULONG,ULONG,ULONG64,const WCHAR*,MEM_EXTENDED_PARAMETER*,ULONG); WINBASEAPI DWORD WINAPI DiscardVirtualMemory(void *addr, SIZE_T size); +WINBASEAPI SIZE_T WINAPI GetLargePageMinimum(void); WINBASEAPI BOOL WINAPI QueryVirtualMemoryInformation(HANDLE process,const void *addr, WIN32_MEMORY_INFORMATION_CLASS info_class, void *info, SIZE_T size, SIZE_T *ret_size); #ifdef __cplusplus -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
From: Alexandre Julliard <julliard@winehq.org> --- dlls/kernel32/tests/virtual.c | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 42b52e468d1..981de4b6560 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -580,6 +580,73 @@ static void test_VirtualAlloc(void) ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %ld, expected ERROR_INVALID_PARAMETER\n", GetLastError()); ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); + + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, 0x2000, MEM_PHYSICAL, PAGE_READWRITE ), "MEM_PHYSICAL succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, 0x2000, MEM_RESERVE | MEM_COMMIT | MEM_PHYSICAL, PAGE_READWRITE ), + "MEM_PHYSICAL succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + addr1 = VirtualAlloc( 0, 0x2000, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE ); + todo_wine + ok( addr1 != NULL, "MEM_PHYSICAL failed err %ld\n", GetLastError() ); + if (addr1) + ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); + + if (pGetLargePageMinimum && pGetLargePageMinimum()) + { + SIZE_T size = pGetLargePageMinimum(); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, size, MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, size, MEM_RESERVE | MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == ERROR_PRIVILEGE_NOT_HELD), + "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, size / 2, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == ERROR_PRIVILEGE_NOT_HELD), + "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, size + size / 2, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == ERROR_PRIVILEGE_NOT_HELD), + "got %ld\n", GetLastError()); + ok( !VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_LARGE_PAGES succeeded\n" ); + todo_wine + ok( GetLastError() == ERROR_PRIVILEGE_NOT_HELD, "got %ld\n", GetLastError()); + + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, size, MEM_PHYSICAL | MEM_LARGE_PAGES, PAGE_READWRITE ), + "MEM_PHYSICAL | MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, 0x2000, MEM_RESERVE | MEM_PHYSICAL | MEM_LARGE_PAGES, + PAGE_READWRITE ), "MEM_PHYSICAL | MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + ok( !VirtualAlloc( 0, 0x2000, MEM_RESERVE | MEM_COMMIT | MEM_PHYSICAL | MEM_LARGE_PAGES, + PAGE_READWRITE ), "MEM_PHYSICAL | MEM_LARGE_PAGES succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); + SetLastError( 0xdeadbeef ); + /* only 64K alignment is required */ + addr1 = VirtualAlloc( 0, 0x10000, MEM_RESERVE | MEM_PHYSICAL | MEM_LARGE_PAGES, PAGE_READWRITE ); + todo_wine + ok( addr1 != NULL || broken(!addr1 && GetLastError() == ERROR_INVALID_PARAMETER), + "MEM_PHYSICAL | MEM_LARGE_PAGES failed err %ld\n", GetLastError() ); + if (addr1) ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); + SetLastError( 0xdeadbeef ); + addr1 = VirtualAlloc( 0, 0x10000, MEM_RESERVE | MEM_COMMIT | MEM_PHYSICAL | MEM_LARGE_PAGES, PAGE_READWRITE ); + todo_wine + ok( addr1 != NULL || broken(!addr1 && GetLastError() == ERROR_INVALID_PARAMETER), + "MEM_PHYSICAL | MEM_LARGE_PAGES failed err %ld\n", GetLastError() ); + if (addr1) ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); + } } static void test_MapViewOfFile(void) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
From: Alexandre Julliard <julliard@winehq.org> --- dlls/kernel32/tests/virtual.c | 1 - dlls/ntdll/unix/virtual.c | 15 +++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 981de4b6560..1c45bcd5ca4 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -618,7 +618,6 @@ static void test_VirtualAlloc(void) "got %ld\n", GetLastError()); ok( !VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE ), "MEM_LARGE_PAGES succeeded\n" ); - todo_wine ok( GetLastError() == ERROR_PRIVILEGE_NOT_HELD, "got %ld\n", GetLastError()); SetLastError( 0xdeadbeef ); diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 42eb1f6bb9f..bb2ea240a6a 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -5171,7 +5171,12 @@ static NTSTATUS allocate_virtual_memory( void **ret, SIZE_T *size_ptr, ULONG typ WARN("called with wrong alloc type flags (%08x) !\n", type); return STATUS_INVALID_PARAMETER; } - + if (type & MEM_LARGE_PAGES) + { + if (size & (user_shared_data->LargePageMinimum - 1)) return STATUS_INVALID_PARAMETER; + if (!(type & MEM_COMMIT)) return STATUS_INVALID_PARAMETER; + return STATUS_PRIVILEGE_NOT_HELD; + } if (type & MEM_RESERVE_PLACEHOLDER && (protect != PAGE_NOACCESS)) return STATUS_INVALID_PARAMETER; if (!arm64ec_view && (attributes & MEM_EXTENDED_PARAMETER_EC_CODE)) return STATUS_INVALID_PARAMETER; @@ -5252,7 +5257,8 @@ static NTSTATUS allocate_virtual_memory( void **ret, SIZE_T *size_ptr, ULONG typ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR zero_bits, SIZE_T *size_ptr, ULONG type, ULONG protect ) { - static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN | MEM_WRITE_WATCH | MEM_RESET; + static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_TOP_DOWN | + MEM_LARGE_PAGES | MEM_WRITE_WATCH; ULONG_PTR limit; TRACE("%p %p %08lx %x %08x\n", process, *ret, *size_ptr, type, protect ); @@ -5389,8 +5395,9 @@ NTSTATUS WINAPI NtAllocateVirtualMemoryEx( HANDLE process, PVOID *ret, SIZE_T *s ULONG protect, MEM_EXTENDED_PARAMETER *parameters, ULONG count ) { - static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN | MEM_WRITE_WATCH - | MEM_RESET | MEM_RESERVE_PLACEHOLDER | MEM_REPLACE_PLACEHOLDER; + static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_TOP_DOWN | + MEM_LARGE_PAGES | MEM_WRITE_WATCH | + MEM_RESERVE_PLACEHOLDER | MEM_REPLACE_PLACEHOLDER; ULONG_PTR limit_low = 0; ULONG_PTR limit_high = 0; ULONG_PTR align = 0; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
From: Alexandre Julliard <julliard@winehq.org> --- dlls/kernel32/tests/virtual.c | 4 ---- dlls/ntdll/unix/virtual.c | 13 ++++++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 1c45bcd5ca4..88aac75e6bf 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -589,9 +589,7 @@ static void test_VirtualAlloc(void) "MEM_PHYSICAL succeeded\n" ); ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError()); addr1 = VirtualAlloc( 0, 0x2000, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE ); - todo_wine ok( addr1 != NULL, "MEM_PHYSICAL failed err %ld\n", GetLastError() ); - if (addr1) ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); if (pGetLargePageMinimum && pGetLargePageMinimum()) @@ -635,13 +633,11 @@ static void test_VirtualAlloc(void) SetLastError( 0xdeadbeef ); /* only 64K alignment is required */ addr1 = VirtualAlloc( 0, 0x10000, MEM_RESERVE | MEM_PHYSICAL | MEM_LARGE_PAGES, PAGE_READWRITE ); - todo_wine ok( addr1 != NULL || broken(!addr1 && GetLastError() == ERROR_INVALID_PARAMETER), "MEM_PHYSICAL | MEM_LARGE_PAGES failed err %ld\n", GetLastError() ); if (addr1) ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); SetLastError( 0xdeadbeef ); addr1 = VirtualAlloc( 0, 0x10000, MEM_RESERVE | MEM_COMMIT | MEM_PHYSICAL | MEM_LARGE_PAGES, PAGE_READWRITE ); - todo_wine ok( addr1 != NULL || broken(!addr1 && GetLastError() == ERROR_INVALID_PARAMETER), "MEM_PHYSICAL | MEM_LARGE_PAGES failed err %ld\n", GetLastError() ); if (addr1) ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index bb2ea240a6a..d6038c4dcb6 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -5171,11 +5171,18 @@ static NTSTATUS allocate_virtual_memory( void **ret, SIZE_T *size_ptr, ULONG typ WARN("called with wrong alloc type flags (%08x) !\n", type); return STATUS_INVALID_PARAMETER; } - if (type & MEM_LARGE_PAGES) + switch (type & (MEM_PHYSICAL | MEM_LARGE_PAGES)) { + case MEM_PHYSICAL: + if (type & (MEM_COMMIT | MEM_RESET)) return STATUS_INVALID_PARAMETER; + break; + case MEM_LARGE_PAGES: if (size & (user_shared_data->LargePageMinimum - 1)) return STATUS_INVALID_PARAMETER; if (!(type & MEM_COMMIT)) return STATUS_INVALID_PARAMETER; return STATUS_PRIVILEGE_NOT_HELD; + case MEM_PHYSICAL | MEM_LARGE_PAGES: + if (size & granularity_mask) return STATUS_INVALID_PARAMETER; + break; } if (type & MEM_RESERVE_PLACEHOLDER && (protect != PAGE_NOACCESS)) return STATUS_INVALID_PARAMETER; if (!arm64ec_view && (attributes & MEM_EXTENDED_PARAMETER_EC_CODE)) return STATUS_INVALID_PARAMETER; @@ -5258,7 +5265,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR z SIZE_T *size_ptr, ULONG type, ULONG protect ) { static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_TOP_DOWN | - MEM_LARGE_PAGES | MEM_WRITE_WATCH; + MEM_PHYSICAL | MEM_LARGE_PAGES | MEM_WRITE_WATCH; ULONG_PTR limit; TRACE("%p %p %08lx %x %08x\n", process, *ret, *size_ptr, type, protect ); @@ -5396,7 +5403,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemoryEx( HANDLE process, PVOID *ret, SIZE_T *s ULONG count ) { static const ULONG type_mask = MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_TOP_DOWN | - MEM_LARGE_PAGES | MEM_WRITE_WATCH | + MEM_PHYSICAL | MEM_LARGE_PAGES | MEM_WRITE_WATCH | MEM_RESERVE_PLACEHOLDER | MEM_REPLACE_PLACEHOLDER; ULONG_PTR limit_low = 0; ULONG_PTR limit_high = 0; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11728
participants (2)
-
Alexandre Julliard -
Alexandre Julliard (@julliard)