windows-nt/Source/XPSP1/NT/sdktools/vmtests/poolkill.c
2020-09-26 16:20:57 +08:00

134 lines
3.6 KiB
C

#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((ULONG)(b))
__cdecl
main(
)
{
LONG i, j;
PULONG p4, p3, p2, p1, oldp1;
SIZE_T Size1;
NTSTATUS status;
HANDLE CurrentProcessHandle;
HANDLE GiantSection;
MEMORY_BASIC_INFORMATION MemInfo;
ULONG OldProtect;
STRING Name3;
HANDLE Section1;
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG ViewSize;
ULONG NumberOfAllocs = 0;
TIME DelayTime = {-15 * 1000 * 1000 * 10, -1};
OBJECT_ATTRIBUTES Object1Attributes;
LARGE_INTEGER SectionSize;
BOOL PrintedOnce = FALSE;
CurrentProcessHandle = NtCurrentProcess();
for(i = 0; i < 3; i += 1){
DbgPrint("Hello World...\n\n");
}
DbgPrint("allocating virtual memory\n");
for (;;) {
p1 = NULL;
Size1 = 800;
status = NtAllocateVirtualMemory(CurrentProcessHandle,
(PVOID *)&p1,
0,
&Size1,
MEM_RESERVE,
PAGE_READWRITE);
if (!NT_SUCCESS(status)) {
break;
}
if ((PrintedOnce == FALSE) &&
((ULONG_PTR)p1 >= 0x80000000)) {
printf("allocate high %p\n", p1);
PrintedOnce = TRUE;
}
NumberOfAllocs += 1;
}
DbgPrint("allocVM failed after %ld allocs of 800 bytes\n", NumberOfAllocs);
DbgPrint("created vm status %X start %p size %d\n",
status,
p1,
Size1);
for (i = 0; i < 4; i += 1) {
p1 = NULL;
Size1 = 800;
status = NtAllocateVirtualMemory(CurrentProcessHandle,
(PVOID *)&p1,
0,
&Size1,
MEM_RESERVE,
PAGE_READWRITE);
DbgPrint("created vm status %X start %p size %d\n",
status,
p1,
Size1);
}
DbgPrint("delaying for 15 seconds\n");
NtDelayExecution(FALSE, &DelayTime);
DbgPrint ("end of delay\n");
DbgPrint ("paged pool allocations\n");
NumberOfAllocs = 0;
for (;;) {
//
// Create a giant section (100mb)
//
InitializeObjectAttributes(&Object1Attributes,
NULL,
0,
NULL,
NULL);
SectionSize.QuadPart = (100 * 1024 * 1024);
status = NtCreateSection(&GiantSection,
SECTION_MAP_READ | SECTION_MAP_WRITE,
&Object1Attributes,
&SectionSize,
PAGE_READWRITE,
SEC_RESERVE,
NULL);
if (!NT_SUCCESS(status)) {
break;
}
NumberOfAllocs += 1;
}
DbgPrint("Create section failed after %ld creates of 2GB\n", NumberOfAllocs);
DbgPrint("create section status %X\n", status);
DbgPrint("delaying for 15 seconds\n");
NtDelayExecution(FALSE, &DelayTime);
DbgPrint("end of delay\n");
DbgPrint("that's all\n");
NtTerminateProcess(NtCurrentProcess(), STATUS_SUCCESS);
return 0;
}