]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DOS/SRVCALL.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DOS / SRVCALL.ASM
1 ; SCCSID = @(#)srvcall.asm 1.4 85/08/02
2 TITLE SRVCALL - Server DOS call
3 NAME SRVCALL
4 ;
5 ; Server DOS call functions
6 ;
7 ;
8 ; $ServerCall
9 ;
10 ; Modification history:
11 ;
12 ; Created: ARR 08 August 1983
13 ;
14
15 .xlist
16 ;
17 ; get the appropriate segment definitions
18 ;
19 include dosseg.asm
20
21 CODE SEGMENT BYTE PUBLIC 'CODE'
22 ASSUME SS:DOSGROUP,CS:DOSGROUP
23
24 .xcref
25 INCLUDE DOSSYM.INC
26 INCLUDE DEVSYM.INC
27 .cref
28 .list
29
30 AsmVars <Installed>
31
32 include dpl.asm
33
34 Installed = TRUE
35
36 i_need USER_ID,WORD
37 i_need PROC_ID,WORD
38 i_need SaveBX,WORD
39 i_need SaveDS,WORD
40 i_need SWAP_START,BYTE
41 i_need SWAP_ALWAYS,BYTE
42 i_need SWAP_END,BYTE
43 I_Need ThisSFT,DWORD
44 I_need fSharing,BYTE
45 i_need OpenBuf,128
46 I_Need ExtErr,WORD
47 I_Need ExtErr_Action,BYTE
48 I_Need ExtErrPt,DWORD
49 I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus
50 i_need JShare,DWORD
51 i_need SWAP_AREA_TABLE,BYTE
52 i_need SWAP_ALWAYS_AREA,DWORD
53 i_need SWAP_ALWAYS_AREA_LEN,WORD
54 i_need SWAP_AREA_LEN,WORD
55
56 BREAK <ServerCall -- Server DOS call>
57
58 TABLE SEGMENT
59 Public SRVC001S,SRVC001E
60 SRVC001S label byte
61
62 ServerTab DW DOSGroup:Server_Disp
63 SERVERLEAVE DW DOSGROUP:ServerReturn
64 SERVER_DISP DB (SERVER_DISP_END-SERVER_DISP-1)/2
65 DW OFFSET DOSGROUP:SRV_CALL ; 0
66 DW OFFSET DOSGROUP:COMMIT_ALL ; 1
67 DW OFFSET DOSGROUP:CLOSE_NAME ; 2
68 DW OFFSET DOSGROUP:CLOSE_UID ; 3
69 DW OFFSET DOSGROUP:CLOSE_UID_PID ; 4
70 DW OFFSET DOSGROUP:GET_LIST ; 5
71 DW OFFSET DOSGROUP:GET_DOS_DATA ; 6
72 DW OFFSET DOSGROUP:SPOOL_OPER ; 7
73 DW OFFSET DOSGROUP:SPOOL_OPER ; 8
74 DW OFFSET DOSGROUP:SPOOL_OPER ; 9
75 DW OFFSET DOSGroup:$setExtendedError ; 10
76 SERVER_DISP_END LABEL BYTE
77
78 SRVC001E label byte
79
80 TABLE ENDS
81
82 ; Inputs:
83 ; DS:DX -> DPL (except calls 7,8,9)
84 ; Function:
85 ; AL=0 Server DOS call
86 ; AL=1 Commit All files
87 ; AL=2 Close file by name (SHARING LOADED ONLY) DS:DX in DPL -> name
88 ; AL=3 Close all files for DPL_UID
89 ; AL=4 Close all files for DPL_UID/PID_PID
90 ; AL=5 Get open file list entry
91 ; IN: BX File Index
92 ; CX User Index
93 ; OUT:ES:DI -> Name
94 ; BX = UID
95 ; CX = # locked blocks held by this UID
96 ; AL=6 Get DOS data area
97 ; OUT: DS:SI -> Start
98 ; CX size in bytes of swap if indos
99 ; DX size in bytes of swap always
100 ; AL=7 Get truncate flag
101 ; AL=8 Set truncate flag
102 ; AL=9 Close all spool files
103 ; AL=10 SetExtendedError
104 ; AL=11 DOS4.00 Get DOS data area
105 ; DS:SI -> swap table
106
107 procedure $ServerCall,NEAR
108 ASSUME DS:NOTHING,ES:NOTHING
109 CMP AL,7
110 JB SET_STUFF
111 CMP AL,9
112 JBE NO_SET_ID ; No DPL on calls 7,8,9
113 CMP AL,11 ;IFS. ;AN000;
114 JNZ SET_STUFF ;IFS. ;AN000;
115 MOV DI,OFFSET DOSGROUP:SWAP_AREA_TABLE ;IFS. ;AN000;
116 PUSH SS ;IFS. ;AN000;
117 POP ES ;IFS. ;AN000;
118 invoke GET_USER_STACK ;IFS. ;AN000;
119 MOV [SI.user_DS],ES ;IFS. ds:si -> swap tab ;AN000;
120 MOV [SI.user_SI],DI ;IFS. ;AN000;
121 transfer SYS_RET_OK ;IFS. ;AN000;
122 SET_STUFF:
123 MOV SI,DX ; Point to DPL with DS:SI
124 MOV BX,[SI.DPL_UID]
125 MOV [USER_ID],BX ; Set UID
126 MOV BX,[SI.DPL_PID]
127 MOV [PROC_ID],BX ; Set process ID
128 NO_SET_ID:
129 PUSH SERVERLEAVE ; push return address
130 PUSH ServerTab ; push table address
131 PUSH AX
132 Invoke TableDispatch
133 MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus
134 error error_invalid_function
135 ServerReturn:
136 return
137
138 ; Commit - iterate through the open file list and make sure that the
139 ; directory entries are correctly updated.
140
141 COMMIT_ALL:
142 ASSUME DS:NOTHING,ES:NOTHING
143 XOR BX,BX ; for (i=0; ThisSFT=getSFT(i); i++)
144 Context DS
145 EnterCrit critSFT ; Gonna scan SFT cache, lock it down
146 CommitLoop:
147 SaveReg <BX>
148 Invoke SFFromSFN
149 JC CommitDone
150 CMP ES:[DI].sf_Ref_Count,0 ; if (ThisSFT->refcount != 0)
151 JZ CommitNext
152 CMP ES:[DI].sf_Ref_Count,sf_busy ; BUSY SFTs have god knows what
153 JZ CommitNext ; in them.
154 ; TEST ES:[DI].sf_flags,sf_isnet
155 invoke Test_IFS_Remote ;IFS. ;AN000;
156 JNZ CommitNext ; Skip Network SFTs so the SERVER
157 ; doesn't deadlock
158 MOV WORD PTR ThisSFT,DI
159 MOV WORD PTR ThisSFT+2,ES
160 Invoke DOS_Commit ; DOSCommit ();
161 CommitNext:
162 RestoreReg <BX>
163 INC BX
164 JMP CommitLoop
165 CommitDone:
166 LeaveCrit critSFT
167 RestoreReg <BX>
168 transfer Sys_Ret_OK
169
170 CLOSE_NAME:
171 ASSUME DS:NOTHING,ES:NOTHING
172
173 if installed
174 Call JShare + 5 * 4
175 else
176 Call MFTcloN
177 endif
178 CheckReturns:
179 JC func_err
180 transfer SYS_RET_OK
181 func_err:
182 transfer SYS_RET_ERR
183
184 CLOSE_UID:
185 ASSUME DS:NOTHING,ES:NOTHING
186
187 if installed
188 Call JShare + 3 * 4
189 else
190 Call MFTclU
191 endif
192 JMP CheckReturns
193
194 CLOSE_UID_PID:
195 ASSUME DS:NOTHING,ES:NOTHING
196
197 if installed
198 Call JShare + 4 * 4
199 else
200 Call MFTCloseP
201 endif
202 JMP CheckReturns
203
204 GET_LIST:
205 ASSUME DS:NOTHING,ES:NOTHING
206 if installed
207 Call JShare + 9 * 4
208 else
209 Call MFT_get
210 endif
211 JC func_err
212 invoke get_user_stack
213 MOV [SI.user_BX],BX
214 MOV [SI.user_DI],DI
215 MOV [SI.user_ES],ES
216 SetCXOK:
217 MOV [SI.user_CX],CX
218 transfer SYS_RET_OK
219
220 SRV_CALL:
221 ASSUME DS:NOTHING,ES:NOTHING
222 POP AX ; get rid of call to $srvcall
223 SaveReg <DS,SI>
224 invoke GET_USER_STACK
225 RestoreReg <DI,ES>
226 ;
227 ; DS:SI point to stack
228 ; ES:DI point to DPL
229 ;
230 invoke XCHGP
231 ;
232 ; DS:SI point to DPL
233 ; ES:DI point to stack
234 ;
235 ; We now copy the registers from DPL to save stack
236 ;
237 SaveReg <SI>
238 MOV CX,6
239 REP MOVSW ; Put in AX,BX,CX,DX,SI,DI
240 INC DI
241 INC DI ; Skip user_BP
242 MOVSW ; DS
243 MOVSW ; ES
244 RestoreReg <SI> ; DS:SI -> DPL
245 MOV AX,[SI.DPL_AX]
246 MOV BX,[SI.DPL_BX]
247 MOV CX,[SI.DPL_CX]
248 MOV DX,[SI.DPL_DX]
249 MOV DI,[SI.DPL_DI]
250 MOV ES,[SI.DPL_ES]
251 PUSH [SI.DPL_SI]
252 MOV DS,[SI.DPL_DS]
253 POP SI
254 MOV [SaveDS],DS
255 MOV [SaveBX],BX
256 MOV fSharing,-1 ; set no redirect flag
257 transfer REDISP
258
259 GET_DOS_DATA:
260 ASSUME DS:NOTHING,ES:NOTHING
261 LES DI,[SWAP_ALWAYS_AREA] ;IFS. get beginning addr of swap ;AC000;
262 MOV DX,[SWAP_ALWAYS_AREA_LEN] ;IFS. get swap always area len ;AC000;
263 AND DX,7FFFH ;IFS. clear high bit ;AC000;
264 MOV CX,[SWAP_AREA_LEN] ;IFS. get swap len ;AC000;
265 invoke GET_USER_STACK
266 MOV [SI.user_DS],ES ; set user regs
267 MOV [SI.user_SI],DI ;
268 MOV [SI.user_DX],DX ;
269 JMP SetCXOK ; ;AN000;
270
271 SPOOL_OPER:
272 ASSUME DS:NOTHING,ES:NOTHING
273 CallInstall NETSpoolOper,multNet,37,AX,BX
274 JC func_err2
275 transfer SYS_RET_OK
276 func_err2:
277 transfer SYS_RET_ERR
278
279 Break <$SetExtendedError - set extended error for later retrieval>
280
281 ;
282 ; $SetExtendedError takes extended error information and loads it up for the
283 ; next extended error call. This is used by interrupt-level proccessors to
284 ; mask their actions.
285 ;
286 ; Inputs: DS:SI points to DPL which contains all registers
287 ; Outputs: none
288 ;
289
290 $SetExtendedError:
291 ASSUME DS:NOTHING,ES:NOTHING
292 MOV AX,[SI].dpl_AX
293 MOV [EXTERR],AX
294 MOV AX,[SI].dpL_di
295 MOV WORD PTR ExtErrPt,AX
296 MOV AX,[SI].dpL_ES
297 MOV WORD PTR ExtErrPt+2,AX
298 MOV AX,[SI].dpL_BX
299 MOV WORD PTR [EXTERR_ACTION],AX
300 MOV AX,[SI].dpL_CX
301 MOV [EXTERR_LOCUS],AH
302 return
303 EndProc $ServerCall
304
305 CODE ENDS
306 END