Kann ich eine Win32-API über das Direktfenster von Visual Studio aufrufen?

8

Ich debugge eine C ++ Win32-Anwendung, und ich möchte eine beliebige Win32-API aus dem Kontext dieses Prozesses aufrufen, als ob das Programm diese Codezeile ausgeführt hätte:

%Vor%

Aber wenn Sie das in das Direktfenster eingeben, erhalten Sie:

%Vor%

Bearbeiten: Mit dem vollständigen Namen der Funktion {,,user32.dll}_NtUserDestroyWindow@4 kann ich das Direktfenster dazu bringen zu verstehen, welche Funktion ich meine und die Adresse der Funktion anzeigen:

%Vor%

Aber wenn ich versuche, es anzurufen, passiert das:

%Vor%

Ist es überhaupt möglich, eine C-Funktion vom Direktfenster aus aufzurufen, oder belle ich den falschen Baum an?

    
RichieHindle 21.08.2009, 13:49
quelle

3 Antworten

4

Sobald Sie die Funktionsadresse haben (wie Sie es in der aktualisierten Frage getan haben), können Sie versuchen, sie an einen Funktionszeiger zu übergeben und aufzurufen:

%Vor%

Der erste Teil von diesem wandelt die Adresse in BOOL (*)(HWND) um. Dies ist ein Zeiger auf eine Funktion, die einen Parameter HWND übernimmt und BOOL zurückgibt. Dann wird der Funktionszeiger dereferenziert und aufgerufen. Stellen Sie sicher, dass die Parameter korrekt sind, sonst werden schlimme Dinge passieren. Auf 64-Bit-Systemen und HWND können 64 Bit sein, so dass es Ihnen möglicherweise nicht möglich ist, den Parameter als int zu übergeben.

Bearbeiten: Siehe die Kommentare für die vollständige Geschichte.

    
Adam Rosenfield 21.08.2009, 22:12
quelle
2

Ich glaube, das Problem ist, dass die C ++ EE Probleme hat, den Kontext von DestroyWindow aufzulösen. Probieren Sie Folgendes aus

%Vor%

Ich bin mir nicht sicher, ob die Methodenaufrufsyntax diesen Qualifizierungsstil unterstützt (nur zum Casting in der Vergangenheit verwendet). Aber es ist einen Versuch wert.

BEARBEITEN Sie müssen oder müssen möglicherweise keine hinzufügen! nach dem Schließen}. Es ist eine Weile her, seit ich diese Syntax benutzt habe und ich verwechsle sie oft mit der entsprechenden Windbg.

    
JaredPar 21.08.2009 14:10
quelle
1

Ich habe einen Workaround gefunden, aber ich würde trotzdem lieber das Direktfenster verwenden.

Die Problemumgehung ist:

  • Erhalte die Adresse der Funktion, wie in der Frage
  • gezeigt
  • Verwenden Sie das Disassembly-Fenster, um zu dieser Adresse zu gehen und setzen Sie dort einen Haltepunkt
  • Machen Sie etwas mit der Anwendung, um es aufzurufen DestroyWindow
  • Sichern Sie den Aufruf-Stack für den Aufrufer von DestroyWindow , der folgendermaßen aussieht:

    6D096A9D push ecx
    6D096A9E ruft dword ptr ds auf: [6D0BB4B8h]

  • Setzen Sie einen Haltepunkt für die Anweisung push ecx und löschen Sie den Wert für DestroyWindow

  • klicken Sie auf Weiter, und machen Sie erneut etwas an der Anwendung, damit es den Code aufruft.
  • notieren Sie den Wert von ecx
  • Ändern Sie den Wert von ecx im Debugger auf den gewünschten Wert und gehen Sie über push/call
  • stellt den Wert von ecx wieder her und verwendet Set Next Statement, um zu push zurückzukehren, dann Weiter

Es ist langwierig, aber es funktioniert. Es wird davon ausgegangen, dass Sie die Anwendung die entsprechende API nach Belieben aufrufen können.

    
RichieHindle 21.08.2009 14:54
quelle