Article 4827 of comp.sys.ibm.pc: Path: brl-smoke!brl-adm!husc6!uwvax!uwmacc!hobbes!circle From: galvin@circle.UUCP (John Galvin) Newsgroups: comp.sys.ibm.pc Subject: preventing MS-DOS from printing ^C while within MS C Date: 29 Jun 87 03:53:30 GMT A while ago someone asked how to prevent MS-DOS from printing ^C when using signal() to trap Ctrl-C's. The code below does this for MS-DOS machines which are BIOS compatible with the IBM PC. Through sheer laziness I have not tested it without signal(). When the BIOS determines that a Ctrl-C has been pressed it does two important things. First it sets bit 7 of 0040:0071 (labeled in the BIOS listing as BIOS_BREAK). Then it does an interrupt 0x1B. The interrupt routine that MS-DOS supplies for int 1B sticks a control C character (0x03) into the keyboard buffer. That is why the ^C is printed out by MS-DOS. The code below intercepts that interrupt so that the ^C is not put into the buffer. It does not, however, affect the byte at BIOS_BREAK in any way. if you want to prevent that flag from being seen by DOS, just add some code to zero out that location in the int 1B interrupt handler. To use these routines, just call intercept() when you want to prevent DOS from printing ^C. Remember to call release() before the program exits. Hope this is what you were looking for... John -- John Galvin UUCP: ...uwvax!uwmacc!hobbes!circle!galvin 213 N. Hamilton #9 FidoNet: Sysop of 121/0, and 121/1. (608) 258-9723 Madison, Wi 53703 AT&T: (608) 258-9721 -------------------------------Cut Here--------------------------------- TITLE Intercept.asm - intercept ^C PAGE 66,132 ; ; Intercept.ASM ; ; Author: John Galvin ; Date: 06-Jan-1987 ; Purpose: to intercept a control-C from Microsoft C ; ; Copyright (C) 1987 by John W. Galvin. ; ; This source code may be freely used and distributed provided that ; it is not sold, no charge whatsoever is made for its distribution, ; and the above copyright and authorship information remains with ; the source code. ; ; John Galvin - FidoNet 121/0 & 121/1 ; UUCP ...!uwvax!uwmacc!hobbes!circle!galvin ; ; use the following to assemble this code for the small memory model: ; masm /ml intercep.asm; ; for the large memory model use: ; masm /ml /dLPROG intercep.asm; ; ; Update History: ; 06-Jan-1987 - initial version. ; 28-Jun-1987 - threw in some comments for release. ; ifdef LPROG assume CS:INTERCEP_TEXT INTERCEP_TEXT segment byte public 'CODE' else assume CS:_TEXT _TEXT segment byte public 'CODE' endif PUBLIC _intercept, _release oldseg dw ? ; the old segment of the break interrupt vector oldoff dw ? ; the old offset of the break interrupt vector ;---------------------------------------------------------------------------- ; Name: do_intcpt ; ; This is an interrupt handler for int 1B, the Keyboard Break ; interrupt. As it stands it just does a return from interrupt. ; This routine is local to this file. ; ifdef LPROG do_intcpt PROC FAR else do_intcpt PROC NEAR endif iret do_intcpt ENDP ;---------------------------------------------------------------------------- ; Name: _intercept ; ; This routine changes the Keyboard Break interrupt handler ; to do_intcpt. ; ifdef LPROG _intercept PROC FAR else _intercept PROC NEAR endif push bp ; save bp mov bp, sp ; setup bp push di ; save possible register variable push si ; save possible register variable push es mov ax, 351Bh ; DOS get vector service int 21h mov ax, es ; segment returned in es mov cs:oldseg, ax ; save old routine's segment address mov cs:oldoff, bx ; and offset mov ax, 251Bh ; DOS set vector service mov dx, offset do_intcpt ; offset of our interrupt handler push ds push cs pop ds ; get segment address of our handler int 21h ; set the vector pop ds ; restore ds pop es ; restore es pop si ; restore si pop di ; restore di mov sp, bp ; chop stack for return to calling function pop bp ; restore bp ret ; return to calling function _intercept ENDP ;---------------------------------------------------------------------------- ; Name: _release ; ; This routine changes the Keyboard Break interrupt handler back to ; the original MS-DOS routine. ; ifdef LPROG _release PROC FAR else _release PROC NEAR endif push bp ; save bp mov bp, sp ; setup bp push di ; save possible register variable push si ; save possible register variable push ds mov ax, 251Bh ; DOS set vector service mov dx, cs:oldoff ; old handler's offset mov bx, cs:oldseg ; old handler's segment mov ds, bx int 21h ; set the vector pop ds pop si ; restore si pop di ; restore di mov sp, bp ; chop stack for return to calling function pop bp ; restore bp ret ; return to calling function _release ENDP ifdef LPROG INTERCEP_TEXT ENDS else _TEXT ENDS endif END