7 hFactorDll = GetModuleHandle(FACTOR_DLL);
9 fatal_error("GetModuleHandle(\"" FACTOR_DLL_NAME "\") failed", 0);
12 void ffi_dlopen(F_DLL *dll)
14 dll->dll = LoadLibraryEx(alien_offset(dll->path), NULL, 0);
17 void *ffi_dlsym(F_DLL *dll, F_SYMBOL *symbol)
19 return GetProcAddress(dll ? (HMODULE)dll->dll : hFactorDll, symbol);
22 void ffi_dlclose(F_DLL *dll)
24 FreeLibrary((HMODULE)dll->dll);
28 bool windows_stat(F_CHAR *path)
30 BY_HANDLE_FILE_INFORMATION bhfi;
31 HANDLE h = CreateFileW(path,
36 FILE_FLAG_BACKUP_SEMANTICS,
39 if(h == INVALID_HANDLE_VALUE)
41 // FindFirstFile is the only call that can stat c:\pagefile.sys
45 if(INVALID_HANDLE_VALUE == (h = FindFirstFile(path, &st)))
51 ret = GetFileInformationByHandle(h, &bhfi);
56 void windows_image_path(F_CHAR *full_path, F_CHAR *temp_path, unsigned int length)
58 snwprintf(temp_path, length-1, L"%s.image", full_path);
59 temp_path[sizeof(temp_path) - 1] = 0;
62 /* You must free() this yourself. */
63 const F_CHAR *default_image_path(void)
65 F_CHAR full_path[MAX_UNICODE_PATH];
67 F_CHAR temp_path[MAX_UNICODE_PATH];
69 if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
70 fatal_error("GetModuleFileName() failed", 0);
72 if((ptr = wcsrchr(full_path, '.')))
75 snwprintf(temp_path, sizeof(temp_path)-1, L"%s.image", full_path);
76 temp_path[sizeof(temp_path) - 1] = 0;
78 return safe_strdup(temp_path);
81 /* You must free() this yourself. */
82 const F_CHAR *vm_executable_path(void)
84 F_CHAR full_path[MAX_UNICODE_PATH];
85 if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
86 fatal_error("GetModuleFileName() failed", 0);
87 return safe_strdup(full_path);
93 F_CHAR *path = (F_CHAR *)(untag_check<F_BYTE_ARRAY>(dpop()) + 1);
94 box_boolean(windows_stat(path));
97 F_SEGMENT *alloc_segment(CELL size)
102 if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
103 MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == 0)
106 if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
107 fatal_error("Cannot allocate low guard page", (CELL)mem);
109 if (!VirtualProtect(mem + size + getpagesize(),
110 getpagesize(), PAGE_NOACCESS, &ignore))
111 fatal_error("Cannot allocate high guard page", (CELL)mem);
113 F_SEGMENT *block = safe_malloc(sizeof(F_SEGMENT));
115 block->start = (CELL)mem + getpagesize();
117 block->end = block->start + size;
122 void dealloc_segment(F_SEGMENT *block)
126 if(!VirtualFree((void*)(block->start - si.dwPageSize), 0, MEM_RELEASE))
127 fatal_error("dealloc_segment failed",0);
131 long getpagesize(void)
133 static long g_pagesize = 0;
136 SYSTEM_INFO system_info;
137 GetSystemInfo (&system_info);
138 g_pagesize = system_info.dwPageSize;
143 void sleep_micros(u64 usec)
145 Sleep((DWORD)(usec / 1000));