1

のすべての WinAPI 呼び出しを置き換える必要があります

  • CreateFile、
  • 読み取りファイル、
  • SetFilePointer、
  • ハンドルを閉じる

私自身の実装(Bluetooth経由で低レベルのファイル読み取りを使用)を使用します。関数が置き換えられるコードは Video File Player であり、通常の hdd ファイルで既に動作します。また、VideoPlayer 入力のファイルが通常の hdd ファイルである場合、Video Player が HDD からファイルを再生できることも必要です。

そのようなタスクのベストプラクティスは何ですか?

4

6 に答える 6

5

次の手順に従うことをお勧めします。

  1. MyCreateFile、MyReadFile などの一連のラッパー関数を作成します。これらは、最初は対応する API を呼び出し、同じ引数を変更せずに渡すだけです。
  2. テキスト エディターを使用して、元の API へのすべての呼び出しを検索し、これらを新しいラッパー関数への呼び出しに置き換えます。
  3. アプリケーションがまだ正しく機能することをテストします。
  4. 独自の目的に合わせてラッパー関数を変更します。

CreateFile は、UNICODE が定義されているかどうかに応じて、CreateFileW または CreateFileA に展開されるマクロであることに注意してください。アプリケーションを ANSI または Unicode として構築できるように、LPCTSTR およびTCHAR 関数の使用を検討してください。

ここの他の回答で提案されているように、#define を使用しないでください。これはメンテナンスの問題につながるだけであり、Maximilian が正しく指摘しているように、ベスト プラクティスではありません。

于 2008-09-13T17:03:28.447 に答える
2

新しい関数をカスタム名前空間に書くことができます。例えば

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

次に、コードで変更する必要があるのは次のとおりです。

if (::CreateFile(...))
{
}

if (Bluetooth::CreateFile(...))
{
}

簡単!:)

于 2008-09-15T09:00:55.253 に答える
1

別のアプリケーションからこれらの API への呼び出しをインターセプトしようとしている場合は、Detoursを検討してください。

于 2008-09-13T16:22:19.233 に答える
1

コードを編集できる場合は、必要なことを行うカスタム API を使用するようにコードを書き直してください。それができない場合は、Maximilian の手法を使用しますが、これはメンテナンス ホラーであることに注意してください。

コードを編集できない場合は、インポート テーブルにパッチを適用して呼び出しを独自のコードにリダイレクトできます。この手法の説明は、この記事に記載されています。「インポート アドレス テーブルの変更によるスパイ」というタイトルのセクションを検索してください。

これは危険ですが、注意すればうまくいくでしょう。また、 Microsoft Detoursもチェックしてください。これは、同じようなことを行いますが、実際のパッチをいじる必要はありません。

于 2008-09-13T16:29:13.350 に答える
1

本当に API をハイジャックしたい場合は、single.dll (L-GPL) を調べてください。

于 2008-09-18T12:40:02.627 に答える
0

これはベストプラクティスではないと思いますが、変更したい関数が呼び出されるすべての場所に含まれるインクルードファイルに入れるとうまくいくはずです:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

MyCreateFile の実装は次のようになります。

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

基本的に、すべての CreateFile 呼び出しを MyCreateFile 呼び出しにして、独自の実装または元の実装を使用する必要があるかどうかを決定できます。

免責事項:これを行うのは醜いと思いますし、私はしません。すべての出現箇所または何かを検索して置き換えたいと思います。

于 2008-09-13T16:11:22.643 に答える