0

3D をレンダリングするためにサードパーティ ライブラリを使用しています。このライブラリには、実行中にライブラリが割り当てて解放したすべてのメモリを追跡する「メモリ トラッカー」機能があります。これは、メモリ リークなどを特定するのに役立つため、優れた機能です。

このライブラリで特定の関数を呼び出すと、プロセスの現在の作業ディレクトリにログ ファイルが生成されます。最近、このファイルがいくつかの異なる場所に表示されることに気付いたので、最初に考えたのはもちろん、現在の作業ディレクトリを常にログを表示するフォルダーに設定することでした。これは正常に機能します。

ただし、このファイルは、上記の関数がプログラムによって呼び出されることなく、さまざまな場所にまだ作成されていることがわかります。したがって、ファイルは私の同意なしにライブラリによって何らかの形で作成されなければなりません。このライブラリの作成者は、エンジンがこのメソッドを内部的に呼び出すことは決してないと述べています。

したがって、彼が間違っていることを証明するために (または、自分が愚かであることを証明することもできます (初めてではありません))、このファイルがいつ作成されたかを正確に把握する方法が必要です。FindFirstChangeNotification()は機能しません。これは、あるフォルダーで何かが起こったという情報しか提供しないためです。理想的には、これが発生したときに (プロセス内またはプロセス外のいずれかで) インターセプトし、何らかの方法でプロセス例外を挿入したい (たとえば、WinDbg にこれをキャッチさせる) ため、コールスタックを介して必要な情報を取得します。

どんな提案でも大歓迎です。

乾杯!

4

2 に答える 2

3

あなたは試すことができます:

  1. FileMonProcess Explorerなどのツールを使用すると、追跡するのに十分な場合があります。
  2. ライブラリのフックを使用して、CreateFile (または必要に応じて他の関数) を独自の関数に置き換えます。私はDetoursで良い経験をしてきました。箱から出してすぐに使用できる本当に素晴らしい例がいくつかあります。
于 2009-05-26T12:44:45.560 に答える
2

次のようなカスタムCreateFileを使用してインジェクションDLLを作成する必要があります。

/** We'll create a custom version of the CreateFile (WinAPI).
  *
  *
  */
HANDLE WINAPI __CreateFile(LPCWSTR fileName,
                           DWORD desiredAccess,
                           DWORD shareMode,
                           LPSECURITY_ATTRIBUTES securityAttributes,
                           DWORD createDisp,
                           DWORD flags,
                           HANDLE tmp)
{
        // At very first, we shall call the original CreateFile.

        HANDLE file = Real_CreateFile(fileName,
                                      desiredAccess,
                                      shareMode,
                                      securityAttributes,
                                      createDisp,
                                      flags,
                                      tmp);

        /** Here, you can do whatever you wish with fileName and the handle, file.
          *
          * ...
          */

        return file;
}

ただし、これだけでは不十分です。また、迂回路の恩恵を受ける必要があります。

BOOL APIENTRY DllMain(HANDLE module, DWORD reasonForCall, LPVOID reserved)
{
        switch (reasonForCall) {
                case DLL_PROCESS_ATTACH: {
                        if (::GetModuleHandle(L"blablabla.exe") == NULL) {
                                DetourTransactionBegin();
                                DetourUpdateThread(GetCurrentThread());
                                DetourAttach(&(PVOID &)Real_CreateFile, __CreateFile);
                                DetourTransactionCommit();
                }

                break;

                case DLL_THREAD_ATTACH: {
                }

                break;

                case DLL_THREAD_DETACH: {
                }

                break;

                case DLL_PROCESS_DETACH: {
                        if (::GetModuleHandle(L"blablabla.exe") == NULL) {
                                DetourTransactionBegin();
                                DetourUpdateThread(GetCurrentThread());
                                DetourDetach(&(PVOID&)Real_CreateFile, __CreateFile);
                                DetourTransactionCommit();
                        }
                }
    }

    return TRUE;
}

残りはあなたの運動に任せます。これは単なる方向性です。データ送信には、適切なIPC方式も見つける必要があります。

于 2009-05-26T13:53:02.273 に答える