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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
; SCCSID = @(#)srvcall.asm 1.4 85/08/02
TITLE SRVCALL - Server DOS call
NAME SRVCALL
;
; Server DOS call functions
;
;
; $ServerCall
;
; Modification history:
;
; Created: ARR 08 August 1983
;
.xlist
;
; get the appropriate segment definitions
;
include dosseg.asm
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME SS:DOSGROUP,CS:DOSGROUP
.xcref
INCLUDE DOSSYM.INC
INCLUDE DEVSYM.INC
.cref
.list
AsmVars <Installed>
include dpl.asm
Installed = TRUE
i_need USER_ID,WORD
i_need PROC_ID,WORD
i_need SaveBX,WORD
i_need SaveDS,WORD
i_need SWAP_START,BYTE
i_need SWAP_ALWAYS,BYTE
i_need SWAP_END,BYTE
I_Need ThisSFT,DWORD
I_need fSharing,BYTE
i_need OpenBuf,128
I_Need ExtErr,WORD
I_Need ExtErr_Action,BYTE
I_Need ExtErrPt,DWORD
I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus
i_need JShare,DWORD
i_need SWAP_AREA_TABLE,BYTE
i_need SWAP_ALWAYS_AREA,DWORD
i_need SWAP_ALWAYS_AREA_LEN,WORD
i_need SWAP_AREA_LEN,WORD
BREAK <ServerCall -- Server DOS call>
TABLE SEGMENT
Public SRVC001S,SRVC001E
SRVC001S label byte
ServerTab DW DOSGroup:Server_Disp
SERVERLEAVE DW DOSGROUP:ServerReturn
SERVER_DISP DB (SERVER_DISP_END-SERVER_DISP-1)/2
DW OFFSET DOSGROUP:SRV_CALL ; 0
DW OFFSET DOSGROUP:COMMIT_ALL ; 1
DW OFFSET DOSGROUP:CLOSE_NAME ; 2
DW OFFSET DOSGROUP:CLOSE_UID ; 3
DW OFFSET DOSGROUP:CLOSE_UID_PID ; 4
DW OFFSET DOSGROUP:GET_LIST ; 5
DW OFFSET DOSGROUP:GET_DOS_DATA ; 6
DW OFFSET DOSGROUP:SPOOL_OPER ; 7
DW OFFSET DOSGROUP:SPOOL_OPER ; 8
DW OFFSET DOSGROUP:SPOOL_OPER ; 9
DW OFFSET DOSGroup:$setExtendedError ; 10
SERVER_DISP_END LABEL BYTE
SRVC001E label byte
TABLE ENDS
; Inputs:
; DS:DX -> DPL (except calls 7,8,9)
; Function:
; AL=0 Server DOS call
; AL=1 Commit All files
; AL=2 Close file by name (SHARING LOADED ONLY) DS:DX in DPL -> name
; AL=3 Close all files for DPL_UID
; AL=4 Close all files for DPL_UID/PID_PID
; AL=5 Get open file list entry
; IN: BX File Index
; CX User Index
; OUT:ES:DI -> Name
; BX = UID
; CX = # locked blocks held by this UID
; AL=6 Get DOS data area
; OUT: DS:SI -> Start
; CX size in bytes of swap if indos
; DX size in bytes of swap always
; AL=7 Get truncate flag
; AL=8 Set truncate flag
; AL=9 Close all spool files
; AL=10 SetExtendedError
; AL=11 DOS4.00 Get DOS data area
; DS:SI -> swap table
procedure $ServerCall,NEAR
ASSUME DS:NOTHING,ES:NOTHING
CMP AL,7
JB SET_STUFF
CMP AL,9
JBE NO_SET_ID ; No DPL on calls 7,8,9
CMP AL,11 ;IFS. ;AN000;
JNZ SET_STUFF ;IFS. ;AN000;
MOV DI,OFFSET DOSGROUP:SWAP_AREA_TABLE ;IFS. ;AN000;
PUSH SS ;IFS. ;AN000;
POP ES ;IFS. ;AN000;
invoke GET_USER_STACK ;IFS. ;AN000;
MOV [SI.user_DS],ES ;IFS. ds:si -> swap tab ;AN000;
MOV [SI.user_SI],DI ;IFS. ;AN000;
transfer SYS_RET_OK ;IFS. ;AN000;
SET_STUFF:
MOV SI,DX ; Point to DPL with DS:SI
MOV BX,[SI.DPL_UID]
MOV [USER_ID],BX ; Set UID
MOV BX,[SI.DPL_PID]
MOV [PROC_ID],BX ; Set process ID
NO_SET_ID:
PUSH SERVERLEAVE ; push return address
PUSH ServerTab ; push table address
PUSH AX
Invoke TableDispatch
MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus
error error_invalid_function
ServerReturn:
return
; Commit - iterate through the open file list and make sure that the
; directory entries are correctly updated.
COMMIT_ALL:
ASSUME DS:NOTHING,ES:NOTHING
XOR BX,BX ; for (i=0; ThisSFT=getSFT(i); i++)
Context DS
EnterCrit critSFT ; Gonna scan SFT cache, lock it down
CommitLoop:
SaveReg <BX>
Invoke SFFromSFN
JC CommitDone
CMP ES:[DI].sf_Ref_Count,0 ; if (ThisSFT->refcount != 0)
JZ CommitNext
CMP ES:[DI].sf_Ref_Count,sf_busy ; BUSY SFTs have god knows what
JZ CommitNext ; in them.
; TEST ES:[DI].sf_flags,sf_isnet
invoke Test_IFS_Remote ;IFS. ;AN000;
JNZ CommitNext ; Skip Network SFTs so the SERVER
; doesn't deadlock
MOV WORD PTR ThisSFT,DI
MOV WORD PTR ThisSFT+2,ES
Invoke DOS_Commit ; DOSCommit ();
CommitNext:
RestoreReg <BX>
INC BX
JMP CommitLoop
CommitDone:
LeaveCrit critSFT
RestoreReg <BX>
transfer Sys_Ret_OK
CLOSE_NAME:
ASSUME DS:NOTHING,ES:NOTHING
if installed
Call JShare + 5 * 4
else
Call MFTcloN
endif
CheckReturns:
JC func_err
transfer SYS_RET_OK
func_err:
transfer SYS_RET_ERR
CLOSE_UID:
ASSUME DS:NOTHING,ES:NOTHING
if installed
Call JShare + 3 * 4
else
Call MFTclU
endif
JMP CheckReturns
CLOSE_UID_PID:
ASSUME DS:NOTHING,ES:NOTHING
if installed
Call JShare + 4 * 4
else
Call MFTCloseP
endif
JMP CheckReturns
GET_LIST:
ASSUME DS:NOTHING,ES:NOTHING
if installed
Call JShare + 9 * 4
else
Call MFT_get
endif
JC func_err
invoke get_user_stack
MOV [SI.user_BX],BX
MOV [SI.user_DI],DI
MOV [SI.user_ES],ES
SetCXOK:
MOV [SI.user_CX],CX
transfer SYS_RET_OK
SRV_CALL:
ASSUME DS:NOTHING,ES:NOTHING
POP AX ; get rid of call to $srvcall
SaveReg <DS,SI>
invoke GET_USER_STACK
RestoreReg <DI,ES>
;
; DS:SI point to stack
; ES:DI point to DPL
;
invoke XCHGP
;
; DS:SI point to DPL
; ES:DI point to stack
;
; We now copy the registers from DPL to save stack
;
SaveReg <SI>
MOV CX,6
REP MOVSW ; Put in AX,BX,CX,DX,SI,DI
INC DI
INC DI ; Skip user_BP
MOVSW ; DS
MOVSW ; ES
RestoreReg <SI> ; DS:SI -> DPL
MOV AX,[SI.DPL_AX]
MOV BX,[SI.DPL_BX]
MOV CX,[SI.DPL_CX]
MOV DX,[SI.DPL_DX]
MOV DI,[SI.DPL_DI]
MOV ES,[SI.DPL_ES]
PUSH [SI.DPL_SI]
MOV DS,[SI.DPL_DS]
POP SI
MOV [SaveDS],DS
MOV [SaveBX],BX
MOV fSharing,-1 ; set no redirect flag
transfer REDISP
GET_DOS_DATA:
ASSUME DS:NOTHING,ES:NOTHING
LES DI,[SWAP_ALWAYS_AREA] ;IFS. get beginning addr of swap ;AC000;
MOV DX,[SWAP_ALWAYS_AREA_LEN] ;IFS. get swap always area len ;AC000;
AND DX,7FFFH ;IFS. clear high bit ;AC000;
MOV CX,[SWAP_AREA_LEN] ;IFS. get swap len ;AC000;
invoke GET_USER_STACK
MOV [SI.user_DS],ES ; set user regs
MOV [SI.user_SI],DI ;
MOV [SI.user_DX],DX ;
JMP SetCXOK ; ;AN000;
SPOOL_OPER:
ASSUME DS:NOTHING,ES:NOTHING
CallInstall NETSpoolOper,multNet,37,AX,BX
JC func_err2
transfer SYS_RET_OK
func_err2:
transfer SYS_RET_ERR
Break <$SetExtendedError - set extended error for later retrieval>
;
; $SetExtendedError takes extended error information and loads it up for the
; next extended error call. This is used by interrupt-level proccessors to
; mask their actions.
;
; Inputs: DS:SI points to DPL which contains all registers
; Outputs: none
;
$SetExtendedError:
ASSUME DS:NOTHING,ES:NOTHING
MOV AX,[SI].dpl_AX
MOV [EXTERR],AX
MOV AX,[SI].dpL_di
MOV WORD PTR ExtErrPt,AX
MOV AX,[SI].dpL_ES
MOV WORD PTR ExtErrPt+2,AX
MOV AX,[SI].dpL_BX
MOV WORD PTR [EXTERR_ACTION],AX
MOV AX,[SI].dpL_CX
MOV [EXTERR_LOCUS],AH
return
EndProc $ServerCall
CODE ENDS
END
|