Cita:
Empezado por islu
pues la aplicación no llega ni a arrancar, en el "Application.Initialize;" he puesto un break point, y me sale antes de llegar a este punto.
|
Quizá no lo sepas pero el código que tú ves en el archivo .dpr
no es lo primero en ejecutarse. Hay de hecho muchísimo código que se ejecuta
antes de llegar siquiera al primer
begin.
Para empezar está todo el código de la unidad System, la única unidad omnipresente en Delphi, y luego todo el código de las secciones
initialization de cada una de las unidades incluidas en el proyecto, tanto las que uno pone explicitamente como las que son incluidas dentro de otras, y creeme, son muchísimas.
De hecho, si te fijas, la primera línea de código en el archivo .dpr,
Application.Initialize
hace referencia a un objeto, Application. Como todo objeto en Delphi, éste debe ya estar creado antes de llamar a ninguno de sus métodos. Tal objeto se crea en la sección
initialization de la unidad Forms.
El tipo de error al que te enfrentas seguramente se genera en alguna de estas secciones, razón por la cual jamás se llega ni siquiera al
begin del dpr.
Puedes de hecho hacer un debug de todo esto habilitando la opción "Use debug dcus" en Project|Options|Compiler y comenzando la ejecución con F8 y continuando paso a paso con F7. Incluso, si uno es suficientemente paciente, es posible que alcances a ver el punto casi exacto donde se produce el error.
Pero antes de tal aventura, haz el experimento tal como te indiqué tan sólo para ver si por ahí va el problema. Más aún, dado que el error podría estarse produciendo antes de que se ejecuta la sección
initialization del formulario sería mejor que crees una unidad nueva con sólo dicho código:
Código:
unit TestPacthInt3;
interface
implementation
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
PatchInt3;
end.
Así, tal cual. Copia, pega y guarda el archivo.
Incluye la unidad
al principio de la cláusula
uses del dpr:
Código:
program Project1;
uses
TestPatchInt3,
Forms,
etc.
...
para que sea la primera en ser procesada, aún antes de la unidad Forms.
// Saludos