
{
Hmm ... My initial attempt was to disable the Int 19h handler, which is
called when you hit ctrl-alt-del; but it didn't work.  So here's a TSR
that "cheats": if you hit "ctrl" and "alt" and then "del", it flags
"ctrl" and "alt" as "not down" and so your system never sees the reboot
condition. }

{$M $0400, $0000, $0000}
{$F+}

program noreboot;
uses dos;

const ctrlbyte = $04;  { Memory location $0040:$0017 governs the statuses of }
      altbyte  = $08;  { the Ctrl key, Alt, Shifts, etc.  the "$04" bit }
                       { handles "Ctrl"; "$08" handles "Alt". }

var old09h: procedure;                          { original keyboard handler }
    ctrldown, altdown, deldown: boolean;
    keyboardstat: byte absolute $0040:$0017;    { the aforementioned location }

{-----------------------------------------------------------------------------}

procedure new09h; interrupt;  { new keyboard handler: it checks if you've
                                pressed "Ctrl", "Alt" and "Delete"; if you
                                have, it changes "Ctrl" and "Alt" to
                                "undepressed".  Then it calls the
                                "old" keyboard handler. }
begin
  if port[$60] and $1d = $1d then ctrldown := (port[$60] < 128);
  if port[$60] and $38 = $38 then altdown  := (port[$60] < 128);
  if port[$60] and $53 = $53 then deldown  := (port[$60] < 128);
  if ctrldown and altdown and deldown then begin
     keyboardstat := keyboardstat and not ctrlbyte;  { By killing the "Ctrl" }
     keyboardstat := keyboardstat and not altbyte;   { and "Alt" bits, the   }
     end;                                            { "reboot" never runs   }
  asm
    pushf
    end;
  old09h;
  end;

{-----------------------------------------------------------------------------}

begin
  getintvec($09, @old09h);
  setintvec($09, @new09h);  { set up new keyboard handler }
  ctrldown := false;
  altdown := false;         { Set "Ctrl", "Alt", "Delete" to "False" }
  deldown := false;
  keep(0);
  end.
