Wie ersetzen WinAPI-Funktionen aufruft, in dem MS VC ++ Projekt mit meiner eigenen Implementierung (Name und eingestellten Parameter sind gleich)?

StackOverflow https://stackoverflow.com/questions/60641

  •  09-06-2019
  •  | 
  •  

Frage

Ich brauche alle WinAPI Anrufe von der ersetzen

  • Create,
  • ReadFile-,
  • SetFilePointer,
  • Closehandle

mit meiner eigenen Implementierung (die über Bluetooth Lese Low-Level-Datei verwenden). Der Code, wo Funktionen ersetzt werden, ist Video File Player und es funktioniert bereits mit den regulären hdd Dateien. Es ist auch erforderlich, dass Video-Player noch Dateien von der Festplatte abspielen können, wenn sich die Datei im Videoplayer-Eingang eine herkömmliche Festplatte Datei ist.

Was ist die beste Praxis für eine solche Aufgabe?

War es hilfreich?

Lösung

Ich schlage vor, dass Sie die folgenden Schritte:

  1. einen Satz von Wrapperfunktionen schreiben, z.B. MyCreateFile, MyReadFile, etc, die zunächst die entsprechende API einfach anrufen und die gleichen Argumente zusammen, unmodifizierten geben.
  2. Verwenden des Texteditor für alle Anrufe zu den ursprünglichen APIs zu suchen, und ersetzen Sie diese mit Anrufen zu Ihren neuen Wrapper-Funktionen.
  3. Test, dass die Anwendung noch korrekt funktioniert.
  4. Ändern Sie die Wrapper-Funktionen Ihre eigenen Zwecke entsprechen.

Beachten Sie, dass Createfile ist ein Makro, das entweder CreateFileW oder CreateFileA erweitert, je nachdem, ob UNICODE definiert ist. Betrachten Sie LPCTSTR und die TCHAR Funktionen so dass Ihre Anwendung kann entweder als ANSI oder Unicode gebaut werden.

Bitte verwenden Sie keine #define, wie in anderen Antworten hier vorgeschlagen, da dies nur zu Wartungsproblemen führen, und wie Maximilian richtig vorträgt, es ist kein Best-Practice.

Andere Tipps

Sie können nur Ihre neue Funktionen in einem benutzerdefinierten Namespace schreiben. z.

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

Dann in Ihrem Code, das einzige, was Sie ändern müssen würde, ist:

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

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

Easy! :)

Wenn Sie versuchen, Anrufe auf diese APIs von einer anderen Anwendung abzufangen, sollten Sie Detours .

Wenn Sie den Code bearbeiten können, sollten Sie einfach neu schreiben sie eine eigene API zu verwenden, das tut, was Sie wollen. in Ermangelung eines solchen, verwenden Maximilians Technik, aber seien Sie gewarnt, dass es eine Wartung Horror ist.

Wenn Sie den Code nicht bearbeiten können, können Sie die Importtabellen Patch Anrufe zu Ihrem eigenen Code zu umleiten. Suche nach dem Abschnitt - Eine Beschreibung dieser Technik kann in diesem Artikel finden der Titel "Bespitzelung durch Änderung des Import Address Table".

Das ist gefährlich, aber wenn Sie vorsichtig sind, können Sie es funktioniert. Überprüfen Sie auch Microsoft Detours , die die gleiche Art der Sache tut, aber sie ist es nicht erforderlich zu Chaos mit dem tatsächlichen Patchen um.

Wenn Sie wirklich wollen, um die API kapern, schauen Sie sich syringe.dll (L-GPL).

Ich glaube nicht, das beste Praxis ist, aber es sollte funktionieren, wenn Sie es in einer Include-Datei setzen, die Sie überall die Funktion enthalten ist wollen aufgerufen wird sich ändern:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

Die Umsetzung der MyCreateFile sieht ungefähr wie folgt aus:

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

Sie machen im Grunde alle Create einen MyCreateFile Anruf in dem Sie entscheiden können, ob Sie brauchen, wollen eine eigene Implementierung oder das orginal verwenden.

Disclaimer: Ich denke, dies zu tun ist hässlich, und ich würde es nicht tun. Ich würde eher suchen und alle Vorkommen oder etwas ersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top