write some CKStateChunk code
This commit is contained in:
@ -10,10 +10,10 @@
|
||||
#define BUFFER_SIZE 1024
|
||||
|
||||
void Assert(bool cond, const char* desc) {
|
||||
if (!cond) {
|
||||
if (!cond) {
|
||||
std::cout << desc << std::endl;
|
||||
ExitProcess(0);
|
||||
}
|
||||
ExitProcess(0);
|
||||
}
|
||||
}
|
||||
|
||||
struct MyModuleInfo {
|
||||
@ -59,6 +59,31 @@ std::map<intptr_t, MyModuleInfo> ConstructModuleList() {
|
||||
return result;
|
||||
}
|
||||
|
||||
void PrintVTable(std::map<intptr_t, MyModuleInfo>& modules, CKDWORD* pCls, size_t vtable_len, char indent) {
|
||||
if (pCls == nullptr) {
|
||||
fputc('\n', stdout);
|
||||
return;
|
||||
}
|
||||
CKDWORD* vtable = *(reinterpret_cast<CKDWORD**>(pCls));
|
||||
|
||||
for (size_t i = 0; i < vtable_len; ++i) {
|
||||
intptr_t addr = vtable[i];
|
||||
const auto& it = modules.lower_bound(addr);
|
||||
if (it != modules.end() && it != modules.begin()) {
|
||||
const auto& itt = std::prev(it);
|
||||
fprintf(stdout, "%s::", itt->second.ModuleName.c_str());
|
||||
addr = addr - itt->second.BaseOfDll;
|
||||
|
||||
if (itt->second.ModuleName == "CK2_3D.dll")
|
||||
addr += 0x10000000u;
|
||||
else if (itt->second.ModuleName == "CK2.dll")
|
||||
addr += 0x24000000u;
|
||||
}
|
||||
fprintf(stdout, "%08X%c", addr, indent);
|
||||
}
|
||||
fputc('\n', stdout);
|
||||
}
|
||||
|
||||
int main() {
|
||||
Assert(LoadLibrary("CK2.dll"), "Error loading CK2.dll");
|
||||
|
||||
@ -88,141 +113,137 @@ int main() {
|
||||
std::cout << "Press any key to run..." << std::endl;
|
||||
system("pause");
|
||||
|
||||
static std::vector<CK_CLASSID> cls{
|
||||
CKCID_OBJECT,
|
||||
CKCID_PARAMETERIN,
|
||||
CKCID_PARAMETEROPERATION,
|
||||
CKCID_STATE,
|
||||
CKCID_BEHAVIORLINK,
|
||||
CKCID_BEHAVIOR,
|
||||
CKCID_BEHAVIORIO,
|
||||
CKCID_RENDERCONTEXT,
|
||||
CKCID_KINEMATICCHAIN,
|
||||
CKCID_SCENEOBJECT,
|
||||
CKCID_OBJECTANIMATION,
|
||||
CKCID_ANIMATION,
|
||||
CKCID_KEYEDANIMATION,
|
||||
CKCID_BEOBJECT,
|
||||
CKCID_DATAARRAY,
|
||||
CKCID_SCENE,
|
||||
CKCID_LEVEL,
|
||||
CKCID_PLACE,
|
||||
CKCID_GROUP,
|
||||
CKCID_SOUND,
|
||||
CKCID_WAVESOUND,
|
||||
CKCID_MIDISOUND,
|
||||
CKCID_MATERIAL,
|
||||
CKCID_TEXTURE,
|
||||
CKCID_MESH,
|
||||
CKCID_PATCHMESH,
|
||||
CKCID_RENDEROBJECT,
|
||||
CKCID_2DENTITY,
|
||||
CKCID_SPRITE,
|
||||
CKCID_SPRITETEXT,
|
||||
CKCID_3DENTITY,
|
||||
CKCID_GRID,
|
||||
CKCID_CURVEPOINT,
|
||||
CKCID_SPRITE3D,
|
||||
CKCID_CURVE,
|
||||
CKCID_CAMERA,
|
||||
CKCID_TARGETCAMERA,
|
||||
CKCID_LIGHT,
|
||||
CKCID_TARGETLIGHT,
|
||||
CKCID_CHARACTER,
|
||||
CKCID_3DOBJECT,
|
||||
CKCID_BODYPART,
|
||||
CKCID_PARAMETER,
|
||||
CKCID_PARAMETERLOCAL,
|
||||
CKCID_PARAMETERVARIABLE,
|
||||
CKCID_PARAMETEROUT,
|
||||
CKCID_INTERFACEOBJECTMANAGER,
|
||||
CKCID_CRITICALSECTION,
|
||||
CKCID_LAYER,
|
||||
CKCID_PROGRESSIVEMESH,
|
||||
CKCID_SYNCHRO
|
||||
};
|
||||
static std::vector<const char*> clsname{
|
||||
"CKCID_OBJECT",
|
||||
"CKCID_PARAMETERIN",
|
||||
"CKCID_PARAMETEROPERATION",
|
||||
"CKCID_STATE",
|
||||
"CKCID_BEHAVIORLINK",
|
||||
"CKCID_BEHAVIOR",
|
||||
"CKCID_BEHAVIORIO",
|
||||
"CKCID_RENDERCONTEXT",
|
||||
"CKCID_KINEMATICCHAIN",
|
||||
"CKCID_SCENEOBJECT",
|
||||
"CKCID_OBJECTANIMATION",
|
||||
"CKCID_ANIMATION",
|
||||
"CKCID_KEYEDANIMATION",
|
||||
"CKCID_BEOBJECT",
|
||||
"CKCID_DATAARRAY",
|
||||
"CKCID_SCENE",
|
||||
"CKCID_LEVEL",
|
||||
"CKCID_PLACE",
|
||||
"CKCID_GROUP",
|
||||
"CKCID_SOUND",
|
||||
"CKCID_WAVESOUND",
|
||||
"CKCID_MIDISOUND",
|
||||
"CKCID_MATERIAL",
|
||||
"CKCID_TEXTURE",
|
||||
"CKCID_MESH",
|
||||
"CKCID_PATCHMESH",
|
||||
"CKCID_RENDEROBJECT",
|
||||
"CKCID_2DENTITY",
|
||||
"CKCID_SPRITE",
|
||||
"CKCID_SPRITETEXT",
|
||||
"CKCID_3DENTITY",
|
||||
"CKCID_GRID",
|
||||
"CKCID_CURVEPOINT",
|
||||
"CKCID_SPRITE3D",
|
||||
"CKCID_CURVE",
|
||||
"CKCID_CAMERA",
|
||||
"CKCID_TARGETCAMERA",
|
||||
"CKCID_LIGHT",
|
||||
"CKCID_TARGETLIGHT",
|
||||
"CKCID_CHARACTER",
|
||||
"CKCID_3DOBJECT",
|
||||
"CKCID_BODYPART",
|
||||
"CKCID_PARAMETER",
|
||||
"CKCID_PARAMETERLOCAL",
|
||||
"CKCID_PARAMETERVARIABLE",
|
||||
"CKCID_PARAMETEROUT",
|
||||
"CKCID_INTERFACEOBJECTMANAGER",
|
||||
"CKCID_CRITICALSECTION",
|
||||
"CKCID_LAYER",
|
||||
"CKCID_PROGRESSIVEMESH",
|
||||
"CKCID_SYNCHRO"
|
||||
};
|
||||
|
||||
// print CKObject vtable
|
||||
//static std::vector<CK_CLASSID> cls{
|
||||
// CKCID_OBJECT,
|
||||
// CKCID_PARAMETERIN,
|
||||
// CKCID_PARAMETEROPERATION,
|
||||
// CKCID_STATE,
|
||||
// CKCID_BEHAVIORLINK,
|
||||
// CKCID_BEHAVIOR,
|
||||
// CKCID_BEHAVIORIO,
|
||||
// CKCID_RENDERCONTEXT,
|
||||
// CKCID_KINEMATICCHAIN,
|
||||
// CKCID_SCENEOBJECT,
|
||||
// CKCID_OBJECTANIMATION,
|
||||
// CKCID_ANIMATION,
|
||||
// CKCID_KEYEDANIMATION,
|
||||
// CKCID_BEOBJECT,
|
||||
// CKCID_DATAARRAY,
|
||||
// CKCID_SCENE,
|
||||
// CKCID_LEVEL,
|
||||
// CKCID_PLACE,
|
||||
// CKCID_GROUP,
|
||||
// CKCID_SOUND,
|
||||
// CKCID_WAVESOUND,
|
||||
// CKCID_MIDISOUND,
|
||||
// CKCID_MATERIAL,
|
||||
// CKCID_TEXTURE,
|
||||
// CKCID_MESH,
|
||||
// CKCID_PATCHMESH,
|
||||
// CKCID_RENDEROBJECT,
|
||||
// CKCID_2DENTITY,
|
||||
// CKCID_SPRITE,
|
||||
// CKCID_SPRITETEXT,
|
||||
// CKCID_3DENTITY,
|
||||
// CKCID_GRID,
|
||||
// CKCID_CURVEPOINT,
|
||||
// CKCID_SPRITE3D,
|
||||
// CKCID_CURVE,
|
||||
// CKCID_CAMERA,
|
||||
// CKCID_TARGETCAMERA,
|
||||
// CKCID_LIGHT,
|
||||
// CKCID_TARGETLIGHT,
|
||||
// CKCID_CHARACTER,
|
||||
// CKCID_3DOBJECT,
|
||||
// CKCID_BODYPART,
|
||||
// CKCID_PARAMETER,
|
||||
// CKCID_PARAMETERLOCAL,
|
||||
// CKCID_PARAMETERVARIABLE,
|
||||
// CKCID_PARAMETEROUT,
|
||||
// CKCID_INTERFACEOBJECTMANAGER,
|
||||
// CKCID_CRITICALSECTION,
|
||||
// CKCID_LAYER,
|
||||
// CKCID_PROGRESSIVEMESH,
|
||||
// CKCID_SYNCHRO
|
||||
//};
|
||||
//static std::vector<const char*> clsname{
|
||||
// "CKCID_OBJECT",
|
||||
// "CKCID_PARAMETERIN",
|
||||
// "CKCID_PARAMETEROPERATION",
|
||||
// "CKCID_STATE",
|
||||
// "CKCID_BEHAVIORLINK",
|
||||
// "CKCID_BEHAVIOR",
|
||||
// "CKCID_BEHAVIORIO",
|
||||
// "CKCID_RENDERCONTEXT",
|
||||
// "CKCID_KINEMATICCHAIN",
|
||||
// "CKCID_SCENEOBJECT",
|
||||
// "CKCID_OBJECTANIMATION",
|
||||
// "CKCID_ANIMATION",
|
||||
// "CKCID_KEYEDANIMATION",
|
||||
// "CKCID_BEOBJECT",
|
||||
// "CKCID_DATAARRAY",
|
||||
// "CKCID_SCENE",
|
||||
// "CKCID_LEVEL",
|
||||
// "CKCID_PLACE",
|
||||
// "CKCID_GROUP",
|
||||
// "CKCID_SOUND",
|
||||
// "CKCID_WAVESOUND",
|
||||
// "CKCID_MIDISOUND",
|
||||
// "CKCID_MATERIAL",
|
||||
// "CKCID_TEXTURE",
|
||||
// "CKCID_MESH",
|
||||
// "CKCID_PATCHMESH",
|
||||
// "CKCID_RENDEROBJECT",
|
||||
// "CKCID_2DENTITY",
|
||||
// "CKCID_SPRITE",
|
||||
// "CKCID_SPRITETEXT",
|
||||
// "CKCID_3DENTITY",
|
||||
// "CKCID_GRID",
|
||||
// "CKCID_CURVEPOINT",
|
||||
// "CKCID_SPRITE3D",
|
||||
// "CKCID_CURVE",
|
||||
// "CKCID_CAMERA",
|
||||
// "CKCID_TARGETCAMERA",
|
||||
// "CKCID_LIGHT",
|
||||
// "CKCID_TARGETLIGHT",
|
||||
// "CKCID_CHARACTER",
|
||||
// "CKCID_3DOBJECT",
|
||||
// "CKCID_BODYPART",
|
||||
// "CKCID_PARAMETER",
|
||||
// "CKCID_PARAMETERLOCAL",
|
||||
// "CKCID_PARAMETERVARIABLE",
|
||||
// "CKCID_PARAMETEROUT",
|
||||
// "CKCID_INTERFACEOBJECTMANAGER",
|
||||
// "CKCID_CRITICALSECTION",
|
||||
// "CKCID_LAYER",
|
||||
// "CKCID_PROGRESSIVEMESH",
|
||||
// "CKCID_SYNCHRO"
|
||||
//};
|
||||
//
|
||||
//auto moduleInfos = ConstructModuleList();
|
||||
|
||||
//fputs("Class Name,Class Id,Show(),IsHiddenByParent(),CanBeHide(),IsVisible(),~dtor(),GetClassID(),PreSave(),Save(),Load(),PostLoad(),PreDelete(),CheckPreDeletion(),CheckPostDeletion(),GetMemoryOccupation(),IsObjectUsed(),PrepareDependencies(),RemapDependencies(),Copy(),\n", stdout);
|
||||
//for (size_t j = 0; j < cls.size(); ++j) {
|
||||
// CK_CLASSID item = cls[j];
|
||||
// const char* itemname = clsname[j];
|
||||
|
||||
// CKObject* obj = ctx->CreateObject(item, NULL, CK_OBJECTCREATION_NONAMECHECK, NULL);
|
||||
|
||||
// fprintf(stdout, "%s,%d,", itemname, item);
|
||||
// PrintVTable(moduleInfos, reinterpret_cast<CKDWORD*>(obj), 18);
|
||||
//}
|
||||
|
||||
// print manager vtables
|
||||
auto moduleInfos = ConstructModuleList();
|
||||
int count = ctx->GetManagerCount();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
CKBaseManager* mgr = ctx->GetManager(i);
|
||||
|
||||
fputs("Class Name,Class Id,Show(),IsHiddenByParent(),CanBeHide(),IsVisible(),~dtor(),GetClassID(),PreSave(),Save(),Load(),PostLoad(),PreDelete(),CheckPreDeletion(),CheckPostDeletion(),GetMemoryOccupation(),IsObjectUsed(),PrepareDependencies(),RemapDependencies(),Copy(),\n", stdout);
|
||||
for (size_t j = 0; j < cls.size(); ++j) {
|
||||
CK_CLASSID item = cls[j];
|
||||
const char* itemname = clsname[j];
|
||||
|
||||
CKObject* obj = ctx->CreateObject(item, NULL, CK_OBJECTCREATION_NONAMECHECK, NULL);
|
||||
if (obj == nullptr) continue;
|
||||
CKDWORD* vtable = *(reinterpret_cast<CKDWORD**>(obj));
|
||||
|
||||
fprintf(stdout, "%s,%d,", itemname, item);
|
||||
for (size_t i = 0; i < 18; ++i) {
|
||||
intptr_t addr = vtable[i];
|
||||
const auto& it = moduleInfos.lower_bound(addr);
|
||||
if (it != moduleInfos.end() && it != moduleInfos.begin()) {
|
||||
const auto& itt = std::prev(it);
|
||||
fprintf(stdout, "%s::", itt->second.ModuleName.c_str());
|
||||
addr = addr - itt->second.BaseOfDll;
|
||||
|
||||
if (itt->second.ModuleName == "CK2_3D.dll")
|
||||
addr += 0x10000000u;
|
||||
else if (itt->second.ModuleName == "CK2.dll")
|
||||
addr += 0x24000000u;
|
||||
}
|
||||
fprintf(stdout, "%08X,", addr);
|
||||
}
|
||||
fputc('\n', stdout);
|
||||
CKSTRING name = mgr->GetName();
|
||||
CKGUID guid = mgr->GetGuid();
|
||||
fprintf(stdout, "%s\t0x%08x, 0x%08x\t", name, guid.d1, guid.d2);
|
||||
PrintVTable(moduleInfos, reinterpret_cast<CKDWORD*>(mgr), 30, '\t');
|
||||
}
|
||||
|
||||
// call reader
|
||||
|
Reference in New Issue
Block a user