45 lines
1.4 KiB
C
45 lines
1.4 KiB
C
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
#include <crc32.h>
|
|
#include <msg.h>
|
|
#include <pe.h>
|
|
#include <main.h>
|
|
#include <config.h>
|
|
|
|
#include <tx.h>
|
|
|
|
void tx_table_file(struct game_data *game, wchar_t *buf) {
|
|
// Get temp directory path
|
|
wchar_t tempDir[MAX_PATH];
|
|
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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
// Checksum the TXS section
|
|
IMAGE_SECTION_HEADER *txsSection = pe_find_section(baseMap, 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);
|
|
|
|
// 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);
|
|
}
|