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