1 ; SCCSID = @(#)srvcall.asm 1.4 85/08/02
2 TITLE SRVCALL
- Server DOS
call
5 ; Server DOS call functions
10 ; Modification history:
12 ; Created: ARR 08 August 1983
17 ; get the appropriate segment definitions
21 CODE SEGMENT BYTE PUBLIC 'CODE'
22 ASSUME
SS:DOSGROUP
,CS:DOSGROUP
40 i_need SWAP_START
,BYTE
41 i_need SWAP_ALWAYS
,BYTE
47 I_Need ExtErr_Action
,BYTE
49 I_Need EXTERR_LOCUS
,BYTE ; Extended Error Locus
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
56 BREAK <ServerCall
-- Server DOS
call>
59 Public SRVC001S
,SRVC001E
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
83 ; DS:DX -> DPL (except calls 7,8,9)
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
95 ; CX = # locked blocks held by this UID
96 ; AL=6 Get DOS data area
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
107 procedure $ServerCall
,NEAR
108 ASSUME
DS:NOTHING
,ES:NOTHING
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;
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;
123 MOV SI,DX ; Point to DPL with DS:SI
125 MOV [USER_ID
],BX ; Set UID
127 MOV [PROC_ID
],BX ; Set process ID
129 PUSH SERVERLEAVE
; push return address
130 PUSH ServerTab
; push table address
133 MOV EXTERR_LOCUS
,errLoc_Unk
; Extended Error Locus
134 error error_invalid_function
138 ; Commit - iterate through the open file list and make sure that the
139 ; directory entries are correctly updated.
142 ASSUME
DS:NOTHING
,ES:NOTHING
143 XOR BX,BX ; for (i=0; ThisSFT=getSFT(i); i++)
145 EnterCrit critSFT
; Gonna scan SFT cache, lock it down
150 CMP ES:[DI].sf_Ref_Count
,0 ; if (ThisSFT->refcount != 0)
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
158 MOV WORD PTR ThisSFT
,DI
159 MOV WORD PTR ThisSFT
+2,ES
160 Invoke DOS_Commit
; DOSCommit ();
171 ASSUME
DS:NOTHING
,ES:NOTHING
185 ASSUME
DS:NOTHING
,ES:NOTHING
195 ASSUME
DS:NOTHING
,ES:NOTHING
205 ASSUME
DS:NOTHING
,ES:NOTHING
212 invoke get_user_stack
221 ASSUME
DS:NOTHING
,ES:NOTHING
222 POP AX ; get rid of call to $srvcall
224 invoke GET_USER_STACK
227 ; DS:SI point to stack
233 ; ES:DI point to stack
235 ; We now copy the registers from DPL to save stack
239 REP MOVSW ; Put in AX,BX,CX,DX,SI,DI
241 INC DI ; Skip user_BP
244 RestoreReg
<SI> ; DS:SI -> DPL
256 MOV fSharing
,-1 ; set no redirect flag
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;
272 ASSUME
DS:NOTHING
,ES:NOTHING
273 CallInstall NETSpoolOper
,multNet
,37,AX,BX
279 Break <$SetExtendedError
- set extended error for later retrieval
>
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.
286 ; Inputs: DS:SI points to DPL which contains all registers
291 ASSUME
DS:NOTHING
,ES:NOTHING
295 MOV WORD PTR ExtErrPt
,AX
297 MOV WORD PTR ExtErrPt
+2,AX
299 MOV WORD PTR [EXTERR_ACTION
],AX
301 MOV [EXTERR_LOCUS
],AH