ページのProtectをパカパカするのはやめたいかも
ePi5131 opened this issue · 2 comments
ePi5131 commented
OverWriteOnProtectHelper
というクラスのRAIIでページのProtectを一時的に変更するという芸をやっている
数十バイト離れた4バイトの書き換えで同じページをいちいちWritable→Readonlyにするのはなんか嫌な気持ちになる
別に負荷にならないというならいいんだけど、そうでもないならある程度「ここにこれを書くよ」を溜め込んでおいて一気にProtectを変えて書くをやりたい
nazonoSAUNA commented
次のようなコードで実験しました
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秒長くなるだけであり、気にするだけ無駄&変わったことをするリスクやコストの方が重いと思われます
ePi5131 commented
じゃあやらないことにします
よく使うやつだしForceWrite
とかそういう短めの名前にするといいなと思ってきた というのを書き残しておいてclose