[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    {
    KAI ROHRBACHER

    I'm looking For a way to tell BorlandPascal that an allocated _data_
    block should now be treated as an executable routine (in Protected Mode).
    Here is a little example to show the problem; it runs w/o problems in
    Real Mode, but results in a GP-fault (despite the use of the alias-selector!):
    }

    Program SelfModify;

    Const
      AnzNOPs = 10;

    Type
      TTestProc = Procedure;

    Var
      code : Pointer;
      Run  : TTestProc;
      pb   : ^Byte;
      pw   : ^Word Absolute pb;
      i    : LongInt;

    begin
      GetMem(code, AnzNOPs + 7); {7 Bytes For proc header & end}
      pb := code; {pb = ^start of routine to build}

      pb^ := $55;
      INC(pb);   {push bp}
      pw^ := $E589;
      INC(pw); {mov bp,sp}
      For i := 1 to AnzNOPs DO
      begin
        pb^ := $90;
        INC(pb); {nop's}
      end;
      pb^ := $5D;
      INC(pb);   {pop bp}
      pb^ := $CA;
      INC(pb);
      pw^ := $0000;          {retf 0}

      {$IFDEF DPMI}
      WriteLN('Protected Mode');
      code:= Ptr(Seg(code) + SelectorInc, Ofs(code)); {alias-selector}
      {$else}
      WriteLN('Real Mode');
      {$endIF}

      Run := TTestProc(code); {that's a Type-cast!}
      Run; {call routine}

      FreeMem(code, AnzNOPs + 7);
      WriteLN('Alive and kicking!');
    end.

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]