complete reverse of open file by mode

This commit is contained in:
Diavolo 2022-08-07 12:33:01 +02:00
parent b18445d2e8
commit 1c20a36a8b
No known key found for this signature in database
GPG Key ID: FA77F074E98D98A5
4 changed files with 78 additions and 12 deletions

View File

@ -789,10 +789,10 @@ namespace game
return (*fs_searchpaths != nullptr); return (*fs_searchpaths != nullptr);
} }
void* fs_handle_for_file_dedicated(FsThread thread) int fs_handle_for_file_dedicated(FsThread thread)
{ {
static DWORD func = 0x5245F0; static DWORD func = 0x5245F0;
void* result = nullptr; auto result = 0;
__asm __asm
{ {
@ -806,14 +806,14 @@ namespace game
return result; return result;
} }
void* FS_HandleForFile(FsThread thread) int FS_HandleForFile(FsThread thread)
{ {
if (is_dedi()) if (is_dedi())
{ {
return fs_handle_for_file_dedicated(thread); return fs_handle_for_file_dedicated(thread);
} }
return reinterpret_cast<void*(*)(FsThread)> return reinterpret_cast<int(*)(FsThread)>
(SELECT_VALUE(0x46B1C0, 0x5AEE50, 0x0))(thread); (SELECT_VALUE(0x46B1C0, 0x5AEE50, 0x0))(thread);
} }

View File

@ -286,7 +286,7 @@ namespace game
void FS_FCloseFile(int h); void FS_FCloseFile(int h);
bool FS_Initialized(); bool FS_Initialized();
void* FS_HandleForFile(FsThread thread); int FS_HandleForFile(FsThread thread);
int FS_FOpenFileReadForThread(const char* filename, int* file, FsThread thread); int FS_FOpenFileReadForThread(const char* filename, int* file, FsThread thread);
int FS_CreatePath(char* OSPath); int FS_CreatePath(char* OSPath);
void FS_CheckFileSystemStarted(); void FS_CheckFileSystemStarted();

View File

@ -27,14 +27,27 @@ static unsigned int file_write(const void* ptr, unsigned int len, FILE* stream)
static FILE* file_open_append_text(const char* filename) static FILE* file_open_append_text(const char* filename)
{ {
FILE* file; errno = 0;
const auto err = fopen_s(&file, filename, "at"); auto* file = fopen(filename, "at");
if (err == 0) if (file)
{ {
return file; return file;
} }
printf("Couldn't open file: %s\n", filename); printf("Couldn't open file: %s %s\n", filename, strerror(errno));
return nullptr;
}
static FILE* file_open_write_binary(const char* filename)
{
errno = 0;
auto* file = fopen(filename, "wb");
if (file)
{
return file;
}
printf("Couldn't open file: %s %s\n", filename, strerror(errno));
return nullptr; return nullptr;
} }
@ -127,7 +140,7 @@ static game::native::FsThread get_current_thread()
return game::native::FS_THREAD_INVALID; return game::native::FS_THREAD_INVALID;
} }
static void* handle_for_file_current_thread() static int handle_for_file_current_thread()
{ {
return game::native::FS_HandleForFile(get_current_thread()); return game::native::FS_HandleForFile(get_current_thread());
} }
@ -155,7 +168,7 @@ static int open_file_append(const char* filename)
return 0; return 0;
} }
auto h = reinterpret_cast<int>(handle_for_file_current_thread()); auto h = handle_for_file_current_thread();
game::native::fsh[h].zipFile = nullptr; game::native::fsh[h].zipFile = nullptr;
strncpy_s(game::native::fsh[h].name, filename, _TRUNCATE); strncpy_s(game::native::fsh[h].name, filename, _TRUNCATE);
game::native::fsh[h].handleFiles.file.o = f; game::native::fsh[h].handleFiles.file.o = f;
@ -170,12 +183,56 @@ static int open_file_append(const char* filename)
return h; return h;
} }
static int get_handle_and_open_file(const char* filename, const char* ospath, game::native::FsThread thread)
{
auto* fp = file_open_write_binary(ospath);
if (!fp)
{
return 0;
}
const auto f = game::native::FS_HandleForFile(thread);
game::native::fsh[f].zipFile = NULL;
game::native::fsh[f].handleFiles.file.o = fp;
strncpy_s(game::native::fsh[f].name, filename, _TRUNCATE);
game::native::fsh[f].handleSync = 0;
return f;
}
static int open_file_write_to_dir_for_thread(const char* filename, const char* dir, const char* osbasepath, game::native::FsThread thread)
{
char ospath[MAX_PATH]{};
game::native::FS_CheckFileSystemStarted();
const char* basepath = (*fs_homepath)->current.string;
build_os_path_for_thread(basepath, dir, filename, ospath, game::native::FS_THREAD_MAIN);
if ((*fs_debug)->current.integer)
{
printf("FS_FOpenFileWriteToDirForThread: %s\n", ospath);
}
if (game::native::FS_CreatePath(ospath))
{
return 0;
}
return get_handle_and_open_file(filename, ospath, thread);
}
static int open_file_write(const char* filename)
{
return open_file_write_to_dir_for_thread(filename, game::native::fs_gamedir, "", game::native::FS_THREAD_MAIN);
}
static const char* sys_default_install_path_stub() static const char* sys_default_install_path_stub()
{ {
static auto current_path = std::filesystem::current_path().string(); static auto current_path = std::filesystem::current_path().string();
return current_path.data(); return current_path.data();
} }
int file_system::open_file_by_mode(const char* qpath, int* f, game::native::fsMode_t mode) int file_system::open_file_by_mode(const char* qpath, int* f, game::native::fsMode_t mode)
{ {
auto r = 6969; auto r = 6969;
@ -187,6 +244,14 @@ int file_system::open_file_by_mode(const char* qpath, int* f, game::native::fsMo
*game::native::com_fileAccessed = TRUE; *game::native::com_fileAccessed = TRUE;
r = game::native::FS_FOpenFileReadForThread(qpath, f, game::native::FS_THREAD_MAIN); r = game::native::FS_FOpenFileReadForThread(qpath, f, game::native::FS_THREAD_MAIN);
break; break;
case game::native::FS_WRITE:
*f = open_file_write(qpath);
r = 0;
if (!*f)
{
r = -1;
}
break;
case game::native::FS_APPEND_SYNC: case game::native::FS_APPEND_SYNC:
sync = 1; sync = 1;
case game::native::FS_APPEND: case game::native::FS_APPEND:

View File

@ -17,6 +17,7 @@
#pragma warning(disable: 28020) #pragma warning(disable: 28020)
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h> #include <Windows.h>
#include <MsHTML.h> #include <MsHTML.h>