Skip to content

Commit a55a647

Browse files
Implement support for TXT files that can't be loaded outside CPKs in 1.01.
1 parent 7fd803e commit a55a647

8 files changed

+69
-2
lines changed

Source/DivaModLoader/Allocator.h

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
static inline FUNCTION_PTR(void*, __fastcall, operatorNew, sigOperatorNew(), size_t);
66
static inline FUNCTION_PTR(void*, __fastcall, operatorDelete, sigOperatorDelete(), void*);
7+
static inline FUNCTION_PTR(void*, __fastcall, heapCMallocAllocate, sigHeapCMallocAllocate(), size_t type, size_t size, const char* name);
78

89
template <class T>
910
class Allocator

Source/DivaModLoader/Context.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "CodeLoader.h"
44
#include "DatabaseLoader.h"
5+
#include "FileLoader.h"
56
#include "ModLoader.h"
67
#include "Patches.h"
78
#include "SigScan.h"
@@ -67,6 +68,7 @@ void Context::init()
6768
Patches::init();
6869
ModLoader::init();
6970
CodeLoader::init();
71+
FileLoader::init();
7072

7173
INSTALL_HOOK(WinMain);
7274
}

Source/DivaModLoader/DivaModLoader.vcxproj

+2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
<ClInclude Include="Config.h" />
105105
<ClInclude Include="Context.h" />
106106
<ClInclude Include="DatabaseLoader.h" />
107+
<ClInclude Include="FileLoader.h" />
107108
<ClInclude Include="ModLoader.h" />
108109
<ClInclude Include="Patches.h" />
109110
<ClInclude Include="Pch.h" />
@@ -116,6 +117,7 @@
116117
<ClCompile Include="Config.cpp" />
117118
<ClCompile Include="Context.cpp" />
118119
<ClCompile Include="DatabaseLoader.cpp" />
120+
<ClCompile Include="FileLoader.cpp" />
119121
<ClCompile Include="ModLoader.cpp" />
120122
<ClCompile Include="Patches.cpp" />
121123
<ClCompile Include="Pch.cpp">

Source/DivaModLoader/DivaModLoader.vcxproj.filters

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<ClInclude Include="Patches.h" />
1313
<ClInclude Include="SigScan.h" />
1414
<ClInclude Include="DatabaseLoader.h" />
15+
<ClInclude Include="FileLoader.h" />
1516
</ItemGroup>
1617
<ItemGroup>
1718
<ClCompile Include="Pch.cpp" />
@@ -22,5 +23,6 @@
2223
<ClCompile Include="Patches.cpp" />
2324
<ClCompile Include="SigScan.cpp" />
2425
<ClCompile Include="DatabaseLoader.cpp" />
26+
<ClCompile Include="FileLoader.cpp" />
2527
</ItemGroup>
2628
</Project>

Source/DivaModLoader/FileLoader.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "FileLoader.h"
2+
#include "Allocator.h"
3+
4+
// This piece of code here only applies to 1.01. For some reason, not all TXT files can be loaded
5+
// outside CPKs in this version, so we need to do it manually.
6+
7+
struct CpkFileHandle
8+
{
9+
char type[0x100]; // "criloader"
10+
void* data; // 0x100
11+
size_t dataSize; // 0x108
12+
uint8_t gap110[0x18];
13+
};
14+
15+
HOOK(CpkFileHandle*, __fastcall, OpenFileFromCpk, sigLoadFileFromCpk(), const char* fileName, bool a2, bool a3)
16+
{
17+
// I don't know what these arguments mean, but they are utilized by files
18+
// that we are interested in manually loading.
19+
if (a2 && a3)
20+
{
21+
FILE* file = fopen(fileName, "rb");
22+
if (file)
23+
{
24+
// Replicate the exact same data structure as the original function.
25+
CpkFileHandle* handle = (CpkFileHandle*)operatorNew(sizeof(CpkFileHandle));
26+
ZeroMemory(handle, sizeof(*handle));
27+
28+
strcpy(handle->type, "criloader");
29+
30+
// Load entirety of the file at once.
31+
fseek(file, 0, SEEK_END);
32+
handle->dataSize = ftell(file);
33+
fseek(file, 0, SEEK_SET);
34+
handle->data = heapCMallocAllocate(5, handle->dataSize, "cri file extract buffer");
35+
fread(handle->data, handle->dataSize, 1, file);
36+
fclose(file);
37+
38+
return handle;
39+
}
40+
}
41+
42+
return originalOpenFileFromCpk(fileName, a2, a3);
43+
}
44+
45+
void FileLoader::init()
46+
{
47+
INSTALL_HOOK(OpenFileFromCpk);
48+
}

