1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
page 80,132
title CP/DOS DosSetSigHandler mapper
include msc.inc
dosxxx segment byte public 'dos'
assume cs:dosxxx,ds:nothing,es:nothing,ss:nothing
;**********************************************************************
;*
;* MODULE: dossetsighandler
;*
;* FILE NAME: dos007.asm
;*
;* CALLING SEQUENCE:
;*
;* push word file handle
;* push dword distance
;* push word move type
;* push@ dword new pointer
;* call doschgfileptr
;*
;* MODULES CALLED: PC-DOS Int 21h, ah=42h
;*
;*********************************************************************
public dossetsighandler
.sall
.xlist
include macros.inc
.list
str struc
old_bp dw ?
return dd ?
Signumber dw ? ; signal number
Action dw ? ; action code
Prevaction dd ? ; previous action code
Prevadrs dd ? ; previous vector address
Routineadrs dd ? ; interrupt handler address
str ends
; While we hate to do this, we have to. The following data areas are
; expected to be in the CODE segment.
NextControlBreakHandler label dword
NextControlBreakHandlerOffset dw DummyControlBreakHandler
NextControlBreakHandlerSegment dw dosxxx
NextCriticalErrorHandler label dword
NextCriticalErrorHandlerOffset dw DummyCriticalErrorHandler
NextCriticalErrorHandlerSegment dw dosxxx
dossetsighandler proc far
Enter dossetsighandler ; push registers
mov ax,[bp].action ; get action code
cmp ax,2 ; action code 2 ??
je continue1 ; branch if true
mov ax,1 ; else, set error code
jmp exit ; return
continue1:
mov ax,[bp].signumber ; get signel number
cmp ax,1 ; signal 1 (cntrl chara) ??
je cntrlc ; jump if true
cmp ax,4 ; signal 4 (cntrl chara) ??
je cntrlc ; jump if true
mov ax,2 ; else, set error code
jmp exit ; return
cntrlc: mov ax,03523h
int 21h ; get old vector address
lds si,[bp].prevadrs ; previous handler pointer
mov word ptr [si],bx ; save it in prevsdrs
mov word ptr [si]+2,es
lds dx,[bp].routineadrs ; get address of signal handler
mov NextControlBreakHandlerOffset,dx ; save it
mov NextControlBreakHandlerSegment,ds
mov dx,cs
mov ds,dx
mov dx,offset RealControlBreakHandler
mov ax,02523H
int 21h ; set signal handler addrs in vector
sub ax,ax ; set good return code
exit: mexit ; pop registers
ret size str - 6 ; return
dossetsighandler endp
page
;------------------------------------------------------------------------------
; This routine will get control on control break, and it will make
; sure that the environment is acceptable prior to calling the new
; handler. NOTE: we expect the new handler to be written in MicroSoft 'C'
RealControlBreakHandler proc far
push ds
push es
push di
push si
push bp
push dx
push cx
push bx
push ax
; reestablish the es and ds segment registers before going to 'C'
mov ax,seg DGroup
mov ds,ax
mov es,ax
call NextControlBreakHandler
pop ax
pop bx
pop cx
pop dx
pop bp
pop si
pop di
pop es
pop ds
iret
RealControlBreakHandler endp
page
;------------------------------------------------------------------------------
; This routine will get control on the control break, and it will make
; sure that the environment is acceptable prior to calling the new
; handler. NOTE: we expect the new handler to be written in MicroSoft 'C'
RealCriticalErrorHandler proc far
push ds
push es
push di
push si
push bp
push dx
push cx
push bx
push ax
; reestablish the es and ds segment registers before going to 'C'
mov ax,seg DGroup
mov ds,ax
mov es,ax
call NextControlBreakHandler
pop ax
pop bx
pop cx
pop dx
pop bp
pop si
pop di
pop es
pop ds
iret
RealCriticalErrorHandler endp
page
;------------------------------------------------------------------------------
DummyControlBreakHandler proc far
iret
DummyControlBreakHandler endp
DummyCriticalErrorHandler proc far
iret
DummyCriticalErrorHandler endp
dosxxx ends
end
|