os -> wm; *_w32_ -> w32_*_, *_lnx_ -> lnx_*_

This commit is contained in:
Ryan Fleury
2026-05-08 21:17:21 -07:00
parent 9a7782de47
commit 2f6d0f9aaa
52 changed files with 3086 additions and 3115 deletions
+94 -94
View File
@@ -14,7 +14,7 @@ global RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0};
//~ rjf: File Info Conversion Helpers
internal FilePropertyFlags
os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes)
w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes)
{
FilePropertyFlags flags = 0;
if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
@@ -25,19 +25,19 @@ os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes)
}
internal void
os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes)
w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes)
{
properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow);
os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime);
os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime);
properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes);
w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime);
w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime);
properties->flags = w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes);
}
////////////////////////////////
//~ rjf: Time Conversion Helpers
internal void
os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in)
w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in)
{
out->year = in->wYear;
out->mon = in->wMonth - 1;
@@ -50,7 +50,7 @@ os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in)
}
internal void
os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in)
w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in)
{
out->wYear = (WORD)(in->year);
out->wMonth = in->mon + 1;
@@ -62,17 +62,17 @@ os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in)
}
internal void
os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in)
w32_dense_time_from_file_time(DenseTime *out, FILETIME *in)
{
SYSTEMTIME systime = {0};
FileTimeToSystemTime(in, &systime);
DateTime date_time = {0};
os_w32_date_time_from_system_time(&date_time, &systime);
w32_date_time_from_system_time(&date_time, &systime);
*out = dense_time_from_date_time(date_time);
}
internal U32
os_w32_sleep_ms_from_endt_us(U64 endt_us)
w32_sleep_ms_from_endt_us(U64 endt_us)
{
U32 sleep_ms = 0;
if(endt_us == max_U64)
@@ -92,7 +92,7 @@ os_w32_sleep_ms_from_endt_us(U64 endt_us)
}
internal U32
os_w32_unix_time_from_file_time(FILETIME file_time)
w32_unix_time_from_file_time(FILETIME file_time)
{
U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime;
U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000);
@@ -106,44 +106,44 @@ os_w32_unix_time_from_file_time(FILETIME file_time)
////////////////////////////////
//~ rjf: Entity Functions
internal OS_W32_Entity *
os_w32_entity_alloc(OS_W32_EntityKind kind)
internal W32_Entity *
w32_entity_alloc(W32_EntityKind kind)
{
OS_W32_Entity *result = 0;
EnterCriticalSection(&os_w32_state.entity_mutex);
W32_Entity *result = 0;
EnterCriticalSection(&w32_state.entity_mutex);
{
result = os_w32_state.entity_free;
result = w32_state.entity_free;
if(result)
{
SLLStackPop(os_w32_state.entity_free);
SLLStackPop(w32_state.entity_free);
}
else
{
result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1);
result = push_array_no_zero(w32_state.entity_arena, W32_Entity, 1);
}
MemoryZeroStruct(result);
}
LeaveCriticalSection(&os_w32_state.entity_mutex);
LeaveCriticalSection(&w32_state.entity_mutex);
result->kind = kind;
return result;
}
internal void
os_w32_entity_release(OS_W32_Entity *entity)
w32_entity_release(W32_Entity *entity)
{
entity->kind = OS_W32_EntityKind_Null;
EnterCriticalSection(&os_w32_state.entity_mutex);
SLLStackPush(os_w32_state.entity_free, entity);
LeaveCriticalSection(&os_w32_state.entity_mutex);
entity->kind = W32_EntityKind_Null;
EnterCriticalSection(&w32_state.entity_mutex);
SLLStackPush(w32_state.entity_free, entity);
LeaveCriticalSection(&w32_state.entity_mutex);
}
////////////////////////////////
//~ rjf: Thread Entry Point
internal DWORD
os_w32_thread_entry_point(void *ptr)
w32_thread_entry_point(void *ptr)
{
OS_W32_Entity *entity = (OS_W32_Entity *)ptr;
W32_Entity *entity = (W32_Entity *)ptr;
ThreadEntryPointFunctionType *func = entity->thread.func;
void *thread_ptr = entity->thread.ptr;
supplement_thread_base_entry_point(func, thread_ptr);
@@ -160,7 +160,7 @@ now_time_us(void)
LARGE_INTEGER large_int_counter;
if(QueryPerformanceCounter(&large_int_counter))
{
result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution;
result = (large_int_counter.QuadPart*Million(1))/w32_state.microsecond_resolution;
}
return result;
}
@@ -170,7 +170,7 @@ now_time_unix(void)
{
FILETIME file_time;
GetSystemTimeAsFileTime(&file_time);
U32 unix_time = os_w32_unix_time_from_file_time(file_time);
U32 unix_time = w32_unix_time_from_file_time(file_time);
return unix_time;
}
@@ -180,7 +180,7 @@ now_time_universal(void)
SYSTEMTIME systime = {0};
GetSystemTime(&systime);
DateTime result = {0};
os_w32_date_time_from_system_time(&result, &systime);
w32_date_time_from_system_time(&result, &systime);
return result;
}
@@ -188,14 +188,14 @@ internal DateTime
universal_from_local_time(DateTime *date_time)
{
SYSTEMTIME systime = {0};
os_w32_system_time_from_date_time(&systime, date_time);
w32_system_time_from_date_time(&systime, date_time);
FILETIME ftime = {0};
SystemTimeToFileTime(&systime, &ftime);
FILETIME ftime_local = {0};
LocalFileTimeToFileTime(&ftime, &ftime_local);
FileTimeToSystemTime(&ftime_local, &systime);
DateTime result = {0};
os_w32_date_time_from_system_time(&result, &systime);
w32_date_time_from_system_time(&result, &systime);
return result;
}
@@ -203,14 +203,14 @@ internal DateTime
local_from_universal_time(DateTime *date_time)
{
SYSTEMTIME systime = {0};
os_w32_system_time_from_date_time(&systime, date_time);
w32_system_time_from_date_time(&systime, date_time);
FILETIME ftime = {0};
SystemTimeToFileTime(&systime, &ftime);
FILETIME ftime_local = {0};
FileTimeToLocalFileTime(&ftime, &ftime_local);
FileTimeToSystemTime(&ftime_local, &systime);
DateTime result = {0};
os_w32_date_time_from_system_time(&result, &systime);
w32_date_time_from_system_time(&result, &systime);
return result;
}
@@ -361,7 +361,7 @@ shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range)
internal SystemInfo *
get_system_info(void)
{
return &os_w32_state.system_info;
return &w32_state.system_info;
}
////////////////////////////////
@@ -425,10 +425,10 @@ set_platform_thread_name(String8 name)
internal Thread
thread_launch(ThreadEntryPointFunctionType *f, void *p)
{
OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread);
W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Thread);
entity->thread.func = f;
entity->thread.ptr = p;
entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid);
entity->thread.handle = CreateThread(0, 0, w32_thread_entry_point, entity, 0, &entity->thread.tid);
Thread result = {IntFromPtr(entity)};
return result;
}
@@ -436,14 +436,14 @@ thread_launch(ThreadEntryPointFunctionType *f, void *p)
internal B32
thread_join(Thread thread, U64 endt_us)
{
DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);
OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(thread.u64[0]);
DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us);
W32_Entity *entity = (W32_Entity *)PtrFromInt(thread.u64[0]);
DWORD wait_result = WAIT_OBJECT_0;
if(entity != 0)
{
wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms);
CloseHandle(entity->thread.handle);
os_w32_entity_release(entity);
w32_entity_release(entity);
}
return (wait_result == WAIT_OBJECT_0);
}
@@ -451,11 +451,11 @@ thread_join(Thread thread, U64 endt_us)
internal void
thread_detach(Thread thread)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(thread.u64[0]);
if(entity != 0)
{
CloseHandle(entity->thread.handle);
os_w32_entity_release(entity);
w32_entity_release(entity);
}
}
@@ -486,7 +486,7 @@ safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail
internal Mutex
mutex_alloc(void)
{
OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex);
W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Mutex);
InitializeCriticalSection(&entity->mutex);
Mutex result = {IntFromPtr(entity)};
return result;
@@ -495,22 +495,22 @@ mutex_alloc(void)
internal void
mutex_release(Mutex mutex)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]);
DeleteCriticalSection(&entity->mutex);
os_w32_entity_release(entity);
w32_entity_release(entity);
}
internal void
mutex_take(Mutex mutex)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]);
EnterCriticalSection(&entity->mutex);
}
internal void
mutex_drop(Mutex mutex)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]);
LeaveCriticalSection(&entity->mutex);
}
@@ -519,7 +519,7 @@ mutex_drop(Mutex mutex)
internal RWMutex
rw_mutex_alloc(void)
{
OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex);
W32_Entity *entity = w32_entity_alloc(W32_EntityKind_RWMutex);
InitializeSRWLock(&entity->rw_mutex);
RWMutex result = {IntFromPtr(entity)};
return result;
@@ -528,14 +528,14 @@ rw_mutex_alloc(void)
internal void
rw_mutex_release(RWMutex rw_mutex)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
os_w32_entity_release(entity);
W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
w32_entity_release(entity);
}
internal void
rw_mutex_take(RWMutex rw_mutex, B32 write_mode)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
if(write_mode)
{
AcquireSRWLockExclusive(&entity->rw_mutex);
@@ -549,7 +549,7 @@ rw_mutex_take(RWMutex rw_mutex, B32 write_mode)
internal void
rw_mutex_drop(RWMutex rw_mutex, B32 write_mode)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]);
if(write_mode)
{
ReleaseSRWLockExclusive(&entity->rw_mutex);
@@ -565,7 +565,7 @@ rw_mutex_drop(RWMutex rw_mutex, B32 write_mode)
internal CondVar
cond_var_alloc(void)
{
OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable);
W32_Entity *entity = w32_entity_alloc(W32_EntityKind_ConditionVariable);
InitializeConditionVariable(&entity->cv);
CondVar result = {IntFromPtr(entity)};
return result;
@@ -574,19 +574,19 @@ cond_var_alloc(void)
internal void
cond_var_release(CondVar cv)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);
os_w32_entity_release(entity);
W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]);
w32_entity_release(entity);
}
internal B32
cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)
{
U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);
U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us);
BOOL result = 0;
if(sleep_ms > 0)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);
OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]);
W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex.u64[0]);
result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms);
}
return result;
@@ -595,12 +595,12 @@ cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)
internal B32
cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us)
{
U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);
U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us);
BOOL result = 0;
if(sleep_ms > 0)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);
OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]);
W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]);
result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms,
write_mode ? 0 : CONDITION_VARIABLE_LOCKMODE_SHARED);
}
@@ -610,14 +610,14 @@ cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us)
internal void
cond_var_signal(CondVar cv)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]);
WakeConditionVariable(&entity->cv);
}
internal void
cond_var_broadcast(CondVar cv)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]);
WakeAllConditionVariable(&entity->cv);
}
@@ -662,7 +662,7 @@ semaphore_close(Semaphore semaphore)
internal B32
semaphore_take(Semaphore semaphore, U64 endt_us)
{
U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);
U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us);
HANDLE handle = (HANDLE)semaphore.u64[0];
DWORD wait_result = WaitForSingleObject(handle, sleep_ms);
B32 result = (wait_result == WAIT_OBJECT_0);
@@ -681,7 +681,7 @@ semaphore_drop(Semaphore semaphore)
internal Barrier
barrier_alloc(U64 count)
{
OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Barrier);
W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Barrier);
if(entity != 0)
{
BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1);
@@ -694,18 +694,18 @@ barrier_alloc(U64 count)
internal void
barrier_release(Barrier barrier)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]);
if(entity != 0)
{
DeleteSynchronizationBarrier(&entity->sb);
os_w32_entity_release(entity);
w32_entity_release(entity);
}
}
internal void
barrier_wait(Barrier barrier)
{
OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]);
W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]);
if(entity != 0)
{
EnterSynchronizationBarrier(&entity->sb, 0);
@@ -826,7 +826,7 @@ file_set_time(File file, DateTime time)
B32 result = 0;
HANDLE handle = (HANDLE)file.u64[0];
SYSTEMTIME system_time = {0};
os_w32_system_time_from_date_time(&system_time, &time);
w32_system_time_from_date_time(&system_time, &time);
FILETIME file_time = {0};
result = (SystemTimeToFileTime(&system_time, &file_time) &&
SetFileTime(handle, &file_time, &file_time, &file_time));
@@ -846,9 +846,9 @@ properties_from_file(File file)
U32 size_lo = info.nFileSizeLow;
U32 size_hi = info.nFileSizeHigh;
props.size = (U64)size_lo | (((U64)size_hi)<<32);
os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime);
os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime);
props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes);
w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime);
w32_dense_time_from_file_time(&props.created, &info.ftCreationTime);
props.flags = w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes);
}
return props;
}
@@ -968,9 +968,9 @@ properties_from_file_path(String8 path)
if(handle != INVALID_HANDLE_VALUE)
{
props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow);
os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime);
os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime);
props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes);
w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime);
w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime);
props.flags = w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes);
}
else
{
@@ -1093,7 +1093,7 @@ file_iter_begin(Arena *arena, String8 path, FileIterFlags flags)
String16 path16 = str16_from_8(scratch.arena, path_with_wildcard);
FileIter *iter = push_array(arena, FileIter, 1);
iter->flags = flags;
OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;
W32_FileIter *w32_iter = (W32_FileIter*)iter->memory;
if(path.size == 0)
{
w32_iter->is_volume_iter = 1;
@@ -1124,7 +1124,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out)
{
B32 result = 0;
FileIterFlags flags = iter->flags;
OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;
W32_FileIter *w32_iter = (W32_FileIter*)iter->memory;
switch(w32_iter->is_volume_iter)
{
//- rjf: file iteration
@@ -1166,9 +1166,9 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out)
if (usable_file){
info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name));
info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32);
os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime);
os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime);
info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes);
w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime);
w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime);
info_out->props.flags = w32_file_property_flags_from_dwFileAttributes(attributes);
result = 1;
if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){
iter->flags |= FileIterFlag_Done;
@@ -1202,7 +1202,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out)
internal void
file_iter_end(FileIter *iter)
{
OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;
W32_FileIter *w32_iter = (W32_FileIter*)iter->memory;
HANDLE zero_handle;
MemoryZeroStruct(&zero_handle);
if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle))
@@ -1248,7 +1248,7 @@ abort_self(S32 exit_code)
internal ProcessInfo *
get_process_info(void)
{
return &os_w32_state.process_info;
return &w32_state.process_info;
}
internal String8
@@ -1274,7 +1274,7 @@ get_process_start_time_unix(void)
FILETIME user_time;
if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time))
{
result = os_w32_unix_time_from_file_time(start_time);
result = w32_unix_time_from_file_time(start_time);
}
return result;
}
@@ -1315,7 +1315,7 @@ process_launch(ProcessLaunchParams *params)
{
str8_list_push(scratch.arena, &all_opts, n->string);
}
for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next)
for(String8Node *n = w32_state.process_info.environment.first; n != 0; n = n->next)
{
str8_list_push(scratch.arena, &all_opts, n->string);
}
@@ -1386,7 +1386,7 @@ internal B32
process_join(Process process, U64 endt_us, U64 *exit_code_out)
{
HANDLE process_handle = (HANDLE)(process.u64[0]);
DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);
DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us);
DWORD result = WaitForSingleObject(process_handle, sleep_ms);
B32 process_joined = (result == WAIT_OBJECT_0);
if(process_joined && exit_code_out)
@@ -1784,22 +1784,22 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
// (we need to set up some basics before this layer can supply
// memory allocation primitives)
{
os_w32_state.microsecond_resolution = 1;
w32_state.microsecond_resolution = 1;
LARGE_INTEGER large_int_resolution;
if(QueryPerformanceFrequency(&large_int_resolution))
{
os_w32_state.microsecond_resolution = large_int_resolution.QuadPart;
w32_state.microsecond_resolution = large_int_resolution.QuadPart;
}
}
{
SystemInfo *info = &os_w32_state.system_info;
SystemInfo *info = &w32_state.system_info;
info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors;
info->page_size = sysinfo.dwPageSize;
info->large_page_size = GetLargePageMinimum();
info->allocation_granularity = sysinfo.dwAllocationGranularity;
}
{
ProcessInfo *info = &os_w32_state.process_info;
ProcessInfo *info = &w32_state.process_info;
info->large_pages_allowed = large_pages_allowed;
info->pid = GetCurrentProcessId();
}
@@ -1820,7 +1820,7 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive))
{
arena_default_flags = ArenaFlag_LargePages;
arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size);
arena_default_reserve_size = Max(MB(64), w32_state.system_info.large_page_size);
arena_default_commit_size = arena_default_reserve_size;
}
if(str8_match(arg8, str8_lit("--gen_crash_dump"), StringMatchFlag_CaseInsensitive) ||
@@ -1838,9 +1838,9 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
//- rjf: set up dynamically-alloc'd state
Arena *arena = arena_alloc();
{
os_w32_state.arena = arena;
w32_state.arena = arena;
{
SystemInfo *info = &os_w32_state.system_info;
SystemInfo *info = &w32_state.system_info;
U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0};
DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
if(GetComputerNameA((char*)buffer, &size))
@@ -1850,7 +1850,7 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
}
}
{
ProcessInfo *info = &os_w32_state.process_info;
ProcessInfo *info = &w32_state.process_info;
{
Temp scratch = scratch_begin(0, 0);
DWORD size = KB(32);
@@ -1896,8 +1896,8 @@ w32_entry_point_caller(int argc, WCHAR **wargv)
}
//- rjf: set up entity storage
InitializeCriticalSection(&os_w32_state.entity_mutex);
os_w32_state.entity_arena = arena_alloc();
InitializeCriticalSection(&w32_state.entity_mutex);
w32_state.entity_arena = arena_alloc();
//- rjf: call into "real" entry point
main_thread_base_entry_point(argc, argv);
+28 -28
View File
@@ -28,8 +28,8 @@
////////////////////////////////
//~ rjf: File Iterator Types
typedef struct OS_W32_FileIter OS_W32_FileIter;
struct OS_W32_FileIter
typedef struct W32_FileIter W32_FileIter;
struct W32_FileIter
{
HANDLE handle;
WIN32_FIND_DATAW find_data;
@@ -37,27 +37,27 @@ struct OS_W32_FileIter
String8Array drive_strings;
U64 drive_strings_iter_idx;
};
StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size);
StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size);
////////////////////////////////
//~ rjf: Entity Types
typedef enum OS_W32_EntityKind
typedef enum W32_EntityKind
{
OS_W32_EntityKind_Null,
OS_W32_EntityKind_Thread,
OS_W32_EntityKind_Mutex,
OS_W32_EntityKind_RWMutex,
OS_W32_EntityKind_ConditionVariable,
OS_W32_EntityKind_Barrier,
W32_EntityKind_Null,
W32_EntityKind_Thread,
W32_EntityKind_Mutex,
W32_EntityKind_RWMutex,
W32_EntityKind_ConditionVariable,
W32_EntityKind_Barrier,
}
OS_W32_EntityKind;
W32_EntityKind;
typedef struct OS_W32_Entity OS_W32_Entity;
struct OS_W32_Entity
typedef struct W32_Entity W32_Entity;
struct W32_Entity
{
OS_W32_Entity *next;
OS_W32_EntityKind kind;
W32_Entity *next;
W32_EntityKind kind;
union
{
struct
@@ -77,8 +77,8 @@ struct OS_W32_Entity
////////////////////////////////
//~ rjf: State
typedef struct OS_W32_State OS_W32_State;
struct OS_W32_State
typedef struct W32_State W32_State;
struct W32_State
{
Arena *arena;
@@ -90,37 +90,37 @@ struct OS_W32_State
// rjf: entity storage
CRITICAL_SECTION entity_mutex;
Arena *entity_arena;
OS_W32_Entity *entity_free;
W32_Entity *entity_free;
};
////////////////////////////////
//~ rjf: Globals
global OS_W32_State os_w32_state = {0};
global W32_State w32_state = {0};
////////////////////////////////
//~ rjf: File Info Conversion Helpers
internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes);
internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes);
internal FilePropertyFlags w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes);
internal void w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes);
////////////////////////////////
//~ rjf: Time Conversion Helpers
internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in);
internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in);
internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in);
internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us);
internal void w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in);
internal void w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in);
internal void w32_dense_time_from_file_time(DenseTime *out, FILETIME *in);
internal U32 w32_sleep_ms_from_endt_us(U64 endt_us);
////////////////////////////////
//~ rjf: Entity Functions
internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind);
internal void os_w32_entity_release(OS_W32_Entity *entity);
internal W32_Entity *w32_entity_alloc(W32_EntityKind kind);
internal void w32_entity_release(W32_Entity *entity);
////////////////////////////////
//~ rjf: Thread Entry Point
internal DWORD os_w32_thread_entry_point(void *ptr);
internal DWORD w32_thread_entry_point(void *ptr);
#endif // WIN32_BASE_H
File diff suppressed because it is too large Load Diff
+192 -198
View File
@@ -1,8 +1,8 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef DEMON_CORE_WIN32_H
#define DEMON_CORE_WIN32_H
#ifndef WIN32_DEMON_H
#define WIN32_DEMON_H
////////////////////////////////
//~ rjf: Windows Includes
@@ -15,173 +15,173 @@
////////////////////////////////
//~ rjf: Win32 Exception Codes
#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u
#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u
#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u
#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u
#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu
#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u
#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u
#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du
#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu
#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu
#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u
#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u
#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u
#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u
#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u
#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u
#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u
#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du
#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u
#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u
#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u
#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu
#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u
#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u
#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u
#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u
#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u
#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u
#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au
#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u
#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u
#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u
#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u
#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u
#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u
#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u
#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u
#define DMN_W32_EXCEPTION_THROW 0xE06D7363u
#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u
#define W32_DMN_EXCEPTION_BREAKPOINT 0x80000003u
#define W32_DMN_EXCEPTION_SINGLE_STEP 0x80000004u
#define W32_DMN_EXCEPTION_LONG_JUMP 0x80000026u
#define W32_DMN_EXCEPTION_ACCESS_VIOLATION 0xC0000005u
#define W32_DMN_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu
#define W32_DMN_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u
#define W32_DMN_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u
#define W32_DMN_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du
#define W32_DMN_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu
#define W32_DMN_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu
#define W32_DMN_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u
#define W32_DMN_EXCEPTION_FLT_OVERFLOW 0xC0000091u
#define W32_DMN_EXCEPTION_FLT_STACK_CHECK 0xC0000092u
#define W32_DMN_EXCEPTION_FLT_UNDERFLOW 0xC0000093u
#define W32_DMN_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u
#define W32_DMN_EXCEPTION_INT_OVERFLOW 0xC0000095u
#define W32_DMN_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u
#define W32_DMN_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du
#define W32_DMN_EXCEPTION_IN_PAGE_ERROR 0xC0000006u
#define W32_DMN_EXCEPTION_INVALID_DISPOSITION 0xC0000026u
#define W32_DMN_EXCEPTION_NONCONTINUABLE 0xC0000025u
#define W32_DMN_EXCEPTION_STACK_OVERFLOW 0xC00000FDu
#define W32_DMN_EXCEPTION_INVALID_HANDLE 0xC0000008u
#define W32_DMN_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u
#define W32_DMN_EXCEPTION_DLL_NOT_FOUND 0xC0000135u
#define W32_DMN_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u
#define W32_DMN_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u
#define W32_DMN_EXCEPTION_DLL_INIT_FAILED 0xC0000142u
#define W32_DMN_EXCEPTION_CONTROL_C_EXIT 0xC000013Au
#define W32_DMN_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u
#define W32_DMN_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u
#define W32_DMN_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u
#define W32_DMN_EXCEPTION_HEAP_CORRUPTION 0xC0000374u
#define W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u
#define W32_DMN_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u
#define W32_DMN_EXCEPTION_ASSERT_FAILURE 0xC0000420u
#define W32_DMN_EXCEPTION_NO_MEMORY 0xC0000017u
#define W32_DMN_EXCEPTION_THROW 0xE06D7363u
#define W32_DMN_EXCEPTION_SET_THREAD_NAME 0x406d1388u
#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u
#define DMN_w32_EXCEPTION_CLR 0xE0434352u
#define DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u
#define DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u
#define DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u
#define W32_DMN_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u
#define W32_DMN_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u
#define W32_DMN_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u
////////////////////////////////
//~ rjf: Win32 Exception ExceptionInformation Codes
//
// used as a subcode, apparently in all cases, for DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN.
// used as a subcode, apparently in all cases, for W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN.
// need to somehow pipe this through & interpret it correctly in outer layers... @fastfail
#define DMN_W32_FAST_FAIL_LEGACY_GS_VIOLATION 0
#define DMN_W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1
#define DMN_W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2
#define DMN_W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3
#define DMN_W32_FAST_FAIL_INCORRECT_STACK 4
#define DMN_W32_FAST_FAIL_INVALID_ARG 5
#define DMN_W32_FAST_FAIL_GS_COOKIE_INIT 6
#define DMN_W32_FAST_FAIL_FATAL_APP_EXIT 7
#define DMN_W32_FAST_FAIL_RANGE_CHECK_FAILURE 8
#define DMN_W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9
#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10
#define DMN_W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11
#define DMN_W32_FAST_FAIL_INVALID_FIBER_SWITCH 12
#define DMN_W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13
#define DMN_W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14
#define DMN_W32_FAST_FAIL_INVALID_JUMP_BUFFER 18
#define DMN_W32_FAST_FAIL_MRDATA_MODIFIED 19
#define DMN_W32_FAST_FAIL_CERTIFICATION_FAILURE 20
#define DMN_W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21
#define DMN_W32_FAST_FAIL_CRYPTO_LIBRARY 22
#define DMN_W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23
#define DMN_W32_FAST_FAIL_INVALID_IMAGE_BASE 24
#define DMN_W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25
#define DMN_W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26
#define DMN_W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27
#define DMN_W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28
#define DMN_W32_FAST_FAIL_INVALID_BALANCED_TREE 29
#define DMN_W32_FAST_FAIL_INVALID_NEXT_THREAD 30
#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_APCS_DISABLED 32
#define DMN_W32_FAST_FAIL_INVALID_IDLE_STATE 33
#define DMN_W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34
#define DMN_W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35
#define DMN_W32_FAST_FAIL_INVALID_LOCK_STATE 36
#define DMN_W32_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37
#define DMN_W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38
#define DMN_W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39
#define DMN_W32_FAST_FAIL_INVALID_THREAD 40
#define DMN_W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_GUARD_SS_FAILURE 44
#define DMN_W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46
#define DMN_W32_FAST_FAIL_INVALID_CONTROL_STACK 47
#define DMN_W32_FAST_FAIL_SET_CONTEXT_DENIED 48
#define DMN_W32_FAST_FAIL_INVALID_IAT 49
#define DMN_W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50
#define DMN_W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51
#define DMN_W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53
#define DMN_W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54
#define DMN_W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal
#define DMN_W32_FAST_FAIL_UNEXPECTED_CALL 56
#define DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57
#define DMN_W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58
#define DMN_W32_FAST_FAIL_FLAGS_CORRUPTION 59
#define DMN_W32_FAST_FAIL_VEH_CORRUPTION 60
#define DMN_W32_FAST_FAIL_ETW_CORRUPTION 61
#define DMN_W32_FAST_FAIL_RIO_ABORT 62
#define DMN_W32_FAST_FAIL_INVALID_PFN 63
#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64
#define DMN_W32_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65
#define DMN_W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66
#define DMN_W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67
#define DMN_W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68
#define DMN_W32_FAST_FAIL_NTDLL_PATCH_FAILED 69
#define DMN_W32_FAST_FAIL_INVALID_FLS_DATA 70
#define DMN_W32_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF
#define W32_DMN_FAST_FAIL_LEGACY_GS_VIOLATION 0
#define W32_DMN_FAST_FAIL_VTGUARD_CHECK_FAILURE 1
#define W32_DMN_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2
#define W32_DMN_FAST_FAIL_CORRUPT_LIST_ENTRY 3
#define W32_DMN_FAST_FAIL_INCORRECT_STACK 4
#define W32_DMN_FAST_FAIL_INVALID_ARG 5
#define W32_DMN_FAST_FAIL_GS_COOKIE_INIT 6
#define W32_DMN_FAST_FAIL_FATAL_APP_EXIT 7
#define W32_DMN_FAST_FAIL_RANGE_CHECK_FAILURE 8
#define W32_DMN_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9
#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10
#define W32_DMN_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11
#define W32_DMN_FAST_FAIL_INVALID_FIBER_SWITCH 12
#define W32_DMN_FAST_FAIL_INVALID_SET_OF_CONTEXT 13
#define W32_DMN_FAST_FAIL_INVALID_REFERENCE_COUNT 14
#define W32_DMN_FAST_FAIL_INVALID_JUMP_BUFFER 18
#define W32_DMN_FAST_FAIL_MRDATA_MODIFIED 19
#define W32_DMN_FAST_FAIL_CERTIFICATION_FAILURE 20
#define W32_DMN_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21
#define W32_DMN_FAST_FAIL_CRYPTO_LIBRARY 22
#define W32_DMN_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23
#define W32_DMN_FAST_FAIL_INVALID_IMAGE_BASE 24
#define W32_DMN_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25
#define W32_DMN_FAST_FAIL_UNSAFE_EXTENSION_CALL 26
#define W32_DMN_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27
#define W32_DMN_FAST_FAIL_INVALID_BUFFER_ACCESS 28
#define W32_DMN_FAST_FAIL_INVALID_BALANCED_TREE 29
#define W32_DMN_FAST_FAIL_INVALID_NEXT_THREAD 30
#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_APCS_DISABLED 32
#define W32_DMN_FAST_FAIL_INVALID_IDLE_STATE 33
#define W32_DMN_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34
#define W32_DMN_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35
#define W32_DMN_FAST_FAIL_INVALID_LOCK_STATE 36
#define W32_DMN_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37
#define W32_DMN_FAST_FAIL_INVALID_LONGJUMP_TARGET 38
#define W32_DMN_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39
#define W32_DMN_FAST_FAIL_INVALID_THREAD 40
#define W32_DMN_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_GUARD_SS_FAILURE 44
#define W32_DMN_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46
#define W32_DMN_FAST_FAIL_INVALID_CONTROL_STACK 47
#define W32_DMN_FAST_FAIL_SET_CONTEXT_DENIED 48
#define W32_DMN_FAST_FAIL_INVALID_IAT 49
#define W32_DMN_FAST_FAIL_HEAP_METADATA_CORRUPTION 50
#define W32_DMN_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51
#define W32_DMN_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_ENCLAVE_CALL_FAILURE 53
#define W32_DMN_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54
#define W32_DMN_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal
#define W32_DMN_FAST_FAIL_UNEXPECTED_CALL 56
#define W32_DMN_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57
#define W32_DMN_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58
#define W32_DMN_FAST_FAIL_FLAGS_CORRUPTION 59
#define W32_DMN_FAST_FAIL_VEH_CORRUPTION 60
#define W32_DMN_FAST_FAIL_ETW_CORRUPTION 61
#define W32_DMN_FAST_FAIL_RIO_ABORT 62
#define W32_DMN_FAST_FAIL_INVALID_PFN 63
#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64
#define W32_DMN_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65
#define W32_DMN_FAST_FAIL_HOST_VISIBILITY_CHANGE 66
#define W32_DMN_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67
#define W32_DMN_FAST_FAIL_PATCH_CALLBACK_FAILED 68
#define W32_DMN_FAST_FAIL_NTDLL_PATCH_FAILED 69
#define W32_DMN_FAST_FAIL_INVALID_FLS_DATA 70
#define W32_DMN_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF
////////////////////////////////
//~ rjf: Win32 Register Codes
#define DMN_W32_CTX_X86 0x00010000
#define DMN_W32_CTX_X64 0x00100000
#define W32_DMN_CTX_X86 0x00010000
#define W32_DMN_CTX_X64 0x00100000
#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags
#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15
#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs
#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15
#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7
#define DMN_W32_CTX_INTEL_EXTENDED 0x0020
#define DMN_W32_CTX_INTEL_XSTATE 0x0040
#define W32_DMN_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags
#define W32_DMN_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15
#define W32_DMN_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs
#define W32_DMN_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15
#define W32_DMN_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7
#define W32_DMN_CTX_INTEL_EXTENDED 0x0020
#define W32_DMN_CTX_INTEL_XSTATE 0x0040
#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \
DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \
DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \
DMN_W32_CTX_INTEL_EXTENDED)
#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \
DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \
DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \
DMN_W32_CTX_INTEL_DEBUG)
#define W32_DMN_CTX_X86_ALL (W32_DMN_CTX_X86 | \
W32_DMN_CTX_INTEL_CONTROL | W32_DMN_CTX_INTEL_INTEGER | \
W32_DMN_CTX_INTEL_SEGMENTS | W32_DMN_CTX_INTEL_DEBUG | \
W32_DMN_CTX_INTEL_EXTENDED)
#define W32_DMN_CTX_X64_ALL (W32_DMN_CTX_X64 | \
W32_DMN_CTX_INTEL_CONTROL | W32_DMN_CTX_INTEL_INTEGER | \
W32_DMN_CTX_INTEL_SEGMENTS | W32_DMN_CTX_INTEL_FLOATS | \
W32_DMN_CTX_INTEL_DEBUG)
////////////////////////////////
//~ rjf: Per-Entity State
typedef enum DMN_W32_EntityKind
typedef enum W32_DMN_EntityKind
{
DMN_W32_EntityKind_Null,
DMN_W32_EntityKind_Root,
DMN_W32_EntityKind_Process,
DMN_W32_EntityKind_Thread,
DMN_W32_EntityKind_Module,
DMN_W32_EntityKind_COUNT
W32_DMN_EntityKind_Null,
W32_DMN_EntityKind_Root,
W32_DMN_EntityKind_Process,
W32_DMN_EntityKind_Thread,
W32_DMN_EntityKind_Module,
W32_DMN_EntityKind_COUNT
}
DMN_W32_EntityKind;
W32_DMN_EntityKind;
typedef struct DMN_W32_Entity DMN_W32_Entity;
struct DMN_W32_Entity
typedef struct W32_DMN_Entity W32_DMN_Entity;
struct W32_DMN_Entity
{
DMN_W32_Entity *first;
DMN_W32_Entity *last;
DMN_W32_Entity *next;
DMN_W32_Entity *prev;
DMN_W32_Entity *parent;
DMN_W32_EntityKind kind;
W32_DMN_Entity *first;
W32_DMN_Entity *last;
W32_DMN_Entity *next;
W32_DMN_Entity *prev;
W32_DMN_Entity *parent;
W32_DMN_EntityKind kind;
U32 gen;
U64 id;
HANDLE handle;
@@ -212,46 +212,46 @@ struct DMN_W32_Entity
};
};
typedef struct DMN_W32_EntityNode DMN_W32_EntityNode;
struct DMN_W32_EntityNode
typedef struct W32_DMN_EntityNode W32_DMN_EntityNode;
struct W32_DMN_EntityNode
{
DMN_W32_EntityNode *next;
DMN_W32_Entity *v;
W32_DMN_EntityNode *next;
W32_DMN_Entity *v;
};
typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode;
struct DMN_W32_EntityIDHashNode
typedef struct W32_DMN_EntityIDHashNode W32_DMN_EntityIDHashNode;
struct W32_DMN_EntityIDHashNode
{
DMN_W32_EntityIDHashNode *next;
DMN_W32_EntityIDHashNode *prev;
W32_DMN_EntityIDHashNode *next;
W32_DMN_EntityIDHashNode *prev;
U64 id;
DMN_W32_Entity *entity;
W32_DMN_Entity *entity;
};
typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot;
struct DMN_W32_EntityIDHashSlot
typedef struct W32_DMN_EntityIDHashSlot W32_DMN_EntityIDHashSlot;
struct W32_DMN_EntityIDHashSlot
{
DMN_W32_EntityIDHashNode *first;
DMN_W32_EntityIDHashNode *last;
W32_DMN_EntityIDHashNode *first;
W32_DMN_EntityIDHashNode *last;
};
////////////////////////////////
//~ rjf: Injection Types
typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak;
struct DMN_W32_InjectedBreak
typedef struct W32_DMN_InjectedBreak W32_DMN_InjectedBreak;
struct W32_DMN_InjectedBreak
{
U64 code;
U64 user_data;
};
#define DMN_W32_INJECTED_CODE_SIZE 32
#define W32_DMN_INJECTED_CODE_SIZE 32
////////////////////////////////
//~ rjf: Image Info Types
typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo;
struct DMN_W32_ImageInfo
typedef struct W32_DMN_ImageInfo W32_DMN_ImageInfo;
struct W32_DMN_ImageInfo
{
Arch arch;
U32 size;
@@ -261,13 +261,13 @@ struct DMN_W32_ImageInfo
////////////////////////////////
//~ rjf: Dynamically-Loaded Win32 Function Types
typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription);
typedef HRESULT W32_DMN_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription);
////////////////////////////////
//~ rjf: Shared State Bundle
typedef struct DMN_W32_Shared DMN_W32_Shared;
struct DMN_W32_Shared
typedef struct W32_DMN_Shared W32_DMN_Shared;
struct W32_DMN_Shared
{
// rjf: top-level info
Arena *arena;
@@ -283,12 +283,12 @@ struct DMN_W32_Shared
// rjf: entity state
Arena *entities_arena;
DMN_W32_Entity *entities_base;
DMN_W32_Entity *entities_first_free;
W32_DMN_Entity *entities_base;
W32_DMN_Entity *entities_first_free;
U64 entities_count;
DMN_W32_EntityIDHashSlot *entities_id_hash_slots;
W32_DMN_EntityIDHashSlot *entities_id_hash_slots;
U64 entities_id_hash_slots_count;
DMN_W32_EntityIDHashNode *entities_id_hash_node_free;
W32_DMN_EntityIDHashNode *entities_id_hash_node_free;
// rjf: launch state
B32 new_process_pending;
@@ -307,53 +307,47 @@ struct DMN_W32_Shared
////////////////////////////////
//~ rjf: Globals
global DMN_W32_Shared *dmn_w32_shared = 0;
global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil};
global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0;
thread_static B32 dmn_w32_ctrl_thread = 0;
////////////////////////////////
//~ rjf: Basic Helpers
internal U64 dmn_w32_hash_from_string(String8 string);
internal U64 dmn_w32_hash_from_id(U64 id);
global W32_DMN_Shared *w32_dmn_shared = 0;
global W32_DMN_Entity w32_dmn_entity_nil = {&w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil};
global W32_DMN_GetThreadDescriptionFunctionType *w32_dmn_GetThreadDescription = 0;
thread_static B32 w32_dmn_ctrl_thread = 0;
////////////////////////////////
//~ rjf: Entity Helpers
//- rjf: entity <-> handle
internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity);
internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle);
internal DMN_Handle w32_dmn_handle_from_entity(W32_DMN_Entity *entity);
internal W32_DMN_Entity *w32_dmn_entity_from_handle(DMN_Handle handle);
//- rjf: entity allocation/deallocation
internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id);
internal void dmn_w32_entity_release(DMN_W32_Entity *entity);
internal W32_DMN_Entity *w32_dmn_entity_alloc(W32_DMN_Entity *parent, W32_DMN_EntityKind kind, U64 id);
internal void w32_dmn_entity_release(W32_DMN_Entity *entity);
//- rjf: kind*id -> entity
internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id);
internal W32_DMN_Entity *w32_dmn_entity_from_kind_id(W32_DMN_EntityKind kind, U64 id);
////////////////////////////////
//~ rjf: Module Info Extraction
internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module);
internal String8 w32_dmn_full_path_from_module(Arena *arena, W32_DMN_Entity *module);
////////////////////////////////
//~ rjf: Win32-Level Process/Thread Reads/Writes
//- rjf: processes
internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst);
internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src);
internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address);
internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address);
#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)
#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)
internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr);
internal U64 w32_dmn_process_read(HANDLE process, Rng1U64 range, void *dst);
internal B32 w32_dmn_process_write(HANDLE process, Rng1U64 range, void *src);
internal String8 w32_dmn_read_memory_str(Arena *arena, HANDLE process_handle, U64 address);
internal String16 w32_dmn_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address);
#define w32_dmn_process_read_struct(process, vaddr, ptr) w32_dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)
#define w32_dmn_process_write_struct(process, vaddr, ptr) w32_dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)
internal W32_DMN_ImageInfo w32_dmn_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr);
//- rjf: threads
internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block);
internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block);
internal B32 w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block);
internal B32 w32_dmn_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block);
//- rjf: remote thread injection
internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address);
internal DWORD w32_dmn_inject_thread(HANDLE process, U64 start_address);
#endif // DEMON_CORE_WIN32_H
File diff suppressed because it is too large Load Diff
+41 -41
View File
@@ -24,18 +24,18 @@
////////////////////////////////
//~ rjf: Windows
typedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea;
struct OS_W32_TitleBarClientArea
typedef struct W32_WM_TitleBarClientArea W32_WM_TitleBarClientArea;
struct W32_WM_TitleBarClientArea
{
OS_W32_TitleBarClientArea *next;
W32_WM_TitleBarClientArea *next;
Rng2F32 rect;
};
typedef struct OS_W32_Window OS_W32_Window;
struct OS_W32_Window
typedef struct W32_WM_Window W32_WM_Window;
struct W32_WM_Window
{
OS_W32_Window *next;
OS_W32_Window *prev;
W32_WM_Window *next;
W32_WM_Window *prev;
HWND hwnd;
HDC hdc;
WINDOWPLACEMENT last_window_placement;
@@ -47,77 +47,77 @@ struct OS_W32_Window
F32 custom_border_edge_thickness;
B32 custom_border_composition_enabled;
Arena *paint_arena;
OS_W32_TitleBarClientArea *first_title_bar_client_area;
OS_W32_TitleBarClientArea *last_title_bar_client_area;
W32_WM_TitleBarClientArea *first_title_bar_client_area;
W32_WM_TitleBarClientArea *last_title_bar_client_area;
};
////////////////////////////////
//~ rjf: Monitor Gathering Bundle
typedef struct OS_W32_MonitorGatherNode OS_W32_MonitorGatherNode;
struct OS_W32_MonitorGatherNode
typedef struct W32_WM_MonitorGatherNode W32_WM_MonitorGatherNode;
struct W32_WM_MonitorGatherNode
{
OS_W32_MonitorGatherNode *next;
OS_Monitor v;
W32_WM_MonitorGatherNode *next;
WM_Monitor v;
};
typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle;
struct OS_W32_MonitorGatherBundle
typedef struct W32_WM_MonitorGatherBundle W32_WM_MonitorGatherBundle;
struct W32_WM_MonitorGatherBundle
{
Arena *arena;
OS_W32_MonitorGatherNode *first_monitor;
OS_W32_MonitorGatherNode *last_monitor;
W32_WM_MonitorGatherNode *first_monitor;
W32_WM_MonitorGatherNode *last_monitor;
U64 monitor_count;
};
////////////////////////////////
//~ rjf: Global State
typedef struct OS_W32_GfxState OS_W32_GfxState;
struct OS_W32_GfxState
typedef struct W32_WM_State W32_WM_State;
struct W32_WM_State
{
Arena *arena;
U32 gfx_thread_tid;
HINSTANCE hInstance;
HCURSOR hCursor;
OS_GfxInfo gfx_info;
OS_W32_Window *first_window;
OS_W32_Window *last_window;
OS_W32_Window *free_window;
OS_Key key_from_vkey_table[256];
WM_SystemInfo gfx_info;
W32_WM_Window *first_window;
W32_WM_Window *last_window;
W32_WM_Window *free_window;
WM_Key key_from_vkey_table[256];
};
////////////////////////////////
//~ rjf: Globals
global OS_W32_GfxState *os_w32_gfx_state = 0;
global OS_EventList os_w32_event_list = {0};
global Arena *os_w32_event_arena = 0;
global B32 os_w32_resizing = 0;
global B32 os_w32_new_window_custom_border = 0;
global W32_WM_State *w32_wm_state = 0;
global WM_EventList w32_wm_event_list = {0};
global Arena *w32_wm_event_arena = 0;
global B32 w32_wm_resizing = 0;
global B32 w32_wm_new_window_custom_border = 0;
////////////////////////////////
//~ rjf: Basic Helpers
internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect);
internal Rng2F32 w32_wm_rng2f32_from_rect(RECT rect);
////////////////////////////////
//~ rjf: Windows
internal OS_Window os_w32_handle_from_window(OS_W32_Window *window);
internal OS_W32_Window * os_w32_window_from_handle(OS_Window window);
internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd);
internal HWND os_w32_hwnd_from_window(OS_W32_Window *window);
internal OS_W32_Window * os_w32_window_alloc(void);
internal void os_w32_window_release(OS_W32_Window *window);
internal OS_Event * os_w32_push_event(OS_EventKind kind, OS_W32_Window *window);
internal OS_Key os_w32_os_key_from_vkey(WPARAM vkey);
internal WPARAM os_w32_vkey_from_os_key(OS_Key key);
internal LRESULT os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
internal WM_Window w32_wm_handle_from_window(W32_WM_Window *window);
internal W32_WM_Window * w32_wm_window_from_handle(WM_Window window);
internal W32_WM_Window * w32_wm_window_from_hwnd(HWND hwnd);
internal HWND w32_wm_hwnd_from_window(W32_WM_Window *window);
internal W32_WM_Window * w32_wm_window_alloc(void);
internal void w32_wm_window_release(W32_WM_Window *window);
internal WM_Event * w32_wm_push_event(WM_EventKind kind, W32_WM_Window *window);
internal WM_Key w32_wm_os_key_from_vkey(WPARAM vkey);
internal WPARAM w32_wm_vkey_from_os_key(WM_Key key);
internal LRESULT w32_wm_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
////////////////////////////////
//~ rjf: Monitors
internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr);
internal BOOL w32_wm_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr);
#endif // WIN32_WINDOW_MANAGER_H