Source/DivaModLoader/FileLoader.h

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
class FileLoader
4+
{
5+
public:
6+
static void init();
7+
};

Source/DivaModLoader/SigScan.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ SIG_SCAN(sigCrtMain, 0x1409794C8, "\x48\x89\x5C\x24\x00\x57\x48\x83\xEC\x30\xB9\
8989
SIG_SCAN(sigWinMain, 0x1402C34E0, "\x40\x55\x53\x57\x41\x54\x41\x55\x48\x8D\xAC\x24\x00\x00\x00\x00\xB8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x2B\xE0\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x85\x00\x00\x00\x00\x48\x8B\xD9\xBA\x00\x00\x00\x00\x33\xC9\x45\x8B\xE1\xFF\x15\x00\x00\x00\x00\xFF\x15\x00\x00\x00\x00\x4C\x8B\xC0\x48\x8D\x95\x00\x00\x00\x00\x48\x8D\x8D\x00\x00\x00\x00", "xxxxxxxxxxxx????x????x????xxxxxx????xxxxxx????xxxx????xxxxxxx????xx????xxxxxx????xxx????")
9090
SIG_SCAN(sigOperatorNew, 0x140978A10, "\x40\x53\x48\x83\xEC\x20\x48\x8B\xD9\xEB\x0F\x48\x8B\xCB\xE8\x00\x00\x00\x00\x85\xC0\x74\x13\x48\x8B\xCB\xE8\x00\x00\x00\x00\x48\x85\xC0\x74\xE7\x48\x83\xC4\x20\x5B\xC3\x48\x83\xFB\xFF\x74\x06\xE8\x00\x00\x00\x00\xCC\xE8\x00\x00\x00\x00\xCC\x40\x53", "xxxxxxxxxxxxxxx????xxxxxxxx????xxxxxxxxxxxxxxxxxx????xx????xxx")
9191
SIG_SCAN(sigOperatorDelete, 0x1409B30D0, "\x48\x85\xC9\x74\x37\x53\x48\x83\xEC\x20\x4C\x8B\xC1\x33\xD2\x48\x8B\x0D\x00\x00\x00\x00\xFF\x15\x00\x00\x00\x00\x85\xC0\x75\x17\xE8\x00\x00\x00\x00\x48\x8B\xD8\xFF\x15\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x89\x03\x48\x83\xC4\x20\x5B\xC3", "xxxxxxxxxxxxxxxxxx????xx????xxxxx????xxxxx????xxx????xxxxxxxx")
92+
SIG_SCAN(sigHeapCMallocAllocate, 0x1404403B0, "\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x20\x0F\xB6\x05\x00\x00\x00\x00\x49\x8B\xE8\x48\x63\xF9\x48\x8B\xF2\x84\xC0\x75\x0C\xE8\x00\x00\x00\x00\x0F\xB6\x05\x00\x00\x00\x00", "xxxx?xxxx?xxxxxxxx????xxxxxxxxxxxxxx????xxx????")
9293
SIG_SCAN(sigInitRomDirectoryPaths, 0x1402A2510, "\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x48\x89\x7C\x24\x00\x55\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8B\xEC\x48\x81\xEC\x00\x00\x00\x00\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x45\xF0\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x33\xF6\x48\x89\x75\xD0\x48\x89\x75\xE0\xBF\x00\x00\x00\x00\x48\x89\x7D\xE8\x40\x88\x75\xD0\x45\x33\xC0\x48\x8D\x15\x00\x00\x00\x00\x48\x8D\x4D\xD0\xE8\x00\x00\x00\x00\x90\x44\x8D\x46\x02\x48\x8D\x15\x00\x00\x00\x00\x48\x8D\x4D\xD0\xE8\x00\x00\x00\x00\x89\x75\xC0\x4C\x8D\x25\x00\x00\x00\x00\x48\x8D\x5E\xFF\x0F\x1F\x80\x00\x00\x00\x00", "xxxx?xxxx?xxxx?xxxxxxxxxxxxxxx????xxx????xxxxxxxxxx????x????xxxxxxxxxxx????xxxxxxxxxxxxxx????xxxxx????xxxxxxxx????xxxxx????xxxxxx????xxxxxxx????")
9394
SIG_SCAN(sigInitSteamAPIManager, 0x1405FFE20, "\x48\x89\x5C\x24\x00\x57\x48\x83\xEC\x20\x48\x8B\xF9\x80\x79\x08\x00\x0F\x85\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xFF\x15\x00\x00\x00\x00\x84\xC0\x74\x0F\xC6\x47\x08\x00\x48\x8B\x5C\x24\x00\x48\x83\xC4\x20\x5F\xC3", "xxxx?xxxxxxxxxxxxxx????x????xx????xxxxxxxxxxxx?xxxxxx")
9495
SIG_SCAN(sigResolveFilePath, 0x1402A5500, "\x48\x89\x5C\x24\x00\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x83\xEC\x40\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x44\x24\x00\x4C\x8B\xE2\x4C\x8B\xF9\x33\xC0\x0F\x57\xC9\xF3\x0F\x7F\x4C\x24\x00\x48\x89\x44\x24\x00\x48\x8D\x54\x24\x00\xE8\x00\x00\x00\x00\x83\xF8\x01\x75\x46\x49\x8B\xCF\xE8\x00\x00\x00\x00\x84\xC0\x74\x28\x4D\x85\xE4\x0F\x84\x00\x00\x00\x00\x4D\x3B\xE7\x0F\x84\x00\x00\x00\x00\x49\x8B\xD7\x49\x83\x7F\x00\x00\x72\x03\x49\x8B\x17", "xxxx?xxxxxxxxxxxxxxxxxx????xxxxxxx?xxxxxxxxxxxxxxxx?xxxx?xxxx?x????xxxxxxxxx????xxxxxxxxx????xxxxx????xxxxxx??xxxxx")
95-
SIG_SCAN(sigInitMdataMgr, 0x14043E150, "\x48\x89\x5C\x24\x00\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x48\x89\x7C\x24\x00\x41\x54\x41\x56\x41\x57\x48\x83\xEC\x60\x48\x8B\x44\x24\x00\x48\x89\x44\x24\x00\x4C\x8D\x25\x00\x00\x00\x00\x4C\x89\x64\x24\x00\x49\x8B\xCC", "xxxx?xxxx?xxxx?xxxx?xxxxxxxxxxxxxx?xxxx?xxx????xxxx?xxx")
96+
SIG_SCAN(sigInitMdataMgr, 0x14043E150, "\x48\x89\x5C\x24\x00\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x48\x89\x7C\x24\x00\x41\x54\x41\x56\x41\x57\x48\x83\xEC\x60\x48\x8B\x44\x24\x00\x48\x89\x44\x24\x00\x4C\x8D\x25\x00\x00\x00\x00\x4C\x89\x64\x24\x00\x49\x8B\xCC", "xxxx?xxxx?xxxx?xxxx?xxxxxxxxxxxxxx?xxxx?xxx????xxxx?xxx")
97+
SIG_SCAN(sigLoadFileFromCpk, 0x140171880, "\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x48\x89\x7C\x24\x00\x55\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x00\x48\x81\xEC\x00\x00\x00\x00\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x45\x27\x45\x0F\xB6\xE8\x44\x0F\xB6\xE2\x48\x8B\xF1\x48\x83\x3D\x00\x00\x00\x00\x00\x75\x07\x33\xC0\xE9\x00\x00\x00\x00", "xxxx?xxxx?xxxx?xxxxxxxxxxxxx?xxx????xxx????xxxxxxxxxxxxxxxxxxxxx?????xxxxx????")

Source/DivaModLoader/SigScan.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@ extern void* sigWinMain();
1515

1616
extern void* sigOperatorNew();
1717
extern void* sigOperatorDelete();
18+
extern void* sigHeapCMallocAllocate();
1819

1920
extern void* sigInitRomDirectoryPaths();
2021

2122
extern void* sigInitSteamAPIManager();
2223

2324
extern void* sigResolveFilePath();
24-
extern void* sigInitMdataMgr();
25+
extern void* sigInitMdataMgr();
26+
27+
extern void* sigLoadFileFromCpk();

0 commit comments

Comments
 (0)