0

さまざまな理由で(理由を質問することは私には役に立ちません)、WindowsXP用に独自の拡張mapidllを実装したいと思います。スケルトンdllがあり、テスト用のエントリポイントがいくつかありますが、システムmapiスタブ(c:\ windows \ system32 \ mapi32.dll、mapistub.dllと同一であることを確認しました)は、私のdllは、同じ呼び出しをMS Outlookのmsmapi32.dllに問題なく渡します(MAPIInitialize、MAPILoginExはそのような呼び出しの2つです)。スタブと拡張mapidllの間には秘密のハンドシェイクがあり、スタブは「うん、それは拡張mapi dllです」とチェックします。おそらく、まだ実装していない追加のエントリポイントが存在するか、何らかの関数からの戻り値である可能性があります。 、 知らない。私' STraceNTとProcessMonitorを使用してMAPIInitializeを呼び出す、私が作成したサンプルアプリをトレースしようとしましたが、明らかなものは何も表示されませんでした。トレースは、スタブが実際にdllをロードすることを示していますが、シークレットソースが明らかに欠落していることを検出し、dllの関数を呼び出す代わりにエラーコードを返します。MAPIInitializeを呼び出すには、dllのエクスポートテーブルにMAPIInitializeが存在すること以上に何が必要でしょうか?GetProcAddressはそれがそこにあると言います。MAPIInitializeを呼び出すには、dllのエクスポートテーブルにMAPIInitializeが存在すること以上に何が必要でしょうか?GetProcAddressはそれがそこにあると言います。MAPIInitializeを呼び出すには、dllのエクスポートテーブルにMAPIInitializeが存在すること以上に何が必要でしょうか?GetProcAddressはそれがそこにあると言います。

私が知りたいのは、スケルトンの拡張mapi dllを最小限に拡張して、スタブmapidllが私のdllへの拡張mapi呼び出しを通過するようにする方法です。秘伝のタレは何ですか?スタブの動作をmsvcリバースエンジニアリングするのに苦痛な1週間を費やしたくありません。

4

1 に答える 1

1

MS のデバッグ シンボルを読み込み、デバッガーのスタブ ライブラリ コードに飛び込むことで、それを理解しました。スタブ ライブラリは「MAPIInitialize」をロードせず、「MAPIInitialize@4」をロードします。MAPIInitialize@4=_MAPIInitialize@4 を .def ファイルの EXPORTS セクションに追加したところ、すべて正常に動作するようになりました。

ところで、システム ライブラリのシンボルを取得するには、XP SP3 用の MS のデバッグ シンボル パッケージをダウンロードしないでください。シンボルが正しく更新されておらず、デバッガで動作しません。代わりに、VS を MS のオンライン シンボル サーバー ( http://msdl.microsoft.com/download/symbols ) にポイントし、VS にシンボルをローカル シンボル キャッシュ ディレクトリに丸呑みさせます。

于 2010-04-20T08:34:42.750 に答える