ePi5131/patch.aul

ページのProtectをパカパカするのはやめたいかも

ePi5131 opened this issue · 2 comments

OverWriteOnProtectHelperというクラスのRAIIでページのProtectを一時的に変更するという芸をやっている
数十バイト離れた4バイトの書き換えで同じページをいちいちWritable→Readonlyにするのはなんか嫌な気持ちになる

別に負荷にならないというならいいんだけど、そうでもないならある程度「ここにこれを書くよ」を溜め込んでおいて一気にProtectを変えて書くをやりたい

次のようなコードで実験しました

BOOL exedit_ReplaceData(DWORD exedit_address, void* data, int size) {
    DWORD oldProtect;
    exedit_address += (DWORD)exeditfp->dll_hinst;
    if (!VirtualProtect((void*)exedit_address, size, PAGE_EXECUTE_READWRITE, &oldProtect)) {
        return FALSE;
    }
    memcpy((void*)exedit_address, data, size);
    return VirtualProtect((void*)exedit_address, size, oldProtect, &oldProtect);
}
BOOL func_init(FILTER* fp) {
    exeditfp = Exedit_GetFilter(fp);

    char c[4] = { 1,2,3,4 };
    int b = 0;
    int t0 = GetTickCount();
    for (int i = 0; i < 1000000; i++) {
        b += i;
        b &= 0xffff;
        exedit_ReplaceData(b, c, 4);
    }
    printf("%d::%d",b, GetTickCount() - t0);
    return TRUE;
}

結果としては 100万回の書き換えで5秒弱しかかかっておらず、
実際の回数を多めに見て書き換え1万回だとしても起動が0.05秒長くなるだけであり、気にするだけ無駄&変わったことをするリスクやコストの方が重いと思われます

じゃあやらないことにします

よく使うやつだしForceWriteとかそういう短めの名前にするといいなと思ってきた というのを書き残しておいてclose