Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für Borland Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Winter 2008 - lieben Dank an Julius für ds Bild
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Delphi für Win32
Debugger-Meldung "ntdll.DbgBreakPoint" verhindern
Ein Delphi (Win32)-Thema von Matze.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen

als PDF-Datei herunterladenThema ausdrucken
 
Code-Library -> Library: Windows API / MS.NET Framework API
Seite 1 von 1   [ 1 Beitrag ]  
 
 Autor 
 Nachricht 
 
Matze #1|Beitrag #164845Verfasst am: 26.04.2004, 12:47      Titel: Debugger-Meldung "ntdll.DbgBreakPoint" verhindern  
Moderator
Alter: 23
Status: offline
Beiträge: 11.092
angemeldet: 07.07.2003
Wohnort: Hochdorf (BaWü)
Turbo Delphi für Win32

Sprache: Delphi (Win32)

Es kann vorkommen, dass sich ein Programm einwandfrei kompillieren lässt, jedoch beim Start aus Delphi nach einiger Zeit das CPU-Fenster geöffnet wird.

Dort steht dann häufig
Zitat:
ntdll.DbgBreakPoint:

...


Dies liegt daran, da Microsoft in manchen Dlls die Funktion ntdll.DbgBreakPoint vergessen hat.

Microsoft hat ein paar Dlls versehentlich mit Debug-Informationen ausgeliefert, die noch Breakpoints enthalten, was der Debugger natürlich meldet.

Man muss in so einem Falle zur Laufzeit den Code patchen. Wink

Das macht man folgendermaßen:

Delphi-Quellcode: zusammenfalten | markieren
procedure PatchINT3;
var
  NOP : Byte;
  NTDLL: THandle;
  BytesWritten: DWORD;
  Address: Pointer;
begin
  if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
  NTDLL := GetModuleHandle('NTDLL.DLL');
  if NTDLL = 0 then Exit;
  Address := GetProcAddress(NTDLL, 'DbgBreakPoint');
  if Address = nil then Exit;
  try
    if Char(Address^) <> #$CC then Exit;

    NOP := $90;
    if WriteProcessMemory(GetCurrentProcess, Address, @NOP, 1, BytesWritten) and
      (BytesWritten = 1) then
      FlushInstructionCache(GetCurrentProcess, Address, 1);
  except
    //Do not panic if you see an EAccessViolation here, it is perfectly harmless!
    on EAccessViolation do ;
    else raise;
  end;
end;

initialization

// nur wenn ein Debugger vorhanden, den Patch ausführen
if DebugHook<>0 then
   PatchINT3;

end.


Diesen Code hat shmia in diesem Thread veröffentlicht.

Grüße, Matze
Linux, Mac oder Windows? FF, IE oder Safari? Stimme ab und diskutiere auf http://pollunity.com *squiiiiek*
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Code-Library -> Library: Windows API / MS.NET Framework API Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1   [ 1 Beitrag ]  
 
   


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2008 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen