home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / insidetp / 1990_03 / cadthief.pas < prev    next >
Pascal/Delphi Source File  |  1990-02-22  |  3KB  |  140 lines

  1. UNIT CADThief;
  2.  
  3. {Intercept Control+Alternate+Delete keypresses}
  4.  
  5. INTERFACE
  6.  
  7. USES   Crt,Dos;
  8.  
  9. FUNCTION GetCAD       : boolean;
  10. FUNCTION HandleCADs: boolean;
  11.  
  12. IMPLEMENTATION
  13.  
  14.  VAR
  15.      OldInt09,OldExitProc: pointer;
  16.      KeyStat: ^byte;
  17.      CADStatus: boolean;
  18.  
  19.  PROCEDURE GoOldInt(OldIntVector: pointer);
  20.  INLINE (
  21.     $5B/   {POP BX - Get Segment}
  22.     $58/   {POP AX - Get Offset}
  23.     $89/   {MOV SP,BP}
  24.     $EC/
  25.     $5D/   {POP BP}
  26.     $07/   {POP ES}
  27.     $1F/   {POP DS}
  28.     $5F/   {POP DI}
  29.     $5E/   {POP SI}
  30.     $5A/   {POP DX}
  31.     $59/   {POP CX}
  32.     $87/   {XCHG SP,BP}
  33.     $EC/
  34.     $87/   {XCHG [BP],BX}
  35.     $5E/
  36.     $00/
  37.     $87/   {XCHG [BP+2],AX}
  38.     $46/
  39.     $02/
  40.     $87/   {XCHG SP,BP}
  41.     $EC/
  42.     $CB);  {RETF}
  43.  
  44. PROCEDURE SetCAD(Status: boolean);
  45.   BEGIN
  46.     CADStatus := Status        {Set flag}
  47.   END;
  48.  
  49. FUNCTION GetCAD: boolean;
  50.   BEGIN
  51.     GetCAD := CADStatus;
  52.   END;
  53.  
  54. {$F+}
  55.  PROCEDURE NewExitProc;
  56. {$F-}
  57.  BEGIN
  58.    ExitProc := OldExitProc;
  59.    SetIntVec($09,OldInt09);
  60.    CheckBreak := TRUE
  61.  END;
  62.  
  63. {$F+}
  64.  PROCEDURE NewInt09(AX,BX,CX,DX,SI,
  65.             DI,SD,ES,BP: Word); INTERRUPT;
  66. {$F-}
  67.  VAR
  68.    I,J: integer;
  69.  CONST
  70.    KsDelCode = $53;
  71.  BEGIN
  72.    I := Port[$60];   {Get Scan Code}
  73.    IF ((I and $7F) = KsDelCode) and  {DEL key?}
  74.       ((KeyStat^ and $0C) = $0C)     {CTL + ALT ?}
  75.       THEN
  76.     BEGIN
  77.       SetCAD(TRUE);
  78.       J := Port[$61];     {Save Kbd Status}
  79.       Port[$61] := J or $80; {Reset Kbd Int}
  80.       Port[$61] := J and $7F;
  81.       Port[$20] := $20;
  82.       Sound(880);Delay(100);
  83.       Sound(1220);Delay(250);NoSound;
  84.     END
  85.       ELSE
  86.     GoOldInt(OldInt09)
  87.  END;
  88.  
  89. FUNCTION HandleCADs: boolean;
  90.  
  91. VAR
  92.     XPos,YPos: byte;
  93.     A : char;
  94.     Regs : Registers;
  95.  
  96.   BEGIN
  97.     WITH Regs DO      {Flush keyboard buffer}
  98.       BEGIN
  99.         AH := $0C;
  100.         AL := 0;
  101.         MsDOS(Regs)
  102.       END;
  103.     XPos :=WhereX;     {Save old cursor position}
  104.     YPos := WhereY;
  105.     GotoXY(1,1);
  106.     WriteLn('Ctrl+Alt+Del pressed');
  107.     Delay(250);Sound(1600);Delay(250);NoSound;
  108.     GotoXY(1,1);
  109.     WriteLn('                    ');
  110.     GotoXY(1,1);
  111.     Write('Are you sure you want to quit? ');
  112.     A := ReadKey;
  113.     Write(A);
  114.     GotoXY(1,1);
  115.     Write('                                 ');
  116.     IF UpCase(A) = 'Y' THEN
  117.        HandleCADs := TRUE
  118.     ELSE
  119.        HandleCADs := FALSE;
  120.     GotoXY(XPos,YPos);
  121.     SetCAD(FALSE)
  122.   END;
  123.  
  124. PROCEDURE InstallCADHndlr;
  125.  
  126.  BEGIN
  127.    OldExitProc := ExitProc;
  128.    ExitProc := @NewExitProc;
  129.    GetIntVec($09, OldInt09);
  130.    SetIntVec($09, @NewInt09);
  131.    SetCBreak(FALSE);
  132.    CheckBreak := FALSE;
  133.    KeyStat := Ptr($40,$17);
  134.  END;
  135.  
  136. BEGIN
  137.    InstallCADHndlr;
  138.    SetCAD(FALSE)
  139. END.
  140.