[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
{
From: COLIN CYR
Subj: Ctrl-Alt-Del...
}
UNIT CADThief;
{Intercept Control+Alternate+Delete keypresses}
INTERFACE
USES Crt,Dos;
FUNCTION GetCAD : boolean;
FUNCTION HandleCADs: boolean;
IMPLEMENTATION
VAR
OldInt09,OldExitProc: pointer;
KeyStat: ^byte;
CADStatus: boolean;
PROCEDURE GoOldInt(OldIntVector: pointer);
INLINE(
$5B/ {POP BX - Get Segment}
$58/ {POP AX - Get Offset}
$89/ {MOV SP,BP}
$EC/
$5D/ {POP BP}
$07/ {POP ES}
$1F/ {POP DS}
$5F/ {POP DI}
$5E/ {POP SI}
$5A/ {POP DX}
$59/ {POP CX}
$87/ {XCHG SP,BP}
$EC/
$87/ {XCHG [BP],BX}
$5E/
$00/
$87/ {XCHG [BP+2],AX}
$46/
$02/
$87/ {XCHG SP,BP}
$EC/
$CB); {RETF}
PROCEDURE SetCAD(Status: boolean);
BEGIN
CADStatus := Status {Set flag}
END;
FUNCTION GetCAD: boolean;
BEGIN
GetCAD := CADStatus;
END;
{$F+}
PROCEDURE NewExitProc;
{$F-}
BEGIN
ExitProc := OldExitProc;
SetIntVec($09,OldInt09);
CheckBreak := TRUE
END;
{$F+}
PROCEDURE NewInt09(AX,BX,CX,DX,SI,DI,DS,ES,BP: Word); INTERRUPT;
{$F-}
VAR
I,J : integer;
CONST
KsDelCode = $53;
BEGIN
I := Port[$60]; {Get Scan Code}
if ((I and $7F) = KsDelCode) and {DEL key?}
((KeyStat^ and $0C) = $0C) {CTL + ALT ?}
THEN
BEGIN
SetCAD(TRUE);
J := Port[$61]; {Save Kbd Status}
Port[$61] := J and $80; {Reset Kbd Int}
Port[$61] := J and $7F;
Port[$20] := $20;
Sound(880);Delay(100);Sound(1220);Delay(250);NoSound;
END
ELSE
GoOldInt(OldInt09)
END;
FUNCTION HandleCADs: boolean;
VAR
XPos,YPos: byte;
A : char;
Regs : Registers;
BEGIN
WITH Regs DO {Flush keyboard buffer}
BEGIN
AH := $0C;
AL := 0;
MsDOS(Regs)
END;
XPos :=WhereX; {Save old cursor position}
YPos := WhereY;
GotoXY(1,1);
WriteLn('Ctrl+Alt+Del pressed');
Delay(250);Sound(1600);Delay(250);NoSound;
GotoXY(1,1);WriteLn(' ');
GotoXY(1,1);Write('Are you sure you want to quit? ');
A := ReadKey;Write(A);
GotoXY(1,1);Write(' ');
IF UpCase(A) = 'Y' THEN
HandleCADs := TRUE
ELSE
HandleCADs := FALSE;
GotoXY(XPos,YPos);SetCAD(FALSE)
END;
PROCEDURE InstallCADHndlr;
BEGIN
OldExitProc := ExitProc;
ExitProc := @NewExitProc;
GetIntVec($09,OldInt09);
SetIntVec($09,@NewInt09);
SetCBreak(FALSE);
CheckBreak := FALSE;
KeyStat := Ptr($40,$17);
END;
BEGIN
InstallCADHndlr;
SetCAD(FALSE)
END.
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]