インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その9

インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その1
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その2
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その3
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その4
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その5
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その6
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その7
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その8

Nekogame版の ランチャーに2つバグがあるのが判明した・ω・

1. 明示的にデストラクタの処理(赤字の部分)をしていないので連続でパッチを当てるとファイルがロックされることがある。

    if (File.Exists(text3)) {
UnpackerClass obj = new UnpackerClass();
obj.PatchExecute(text3);
foreach (PatchHeader.Header item in keyValuePair.Value)
{
obj.SaveFile0(item.FileName, item.FileBytes);
}
                        obj.Dispose();
    }

2. 同じパッチを何度も適用するとファイルが無駄に肥大化する。

int unpackerClass::itemSave_sub(char*itemName, BYTE* itemData ,int itemDataSize)
{
DWORD tmpsize;
EcoObjectStruct obj = dic[itemName];
if (binDataReader != INVALID_HANDLE_VALUE && obj.dataLength == itemDataSize){
arrayData = new BYTE [obj.dataLength];
SetFilePointer(binDataReader, obj.dataPosition , 0,FILE_BEGIN);
ReadFile(binDataReader, (void*)arrayData, obj.dataLength, &tmpsize,0);//
if(!memcmp(itemData, arrayData,itemDataSize)) {
dbgPRN(dbgVERBOSE, "Already patched![%s]\015\012",itemName);
delete []arrayData;
return 0;
}
delete []arrayData;
}

なので、テーブル内に全く同じ内容があった場合は、書き足さずスキップするようにした・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です