LPVOID VirtualInit (DWORD virtualPages, DWORD physicalPages) { /* Check for straight out wrong cases. */ if (virtualPages < physicalPages) { print_error("Fewer virtual pages than physical pages"); return NULL; } if (virtualPages > MAX_VIRTUAL_PAGES) { print_error("Too many virtual pages"); return NULL; } if (physicalPages > MAX_PHYSICAL_PAGES) { print_error("Too many physical pages"); return NULL; } /* First initialize global variables. */ crt_frame = -1; memory = NULL; physicalMemory = NULL; virtualMemory = NULL; memoryPages = physicalPages; swapPages = virtualPages; /* Try to set up files for use with memory.*/ hndRam = CreateFile(RAM_FILE, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hndRam == INVALID_HANDLE_VALUE) { error_message(__FILE__, __LINE__); return NULL; } hndSwap = CreateFile(SWAP_FILE, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hndSwap == INVALID_HANDLE_VALUE) { error_message(__FILE__, __LINE__); return NULL; } /*allocate memory in process space*/ memory = VirtualAlloc(memory, virtualPages * pageSize, MEM_COMMIT, PAGE_NOACCESS); if (memory == NULL) { error_message(__FILE__, __LINE__); return NULL; } /* Create file mappings. */ hndRamMapping = CreateFileMapping(hndRam, NULL, PAGE_READWRITE, 0, physicalPages * pageSize, NULL); if (hndRamMapping == NULL) { error_message(__FILE__, __LINE__); return NULL; } hndSwapMapping = CreateFileMapping(hndSwap, NULL, PAGE_READWRITE, 0, virtualPages * pageSize, NULL); if (hndSwapMapping == NULL) { error_message(__FILE__, __LINE__); return NULL; } /* map physical memory */ physicalMemory = (char*)MapViewOfFile(hndRamMapping, FILE_MAP_WRITE, 0, 0, 0); printf("\nPhysical memory at: 0x%x (NULL at: 0x%x)\n", physicalMemory, NULL); if (physicalMemory == NULL) { error_message(__FILE__, __LINE__); return NULL; } /* map virtual memory. */ virtualMemory = (char*)MapViewOfFile(hndSwapMapping, FILE_MAP_WRITE, 0, 0, 0); if (virtualMemory == NULL) { error_message(__FILE__, __LINE__); return NULL; } /*set interrupt handler*/ handler = AddVectoredExceptionHandler(1, PageFaultVectoredHandler); if (handler == NULL) { error_message(__FILE__, __LINE__); return NULL; } /* initialize data structures */ init_mem_pages(pages, MAX_PHYSICAL_PAGES); init_mem_frames(frames, MAX_VIRTUAL_PAGES); return memory; }