8 void factorvm::init_ffi()
10 hFactorDll = GetModuleHandle(FACTOR_DLL);
12 fatal_error("GetModuleHandle(\"" FACTOR_DLL_NAME "\") failed", 0);
17 return vm->init_ffi();
20 void factorvm::ffi_dlopen(dll *dll)
22 dll->dll = LoadLibraryEx((WCHAR *)alien_offset(dll->path), NULL, 0);
25 void ffi_dlopen(dll *dll)
27 return vm->ffi_dlopen(dll);
30 void *factorvm::ffi_dlsym(dll *dll, symbol_char *symbol)
32 return (void *)GetProcAddress(dll ? (HMODULE)dll->dll : hFactorDll, symbol);
35 void *ffi_dlsym(dll *dll, symbol_char *symbol)
37 return vm->ffi_dlsym(dll,symbol);
40 void factorvm::ffi_dlclose(dll *dll)
42 FreeLibrary((HMODULE)dll->dll);
46 void ffi_dlclose(dll *dll)
48 return vm->ffi_dlclose(dll);
51 bool windows_stat(vm_char *path)
53 BY_HANDLE_FILE_INFORMATION bhfi;
54 HANDLE h = CreateFileW(path,
59 FILE_FLAG_BACKUP_SEMANTICS,
62 if(h == INVALID_HANDLE_VALUE)
64 // FindFirstFile is the only call that can stat c:\pagefile.sys
68 if(INVALID_HANDLE_VALUE == (h = FindFirstFile(path, &st)))
74 ret = GetFileInformationByHandle(h, &bhfi);
79 void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length)
81 snwprintf(temp_path, length-1, L"%s.image", full_path);
82 temp_path[sizeof(temp_path) - 1] = 0;
85 /* You must free() this yourself. */
86 const vm_char *default_image_path()
88 vm_char full_path[MAX_UNICODE_PATH];
90 vm_char temp_path[MAX_UNICODE_PATH];
92 if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
93 fatal_error("GetModuleFileName() failed", 0);
95 if((ptr = wcsrchr(full_path, '.')))
98 snwprintf(temp_path, sizeof(temp_path)-1, L"%s.image", full_path);
99 temp_path[sizeof(temp_path) - 1] = 0;
101 return safe_strdup(temp_path);
104 /* You must free() this yourself. */
105 const vm_char *factorvm::vm_executable_path()
107 vm_char full_path[MAX_UNICODE_PATH];
108 if(!GetModuleFileName(NULL, full_path, MAX_UNICODE_PATH))
109 fatal_error("GetModuleFileName() failed", 0);
110 return safe_strdup(full_path);
113 const vm_char *vm_executable_path()
115 return vm->vm_executable_path();
119 inline void factorvm::vmprim_existsp()
121 vm_char *path = untag_check<byte_array>(dpop())->data<vm_char>();
122 box_boolean(windows_stat(path));
127 PRIMITIVE_GETVM()->vmprim_existsp();
130 segment *factorvm::alloc_segment(cell size)
135 if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
136 MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == 0)
139 if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
140 fatal_error("Cannot allocate low guard page", (cell)mem);
142 if (!VirtualProtect(mem + size + getpagesize(),
143 getpagesize(), PAGE_NOACCESS, &ignore))
144 fatal_error("Cannot allocate high guard page", (cell)mem);
146 segment *block = (segment *)safe_malloc(sizeof(segment));
148 block->start = (cell)mem + getpagesize();
150 block->end = block->start + size;
155 segment *alloc_segment(cell size)
157 return vm->alloc_segment(size);
160 void factorvm::dealloc_segment(segment *block)
164 if(!VirtualFree((void*)(block->start - si.dwPageSize), 0, MEM_RELEASE))
165 fatal_error("dealloc_segment failed",0);
169 void dealloc_segment(segment *block)
171 return vm->dealloc_segment(block);
174 long factorvm::getpagesize()
176 static long g_pagesize = 0;
179 SYSTEM_INFO system_info;
180 GetSystemInfo (&system_info);
181 g_pagesize = system_info.dwPageSize;
188 return vm->getpagesize();
191 void factorvm::sleep_micros(u64 usec)
193 Sleep((DWORD)(usec / 1000));
196 void sleep_micros(u64 usec)
198 return vm->sleep_micros(usec);