1
{ This example shows how to redirect a software interrupt by
2
changing the protected mode handler of the DPMI host.
4
In more detail it hooks interrupt 1Ch which is called every
5
time the timer interrupt (int 08) is executed. This is the
6
preferred way to hook the timer, because int 1Ch is a software
7
interrupt which doesn't need so much initialization stuff
8
compared to hooking a hardware interrupt.
16
{ interrupt number we want to hook }
20
{ 48 bit pointer to old interrupt handler }
22
{ 48 bit pointer to new interrupt handler }
25
{ increased every time the interrupt is called }
26
int1c_counter : Longint;
28
{ the current data selector }
29
int1c_ds : Word; external name '___v2prt0_ds_alias';
31
{ the actual handler code }
32
procedure int1c_handler; assembler;
35
{ save all registers }
38
{ prepare segment registers for FPC procedure }
39
movw %cs:int1c_ds, %ax
41
{ simply increase the counter by one }
53
{ insert right handler data into new handler variable }
54
newint1c.offset := @int1c_handler;
55
newint1c.segment := get_cs;
56
{ get the old handler }
57
get_pm_interrupt(int1c, oldint1c);
58
Writeln('-- Press any key to exit --');
60
set_pm_interrupt(int1c, newint1c);
61
{ write the number of interrupts occured }
62
while (not keypressed) do begin
64
write('Number of interrupts occured : ', int1c_counter);
66
{ restore old handler }
67
set_pm_interrupt(int1c, oldint1c);
b'\\ No newline at end of file'