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

    {
    > I was wondering if anybody out there has written a PROCEDURE to
    > disable control-alt-delete in a program.
    }

    USES DOS, Crt;

    CONST
      KBD_INT  = $9;    { Keyboard interrupt service routine (ISR) }

      CTRL_ALT =  12;   { Control + Alt toggle flag status }
      KEYBOARD = $60;   { Keyboard port address }
      DEL      =  83;   { Delete key, before mapping translation }
      ESC      = $1B;   { Escape key, after mapping translation }
      PIC      = $20;   { Priority Interrupt Controller port address }
      EOI      = $20;   { End of interrupt signal }

    VAR
      KbdIntVec : PROCEDURE;                  { Calls old keyboard handler }
      SwitCheck : BYTE ABSOLUTE $0000:$0417;  { Checks keyboard toggle flags }
      Reboot    : BOOLEAN;                    { TRUE if 3-fingered salute }

    {$F+}
    PROCEDURE KeyClick; INTERRUPT;
    Begin
      IF ((SwitCheck AND CTRL_ALT) = CTRL_ALT) AND (Port[ KEYBOARD ] = DEL) THEN
      Begin
        Reboot      := TRUE;
        Port[ PIC ] := EOI;
      End
      ELSE
      Begin
        Inline( $9C );  { PUSHF }

        { Call old ISR using saved vector }
        KbdIntVec;
      End;
    End;
    {$F-}

    VAR
      Ch : CHAR;

    BEGIN
      ClrScr;

      GetIntVec( KBD_INT, @KbdIntVec );
      SetIntVec( KBD_INT, Addr( Keyclick ) );

      Reboot := FALSE;

      WriteLn( 'Start typing.  Press CTRL-ALT-DEL to quit.  /[:)' );

      Repeat
        IF KeyPressed THEN
        Begin
          Ch := ReadKey;

          Write( Ch );
        End;
      Until Reboot;

      WriteLn;
      WriteLn( 'Shranks!' );

      SetIntVec( KBD_INT, Addr( KbdIntVec ) );
    END.

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