Close imagefile handles
This commit is contained in:
parent
e6901318e8
commit
9ceda4f4fd
@ -7,6 +7,7 @@
|
|||||||
#include "console.hpp"
|
#include "console.hpp"
|
||||||
#include "mods.hpp"
|
#include "mods.hpp"
|
||||||
#include "fonts.hpp"
|
#include "fonts.hpp"
|
||||||
|
#include "imagefiles.hpp"
|
||||||
|
|
||||||
#include <utils/hook.hpp>
|
#include <utils/hook.hpp>
|
||||||
#include <utils/concurrency.hpp>
|
#include <utils/concurrency.hpp>
|
||||||
@ -31,6 +32,7 @@ namespace fastfiles
|
|||||||
utils::hook::detour db_try_load_x_file_internal_hook;
|
utils::hook::detour db_try_load_x_file_internal_hook;
|
||||||
utils::hook::detour db_find_xasset_header;
|
utils::hook::detour db_find_xasset_header;
|
||||||
utils::hook::detour load_xasset_header_hook;
|
utils::hook::detour load_xasset_header_hook;
|
||||||
|
utils::hook::detour db_unload_x_zones_hook;
|
||||||
|
|
||||||
void db_try_load_x_file_internal(const char* zone_name, const int flags)
|
void db_try_load_x_file_internal(const char* zone_name, const int flags)
|
||||||
{
|
{
|
||||||
@ -158,10 +160,13 @@ namespace fastfiles
|
|||||||
void load_pre_gfx_zones(game::XZoneInfo* zone_info,
|
void load_pre_gfx_zones(game::XZoneInfo* zone_info,
|
||||||
unsigned int zone_count, game::DBSyncMode sync_mode)
|
unsigned int zone_count, game::DBSyncMode sync_mode)
|
||||||
{
|
{
|
||||||
|
imagefiles::close_custom_handles();
|
||||||
|
|
||||||
// code_pre_gfx
|
// code_pre_gfx
|
||||||
|
|
||||||
utils::memory::allocator allocator;
|
utils::memory::allocator allocator;
|
||||||
std::vector<game::XZoneInfo> zones;
|
std::vector<game::XZoneInfo> zones;
|
||||||
|
|
||||||
try_add_zone(zones, allocator, "h2_mod_pre_gfx", true);
|
try_add_zone(zones, allocator, "h2_mod_pre_gfx", true);
|
||||||
add_mod_zones(zones, allocator, mods::zone_priority::pre_gfx);
|
add_mod_zones(zones, allocator, mods::zone_priority::pre_gfx);
|
||||||
push_zones(zones, zone_info, zone_count);
|
push_zones(zones, zone_info, zone_count);
|
||||||
@ -570,6 +575,22 @@ namespace fastfiles
|
|||||||
|
|
||||||
load_xasset_header_hook.invoke<void>(a1);
|
load_xasset_header_hook.invoke<void>(a1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void db_unload_x_zones_stub(const unsigned short* unload_zones,
|
||||||
|
const unsigned int unload_count, const bool create_default)
|
||||||
|
{
|
||||||
|
for (auto i = 0u; i < unload_count; i++)
|
||||||
|
{
|
||||||
|
const auto zone_name = game::g_zones[unload_zones[i]].name;
|
||||||
|
if (zone_name[0] != '\0')
|
||||||
|
{
|
||||||
|
printf("unload zone %s\n", zone_name);
|
||||||
|
imagefiles::close_handle(zone_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
db_unload_x_zones_hook.invoke<void>(unload_zones, unload_count, create_default);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exists(const std::string& zone)
|
bool exists(const std::string& zone)
|
||||||
@ -585,7 +606,6 @@ namespace fastfiles
|
|||||||
{
|
{
|
||||||
db_fs->vftbl->Close(db_fs, handle);
|
db_fs->vftbl->Close(db_fs, handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return handle != nullptr;
|
return handle != nullptr;
|
||||||
@ -644,6 +664,8 @@ namespace fastfiles
|
|||||||
db_try_load_x_file_internal_hook.create(0x1404173B0, db_try_load_x_file_internal);
|
db_try_load_x_file_internal_hook.create(0x1404173B0, db_try_load_x_file_internal);
|
||||||
db_find_xasset_header.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub);
|
db_find_xasset_header.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub);
|
||||||
|
|
||||||
|
db_unload_x_zones_hook.create(0x140417D80, db_unload_x_zones_stub);
|
||||||
|
|
||||||
// Allow loading of mixed compressor types
|
// Allow loading of mixed compressor types
|
||||||
utils::hook::nop(0x1403E66A7, 2);
|
utils::hook::nop(0x1403E66A7, 2);
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ namespace imagefiles
|
|||||||
char __pad0[88];
|
char __pad0[88];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
utils::memory::allocator image_file_allocator;
|
||||||
std::unordered_map<std::string, image_file_unk*> image_file_unk_map;
|
std::unordered_map<std::string, image_file_unk*> image_file_unk_map;
|
||||||
std::unordered_map<std::string, game::DB_IFileSysFile*> image_file_handles;
|
std::unordered_map<std::string, game::DB_IFileSysFile*> image_file_handles;
|
||||||
|
|
||||||
@ -44,7 +45,7 @@ namespace imagefiles
|
|||||||
const auto name = get_image_file_name();
|
const auto name = get_image_file_name();
|
||||||
if (image_file_unk_map.find(name) == image_file_unk_map.end())
|
if (image_file_unk_map.find(name) == image_file_unk_map.end())
|
||||||
{
|
{
|
||||||
const auto unk = utils::memory::get_allocator()->allocate<image_file_unk>();
|
const auto unk = image_file_allocator.allocate<image_file_unk>();
|
||||||
image_file_unk_map[name] = unk;
|
image_file_unk_map[name] = unk;
|
||||||
return unk;
|
return unk;
|
||||||
}
|
}
|
||||||
@ -129,6 +130,41 @@ namespace imagefiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void close_custom_handles()
|
||||||
|
{
|
||||||
|
const auto db_fs = game::DB_FSInitialize();
|
||||||
|
for (const auto& handle : image_file_handles)
|
||||||
|
{
|
||||||
|
if (handle.second != nullptr)
|
||||||
|
{
|
||||||
|
db_fs->vftbl->Close(db_fs, handle.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
image_file_handles.clear();
|
||||||
|
image_file_unk_map.clear();
|
||||||
|
image_file_allocator.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void close_handle(const std::string& fastfile)
|
||||||
|
{
|
||||||
|
if (!image_file_handles.contains(fastfile))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto db_fs = game::DB_FSInitialize();
|
||||||
|
const auto handle = image_file_handles[fastfile];
|
||||||
|
if (handle != nullptr)
|
||||||
|
{
|
||||||
|
db_fs->vftbl->Close(db_fs, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
image_file_handles.erase(fastfile);
|
||||||
|
image_file_allocator.free(image_file_unk_map[fastfile]);
|
||||||
|
image_file_unk_map.erase(fastfile);
|
||||||
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
7
src/client/component/imagefiles.hpp
Normal file
7
src/client/component/imagefiles.hpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace imagefiles
|
||||||
|
{
|
||||||
|
void close_custom_handles();
|
||||||
|
void close_handle(const std::string& fastfile);
|
||||||
|
}
|
@ -1156,6 +1156,15 @@ namespace game
|
|||||||
DB_ZONE_CUSTOM = 0x1000 // added for custom zone loading
|
DB_ZONE_CUSTOM = 0x1000 // added for custom zone loading
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct XZone
|
||||||
|
{
|
||||||
|
char __pad0[24];
|
||||||
|
char name[64];
|
||||||
|
char __pad1[128];
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(XZone) == 216);
|
||||||
|
|
||||||
struct XZoneInfo
|
struct XZoneInfo
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
|
@ -223,12 +223,13 @@ namespace game
|
|||||||
|
|
||||||
WEAK symbol<HWND> hWnd{0x14CCF81C0};
|
WEAK symbol<HWND> hWnd{0x14CCF81C0};
|
||||||
|
|
||||||
WEAK game::symbol<const char*> g_assetNames{0x140BEF280};
|
WEAK symbol<const char*> g_assetNames{0x140BEF280};
|
||||||
|
|
||||||
WEAK game::symbol<void*> g_assetPool{0x140BF3620};
|
WEAK symbol<void*> g_assetPool{0x140BF3620};
|
||||||
|
|
||||||
WEAK game::symbol<unsigned int> g_zoneCount{0x1422F45F4};
|
WEAK symbol<unsigned int> g_zoneCount{0x1422F45F4};
|
||||||
WEAK game::symbol<unsigned short> g_zoneIndex{0x1422F8DC8};
|
WEAK symbol<unsigned short> g_zoneIndex{0x1422F8DC8};
|
||||||
|
WEAK symbol<XZone> g_zones{0x144176040};
|
||||||
|
|
||||||
WEAK symbol<int> g_compressor{0x142065E80};
|
WEAK symbol<int> g_compressor{0x142065E80};
|
||||||
WEAK symbol<int> g_poolSize{0x140BF2E40};
|
WEAK symbol<int> g_poolSize{0x140BF2E40};
|
||||||
|
Loading…
Reference in New Issue
Block a user