1 #ifndef _APITEST_GUARD_H 2 #define _APITEST_GUARD_H 3 4 #include <ndk/mmfuncs.h> 5 #include <ndk/psfuncs.h> 6 7 static 8 inline 9 PVOID 10 AllocateGuarded( 11 _In_ SIZE_T SizeRequested) 12 { 13 NTSTATUS Status; 14 SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE); 15 PVOID VirtualMemory = NULL; 16 PCHAR StartOfBuffer; 17 18 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_RESERVE, PAGE_NOACCESS); 19 20 if (!NT_SUCCESS(Status)) 21 return NULL; 22 23 Size -= PAGE_SIZE; 24 if (Size) 25 { 26 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE); 27 if (!NT_SUCCESS(Status)) 28 { 29 Size = 0; 30 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); 31 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status); 32 return NULL; 33 } 34 } 35 36 StartOfBuffer = VirtualMemory; 37 StartOfBuffer += Size - SizeRequested; 38 39 return StartOfBuffer; 40 } 41 42 static 43 inline 44 VOID 45 FreeGuarded( 46 _In_ PVOID Pointer) 47 { 48 NTSTATUS Status; 49 PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer); 50 SIZE_T Size = 0; 51 52 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); 53 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status); 54 } 55 56 static 57 inline 58 VOID 59 MakeReadOnly( 60 PVOID Pointer, 61 SIZE_T SizeRequested) 62 { 63 NTSTATUS Status; 64 SIZE_T Size = PAGE_ROUND_UP(SizeRequested); 65 PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer); 66 67 if (Size) 68 { 69 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE); 70 if (!NT_SUCCESS(Status)) 71 { 72 Size = 0; 73 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); 74 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status); 75 } 76 } 77 } 78 79 #endif /* _APITEST_GUARD_H */ 80