Runtime C++ Editing
C C++ C# Other
Failed to load latest commit information.
Test VS2012 Nov 15, 2013
bin DynamicPatcher-1.1.0 Sep 4, 2013
disasm-lib DynamicPatcher -> top Jun 3, 2013
dpVS2012 dpVS2012 Nov 15, 2013
old DynamicObjLoader -> old Jun 3, 2013
DynamicPatcher.cpp dpVS2012 Nov 15, 2013
DynamicPatcher.h dpVS2012 Nov 15, 2013
DynamicPatcher2010.sln VS2012 Nov 15, 2013
DynamicPatcher2010.vcxproj VS2012 Nov 15, 2013
DynamicPatcher2010.vcxproj.filters VS2012 Nov 15, 2013
DynamicPatcher2012.sln dpVS2012 Nov 15, 2013
DynamicPatcher2012.vcxproj VS2012 Nov 15, 2013
DynamicPatcher2012.vcxproj.filters VS2012 Nov 15, 2013
DynamicPatcherInjector.cpp dpVS2012 Nov 15, 2013
DynamicPatcherInjector.dpconf DynamicObjLoader -> DynamicPatcher Jun 6, 2013
DynamicPatcherInjector2010.vcxproj VS2012 Nov 15, 2013
DynamicPatcherInjector2012.vcxproj dpVS2012 Nov 15, 2013
DynamicPatcherInjectorDLL.cpp dpVS2012 Nov 15, 2013
DynamicPatcherInjectorDLL2010.vcxproj VS2012 Nov 15, 2013
DynamicPatcherInjectorDLL2012.vcxproj VS2012 Nov 15, 2013
README.md README.md Nov 15, 2013
disasm2010.vcxproj VS2012 Nov 15, 2013
disasm2010.vcxproj.filters VS2012 Nov 15, 2013
disasm2012.vcxproj VS2012 Nov 15, 2013
disasm2012.vcxproj.filters VS2012 Nov 15, 2013
dpBinary.cpp VisualC++2012 が更新された dll の pdb を読んでくれない問題に対処 Sep 2, 2013
dpBuilder.cpp preload bugfix Jul 1, 2013
dpConfig.cpp force host symbol オプション追加 Aug 15, 2013
dpContext.cpp dpWithTDisasm option (これを無効化したら tDisasm 使わなくなる) Sep 11, 2013
dpFoundation.cpp dpVS2012 Nov 15, 2013
dpInternal.h dpUnpatchAll() Sep 2, 2013
dpLoader.cpp improved .map file parser (thanks Jaewon Jung) Oct 2, 2013
dpPatcher.cpp dpWithTDisasm option (これを無効化したら tDisasm 使わなくなる) Sep 11, 2013
package.bat DynamicPatcher -> top Jun 3, 2013

README.md

DynamicPatcher

Runtime C++ Editing library.
compile .cpps, load and link .objs (or .libs, .dlls), and update functions at runtime.

demo movie

DynamicPatcher demo

detailed description

(japanese) http://www.slideshare.net/i-saint/runtime-cediting
(japanese) http://i-saint.hatenablog.com/entry/2013/06/06/212515

example

#include <windows.h> // Sleep()
#include <cstdio>
#include "DynamicPatcher.h"

// dpPatch をつけておくとロード時に同名の関数を自動的に更新する。
// (dpPatch は単なる dllexport。.obj に情報が残るいい指定方法が他に見当たらなかったので仕方なく…。
//  この自動ロードは dpInitialize() のオプションで切ることも可能)
dpPatch void MaybeOverridden()
{
    // ここを書き換えるとリアルタイムに挙動が変わる
    puts("MaybeOverridden()\n");
}

// CRT の関数を差し替える例。今回の犠牲者は puts()
int puts_hook(const char *s)
{
    typedef int (*puts_t)(const char *s);
    puts_t orig_puts = (puts_t)dpGetUnpatched(&puts); // hook 前の関数を取得
    orig_puts("puts_hook()");
    return orig_puts(s);
}

// dpOnLoad() の中身はロード時に自動的に実行される。アンロード時に実行される dpOnUnload() も記述可能
dpOnLoad(
    // dpPatch による自動差し替えを使わない場合、on load 時とかに手動で差し替える必要がある。
    // 元関数と新しい関数の名前が違うケースでは手動指定するしかない。
    dpPatchAddressToAddress(&puts, &puts_hook); // puts() を puts_hook() に差し替える
)

int main()
{
    dpInitialize();
    dpAddSourcePath("."); // このディレクトリのファイルに変更があったらビルドコマンドを呼ぶ
    dpAddModulePath("example.obj"); // ビルドが終わったらこのファイルをロードする
    // cl.exe でコンパイル。msbuild や任意のコマンドも指定可能。
    // 実運用の際は msbuild を使うか、自動ビルドは使用せすユーザー制御になると思われる。
    // (dpStartAutoBuild() を呼ばなかった場合、dpUpdate() はロード済み or module path にあるモジュールに更新があればそれをリロードする)
    dpAddCLBuildCommand("example.cpp /c /Zi");
    dpStartAutoBuild(); // 自動ビルド開始

    for(;;) {
        MaybeOverridden();
        ::Sleep(2000);
        dpUpdate();
    }

    dpFinalize();
}

// cl /Zi example.cpp && ./example

license

CC BY

thanks

DynamicPatcher contains a disassembler (tDisasm) by Matt Conover.
Runtime-Compiled C++
Mhook
PE/COFF file format
lib file format

Riot Games used this library!