📄 ctrl_c.c
字号:
#include <stdio.h>
#include <dos.h>
#include <bios.h>
#define TRUE 1
#define FALSE 0
#define INTERCEPT 0
#define RELEASE 1
#define GET 0x00
#define SET 0x01
#define CHKON 0x01
#define CHKOFF 0x00
#define BREAKINTR 0x1B
#define DOS 0x21
#define CTRLCCHK 0x33
#define GETVECT 0x35
#define SETVECT 0x25
#define IOCTL 0x44
#define DEVFLAG 0x80
#define RAWFLAG 0x20
int get_ctrl_c_chk()
{
union REGS regs;
regs.h.ah = CTRLCCHK;
regs.h.al = GET;
int86(DOS, ®s, ®s);
if (regs.x.cflag)
return(FALSE);
return(regs.h.dl);
}
int set_ctrl_c_chk(int value)
{
union REGS regs;
regs.h.ah = CTRLCCHK;
regs.h.al = SET;
regs.h.dl = value;
int86(DOS, ®s, ®s);
return(!regs.x.cflag);
}
unsigned int ioctl(int handle, int op, unsigned int value)
{
union REGS regs;
regs.h.ah = IOCTL;
regs.h.al = op;
regs.x.bx = handle;
regs.x.dx = value & 0xFF;
int86(DOS, ®s, ®s);
if (regs.x.cflag)
return(FALSE);
return(regs.x.dx);
}
int rawio(int handle, int raw)
{
unsigned int flags;
flags = ioctl(handle, GET, 0);
if (flags & DEVFLAG)
{
if (raw)
ioctl(handle, SET, flags | RAWFLAG);
else
ioctl(handle, SET, flags & ~RAWFLAG);
}
return(flags & RAWFLAG);
}
static void interrupt far do_intcpt()
{
return;
}
static void do_break(int op)
{
union REGS regs;
struct SREGS segs;
static unsigned int oldseg;
static unsigned int oldofs;
if (op == INTERCEPT)
{
segread(&segs);
regs.h.ah = GETVECT;
regs.h.al = BREAKINTR;
int86x(DOS, ®s, ®s, &segs);
oldseg = segs.es;
oldofs = regs.x.bx;
segread(&segs);
regs.x.dx = (unsigned int) do_intcpt;
segs.ds = ((unsigned long) do_intcpt) >> 16;
}
else
{
segread(&segs);
regs.x.dx = oldofs;
segs.ds = oldseg;
}
regs.h.ah = SETVECT;
regs.h.al = BREAKINTR;
int86x(DOS, ®s, ®s, &segs);
}
int ctrl_c(int op)
{
static unsigned int outflg;
static unsigned int inflg;
static unsigned int ctrlcchk;
if (op == INTERCEPT)
{
do_break(INTERCEPT);
inflg = rawio(fileno(stdin), TRUE);
outflg = rawio(fileno(stdout), TRUE);
if ((ctrlcchk = get_ctrl_c_chk()) == CHKON)
set_ctrl_c_chk(CHKOFF);
}
else
{
set_ctrl_c_chk(ctrlcchk);
rawio(fileno(stdout), outflg);
rawio(fileno(stdin), inflg);
do_break(RELEASE);
}
return(TRUE);
}
void main()
{
int achar;
ctrl_c(INTERCEPT);
/* Chi co the ket thuc bang SpaceBar */
while ((achar = _bios_keybrd(_KEYBRD_READ) & 0xFF) != ' ')
putch(achar);
ctrl_c(RELEASE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -