2009-05-26 7 views
0

Wir verwenden eine dritte Teilbibliothek, um 3D zu rendern. In dieser Bibliothek gibt es eine "Memory Tracker" -Funktionalität, die den gesamten Speicher verfolgt, den die Bibliothek während der Ausführung zugewiesen und freigegeben hat. Dies ist ein nettes Merkmal, da es hilft, z. Speicherlecks.So fangen Sie die Dateierstellung und den verantwortlichen Aufrufer

Durch Aufruf einer bestimmten Funktion in dieser Bibliothek wird eine Protokolldatei im aktuellen Arbeitsverzeichnis des Prozesses erzeugt. In letzter Zeit ist mir aufgefallen, dass diese Datei an verschiedenen Stellen angezeigt wird. Mein erster Gedanke war natürlich, das aktuelle Arbeitsverzeichnis immer auf den Ordner zu setzen, in dem das Protokoll angezeigt werden soll, und das funktioniert einwandfrei.

Es stellt sich jedoch heraus, dass diese Datei immer noch an verschiedenen Stellen erstellt wird, ohne dass die oben genannte Funktion jemals vom Programm aufgerufen wird. Daher muss die Datei irgendwie ohne meine Zustimmung von der Bibliothek erstellt werden. Der Ersteller dieser Bibliothek sagt, dass die Engine diese Methode niemals intern aufruft.

Also, um ihn falsch zu beweisen (alternativ beweisen, ich bin dumm (wird nicht das erste Mal obwohl)), ich brauche einen Weg, genau zu erfassen, wenn diese Datei erstellt wird. FindFirstChangeNotification() wird nicht tun, da dies mir nur Informationen zur Verfügung stellt, dass etwas in einem Ordner passiert ist. Idealerweise möchte ich (entweder im Prozess oder außerhalb des Prozesses) abfangen, wenn dies geschieht, und irgendwie eine Prozessausnahme einfügen (z. B. make WinDbg fangen), damit ich durch den Callstack die Informationen bekomme, die ich möchte.

Alle Vorschläge sind willkommen.

Prost!

Antwort

3

Sie könnten versuchen:

  1. ein Tool wie FileMon oder Process Explorer verwenden, könnten sie genug sein, es aufzuspüren.
  2. Verwenden Sie ein Hooking einer Bibliothek und ersetzen Sie CreateFile (oder weitere Funktionen, falls erforderlich) durch Ihre eigene Funktion. Ich hatte gute Erfahrungen mit Detours, es hat einige wirklich schöne Beispiele, die Sie direkt aus der Box verwenden konnten.
2

Sie benötigen Injektion DLL mit benutzerdefinierten Createfile erstellen, etwa so:

/** 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; 
}

Dies ist jedoch nicht genug. Sie müssen auch von Umleitungen auch profitieren:

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; 
}

Ich überlasse den Rest für Ihre Übung. Dies ist nur ein Orientierungspunkt. Sie müssen auch eine geeignete IPC-Methode für die Datenübertragung finden.

+0

+1 für Codebeispiel. Aber Daniel war zuerst, sorry :) – ralphtheninja