20 // Difference between Jan 1 00:00:00 1601 and Jan 1 00:00:00 1970
21 #define EPOCH_OFFSET 0x019db1ded53e8000LL
25 typedef wchar_t vm_char;
26 typedef char symbol_char;
27 typedef HANDLE THREADHANDLE;
29 #define STRING_LITERAL(string) L##string
31 #define MAX_UNICODE_PATH 32768
32 #define VM_C_API extern "C" __declspec(dllexport)
33 #define SSCANF swscanf
35 #define STRNCMP wcsncmp
36 #define STRDUP _wcsdup
42 #define FTELL ftello64
43 #define FSEEK fseeko64
46 #define FACTOR_OS_STRING "windows"
48 // SSE traps raise these exception codes, which are defined in internal NT
51 #ifndef STATUS_FLOAT_MULTIPLE_FAULTS
52 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
55 #ifndef STATUS_FLOAT_MULTIPLE_TRAPS
56 #define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
59 #define OPEN_READ(path) _wfopen((path), L"rb")
60 #define OPEN_WRITE(path) _wfopen((path), L"wb")
61 #define THREADSAFE_STRERROR(errnum, buf, buflen) strerror_s(buf, buflen, errnum)
63 inline static void early_init() {}
64 uint64_t nano_count();
65 void sleep_nanos(uint64_t nsec);
67 VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
69 THREADHANDLE start_thread(void* (*start_routine)(void*), void* args);
71 inline static THREADHANDLE thread_id() {
72 DWORD id = GetCurrentThreadId();
73 HANDLE threadHandle = OpenThread(
74 THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME, FALSE,
76 FACTOR_ASSERT(threadHandle != NULL);
80 inline static void breakpoint() { DebugBreak(); }
82 #define CODE_TO_FUNCTION_POINTER(code) (void)0
83 #define CODE_TO_FUNCTION_POINTER_CALLBACK(vm, code) (void)0
84 #define FUNCTION_CODE_POINTER(ptr) ptr
85 #define FUNCTION_TOC_POINTER(ptr) ptr
87 extern HANDLE boot_thread;
89 inline static std::string to_utf8(const wchar_t* buffer, int len) {
90 int nChars = ::WideCharToMultiByte(
99 if (nChars == 0) return "";
101 std::string newbuffer;
102 newbuffer.resize(nChars) ;
103 ::WideCharToMultiByte(
108 const_cast<char*>(newbuffer.c_str()),
115 inline static std::string to_utf8(const std::wstring& str) {
116 return to_utf8(str.c_str(), (int)str.size());
119 #define AS_UTF8(ptr) to_utf8(ptr)