| Index: handler/win/crashy_test_program.cc
|
| diff --git a/handler/win/crashy_test_program.cc b/handler/win/crashy_test_program.cc
|
| index 622a5e5df08d3218dbdd2e5d1a2ab7fca32992e2..638098a68ebeed8b643f34f896980eb1dfa0f918 100644
|
| --- a/handler/win/crashy_test_program.cc
|
| +++ b/handler/win/crashy_test_program.cc
|
| @@ -20,6 +20,7 @@
|
| #define STATUS_NO_SUCH_FILE static_cast<NTSTATUS>(0xC000000F)
|
| #endif
|
|
|
| +#include "base/basictypes.h"
|
| #include "base/logging.h"
|
| #include "client/crashpad_client.h"
|
| #include "tools/tool_support.h"
|
| @@ -35,6 +36,45 @@ ULONG RtlNtStatusToDosError(NTSTATUS status) {
|
| return rtl_nt_status_to_dos_error(status);
|
| }
|
|
|
| +void AllocateMemoryOfVariousProtections() {
|
| + SYSTEM_INFO system_info;
|
| + GetSystemInfo(&system_info);
|
| +
|
| + const size_t kPageSize = system_info.dwPageSize;
|
| +
|
| + const uint32_t kPageTypes[] = {
|
| + PAGE_NOACCESS,
|
| + PAGE_READONLY,
|
| + PAGE_READWRITE,
|
| + PAGE_EXECUTE,
|
| + PAGE_EXECUTE_READ,
|
| + PAGE_EXECUTE_READWRITE,
|
| +
|
| + // PAGE_NOACCESS is invalid with PAGE_GUARD.
|
| + PAGE_READONLY | PAGE_GUARD,
|
| + PAGE_READWRITE | PAGE_GUARD,
|
| + PAGE_EXECUTE | PAGE_GUARD,
|
| + PAGE_EXECUTE_READ | PAGE_GUARD,
|
| + PAGE_EXECUTE_READWRITE | PAGE_GUARD,
|
| + };
|
| +
|
| + // All of these allocations are leaked, we want to view them in windbg via
|
| + // !vprot.
|
| + void* reserve = VirtualAlloc(
|
| + nullptr, arraysize(kPageTypes) * kPageSize, MEM_RESERVE, PAGE_READWRITE);
|
| + PCHECK(reserve) << "VirtualAlloc MEM_RESERVE";
|
| + uintptr_t reserve_as_int = reinterpret_cast<uintptr_t>(reserve);
|
| +
|
| + for (size_t i = 0; i < arraysize(kPageTypes); ++i) {
|
| + void* result =
|
| + VirtualAlloc(reinterpret_cast<void*>(reserve_as_int + (kPageSize * i)),
|
| + kPageSize,
|
| + MEM_COMMIT,
|
| + kPageTypes[i]);
|
| + PCHECK(result) << "VirtualAlloc MEM_COMMIT " << i;
|
| + }
|
| +}
|
| +
|
| void SomeCrashyFunction() {
|
| // SetLastError and NTSTATUS so that we have something to view in !gle in
|
| // windbg. RtlNtStatusToDosError() stores STATUS_NO_SUCH_FILE into the
|
| @@ -61,6 +101,8 @@ int CrashyMain(int argc, char* argv[]) {
|
| return 1;
|
| }
|
|
|
| + AllocateMemoryOfVariousProtections();
|
| +
|
| SomeCrashyFunction();
|
|
|
| return 0;
|
|
|