2005-05-10 22:30:58 -04:00
|
|
|
#include "../factor.h"
|
|
|
|
|
|
2006-02-13 02:46:07 -05:00
|
|
|
BOUNDED_BLOCK *alloc_bounded_block(CELL size)
|
2005-05-10 22:30:58 -04:00
|
|
|
{
|
2006-02-13 02:46:07 -05:00
|
|
|
SYSTEM_INFO si;
|
|
|
|
|
char *mem;
|
|
|
|
|
DWORD ignore;
|
|
|
|
|
|
|
|
|
|
GetSystemInfo(&si);
|
|
|
|
|
mem = (char *)VirtualAlloc(NULL, si.dwPageSize*2 + size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
2006-02-19 16:27:53 -05:00
|
|
|
if(!mem)
|
|
|
|
|
fatal_error("VirtualAlloc() failed in alloc_bounded_block()",0);
|
2006-02-13 02:46:07 -05:00
|
|
|
|
|
|
|
|
if (!VirtualProtect(mem, si.dwPageSize, PAGE_NOACCESS, &ignore))
|
|
|
|
|
fatal_error("Cannot allocate low guard page", (CELL)mem);
|
|
|
|
|
|
|
|
|
|
if (!VirtualProtect(mem+size+si.dwPageSize, si.dwPageSize, PAGE_NOACCESS, &ignore))
|
|
|
|
|
fatal_error("Cannot allocate high guard page", (CELL)mem);
|
|
|
|
|
|
2006-02-19 16:27:53 -05:00
|
|
|
BOUNDED_BLOCK *retval = safe_malloc(sizeof(BOUNDED_BLOCK));
|
2006-02-13 02:46:07 -05:00
|
|
|
|
|
|
|
|
retval->start = mem + si.dwPageSize;
|
|
|
|
|
retval->size = size;
|
|
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
2005-05-10 22:30:58 -04:00
|
|
|
|
2006-02-13 02:46:07 -05:00
|
|
|
void dealloc_bounded_block(BOUNDED_BLOCK *block)
|
|
|
|
|
{
|
2006-02-20 02:13:02 -05:00
|
|
|
|
|
|
|
|
SYSTEM_INFO si;
|
|
|
|
|
GetSystemInfo(&si);
|
|
|
|
|
if(!VirtualFree(block->start - si.dwPageSize, si.dwPageSize*2 + block->size, MEM_DECOMMIT))
|
|
|
|
|
fatal_error("VirtualFree() failed",0);
|
|
|
|
|
free(block);
|
2005-05-10 22:30:58 -04:00
|
|
|
}
|