From 46c0597492624e084b89fb49c945dd3e53b2f6fe Mon Sep 17 00:00:00 2001 From: mkrsym1 Date: Sat, 24 Feb 2024 18:32:33 +0200 Subject: [PATCH] Moved memorymapping files into a separate function --- game_payload/blob/core.o | Bin 7627 -> 6774 bytes game_payload/include/utils.h | 10 ++++++++ game_payload/src/tx.c | 22 +++++++----------- game_payload/src/utils.c | 44 +++++++++++++++++++++-------------- 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/game_payload/blob/core.o b/game_payload/blob/core.o index 4c441e03f2e5f16d52480e71af4d60a8851e256f..4bd58b6c281639213276bc1243f32727d1a19d4d 100644 GIT binary patch literal 6774 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 O4!r+Ij9}>FJ^R1AqOIBh literal 7627 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 YZN`rhDH=;elfe-CAHon#S6{sU1`UXAz5oCK diff --git a/game_payload/include/utils.h b/game_payload/include/utils.h index af0bbbe..90155f7 100644 --- a/game_payload/include/utils.h +++ b/game_payload/include/utils.h @@ -1,9 +1,19 @@ #pragma once +#include #include #define UTILS_COUNT(arr) (sizeof(arr) / sizeof(*arr)) +struct file_mapping { + HANDLE file; + HANDLE mapping; + unsigned char *data; +}; + +void utils_map_file(const wchar_t *path, struct file_mapping *map); +void utils_unmap_file(struct file_mapping *map); + int utils_path_exists(const wchar_t *filePath); uint32_t utils_file_crc32c(const wchar_t *filePath); diff --git a/game_payload/src/tx.c b/game_payload/src/tx.c index af88377..3b444d2 100644 --- a/game_payload/src/tx.c +++ b/game_payload/src/tx.c @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -15,30 +16,23 @@ void tx_table_file(struct game_data *game, wchar_t *buf) { GetTempPathW(MAX_PATH, tempDir); // Memorymap the base module - HANDLE baseFile = CreateFileA(game->base_module_name, FILE_READ_ACCESS, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (!baseFile) { - msg_err_a("Could not open file: %s", game->base_module_name); - } + wchar_t baseModuleW[MAX_PATH]; + MultiByteToWideChar(CP_UTF8, 0, game->base_module_name, strlen(game->base_module_name) + 1, baseModuleW, MAX_PATH); - HANDLE hBaseMap = CreateFileMappingA(baseFile, NULL, PAGE_READONLY, 0, 0, NULL); - char *baseMap = MapViewOfFile(hBaseMap, FILE_MAP_READ, 0, 0, 0); - if (!baseMap) { - msg_err_a("Could not create file mapping for %s", game->base_module_name); - } + struct file_mapping map; + utils_map_file(baseModuleW, &map); // Checksum the TXS section - IMAGE_SECTION_HEADER *txsSection = pe_find_section(baseMap, game->txs_section_name); + IMAGE_SECTION_HEADER *txsSection = pe_find_section(map.data, game->txs_section_name); if (!txsSection) { msg_err_a("Could not find %s in %s. " ISSUE_SUFFIX, game->txs_section_name, game->base_module_name); } - uint32_t txsChecksum = crc32c(0, baseMap + txsSection->PointerToRawData, txsSection->SizeOfRawData); + uint32_t txsChecksum = crc32c(0, map.data + txsSection->PointerToRawData, txsSection->SizeOfRawData); // Format the path wsprintfW(buf, L"%sjadeite\\" JADEITE_VERSION "\\%hs.%x.dat", tempDir, game->base_module_name, txsChecksum); // Cleanup - UnmapViewOfFile(baseMap); - CloseHandle(hBaseMap); - CloseHandle(baseFile); + utils_unmap_file(&map); } diff --git a/game_payload/src/utils.c b/game_payload/src/utils.c index 3cf7211..c312cb6 100644 --- a/game_payload/src/utils.c +++ b/game_payload/src/utils.c @@ -5,31 +5,39 @@ #include +void utils_map_file(const wchar_t *path, struct file_mapping *map) { + map->file = CreateFileW(path, FILE_READ_ACCESS, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (map->file == INVALID_HANDLE_VALUE) { + msg_err_w(L"Could not open file: %ls", path); + } + + map->mapping = CreateFileMappingA(map->file, NULL, PAGE_READONLY, 0, 0, NULL); + map->data = MapViewOfFile(map->mapping, FILE_MAP_READ, 0, 0, 0); + if (!map->data) { + msg_err_w(L"Could not map view of file %ls", path); + } +} + +void utils_unmap_file(struct file_mapping *map) { + UnmapViewOfFile(map->data); + CloseHandle(map->mapping); + CloseHandle(map->file); +} + int utils_path_exists(const wchar_t *filePath) { return GetFileAttributesW(filePath) != INVALID_FILE_ATTRIBUTES; } uint32_t utils_file_crc32c(const wchar_t *filePath) { - HANDLE file = CreateFileW(filePath, FILE_READ_ACCESS, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (!file) { - msg_err_w(L"Could not open file: %ls", filePath); - } + struct file_mapping map; + utils_map_file(filePath, &map); LARGE_INTEGER fileSize; - GetFileSizeEx(file, &fileSize); + GetFileSizeEx(map.file, &fileSize); - HANDLE hMap = CreateFileMappingA(file, NULL, PAGE_READONLY, 0, 0, NULL); - char *map = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); - if (!map) { - msg_err_w(L"Could not create file mapping for %ls", filePath); - } - - uint32_t crc = crc32c(0, map, fileSize.QuadPart); - - UnmapViewOfFile(map); - CloseHandle(hMap); - CloseHandle(file); + uint32_t crc = crc32c(0, map.data, fileSize.QuadPart); + utils_unmap_file(&map); return crc; } @@ -51,8 +59,8 @@ void utils_create_parent_dirs(const wchar_t *path) { void utils_save_to_file(const wchar_t *filePath, const void *buf, size_t length) { HANDLE file = CreateFileW(filePath, FILE_WRITE_ACCESS, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); - if (!file) { - msg_err_w(L"Could not open file: %ls", filePath); + if (file == INVALID_HANDLE_VALUE) { + msg_err_w(L"Could not create file: %ls", filePath); } WriteFile(file, buf, length, NULL, FALSE);