RandomClear icon

Low-level exception filter

RandomClear | PRO | 09/17/15 03:07:43 PM UTC | 0 ⭐ | 10698 👁️ | Never ⏰ | []
Delphi |

1.7 KB

|

None

|

0 👍

/

0 👎

// The following example will disable EurekaLog for all exceptions raised in ntdll, kernel32 and kernelbase DLLs.
 
uses
  EInject;
 
var
  EurekaLogExceptionDispatcher: TExceptionDispatcherProc;
 
function IgnoreException(const AContext: Windows.TContext; const AExceptionRecord: Windows.TExceptionRecord): Cardinal; stdcall;
const
  EXCEPTION_CONTINUE_SEARCH  = 0;
  cDelphiException           = $0EEDFADE; // see System.pas
var
  ExceptionAddress: Pointer;
  ExceptionModule: HMODULE;
  ExceptionModuleFileName: String;
  ExceptionModuleName: String;
 
  function IgnoreThisException: Boolean;
  begin
    Result := SameFileName(ExceptionModuleName, 'ntdll.dll') or
              SameFileName(ExceptionModuleName, 'kernel32.dll') or
              SameFileName(ExceptionModuleName, 'kernelbase.dll');
  end;
 
begin
  if AExceptionRecord.ExceptionCode = cDelphiException then
    ExceptionAddress      := Pointer(AExceptionRecord.ExceptionInformation[0]) // see System.TExceptionRecord
    // Exception object is available in TObject(AExceptionRecord.ExceptionInformation[1])
  else
    ExceptionAddress      := AExceptionRecord.ExceptionAddress;
  ExceptionModule         := FindHInstance(ExceptionAddress);
  ExceptionModuleFileName := GetModuleName(ExceptionModule);
  ExceptionModuleName     := ExtractFileName(ExceptionModuleFileName);
 
  if IgnoreThisException then
    Result := EXCEPTION_CONTINUE_SEARCH // RTL Handler will be called
  else
    Result := EurekaLogExceptionDispatcher(AContext, AExceptionRecord); // EurekaLog will be called
end;
 
initialization
  EurekaLogExceptionDispatcher := EInject.EventExceptionDispatcher;
  EInject.EventExceptionDispatcher := IgnoreException;
end.

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