OS_Handle FS_FileOpen(Str8 path, FS_AccessFlags access) { OS_Handle result = { 0 }; M_TempScope(0, 0) { Str8 wpath = Win32_WideStr(temp.arena, path); DWORD dwAccess = 0; DWORD dwShare = FILE_SHARE_READ; DWORD dwCreate = OPEN_EXISTING; if (access & FS_ACCESS_WRITE) { dwCreate = CREATE_ALWAYS; dwAccess = GENERIC_WRITE; } if (access & FS_ACCESS_READ) { dwAccess |= GENERIC_READ; } HANDLE hFile = CreateFileW((LPCWSTR) wpath.data, dwAccess, dwShare, 0, dwCreate, 0, 0); result.v[0] = (hFile == INVALID_HANDLE_VALUE) ? 0 : ((U64) hFile); } return result; } void FS_FileClose(OS_Handle file) { HANDLE hFile = cast(HANDLE) file.v[0]; if (hFile) { CloseHandle(hFile); } } void FS_FileRead(OS_Handle file, void *ptr, U64 size, U64 offset) { HANDLE hFile = cast(HANDLE) file.v[0]; if (hFile) { U8 *buffer = ptr; U64 current = offset; U64 remainder = size; while (remainder != 0) { OVERLAPPED overlapped = { 0 }; overlapped.Offset = cast(DWORD) (current & 0xFFFFFFFF); overlapped.OffsetHigh = cast(DWORD) ((current >> 32) & 0xFFFFFFFF); DWORD toread = (remainder > U32_MAX) ? U32_MAX : (DWORD) remainder; DWORD nread = 0; if (!ReadFile(hFile, buffer, toread, &nread, &overlapped)) { break; } buffer += nread; current += nread; remainder -= nread; } } } void FS_FileWrite(OS_Handle file, void *ptr, U64 size, U64 offset) { HANDLE hFile = cast(HANDLE) file.v[0]; if (hFile) { U8 *buffer = ptr; U64 current = offset; U64 remainder = size; while (remainder != 0) { OVERLAPPED overlapped = { 0 }; overlapped.Offset = cast(DWORD) (current & 0xFFFFFFFF); overlapped.OffsetHigh = cast(DWORD) ((current >> 32) & 0xFFFFFFFF); DWORD towrite = (remainder > U32_MAX) ? U32_MAX : (DWORD) remainder; DWORD nwritten = 0; if (!WriteFile(hFile, buffer, towrite, &nwritten, &overlapped)) { break; } buffer += nwritten; current += nwritten; remainder -= nwritten; } } }