9 #define _WIN32_WINNT 0x0501 // For AddVectoredExceptionHandler
23 /* Difference between Jan 1 00:00:00 1601 and Jan 1 00:00:00 1970 */
24 #define EPOCH_OFFSET 0x019db1ded53e8000LL
29 typedef wchar_t vm_char;
30 typedef char symbol_char;
31 typedef HANDLE THREADHANDLE;
33 #define STRING_LITERAL(string) L##string
35 #define MAX_UNICODE_PATH 32768
36 #define VM_C_API extern "C" __declspec(dllexport)
37 #define SSCANF swscanf
39 #define STRNCMP wcsncmp
40 #define STRDUP _wcsdup
45 #define SNPRINTF _snprintf
47 #define FTELL ftello64
48 #define FSEEK fseeko64
49 #define SNPRINTF snprintf
52 #define FACTOR_OS_STRING "windows"
54 #define FACTOR_DLL NULL
56 // SSE traps raise these exception codes, which are defined in internal NT headers
58 #ifndef STATUS_FLOAT_MULTIPLE_FAULTS
59 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
62 #ifndef STATUS_FLOAT_MULTIPLE_TRAPS
63 #define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
66 #define OPEN_READ(path) _wfopen((path),L"rb")
67 #define OPEN_WRITE(path) _wfopen((path),L"wb")
69 inline static void early_init() {}
71 void sleep_nanos(u64 nsec);
73 void move_file(const vm_char *path1, const vm_char *path2);
74 VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
75 THREADHANDLE start_thread(void *(*start_routine)(void *),void *args);
77 inline static THREADHANDLE thread_id()
79 DWORD id = GetCurrentThreadId();
80 HANDLE threadHandle = OpenThread(
81 THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME,
85 FACTOR_ASSERT(threadHandle != NULL);
89 inline static void breakpoint()
94 #define CODE_TO_FUNCTION_POINTER(code) (void)0
95 #define CODE_TO_FUNCTION_POINTER_CALLBACK(vm, code) (void)0
96 #define FUNCTION_CODE_POINTER(ptr) ptr
97 #define FUNCTION_TOC_POINTER(ptr) ptr