Add some debugging stuff
This commit is contained in:
parent
3a9fed6845
commit
0a86dfac43
@ -7,23 +7,111 @@
|
|||||||
|
|
||||||
#include <utils/hook.hpp>
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
namespace branding
|
namespace branding
|
||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
std::map<int, std::string> connectivity_bits = {
|
||||||
|
{0x10000000, "???"},
|
||||||
|
{0x01000000, "LiveInventory_IsValid"},
|
||||||
|
{0x02000000, "LiveStorage_AreDDLsInSync"},
|
||||||
|
{0x04000000, "LiveInventory_InitialCODPointsChecked"},
|
||||||
|
{0x08000000, "Marketing_HaveMessages"},
|
||||||
|
{0x00100000, "LivePublisherVariables_AreVariablesAvailable"},
|
||||||
|
{0x00200000, "SaveGame_IsDataReady(controllerIndex, MODE_NETWORK_ONLINE)"},
|
||||||
|
{0x00400000, "LPC_IsLPCReady() || !Dvar_GetBool(live_useLPC)"},
|
||||||
|
{0x00800000, "LiveAntiCheat_ConsoleDetailsReported"},
|
||||||
|
{0x00010000, "Live_Qos_Finished"},
|
||||||
|
{0x00080000, "???"},
|
||||||
|
{0x00002000, "Live_IsGeoLocationDataRetrieved"},
|
||||||
|
{0x00000100, "LiveStorage_DoWeHavePlaylists"},
|
||||||
|
{0x00000200, "LiveStorage_ValidateFFOTD"},
|
||||||
|
{0x00000010, "LiveStats_Loadouts_Ready(controllerIndex, MODE_NETWORK_ONLINE)"},
|
||||||
|
{0x00000040, "g_dwNetStatus == 6"},
|
||||||
|
{0x00000080, "LiveStorage_DoWeHaveFFOTD"},
|
||||||
|
{0x00000002, "LiveUser_IsUserSignedInToLive"},
|
||||||
|
{0x00000004, "Live_IsUserSignedInToDemonware"},
|
||||||
|
{0x00000008, "LiveStats_Core_Ready(controllerIndex, MODE_NETWORK_ONLINE)"},
|
||||||
|
};
|
||||||
|
|
||||||
|
int patch = false;
|
||||||
|
|
||||||
|
std::string GetConnectivityInfo()
|
||||||
|
{
|
||||||
|
int bits = 0;
|
||||||
|
game::Live_GetConnectivityInformation(0, &bits, false);
|
||||||
|
std::string str = utils::string::va("Bits: %X\n", bits);
|
||||||
|
|
||||||
|
if (patch)
|
||||||
|
{
|
||||||
|
*(uint8_t*)0x143410CE8_g = 1;
|
||||||
|
*(uint8_t*)0x151843808_g = 1;
|
||||||
|
*(uint8_t*)0x151641C8A_g = 1;
|
||||||
|
*(uint32_t*)0x151412FB4_g = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int required_mask = 0x1FF923DE;
|
||||||
|
for (int i = 0; (1 << i) <= 0x10000000; ++i)
|
||||||
|
{
|
||||||
|
auto value = 1 << i;
|
||||||
|
|
||||||
|
bool set = bits & value;
|
||||||
|
bool req = required_mask & value;
|
||||||
|
if (!req) continue;
|
||||||
|
|
||||||
|
std::string name = "?";
|
||||||
|
|
||||||
|
auto entry = connectivity_bits.find(value);
|
||||||
|
if (entry != connectivity_bits.end())
|
||||||
|
{
|
||||||
|
name = entry->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
str += utils::string::va("%08X - %d - %s\n", value, (int)set, name.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& bit : connectivity_bits)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetOtherInfo()
|
||||||
|
{
|
||||||
|
std::string info;
|
||||||
|
|
||||||
|
info += utils::string::va("s_publisherFastFileInited: %d\n", (uint32_t)*(uint8_t*)0x1518DC384_g);
|
||||||
|
info += utils::string::va("Dvar_GetBool(qword_151641C00): %d\n", (uint32_t)reinterpret_cast<bool(*)(uint64_t)>(0x1421844C0_g)(*(uint64_t*)0x151641C00_g));
|
||||||
|
info += utils::string::va("0x143410CE8: %d\n", (uint32_t)*(uint8_t*)0x143410CE8_g);
|
||||||
|
info += utils::string::va("ffotdValid: %d\n", (uint32_t)*(uint8_t*)0x151843808_g);
|
||||||
|
info += utils::string::va("ffotdSize: %d\n", (uint32_t)*(uint32_t*)0x1518DC370_g);
|
||||||
|
info += utils::string::va("Sys_IsDatabaseReady: %d\n", (uint32_t)reinterpret_cast<bool(*)()>(0x1421844C0_g)());
|
||||||
|
info += utils::string::va("Com_IsRunningUILevel: %d\n", (uint32_t)(reinterpret_cast<bool(*)()>(0x142148DB0_g)()));
|
||||||
|
info += utils::string::va("array: %d\n", ((int*)0x1453DABC8_g)[1054 * *(DWORD*)0x14342355C_g]);
|
||||||
|
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
void draw_branding()
|
void draw_branding()
|
||||||
{
|
{
|
||||||
constexpr auto x = 4;
|
constexpr auto x = 4;
|
||||||
constexpr auto y = 0;
|
constexpr auto y = 0;
|
||||||
constexpr auto scale = 0.45f;
|
constexpr auto scale = 0.45f;
|
||||||
float color[4] = {0.666f, 0.666f, 0.666f, 0.666f};
|
float color[4] = {0.666f, 0.666f, 0.666f, 1.0f};
|
||||||
|
|
||||||
auto* font = reinterpret_cast<uint32_t*(*)()>(0x141CAC8E0_g)();
|
auto* font = reinterpret_cast<uint32_t*(*)()>(0x141CAC8E0_g)();
|
||||||
if (!font) return;
|
if (!font) return;
|
||||||
|
|
||||||
game::R_AddCmdDrawText("BOIII: " VERSION, 0x7FFFFFFF, font, static_cast<float>(x),
|
std::string str = "BOIII: " VERSION;
|
||||||
|
//str += "\n\n" + GetConnectivityInfo();
|
||||||
|
//str += "\n\n" + GetOtherInfo();
|
||||||
|
game::R_AddCmdDrawText(str.data(), 0x7FFFFFFF, font, static_cast<float>(x),
|
||||||
y + static_cast<float>(font[2]) * scale,
|
y + static_cast<float>(font[2]) * scale,
|
||||||
scale, scale, 0.0f, color, game::ITEM_TEXTSTYLE_NORMAL);
|
scale, scale, 0.0f, color, game::ITEM_TEXTSTYLE_MONOSPACESHADOWED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ namespace console
|
|||||||
void print_message(const char* message)
|
void print_message(const char* message)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
//OutputDebugStringA(message);
|
OutputDebugStringA(message);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (started && !terminate_runner)
|
if (started && !terminate_runner)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <std_include.hpp>
|
#include <std_include.hpp>
|
||||||
#include "loader/component_loader.hpp"
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include <utils/io.hpp>
|
||||||
#include <utils/hook.hpp>
|
#include <utils/hook.hpp>
|
||||||
#include <utils/thread.hpp>
|
#include <utils/thread.hpp>
|
||||||
|
|
||||||
@ -11,6 +12,8 @@
|
|||||||
#include "game/demonware/servers/umbrella_server.hpp"
|
#include "game/demonware/servers/umbrella_server.hpp"
|
||||||
#include "game/demonware/server_registry.hpp"
|
#include "game/demonware/server_registry.hpp"
|
||||||
|
|
||||||
|
#include "resource.hpp"
|
||||||
|
|
||||||
#define TCP_BLOCKING true
|
#define TCP_BLOCKING true
|
||||||
#define UDP_BLOCKING false
|
#define UDP_BLOCKING false
|
||||||
|
|
||||||
@ -436,6 +439,120 @@ namespace demonware
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FSCKData
|
||||||
|
{
|
||||||
|
bool bSuccess;
|
||||||
|
bool bInProgress;
|
||||||
|
bool bFileChecked;
|
||||||
|
hash_state hstate;
|
||||||
|
uint32_t fileIndex;
|
||||||
|
uint32_t filePointer;
|
||||||
|
byte data[65536];
|
||||||
|
};
|
||||||
|
|
||||||
|
void load_ffotd()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("LOADING FASTFILE");
|
||||||
|
|
||||||
|
static const auto ffotd = utils::nt::load_resource(DW_FASTFILE);
|
||||||
|
|
||||||
|
game::XZoneInfo zone_info{};
|
||||||
|
zone_info.name = "core_ffotd_tu32_593";
|
||||||
|
zone_info.allocFlags = 0x2000;
|
||||||
|
zone_info.freeFlags = 0x40000000;
|
||||||
|
zone_info.allocSlot = 0;
|
||||||
|
zone_info.freeSlot = 0;
|
||||||
|
zone_info.fileBuffer.data = ffotd.data();
|
||||||
|
zone_info.fileBuffer.dataSize = ffotd.size();
|
||||||
|
|
||||||
|
game::DB_LoadXAssets(&zone_info, 1, false, false);
|
||||||
|
|
||||||
|
|
||||||
|
OutputDebugStringA("DONE1 FASTFILE");
|
||||||
|
|
||||||
|
reinterpret_cast<void(*)()>(0x141424EB0_g)();
|
||||||
|
OutputDebugStringA("DONE2 FASTFILE");
|
||||||
|
*reinterpret_cast<bool*>(0x151843803_g) = true;
|
||||||
|
OutputDebugStringA("DONE3 FASTFILE");
|
||||||
|
}
|
||||||
|
|
||||||
|
void doLPCStuff()
|
||||||
|
{
|
||||||
|
auto& s_fsckData = *(FSCKData*)0x1562CDB00_g;
|
||||||
|
bool& s_lpcData_lpcBusy = *(bool*)0x1562CDACD_g;
|
||||||
|
bool& s_lpcData_lpcReady = *(bool*)0x1562CDACC_g;
|
||||||
|
uint8_t* s_localManifest = (uint8_t*)0x1562DDBE0_g;
|
||||||
|
|
||||||
|
std::string data = utils::io::read_file("LPC/.manifest");
|
||||||
|
if (data.empty())
|
||||||
|
{
|
||||||
|
s_lpcData_lpcBusy = false;
|
||||||
|
printf("LPC BAD :(\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("LPC GOOD :)\n");
|
||||||
|
|
||||||
|
memcpy(s_localManifest, data.data(), data.size());
|
||||||
|
|
||||||
|
if (!s_fsckData.bInProgress)
|
||||||
|
{
|
||||||
|
// LPC_ResetFSCK
|
||||||
|
memset(&s_fsckData, 0, sizeof(s_fsckData));
|
||||||
|
s_fsckData.bSuccess = true;
|
||||||
|
s_fsckData.bInProgress = true;
|
||||||
|
s_lpcData_lpcBusy = true;
|
||||||
|
|
||||||
|
// LPC_TickFSCK
|
||||||
|
//reinterpret_cast<void(*)()>(0x141F03F00_g)();
|
||||||
|
//load_ffotd();
|
||||||
|
|
||||||
|
// Fuck it
|
||||||
|
s_fsckData.bSuccess = true;
|
||||||
|
s_fsckData.bInProgress = false;
|
||||||
|
s_lpcData_lpcBusy = false;
|
||||||
|
s_lpcData_lpcReady = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getShotLang(game::XZoneInfo* zoneInfo, uint32_t zoneCount, bool sync, bool suppressSync)
|
||||||
|
{
|
||||||
|
printf("ZOOONEEE: %X %s\n", zoneCount, zoneInfo[0].name);
|
||||||
|
game::DB_LoadXAssets(zoneInfo, zoneCount, sync, suppressSync);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils::hook::detour start;
|
||||||
|
utils::hook::detour suc;
|
||||||
|
utils::hook::detour fai;
|
||||||
|
|
||||||
|
void* succ(void* a1, void* a2)
|
||||||
|
{
|
||||||
|
printf("LPC SUCCESS\n");
|
||||||
|
return suc.invoke<void*>(a1, a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* failc(void* a1, void* a2)
|
||||||
|
{
|
||||||
|
printf("LPC FAIL\n");
|
||||||
|
return fai.invoke<void*>(a1, a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* startc(void* a1, void* a2)
|
||||||
|
{
|
||||||
|
printf("LPC START\n");
|
||||||
|
return start.invoke<void*>(a1, a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void statusss()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("IT CXALLLED");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* getShotLangReal()
|
||||||
|
{
|
||||||
|
return "core_ffotd_tu32_593";
|
||||||
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -482,6 +599,29 @@ namespace demonware
|
|||||||
|
|
||||||
utils::hook::set<uint32_t>(0x141EC4B50_g, 0xC3D08948); // Skip publisher file signature stuff
|
utils::hook::set<uint32_t>(0x141EC4B50_g, 0xC3D08948); // Skip publisher file signature stuff
|
||||||
|
|
||||||
|
//utils::hook::set<uint32_t>(0x141EC4B40_g, 0xC301B0); // FFOTD is valid
|
||||||
|
//utils::hook::set<uint32_t>(0x141EBDF30_g, 0xC301B0); // DDLs available
|
||||||
|
//utils::hook::set<uint32_t>(0x141E968F0_g, 0xC301B0); // QOL finished
|
||||||
|
//*(uint8_t*)0x151843808_g = 1; //
|
||||||
|
//*(uint8_t*)0x151641C8A_g = 1; // DDLs
|
||||||
|
//*(uint32_t*)0x151412FB4_g = 4; // QOL
|
||||||
|
|
||||||
|
//utils::hook::jump(0x141F03A20_g, doLPCStuff);
|
||||||
|
//utils::hook::call(0x141EC462D_g, getShotLang);
|
||||||
|
utils::hook::call(0x141EC458C_g, getShotLangReal);
|
||||||
|
|
||||||
|
//start.create(0x141EC4400_g, startc);
|
||||||
|
//suc.create(0x141440B00_g, succ);
|
||||||
|
//fai.create(0x141440B10_g, failc);
|
||||||
|
|
||||||
|
/*utils::hook::jump(0x141EC4487_g, utils::hook::assemble([](utils::hook::assembler& a)
|
||||||
|
{
|
||||||
|
a.pushad64();
|
||||||
|
a.call_aligned(statusss);
|
||||||
|
a.popad64();
|
||||||
|
a.mov(qword_ptr(rsp, 0x288 + 0x8), rdi);
|
||||||
|
a.jmp(0x141EC448F_g);
|
||||||
|
}));*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void pre_destroy() override
|
void pre_destroy() override
|
||||||
|
Loading…
Reference in New Issue
Block a user