From: <ou...@us...> - 2006-06-10 18:52:24
|
Revision: 1674 Author: outchy Date: 2006-06-10 11:52:16 -0700 (Sat, 10 Jun 2006) ViewCVS: http://svn.sourceforge.net/jcl/?rev=1674&view=rev Log Message: ----------- Page access rights are now explicit Modified Paths: -------------- trunk/jcl/experts/debug/dialog/ExceptDlg.Delphi32.pas Modified: trunk/jcl/experts/debug/dialog/ExceptDlg.Delphi32.pas =================================================================== --- trunk/jcl/experts/debug/dialog/ExceptDlg.Delphi32.pas 2006-05-30 20:27:21 UTC (rev 1673) +++ trunk/jcl/experts/debug/dialog/ExceptDlg.Delphi32.pas 2006-06-10 18:52:16 UTC (rev 1674) @@ -30,7 +30,7 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, - JclSysUtils,%if SendEMail JclMapi%endif, JclDebug; + JclSysUtils,%if SendEMail JclMapi,%endif JclDebug; const UM_CREATEDETAILS = WM_USER + $100; @@ -169,7 +169,7 @@ TApplicationHandleExceptionAddr, SysUtilsShowExceptionAddr: Pointer; CALLInstruction: TCALLInstruction; CallAddress: Pointer; - NW: DWORD; + OldProtect: DWORD; function CheckAddressForOffset(Offset: Cardinal): Boolean; begin @@ -195,10 +195,16 @@ Result := CheckAddressForOffset(CallOffset) or CheckAddressForOffset(CallOffsetDebug); if Result then begin - CALLInstruction.Address := Integer(@HookShowException) - Integer(CallAddress) - SizeOf(CALLInstruction); - Result := WriteProcessMemory(GetCurrentProcess, CallAddress, @CALLInstruction, SizeOf(CALLInstruction), NW); + Result := VirtualProtect(CallAddress, sizeof(CallInstruction), PAGE_EXECUTE_READWRITE, OldProtect); if Result then - FlushInstructionCache(GetCurrentProcess, CallAddress, SizeOf(CALLInstruction)); + try + CALLInstruction.Address := Integer(@HookShowException) - Integer(CallAddress) - SizeOf(CALLInstruction); + PCALLInstruction(CallAddress)^ := CALLInstruction; + if Result then + FlushInstructionCache(GetCurrentProcess, CallAddress, SizeOf(CALLInstruction)); + finally + VirtualProtect(CallAddress, sizeof(CallInstruction), OldProtect, OldProtect); + end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |