|
|
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#define DbgPrint printf
#define NtTerminateProcess(a,b) ExitProcess(b)
__cdecl main( )
{
SIZE_T size, Size; PVOID BaseAddress; LONG i, j; PULONG p4, p3, p2, p1, oldp1, vp1; SIZE_T Size1, Size2, Size3; NTSTATUS status, alstatus; HANDLE CurrentProcessHandle; HANDLE GiantSection; HANDLE Section2, Section4; MEMORY_BASIC_INFORMATION MemInfo; ULONG OldProtect; STRING Name3; HANDLE Section1; OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES Object1Attributes; SIZE_T ViewSize; LARGE_INTEGER Offset; LARGE_INTEGER SectionSize; UNICODE_STRING Unicode; LOGICAL Os64Bit; SYSTEM_PROCESSOR_INFORMATION SysInfo;
Os64Bit = FALSE;
//
// If we're running on a 64-bit OS, make large memory calls.
//
status = NtQuerySystemInformation (SystemProcessorInformation, &SysInfo, sizeof(SYSTEM_PROCESSOR_INFORMATION), NULL);
if (NT_SUCCESS(status)) { if (SysInfo.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || SysInfo.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) { Os64Bit = TRUE; } }
DbgPrint("****Memory Management Tests (%d-bit) - AllocVm, FreeVm, ProtectVm, QueryVm\n", Os64Bit == TRUE ? 64 : 32);
CurrentProcessHandle = NtCurrentProcess();
p1 = (PULONG)0x20020000; Size1 = 0xbc0000; DbgPrint(" Test 1 - "); alstatus = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(alstatus)) { DbgPrint("Failed allocate with status %lx start %p size %p\n", alstatus, p1, (void *)Size1);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 2 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p1, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status) || (MemInfo.RegionSize != Size1) || (MemInfo.BaseAddress != p1) || (MemInfo.Protect != PAGE_READWRITE) || (MemInfo.Type != MEM_PRIVATE) || (MemInfo.State != MEM_COMMIT)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p1, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 3 - "); p2 = NULL; Size2 = 0x100000; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, 3, &Size2, MEM_TOP_DOWN | MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed allocate with status %lx start %p size %p\n", status, p2, (void *)Size2);
} else { DbgPrint("Succeeded\n"); }
//
// Touch every other page.
//
DbgPrint(" Test 4 - "); try { vp1 = p2 + 3000; while (vp1 < (p2 + (Size2 / sizeof(ULONG)))) { *vp1 = 938; vp1 += 3000; }
DbgPrint("Succeeded\n");
} except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("Failed with an exception\n"); }
//
// Decommit pages.
//
DbgPrint(" Test 5 - "); Size3 = Size2 - 5044; vp1 = p2 + 3000; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, &Size3, MEM_DECOMMIT);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
//
// Split the memory block using MEM_RELEASE.
//
DbgPrint(" Test 6 - "); vp1 = p2 + 5000; Size3 = Size2 - 50000; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&vp1, &Size3, MEM_RELEASE);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 7 - "); vp1 = p2 + 3000; Size3 = 41; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&vp1, &Size3, MEM_RELEASE);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
//
// free every page, ignore the status.
//
vp1 = p2; Size3 = 30; while (vp1 < (p2 + (Size2 / sizeof(ULONG)))) { status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&vp1, &Size3, MEM_RELEASE); vp1 += 128; }
DbgPrint(" Test 8 - "); p2 = NULL; Size2 = 0x10000; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, 3, &Size2, MEM_TOP_DOWN | MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed allocate with status %lx start %p size %p\n", status, p2, (void *)Size1);
} else { if (p2 < (PULONG)0x1fff0000) { DbgPrint("Failed allocate at top of memory at %p\n", p2); }
status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, &Size2, MEM_RELEASE);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded with allocation at %p\n", p2); } }
DbgPrint(" Test 9 - "); if (NT_SUCCESS(alstatus)) { status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1, MEM_RELEASE);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
} else { DbgPrint("Failed allocate with status %lx\n", alstatus); }
DbgPrint(" Test 10 - "); p1 = NULL; Size1 = 16 * 4096; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size1, MEM_RESERVE, PAGE_READWRITE | PAGE_GUARD);
if (!NT_SUCCESS(status)) { DbgPrint("Failed created with status %lx start %p size %p\n", status, p1, (void *)Size1);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 11 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p1, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status) || (MemInfo.RegionSize != Size1) || (MemInfo.BaseAddress != p1) || (MemInfo.AllocationProtect != (PAGE_READWRITE | PAGE_GUARD)) || (MemInfo.Protect != 0) || (MemInfo.Type != MEM_PRIVATE) || (MemInfo.State != MEM_RESERVE)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p1, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx alloc_protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.AllocationProtect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 12 - "); Size2 = 8192; oldp1 = p1; p1 = p1 + 14336; // 64k -8k /4
status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed creat with status %lx start %p size %p\n", status, p1, (void *)Size1);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 13 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, oldp1, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status) || (MemInfo.RegionSize != 56*1024) || (MemInfo.BaseAddress != oldp1) || (MemInfo.AllocationProtect != (PAGE_READWRITE | PAGE_GUARD)) || (MemInfo.Protect != 0) || (MemInfo.Type != MEM_PRIVATE) || (MemInfo.State != MEM_RESERVE)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, oldp1, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx alloc_protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.AllocationProtect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 14 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p1, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status) || (MemInfo.RegionSize != Size2) || (MemInfo.BaseAddress != p1) || (MemInfo.Protect != PAGE_EXECUTE_READWRITE) || (MemInfo.Type != MEM_PRIVATE) || (MemInfo.State != MEM_COMMIT) || (MemInfo.AllocationBase != oldp1)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, oldp1, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 15 - "); Size1 = Size2; status = NtProtectVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1, PAGE_READONLY | PAGE_NOCACHE, &OldProtect);
if ((!NT_SUCCESS(status)) || (OldProtect != PAGE_EXECUTE_READWRITE)) { DbgPrint("Failed protect with status %lx base %p size %p old protect %lx\n", status, p1, (void *)Size1, OldProtect);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 16 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p1, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if ((!NT_SUCCESS(status)) || (MemInfo.Protect != (PAGE_NOCACHE | PAGE_READONLY))) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p1, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 17 - "); i = *p1; status = NtProtectVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1, PAGE_NOACCESS | PAGE_NOCACHE, &OldProtect);
if (status != STATUS_INVALID_PAGE_PROTECTION) { DbgPrint("Failed protect with status %lx, base %p, size %p, old protect %lx\n", status, p1, (void *)Size1, OldProtect);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 18 - "); status = NtProtectVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1, PAGE_READONLY, &OldProtect);
if ((!NT_SUCCESS(status)) || (OldProtect != (PAGE_NOCACHE | PAGE_READONLY))) { DbgPrint("Failed protect with status %lx base %p size %p old protect %lx\n", status, p1, (void *)Size1, OldProtect);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 19 - "); status = NtProtectVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1, PAGE_READWRITE, &OldProtect);
if ((!NT_SUCCESS(status)) || (OldProtect != (PAGE_READONLY))) { DbgPrint("Failed protect with status %lx base %p size %p old protect %lx\n", status, p1, (void *)Size1, OldProtect);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 20 - "); for (i = 1; i < 12; i++) { p2 = NULL; Size2 = i * 4096; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, 0, &Size2, MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed creat with status %lx start %p size %p\n", status, p2, (void *)Size2);
break;
}
if (i == 4) { p3 = p2; }
if (i == 8) { Size3 = 12000; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p3, &Size3, MEM_RELEASE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed free with status %lx start %p size %p\n", status, p3, (void *)Size3);
break; } } }
if (i == 12) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 21 - "); p3 = p1 + 8 * 1024; status = NtQueryVirtualMemory(CurrentProcessHandle, p3, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p3, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 22 - "); p3 = p1 - 8 * 1024; status = NtQueryVirtualMemory(CurrentProcessHandle, p3, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p3, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 23 - "); Size3 = 16 * 4096; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p3, &Size3, MEM_RELEASE);
if (status != STATUS_UNABLE_TO_FREE_VM) { DbgPrint("Failed free with status %lx start %p size %p\n", status, p3, (void *)Size3);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 24 - "); Size3 = 1 * 4096; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p3, &Size3, MEM_RELEASE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed free with status %lx start %p size %p\n", status, p3, (void *)Size3);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 25 - "); p3 = NULL; Size3 = 300 * 4096; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p3, 0, &Size3, MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed creat with status %lx start %p size %p\n", status, p3, (void *)Size3);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 26 - "); p1 = p3; p2 = ((PULONG)((PUCHAR)p3 + Size3)); p4 = p1; j = 0; while (p3 < p2) { j += 1; if (j % 8 == 0) { if (*p4 != (ULONG)((ULONG_PTR)p4)) { DbgPrint("Failed bad value in xcell %p value is %lx\n", p4, *p4); break; }
p4 += 1; *p4 = (ULONG)((ULONG_PTR)p4); p4 = p4 + 1026; }
*p3 = (ULONG)((ULONG_PTR)p3); p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 27 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p3, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed query with status %lx address %p Base %p size %p\n", status, p3, MemInfo.BaseAddress, (void *)MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 28 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in 1cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 29 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in 2cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 30 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in 3cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 31 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in 4cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 32 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in 5cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 33 - "); p3 = p1; while (p3 < p2) { if (*p3 != (ULONG)((ULONG_PTR)p3)) { DbgPrint("Failed bad value in cell %p value is %lx\n", p3, *p3); break; }
p3 += 1027; }
if (p3 >= p2) { DbgPrint("Succeeded\n"); }
//
// Check physical frame mapping.
//
DbgPrint(" Test 34 - "); RtlInitAnsiString(&Name3, "\\Device\\PhysicalMemory"); RtlAnsiStringToUnicodeString(&Unicode, &Name3, TRUE); InitializeObjectAttributes(&ObjectAttributes, &Unicode, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = NtOpenSection(&Section1, SECTION_MAP_READ | SECTION_MAP_WRITE, &ObjectAttributes);
RtlFreeUnicodeString(&Unicode); if (!NT_SUCCESS(status)) { DbgPrint("Failed open physical section with status %lx\n", status); DbgPrint(" skipping test 35\n"); goto Test36;
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 35 - "); p1 = NULL; Offset.QuadPart = 0x810ff033; ViewSize = 300 * 4096; status = NtMapViewOfSection(Section1, NtCurrentProcess(), (PVOID *)&p1, 0, ViewSize, &Offset, &ViewSize, ViewUnmap, 0, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed map physical section %lx offset %p base %p\n", status, Offset.QuadPart, p1);
} else { DbgPrint("Succeeded\n"); }
Test36: DbgPrint(" Test 36 - "); p1 = NULL; Size1 = 8 * 1024 * 1024; alstatus = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(alstatus)) { DbgPrint("Failed created with status %lx start %p size %p\n", alstatus, p1, Size1);
} else { DbgPrint("Succeeded\n"); }
try { RtlZeroMemory(p1, Size1);
} except(EXCEPTION_EXECUTE_HANDLER) { }
DbgPrint(" Test 37 - "); Size1 -= 20000; (PUCHAR)p1 += 5000; status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, &Size1 , MEM_DECOMMIT);
if (!(NT_SUCCESS(status))) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 38 - "); Size1 -= 20000; (PUCHAR)p1 += 5000; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed create with status %lx start %p size %p\n", status, p1, Size1);
} else { DbgPrint("Succeeded\n"); }
try { RtlZeroMemory(p1, Size1);
} except(EXCEPTION_EXECUTE_HANDLER) { }
DbgPrint(" Test 39 - "); Size1 = 28 * 4096; p1 = NULL; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size1, MEM_COMMIT, PAGE_READWRITE | PAGE_GUARD);
if (!NT_SUCCESS(status)) { DbgPrint("Failed create with status %lx start %p size %p\n", status, p1, Size1);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 40 - "); try {
//
// attempt to write the guard page.
//
*p1 = 973; DbgPrint("Failed guard page exception did not occur\n");
} except (EXCEPTION_EXECUTE_HANDLER) { status = GetExceptionCode(); if (status != STATUS_GUARD_PAGE_VIOLATION) { DbgPrint("Failed incorrect guard exception code %lx\n", status);
} else { DbgPrint("Succeeded\n"); } }
DbgPrint(" Test 41 - "); p2 = NULL; Size2 = 200 * 1024 * 1024; //200MB
status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, 0, &Size2, MEM_COMMIT, PAGE_READWRITE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed allocate with status %lx\n", status);
} else { status = NtFreeVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, &Size2, MEM_RELEASE);
if (!NT_SUCCESS(status)) { DbgPrint("Failed free with status %lx\n", status);
} else { DbgPrint("Succeeded\n"); } }
//
// Create a giant section 2gb on 32-bit system, 4gb on 64_bit system.
//
DbgPrint(" Test 42 - "); InitializeObjectAttributes(&Object1Attributes, NULL, 0, NULL, NULL);
#if defined(_WIN64)
SectionSize.QuadPart = 0xffffffff;
#else
SectionSize.QuadPart = 0x7f000000;
#endif
status = NtCreateSection(&GiantSection, SECTION_MAP_READ | SECTION_MAP_WRITE, &Object1Attributes, &SectionSize, PAGE_READWRITE, SEC_RESERVE, NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed create big section with status %lx\n", status); DbgPrint(" skipping test 43\n"); goto Test44;
} else { DbgPrint("Succeeded\n"); }
//
// Attempt to map the section (this should fail).
//
DbgPrint(" Test 43 - "); p1 = NULL; ViewSize = 0; status = NtMapViewOfSection(GiantSection, CurrentProcessHandle, (PVOID *)&p1, 0L, 0, 0, &ViewSize, ViewUnmap, 0, PAGE_READWRITE );
if (status != STATUS_NO_MEMORY) { DbgPrint("Failed map big section status %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
Test44: DbgPrint(" Test 44 - "); i = 0;
#if defined(_WIN64)
if (Os64Bit == TRUE) { Size2 = (SIZE_T)(32i64 * 1024 * 1024 * 1024 + 9938); } else { Size2 = 8 * 1024 * 1024 + 9938; } #else
Size2 = 8 * 1024 * 1024 + 9938; #endif
do { p2 = NULL; i += 1; status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p2, 0, &Size2, MEM_RESERVE, PAGE_READWRITE);
} while (NT_SUCCESS(status));
if (status != STATUS_NO_MEMORY) { DbgPrint("Failed with status %lx after %d allocations\n", status, i);
} else { DbgPrint("Succeeded with %d allocations\n", i); }
//
// we pass an address of 1, so mm will round it down to 0. if we
// passed 0, it looks like a not present argument
//
// N.B. We have to make two separate calls to allocatevm, because
// we want a specific virtual address. If we don't first reserve
// the address, the mm fails the commit call.
//
DbgPrint(" Test 45 - "); Size = 50 * 1024; size = Size - 1; BaseAddress = (PVOID)1; status = NtAllocateVirtualMemory(NtCurrentProcess(), &BaseAddress, 0L, &size, MEM_RESERVE, PAGE_READWRITE );
if (!NT_SUCCESS(status)) { DbgPrint("Failed reserve with status = %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 46 - "); size = Size - 1; BaseAddress = (PVOID)1; status = NtAllocateVirtualMemory(NtCurrentProcess(), &BaseAddress, 0L, &size, MEM_COMMIT, PAGE_READWRITE );
if (!NT_SUCCESS(status)) { DbgPrint("Failed commit with status = %lx\n", status);
} else { DbgPrint("Succeeded\n"); }
//
// Test MEM_DOS_LIM support.
//
#ifdef i386
DbgPrint(" Test 47 - "); InitializeObjectAttributes(&Object1Attributes, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL);
SectionSize.QuadPart = 1575757, status = NtCreateSection(&Section4, SECTION_MAP_READ | SECTION_MAP_WRITE, &Object1Attributes, &SectionSize, PAGE_READWRITE, SEC_COMMIT, NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed create section with status %lx section handle %lx\n", status, (ULONG)Section4);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 48 - "); p3 = (PVOID)0x9001000; ViewSize = 8000; status = NtMapViewOfSection(Section4, CurrentProcessHandle, (PVOID *)&p3, 0L, 0, 0, &ViewSize, ViewUnmap, MEM_DOS_LIM, PAGE_READWRITE );
if (!NT_SUCCESS(status)) { DbgPrint("Failed map section with status %lx base %lx size %lx\n", status, (ULONG)p3, ViewSize);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 49 - "); p2 = (PVOID)0x9003000; ViewSize = 8000; status = NtMapViewOfSection(Section4, CurrentProcessHandle, (PVOID *)&p2, 0L, 0, 0, &ViewSize, ViewUnmap, MEM_DOS_LIM, PAGE_READWRITE );
if (!NT_SUCCESS(status)) { DbgPrint("Failed map section with status %lx base %lx size %lx\n", status, (ULONG)p3, ViewSize);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 50 - "); status = NtQueryVirtualMemory(CurrentProcessHandle, p3, MemoryBasicInformation, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION), NULL);
if (!NT_SUCCESS(status)) { DbgPrint("Failed query with status %lx address %lx Base %lx size %lx\n", status, p1, MemInfo.BaseAddress, MemInfo.RegionSize);
DbgPrint(" state %lx protect %lx type %lx\n", MemInfo.State, MemInfo.Protect, MemInfo.Type);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 51 - "); *p3 = 98; if (*p3 != *p2) { DbgPrint("Failed compare with %lx %lx\n", *p3, *p2);
} else { DbgPrint("Succeeded\n"); }
DbgPrint(" Test 52 - "); Size2 = 8; p1 = (PVOID)((ULONG)p2 - 0x3000); status = NtAllocateVirtualMemory(CurrentProcessHandle, (PVOID *)&p1, 0, &Size2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NT_SUCCESS(status)) { DbgPrint("Failed create with status %lx start %lx size %lx\n", status, p1, Size1);
} else { DbgPrint("Succeeded\n"); }
#endif
DbgPrint("****End of Memory Management Tests\n"); return 0; }
|