2011-04-18 7 views
3

Windows API's PatchAPIを使用していくつかのパッチを適用したいと思います。 パッチの適用は、自分のsystem32フォルダにあるmspatcha.dllに実装されています。Windows APIのパッチAPIにリンクする

リファレンスやグーグルーグなど、さまざまな場所で読んだ後、私はこのDLLにリンクする正しい方法をまだ見つけていません。私は静的にリンクしたいと思います.LoadLibraryを扱うのは面倒で、そのようなpatchapi.hヘッダーの目的を壊してしまいます。私はにリンクしています何の.libファイルを発見したので、私は、次のコマンドを使用して独自に作成した:

1)DUMPBIN /輸出C:\ WINDOWS \ SYSTEM32 \ mspatcha.dll

2)を作成しますmspatcha.defファイルは、の出力に表示される各関数名の1行に続いて、「EXPORTS」行を書く

3)のlib /def:mspatcha.def /out:mspatcha.lib

DUMPBIN私はこれが静的にpatchapiにリンクする正しい方法ではないと確信していますが、私はそうする正しい方法を見つけていません。 これらの手順を実行して、ApplyPatchToFileExA()を1回呼び出すだけで簡単なテストケースを作成した後も、_ApplyPatchToFileA @ 16のシンボルにリンカーエラーが表示されます。見つける「ApplyPatchToFileExA」| \ TMP \ mspatcha>輸出/ DUMPBIN mspatcha.lib:私の新しく作成されたmspatcha.libのエクスポートされたシンボルを見てみると 、関数が間違った名前の規則

Dを使用することが表示されます

   _ApplyPatchToFileExA 

私が間違っている場合を除き、これはlibには、DLLがSTDCALLを使用している(あるいは少なくとも_stdcallとしての機能を宣言している)のに対し、CDECLを使用して機能を輸出していることを示しています。参照:C name decoration in Microsoft Windows

私のアプリケーションでmspatcha.dllを使用する正しい方法は何ですか?また、静的リンクを行うためにdllからlibを作成するプロセスで何が間違っていましたか?

私の端末の詳細な出力がここで見つけることができます:あなたは全く異なる何かを意味し、暗黙的にではなく、静的にリンクしようとしている用語のポイントとしてhttp://pastebin.com/q4FV4Se6

+0

「静的にインポートされた」と「静的にリンクされた」という用語を区別してください。前者は、バイナリが制御される前にローダがインポートされた関数を解決することを意味します(失敗する可能性があります)。後者は、実際のオブジェクトコードが最終的なバイナリイメージにリンクされることを意味します。 – 0xC0000022L

+0

'lib.exe'は、あなたが与えたDEFファイルのような装飾された名前を作成するはずです。あなたはこれとリンクしようとしましたか?libを作成し、結果のバイナリのインポートディレクトリを調べますか? – 0xC0000022L

+0

この小さなツールを試してみてください:http://vortex.masmcode.com/files/def2lib11.zip - リンカーとローダーの両方が満足できるように、.defファイル内に装飾された名前をとります。 – 0xC0000022L

答えて

0

を。

実際に.libファイルを取得できない場合は、簡単に生成する方法の1つは、各関数の空のスタブを持つダミーDLLを作成することです。 DLL mspatcha.dllを呼び出します。 .defファイルとstdcallを必ず使用してください。

DLLをビルドしたら、それを投げ捨ててください。ただし、.libファイルは保管しておいてください!

これまで、.libファイルを生成しないツールチェーンを使用してビルドされたDLLの.libファイルを生成するためにこれを行ってきました。

使用した手法は、cdecl機能でのみ機能します。

+0

それは過剰です。 'lib.exe'を使うと' .def'(モジュール定義)ファイルを使って '.lib'をインポートすることができます。ダミーDLLを作成する必要はありません。それはOPがやっていることなので、問題は呼び出し規約に疑わしいものがあることです。 – 0xC0000022L

+0

サイドノート:彼が使った技術は '__cdecl'だけでなく、私は '__stdcall'を何度も使ってきました。 – 0xC0000022L

+0

@status cdeclに関するあなたのコメントは、ここでは矛盾しています:http://support.microsoft.com/kb/131313 –

関連する問題