| |
| Matze |
#1| Verfasst 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.
Das macht man folgendermaßen:
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · 33
| 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 |
 |
|
|
|