03/12/03 18:39
THINK Pascalで出来るコードリソース呼び出し
type
funcOverWriteT = record {関数書換用の型}
opCode: integer; {JMP命令オペコード用領域}
operand: longint; {JMP先絶対アドレス用領域}
end;
funcOWPtr = ^funcOverWriteT;
var
fp: funcOWPtr; {ダミー関数アドレス保持}
h: handle; {プラグインアドレス保持}
c: integer;
function dummy_Func (a, b: integer): integer; {ダミー関数。形式はプラグインと合わせる}
begin
dummy_Func := 1 + a + b - 3 + 4;
end;
procedure Plugin_Caller (function f (a, b: integer): integer); {Plug-in呼び出し用手続き}
begin
c := f(3, 6);
end;
begin
h := loadPluginManual; {プラグインアドレス取得。>>810の手続きを関数にしたもの}
hlock(handle(h)); {プラグインのハンドルロック}
fp := funcOWPtr(@dummy_Func); {ダミー関数のアドレス取得}
fp^.opCode := $4ef9; {68KのJMP命令を上書き}
fp^.operand := ord4(h^); {プラグインの絶対アドレスを上書き。ハンドル→ポインタを忘れずに}
c := dummy_Func(3, 6); writeln(c); {失敗。ジャンプテーブルを経由しないので元の関数が呼ばれる。}
Plugin_Caller(dummy_Func); writeln(c); {プラグイン呼び出し成功!!}