2020-8-5 09:25 /
int main(int argc, char* argv[])
{
if (argc != 2)
{
MessageBox(0, L"extNNN_spt.exe <input spt file>", L"AyamiKaze", 0);
return -1;
}
char* FileName = argv[1];
auto fp = fopen(FileName, "rb");
fseek(fp, 0, SEEK_END);
DWORD FileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
DWORD DataSize = ((FileSize + 3) / 4);
BYTE* FileBuff = (BYTE*)malloc(FileSize);
if (!FileBuff)
return E("Not buff, check if your alloc memory setting.");
fread(FileBuff, FileSize, 1, fp);
fclose(fp);
//Not for all games here.
for (int i = 0; i < FileSize; i++)
FileBuff[i] ^= 0xFF;
// Get valune name from offical code
DWORD szOfHeaderTable = *(DWORD*)FileBuff;
DWORD m_messageKosuu1 = *(DWORD*)(FileBuff + 0x10);
DWORD m_messagePointer1 = *(DWORD*)(FileBuff + 0x14);
DWORD m_messageKosuu2 = *(DWORD*)(FileBuff + 0x18);
DWORD m_messagePointer2 = *(DWORD*)(FileBuff + 0x1C);
DWORD m_storyKosuu = *(DWORD*)(FileBuff + 0x28);
DWORD m_int32Pointer = *(DWORD*)(FileBuff + 0x48);
DWORD m_subCallPointer = 0;
DWORD m_selectPointer = 0;
DWORD m_commandCallPointer = 0;
DWORD m_scriptCallPointer = 0;
/*
newer version need it.
if (szOfHeaderTable >= 0x20)
{
m_subCallPointer = *(DWORD*)(FileBuff + 0x50);
m_selectPointer = *(DWORD*)(FileBuff + 0x54);
m_commandCallPointer = *(DWORD*)(FileBuff + 0x58);
m_scriptCallPointer = *(DWORD*)(FileBuff + 0x5C);
}
*/
string fn(FileName);
fn += ".txt";
ofstream LOG(fn);
int hit = 0;
for (DWORD ecx = 0; ecx < DataSize; )
{
DWORD ebx = *(DWORD*)(FileBuff + ecx * 4);
DWORD identify = *(DWORD*)(FileBuff + ecx * 4 + 4);
DWORD code = *(DWORD*)(FileBuff + ecx * 4 + 8);
DWORD count = *(DWORD*)(FileBuff + ecx * 4 + 12);
DWORD pos = *(DWORD*)(FileBuff + ecx * 4 + 16);
if ((code == CODE_SYSTEMCOMMAND_PRINT) || (code == CODE_SYSTEMCOMMAND_LPRINT) ||
(code == CODE_SYSTEMCOMMAND_APPEND))
{
LOG << (FileBuff + *(DWORD*)(FileBuff + (m_messagePointer1 + count) * 4) * 4) << endl;
hit++;
}
if (identify == IDENTIFY_SYSTEMCOMMAND)
{
if (code == CODE_SYSTEMCOMMAND_SELECT)
{
for (int i = 0; i < count; i++)
{
LOG << (FileBuff + *(DWORD*)(FileBuff + (m_messagePointer2 + pos + i) * 4) * 4) << endl;
}
}
}
ecx += ebx;
}
if (hit != m_messageKosuu1)
{
cout << "Find Sripts:0x" << hex << hit << endl;
cout << "Should Scripts:0x" << hex << m_messageKosuu1 << endl;
return E("hit != m_messageKosuu1");
}
return End();
}