Commit 685f1b6b authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Catch MEM_EXTENDED_PARAMETER duplicates for all types.

parent d225fb8e
...@@ -293,7 +293,7 @@ static void check_region_size_(void *p, SIZE_T s, unsigned int line) ...@@ -293,7 +293,7 @@ static void check_region_size_(void *p, SIZE_T s, unsigned int line)
static void test_NtAllocateVirtualMemoryEx(void) static void test_NtAllocateVirtualMemoryEx(void)
{ {
MEM_EXTENDED_PARAMETER ext; MEM_EXTENDED_PARAMETER ext[2];
SIZE_T size, size2; SIZE_T size, size2;
char *p, *p1, *p2; char *p, *p1, *p2;
NTSTATUS status; NTSTATUS status;
...@@ -425,13 +425,28 @@ static void test_NtAllocateVirtualMemoryEx(void) ...@@ -425,13 +425,28 @@ static void test_NtAllocateVirtualMemoryEx(void)
ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status); ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
} }
memset( &ext, 0, sizeof(ext) ); memset( ext, 0, sizeof(ext) );
ext.Type = MemExtendedParameterAttributeFlags; ext[0].Type = MemExtendedParameterAttributeFlags;
ext.ULong = MEM_EXTENDED_PARAMETER_EC_CODE; ext[0].ULong = 0;
ext[1].Type = MemExtendedParameterAttributeFlags;
ext[1].ULong = 0;
size = 0x10000;
addr1 = NULL;
status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_RESERVE,
PAGE_EXECUTE_READWRITE, ext, 1 );
ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
NtFreeVirtualMemory( NtCurrentProcess(), &addr1, &size, MEM_DECOMMIT );
status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_RESERVE,
PAGE_EXECUTE_READWRITE, ext, 2 );
ok(status == STATUS_INVALID_PARAMETER, "Unexpected status %08lx.\n", status);
memset( ext, 0, sizeof(ext) );
ext[0].Type = MemExtendedParameterAttributeFlags;
ext[0].ULong = MEM_EXTENDED_PARAMETER_EC_CODE;
size = 0x10000; size = 0x10000;
addr1 = NULL; addr1 = NULL;
status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_RESERVE, status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_RESERVE,
PAGE_EXECUTE_READWRITE, &ext, 1 ); PAGE_EXECUTE_READWRITE, ext, 1 );
#ifdef __x86_64__ #ifdef __x86_64__
if (pRtlGetNativeSystemInformation) if (pRtlGetNativeSystemInformation)
{ {
...@@ -453,7 +468,7 @@ static void test_NtAllocateVirtualMemoryEx(void) ...@@ -453,7 +468,7 @@ static void test_NtAllocateVirtualMemoryEx(void)
if (pRtlIsEcCode) ok( !pRtlIsEcCode( addr1 ), "EC code %p\n", addr1 ); if (pRtlIsEcCode) ok( !pRtlIsEcCode( addr1 ), "EC code %p\n", addr1 );
size = 0x1000; size = 0x1000;
status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_COMMIT, status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_COMMIT,
PAGE_EXECUTE_READWRITE, &ext, 1 ); PAGE_EXECUTE_READWRITE, ext, 1 );
ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status); ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
if (pRtlIsEcCode) if (pRtlIsEcCode)
{ {
...@@ -474,9 +489,9 @@ static void test_NtAllocateVirtualMemoryEx(void) ...@@ -474,9 +489,9 @@ static void test_NtAllocateVirtualMemoryEx(void)
if (pRtlIsEcCode) ok( pRtlIsEcCode( addr1 ), "not EC code %p\n", addr1 ); if (pRtlIsEcCode) ok( pRtlIsEcCode( addr1 ), "not EC code %p\n", addr1 );
size = 0x2000; size = 0x2000;
ext.ULong = 0; ext[0].ULong = 0;
status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_COMMIT, status = pNtAllocateVirtualMemoryEx( NtCurrentProcess(), &addr1, &size, MEM_COMMIT,
PAGE_EXECUTE_READWRITE, &ext, 1 ); PAGE_EXECUTE_READWRITE, ext, 1 );
ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status); ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
if (pRtlIsEcCode) if (pRtlIsEcCode)
{ {
...@@ -1607,6 +1622,47 @@ static void test_NtMapViewOfSectionEx(void) ...@@ -1607,6 +1622,47 @@ static void test_NtMapViewOfSectionEx(void)
CloseHandle(file); CloseHandle(file);
DeleteFileA(testfile); DeleteFileA(testfile);
file = CreateFileA( "c:\\windows\\system32\\version.dll", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0 );
ok( file != INVALID_HANDLE_VALUE, "Failed to open version.dll\n" );
mapping = CreateFileMappingA( file, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL );
ok( mapping != 0, "CreateFileMapping failed\n" );
memset(&ext, 0, sizeof(ext));
ext[0].Type = MemExtendedParameterImageMachine;
ext[0].ULong = 0;
ptr = NULL;
size = 0;
status = pNtMapViewOfSectionEx( mapping, process, &ptr, &offset, &size, 0, PAGE_READONLY, ext, 1 );
if (status != STATUS_INVALID_PARAMETER)
{
ok(status == STATUS_SUCCESS || status == STATUS_IMAGE_NOT_AT_BASE, "NtMapViewOfSection returned %08lx\n", status);
NtUnmapViewOfSection(process, ptr);
ext[1].Type = MemExtendedParameterImageMachine;
ext[1].ULong = 0;
ptr = NULL;
size = 0;
status = pNtMapViewOfSectionEx( mapping, process, &ptr, &offset, &size, 0, PAGE_READONLY, ext, 2 );
ok(status == STATUS_INVALID_PARAMETER, "NtMapViewOfSection returned %08lx\n", status);
ext[0].ULong = IMAGE_FILE_MACHINE_R3000;
ext[1].ULong = IMAGE_FILE_MACHINE_R4000;
ptr = NULL;
size = 0;
status = pNtMapViewOfSectionEx( mapping, process, &ptr, &offset, &size, 0, PAGE_READONLY, ext, 2 );
ok(status == STATUS_INVALID_PARAMETER, "NtMapViewOfSection returned %08lx\n", status);
ptr = NULL;
size = 0;
status = pNtMapViewOfSectionEx( mapping, process, &ptr, &offset, &size, 0, PAGE_READONLY, ext, 1 );
todo_wine
ok(status == STATUS_NOT_SUPPORTED, "NtMapViewOfSection returned %08lx\n", status);
}
else win_skip( "MemExtendedParameterImageMachine not supported\n" );
NtClose(mapping);
CloseHandle(file);
TerminateProcess(process, 0); TerminateProcess(process, 0);
CloseHandle(process); CloseHandle(process);
} }
......
...@@ -4152,18 +4152,21 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR z ...@@ -4152,18 +4152,21 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR z
static NTSTATUS get_extended_params( const MEM_EXTENDED_PARAMETER *parameters, ULONG count, static NTSTATUS get_extended_params( const MEM_EXTENDED_PARAMETER *parameters, ULONG count,
ULONG_PTR *limit, ULONG_PTR *align, ULONG *attributes ) ULONG_PTR *limit, ULONG_PTR *align, ULONG *attributes )
{ {
MEM_ADDRESS_REQUIREMENTS *r = NULL; ULONG i, present = 0;
ULONG i;
if (count && !parameters) return STATUS_INVALID_PARAMETER; if (count && !parameters) return STATUS_INVALID_PARAMETER;
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
if (parameters[i].Type >= 32) return STATUS_INVALID_PARAMETER;
if (present & (1u << parameters[i].Type)) return STATUS_INVALID_PARAMETER;
present |= 1u << parameters[i].Type;
switch (parameters[i].Type) switch (parameters[i].Type)
{ {
case MemExtendedParameterAddressRequirements: case MemExtendedParameterAddressRequirements:
if (r) return STATUS_INVALID_PARAMETER; {
r = parameters[i].Pointer; MEM_ADDRESS_REQUIREMENTS *r = parameters[i].Pointer;
if (r->LowestStartingAddress) if (r->LowestStartingAddress)
FIXME( "Not supported requirements LowestStartingAddress %p, Alignment %p.\n", FIXME( "Not supported requirements LowestStartingAddress %p, Alignment %p.\n",
...@@ -4188,6 +4191,7 @@ static NTSTATUS get_extended_params( const MEM_EXTENDED_PARAMETER *parameters, U ...@@ -4188,6 +4191,7 @@ static NTSTATUS get_extended_params( const MEM_EXTENDED_PARAMETER *parameters, U
} }
} }
break; break;
}
case MemExtendedParameterAttributeFlags: case MemExtendedParameterAttributeFlags:
*attributes = parameters[i].ULong; *attributes = parameters[i].ULong;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment