Einzelnen Beitrag anzeigen

MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
555 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: [Windows Update 03/2017 Problem] CompPkgSup.DLL schießt eigenes Programm ab

  Alt 19. Mär 2017, 19:22
Das Thema ist ein wenig seltsam

Probiere, aber vergiss nicht ich hab das hurtig zusammengeflickt ohne so genau zu wissen was ich tue, einen Versuch mit einem Vectored Exception Handling.

Zumal der installierte Handler die ganze Zeit den Prozess überlebt besser kurz vor deinem Aufruf welcher schief geht installieren und hernach gleich wieder deinstallieren. Je nachdem was dieser Handler als Rückgabewert gibt wird die Anwendung gezwungen eine Exception zu handeln, nicht oder weiter die Liste mit vektorbasieren Exeception Handlern abzuklappern.

Delphi-Quellcode:

unit VEH;

(*

LONG CALLBACK VectoredHandler(
  _In_ PEXCEPTION_POINTERS ExceptionInfo
);

PVOID WINAPI AddVectoredExceptionHandler(
  _In_ ULONG                      FirstHandler,
  _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
);

ULONG WINAPI RemoveVectoredContinueHandler(
  _In_ PVOID Handler
);

ULONG WINAPI RemoveVectoredContinueHandler(
  _In_ PVOID Handler
);

PVOID WINAPI AddVectoredContinueHandler(
  _In_ ULONG                      FirstHandler,
  _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
*)



interface

{$IFDEF WIN32}
 uses Windows;


//Handler

const CALL_FIRST = 1;
const CALL_LAST = 0;

const EXCEPTION_CONTINUE_EXECUTION = -1;
const EXCEPTION_CONTINUE_SEARCH = 0;
const EXCEPTION_EXECUTE_HANDLER = 1;

type PVECTORED_EXCEPTION_HANDLER =
  function(const ExceptionInfo: _EXCEPTION_POINTERS): LongInt cdecl {$IFDEF WIN32} stdcall {$ENDIF};

// Installed after First Chance Exception
function AddVectoredExceptionHandler(const FirstHandler: ULONG;
  const VectoredHandler: PVECTORED_EXCEPTION_HANDLER): PVOID; stdcall;

function RemoveVectoredExceptionHandler(const VectoredHandlerHandle: PVOID): ULONG; stdcall;

function AddVectoredContinueHandler (Const FirstHandler: ULONG;
  const VectoredHandler: PVECTORED_EXCEPTION_HANDLER): PVOID; stdcall;

function RemoveVectoredContinueHandler (const VectoredHandlerHandle: PVOID) : ULONG; stdcall;

implementation


function AddVectoredExceptionHandler;
  external kernel32 name 'AddVectoredExceptionHandler'

function RemoveVectoredExceptionHandler;
  external kernel32 name 'RemoveVectoredExceptionHandler'

  function AddVectoredContinueHandler;
  external kernel32 name 'AddVectoredContinueHandler'

function RemoveVectoredContinueHandler;
  external kernel32 name 'RevomeVectoredContinueHandler'

{$ENDIF}

end.
Handler und Aufruf ...

Delphi-Quellcode:

uses VEH;

function ForceExceptionHandling(const ExceptionInfo: TExceptionPointers): Longint; stdcall;
begin
// writeln('Vextored Exception Handler');
  Result := EXCEPTION_CONTINUE_EXECUTION;
  //Result := EXCEPTION_EXECUTE_HANDLER;
  //Result := EXCEPTION_CONTINUE_SEARCH;
end;

procedure TForm1.bnVecotoredEhClick(Sender: TObject);
var
  resf : Pointer;
  dummy : integer;
begin
  try
    //try
      //writeln('Adding First Handler : EXCEPTION_CONTINUE_EXECUTION');
      resf:=AddVectoredExceptionHandler(CALL_FIRST, ForceExceptionHandling);
      //writeln('Raising Exception');
      raise EExternalException.Create('Howdy friends and neighbors');
      dummy := 1;
    //except
    //end;
  finally
    //writeln('Removing First Handler : EXCEPTION_CONTINUE_EXECUTION');
    RemoveVectoredExceptionHandler(resf);
  end;
Am Fehler wird es nichts ändern. Ich kann leider keine Windows Exception auslösen, so in der Richtung. Diese Exception Handling Routinen werden nach der First Chance Exception ausgeführt.

Wäre für Win32. EXCEPTION_CONTINUE_EXECUTION führt auf der Kommadozeile im Debugger zum Crash der Applikation. Im Fall von VCL was nicht viel sagt. EXCEPTION_EXECUTE_HANDLER könnte sein was du braucht. Das war bisher unproblematisch. Die ExceptionInfo im Handler ist gefüllt.

Danke nochmal.
  Mit Zitat antworten Zitat