You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.5 KiB
108 lines
3.5 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
/* This test tests three things:
|
|
|
|
-First reserves memory using the knob (remember that memory is reserved for app use) and tries
|
|
to access the ranges that were reserved through the app. If it is unsuccessful the test should return 1
|
|
(the test checks that at least one of the ranges we reserved are actually allocated for the app)
|
|
|
|
-Second makes sure that there are no free pages within any of the ranges provided, returns 3 if there are.
|
|
|
|
-Third tests scenarios where error messages should be returned:
|
|
|
|
In winrange.address we ask to reserve the following addresses, and expect to see the log messages as stated:
|
|
|
|
0x57010000:0x57020000
|
|
0x57000000:0x57050000
|
|
Some part in the middle of the range has been allocated, expect:
|
|
winloader: PROCESS_ACCESSOR: Failed to allocate the range: 0x57010000:0x57020000
|
|
|
|
0x68000000:0x68100000
|
|
0x68000000:0x68050000
|
|
The entire range has been previously allocated, expect:
|
|
winloader: RESERVE MEMORY: Attempt to reserve memory at 0x068000000:0x068050000 - FAILED
|
|
|
|
0x39080000:0x39090000
|
|
0x39060000:0x39090000
|
|
The last part of the address was previously allocated, should not be able to allocate it, expect:
|
|
winloader: PROCESS_ACCESSOR: Failed to allocate the range: 0x39080000:0x39090000
|
|
|
|
0x40011000:0x40021000
|
|
This address is not aligned to the 64K we expect. Will allocate after fixing alignment, expect to see:
|
|
winloader: PROCESS_ACCESSOR: Base Address misaligned, rounding down to: 0x40010000
|
|
winloader: PROCESS_ACCESSOR: End Address misaligned, rounding up to: 0x40030000
|
|
|
|
0x40010000:0x40000000
|
|
Here begin>end expect:
|
|
ERROR: RESERVE MEMORY: Illegal range 0x040010000:0x040000000
|
|
*/
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <windows.h>
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
FILE *f = fopen(argv[1], "r");
|
|
int access_flag = atoi(argv[2]);
|
|
if (!f)
|
|
{
|
|
fprintf(stderr, "cannot open file %s\n", argv[1]);
|
|
return 2;
|
|
}
|
|
|
|
uintptr_t low = 0, high = 0, size = 0;
|
|
int tid;
|
|
char desc[64];
|
|
char * ptr = (char *)NULL;
|
|
|
|
SYSTEM_INFO si;
|
|
GetSystemInfo(&si);
|
|
int page_size = si.dwPageSize;
|
|
bool knobSuccess = false;
|
|
bool noFree = true;
|
|
while (!feof(f))
|
|
{
|
|
fscanf(f, "%Ix %Ix %s %d", &low, &high, desc, &tid);
|
|
|
|
if (high<low) {
|
|
continue;
|
|
}
|
|
|
|
for (uintptr_t i = low; i < high; i += page_size)
|
|
{
|
|
PMEMORY_BASIC_INFORMATION reg = (PMEMORY_BASIC_INFORMATION)malloc(sizeof(MEMORY_BASIC_INFORMATION));
|
|
VirtualQuery((void*)(i), reg, sizeof(MEMORY_BASIC_INFORMATION));
|
|
ptr = (char*)(i);
|
|
if (access_flag == 1 && reg->Protect == PAGE_EXECUTE_READWRITE)
|
|
{ //Protection should be PAGE_EXECUTE_READWRITE if the region was allocated through reserve_mem.
|
|
*ptr = 0;
|
|
knobSuccess = true;
|
|
}
|
|
if (access_flag = 1 && reg->State == MEM_FREE)
|
|
{ //there is a free page within the range
|
|
noFree = false;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
if (knobSuccess == false && access_flag == 1) {
|
|
return 1;
|
|
}
|
|
if (noFree == false && access_flag == 1) {
|
|
return 3;
|
|
}
|
|
|
|
return 0;
|
|
} |