]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / IFSFUNC / IFSUTIL.ASM
1 PAGE ,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsutil.asm 1.0 87/05/05 ;AN000;
3 TITLE IFSFUNC UTILITY ROUTINES - Routines for IFSFUNC ;AN000;
4 NAME IFSUTIL ;AN000;
5 ;************************************************************************************ ;AN000;
6 ; ;AN000;
7 ; Miscellaneous routines ;AN000;
8 ; ;AN000;
9 ; IFSFlushBuf ;AN000;
10 ; IFS_UPDATE_CB (Part II) ;AN000;
11 ; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000;
12 ; SERVER_IFSFUNC_DATA_AREA ;AN000;
13 ; DRIVE_FROM_CDS ;AN000;
14 ; DRIVE_FROM_SFT ;AN000;
15 ; PREP_IFSR ;AN000;
16 ; CALL_IFS ;AN000;
17 ; CREATE_DFL_ENTRY ;AN000;
18 ;;;alias ENTER_NAMES_LIST ;AN000;
19 ; DELETE_DFL_ENTRY ;AN000;
20 ;;;alias EXIT_NAMES_LIST ;AN000;
21 ; DFL_MATCH ;AN000;
22 ; DFL_SINGLE_FILE_CHECK ;AN000;
23 ;;;alias PROCESS_ALIAS ;AN000;
24 ; CDS_TO_CD ;AN000;
25 ; CD_TO_CDS ;AN000;
26 ; DFL_TO_DF ;AN000;
27 ; DF_TO_DFL ;AN000;
28 ; SFT_TO_SFF ;AN000;
29 ; SF_TO_SFT ;AN000;
30 ; XCHGP ;AN000;
31 ; CONSIST_SFT ;AN000;
32 ; CONSIST_DFL ;AN000;
33 ; PRN_CHECK ;AN000;
34 ; IFSDrvFromCDS ;AN000;
35 ; SET_THISIFS_UNC ;AN000;
36 ; SET_CATEGORY ;AN000;
37 ; SET_DEPIOCTL_IFSR ;AN000;
38 ; GET_UNC_FS_NAME
39 ; MOVE_DRIVER_NAME ;AN000;
40 ; CONVERT_NAME_ASCIIZ ;AN000;
41 ; CHECK_SEQ ;AN000;
42 ; CHECK_REAL_DEVICE ;AN000;
43 ; NET_TRANS ;AN000;
44 ; STRIP_WFP_START
45 ; CHECK_IFS_ATTRIBUTE
46 ; CHECK_IFS_SUPPORT
47 ; ;AN000;
48 ; REVISION HISTORY: ;AN000;
49 ; A000 Original version 4.00 May 1987 ;AN000;
50 ; A001 P453 - Correct $NameTrans processing on connect part of string ;AN000;
51 ; RGazzia Aug 25,1987
52 ; A002 D158 - merge redir info into attach stuff 8/87 RGazzia
53 ; A003 P635 - read problem - sff-to-sft problem 8/87 RGazzia
54 ; A004 P764 - printer attach problem 8/87 RGazzia
55 ; A005 P845 - Disk reset infinitely calls 8/87 RGazzia
56 ; A006 P868 - Lock problems 8/87 RGazzia
57 ; A007 P849 - Printer open problems 8/87 RGazzia
58 ; A008 P2307- Critical error problems 11/87 RGazzia
59 ; A009 P2364- Chkdsk fails if afs loaded 11/87 RGazzia
60 ; due to losing cx in flush buf loop
61 ; A010 P2385- check for ifs support of multifile/device fcns 11/87 RGazzia
62 ; A011 P2827- ifs driver error mapping 12/87 RGazzia
63 ; A012 P3225- prn to lpt1 problems 1/88 RGazzia
64 ; A013 P3251- Net trans buffer problems 1/88 RGazzia
65 ; A014 P3692- detach of attached ptr problem 3/88 RGazzia
66 ; A015 P3745- commit problem due to sft flags problem 3/88 RGazzia
67 ; A016 P3810- new sff field - sft entry id 3/88 RGazzia
68 ; A017 P3680- sft changes 3/88 RGazzia
69 ; A018 P3883- Share violation problems 3/16/88 RMG
70 ; A019 P3971- pause problems 3/24/88 RMG
71 ; A020 P4055 Make sure THISDFL reset to null 3/30/88 RMG
72 ; A021 P4172 share violation fail - wrong dos extended error 4/08/88 RMG
73 ; A022 P4188 names=0 problems 4/08/88 RMG
74 ; A023 P4227 Austin garbage attach problem 4/11/88 RMG
75 ; A024 P4392 Yet another sft change 4/18/88 RMG
76 ; A025 P4751 retry logic fix 5/05/88 RMG
77 ; A026 P4802 NET821 retry hang/ fail hang 5/10/88 RMG
78 ; A027 P4839 ctrl-prtsc problems (consist_sft) 5/13/88 RMG
79 ; A028 P4863 criter/parms problem 5/14/88 RMG
80 ; A029 P4968 I24 DI not set right 5/25/88 RMG
81 ; A030 P5004 Cap of device name corrupted 6/01/88 RMG
82 ; A031 P5006 ctrl prtsc problems - pause back to real 6/02/88 RMG
83 ; consist_sft
84 ;
85 ; LOC - 696
86 ;************************************************************************************ ;AN000;
87 ;AN000;
88 .xlist ;AN000;
89 .xcref ;AN000;
90 INCLUDE IFSSYM.INC ;AN000;
91 INCLUDE IFSFSYM.INC ;AN000;
92 INCLUDE DOSSYM.INC ;AN000;
93 INCLUDE DEVSYM.INC ;AN000;
94 .cref ;AN000;
95 .list ;AN000;
96 ;AN000;
97 AsmVars <IBM, Installed, DEBUG> ;AN000;
98 ;AN000;
99 ; define the base code segment of the network support first ;AN000;
100 ;AN000;
101 IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
102 IFSSEG ENDS ;AN000;
103 ;AN000;
104 ; include the rest of the segment definitions for normal MSDOS ;AN000;
105 ;AN000;
106 include dosseg.asm ;AN000;
107 ;AN000;
108 DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
109 ;DOSGROUP Data ;AN000;
110 Extrn sft_addr:DWORD ;AN000;
111 Extrn sftFCB:DWORD ;AN000;
112 Extrn WFP_START:WORD ;AN000;
113 Extrn THISCDS:DWORD ;AN000;
114 Extrn THISSFT:DWORD ;AN000;
115 Extrn CDSADDR:DWORD ;AN000;
116 Extrn CDSCOUNT:BYTE ;AN000;
117 Extrn CurrentPDB:WORD ;AN000;
118 Extrn RetryCount:WORD ;AN000;
119 Extrn SysInitTable:BYTE ;AN000;
120 Extrn CurrentPDB:WORD ;AN000;
121 Extrn IFS_HEADER:DWORD ;AN000;
122 Extrn NULDEV:DWORD ;AN000;
123 Extrn SWAP_AREA_TABLE:BYTE ;AN000;
124 Extrn EXTERR:WORD ;AN011;
125 Extrn EXTERR_ACTION:BYTE ;AN011;
126 Extrn EXTERR_CLASS:BYTE ;AN011;
127 Extrn EXTERR_LOCUS:BYTE ;AN011;
128 Extrn ALLOWED:BYTE ;AN011;
129 Extrn ErrMap24End:BYTE
130 Extrn ErrMap24:BYTE
131 if debug ;AN000;
132 Extrn BugLev:WORD ;AN000;
133 Extrn BugTyp:WORD ;AN000;
134 include bugtyp.asm ;AN000;
135 endif ;AN000;
136 DATA ENDS ;AN000;
137 ;AN000;
138 ; define our own code segment ;AN000;
139 ;AN000;
140 IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
141 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
142 ;AN000;
143 ;IFS Data ;AN000;
144 Extrn IFSPROC_FLAGS:WORD ;AN000;
145 Extrn IFSFUNC_FLAGS:WORD ;AN000;
146 ;;;aliasExtrn NLAddr:DWORD ;AN000;
147 Extrn TEMPBUF:BYTE ;AN000;
148 Extrn DFLAddr:DWORD ;AN000;
149 Extrn DFLCount:BYTE ;AN000;
150 Extrn UNC_FS_HDR:DWORD ;AN000;
151 Extrn THISIFS:DWORD ;AN000;
152 Extrn THISDFL:DWORD ;AN000;
153 Extrn IFSR:WORD ;AN000;
154 Extrn CD1:WORD ;AN000;
155 Extrn DF1:WORD ;AN000;
156 Extrn SFF1:WORD ;AN000;
157 Extrn IFSDRV:BYTE ;AN000;
158 Extrn PHONEY_NAME:BYTE ;AN000;
159 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
160 Extrn SAVE_CB@:DWORD ;AN000;
161 Extrn IFSF_SWAP_START:BYTE ;AN000;
162 Extrn IFSF_SWAP_END:BYTE ;AN000;
163 ;AN000;
164 PUBLIC LPT1_NAME ;AN000;
165 LPT1_NAME DB "LPT1",0 ;AN000;
166 PRN_NAME DB "PRN",0 ;AN000;
167 ;AN000;
168 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013;
169 ; The following buffer was created 1/88 to temporarily hold canonicalized ;AN013;
170 ; path name for $Nametrans call for Redir ;AN013;
171 ; Some area of TEMPBUF should be used instead for optimized storage space but ;AN013;
172 ; I didn't have time to research the best way to use it as time was short to ;AN013;
173 ; fix ptm ;AN013;
174 ; This buffer should later be taken out when time permits to do this right ;AN013;
175 ;
176 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013;
177 NET_TRANS_BUFFER DB 128 DUP (0) ; temporary buffer used for $Nametrans ;AN013;
178 ; storage of canonicalized pathname ;AN013;
179 ;AN000;
180 BREAK <IFSFlushBuf -- Flush all Net Cache Buffers> ;AN000;
181 ;AN000;
182 ;************************************************************************************ ;AN000;
183 ; ;AN000;
184 ; IFSFlushBuf ;AN000;
185 ; ;AN000;
186 ; Called by: Dispatcher ;AN000;
187 ; ;AN000;
188 ; Routines called: CD_TO_CDS ;AN000;
189 ; CDS_TO_CD ;AN000;
190 ; CALL_IFS ;AN000;
191 ; ;AN000;
192 ; Input: AL = 0 Flush all Net buffers. ;AN000;
193 ; -1 " " " plus invalidate them. ;AN000;
194 ; ;AN000;
195 ; Function: ;AN000;
196 ; FOR I = 1 to # CDSs ;AN000;
197 ; DO ;AN000;
198 ; IF CURDIR_ISIFS = true THEN ;AN000;
199 ; DO ;AN000;
200 ; Prepare IFSRH: ;AN000;
201 ; * IFSR_LENGTH DW 40 ; Request length ;AN000;
202 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
203 ; + IFSR_RETCODE DW ? ;AN000;
204 ; + IFSR_RETCLASS DB ? ;AN000;
205 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
206 ; * IFSR_APIFUNC DB 1 ; Drive Reset ;AN000;
207 ; + IFSR_ERROR_CLASS DB ? ;AN000;
208 ; + IFSR_ERROR_ACTION DB ? ;AN000;
209 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
210 ; + IFSR_ALLOWED DB ? ;AN000;
211 ; + IFSR_I24_RETRY DB ? ;AN000;
212 ; + IFSR_I24_RESP DB ? ;AN000;
213 ; IFSR_RESV2 DB ? ;AN000;
214 ; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert ;AN000;
215 ; ; CDS to CD and set this as ;AN000;
216 ; ; pointer to it. ;AN000;
217 ; IFSR_OPEN_CB@ DD ? ;AN000;
218 ; * IFSR_FUNC DB ? ; 0 IF AL=0. 1 IF AL=-1. ;AN000;
219 ; IFSR_RESV2 DB 0 ;AN000;
220 ; ;AN000;
221 ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
222 ; ENDDO ;AN000;
223 ; ENDIF ;AN000;
224 ; ENDDO ;AN000;
225 ; ;AN000;
226 ; Output: None ;AN000;
227 ; ;AN000;
228 ; Notes: all destroyed ;AN000;
229 ; ;AN000;
230 ;************************************************************************************ ;AN000;
231 ;AN000;
232 procedure IFSFlushBuf,NEAR ;AN000;
233 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
234 ;AN000;
235 ifsr_fcn_def EXECAPI ;AN000;
236 ifsr_api_def DRIVERESET ;AN000;
237 ;AN000;
238 MOV CL,CDSCount ; CX = # CDS's ;AN000;
239 MOV DX,SIZE curdir_list ; DX = size CDS entry ;AN000;
240 LDS SI,[CDSAddr] ; Get addr 1st CDS ;AN000;
241 ;AN000;
242 IFB_20: ;AN000;
243 TEST DS:[SI.curdir_flags],curdir_isnet ;AN000;
244 JZ IFB_60 ;AN000;
245 ; Is IFS. Send drive reset request ;AN000;
246 invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000;
247 MOV ES:[BX.IFSR_LENGTH],LENGTH_DRIVERESET ;AN000;
248 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
249 MOV ES:[BX.IFSR_APIFUNC],IFSDRIVERESET ;AN000;
250 SaveReg <DS,SI> ; save cds ptr ;AN000;
251 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
252 invoke CDS_TO_CD ;AN000;
253 MOV ES:[BX.IFSR_FUNC],AL ;AN000;
254 ;AN000;
255 SaveReg <CX> ; preserve loop count
256 invoke CALL_IFS ; Call IFS ;AN000;
257 RestoreReg <CX> ; retrieve loop count
258 JNC IFB_30 ;AN000;
259 RestoreReg <SI,DS> ; restore cds ptr ;AN000;
260 JMP SHORT IFB_60 ;AN000;
261 IFB_30: ;AN000;
262 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
263 CALL CD_TO_CDS ; update CDS if retcode ok ;AN000;
264 PUSH ES ; get cds ptr into ds:si ;AN000;
265 POP DS ;AN000;
266 MOV SI,DI ;AN000;
267 ;AN000;
268 IFB_60: ;AN000;
269 ADD SI,DX ; Skip to next CDS ;AN000;
270 LOOP IFB_20 ;AN000;
271 JMP IFS_990 ;AN000;
272 ;AN000;
273 ;*********************************************************************************** ;AN000;
274 ; ifs common return area ;AN000;
275 ;*********************************************************************************** ;AN000;
276 entry IFS_980 ;AN000;
277 STC ;AN000;
278 return ;AN000;
279 entry IFS_990 ;AN000;
280 CLC ;AN000;
281 entry IFS_1000 ;AN000;
282 return ;AN000;
283 ;AN000;
284 ;AN000;
285 EndProc IFSFlushBuf ;AN000;
286 ;AN000;
287 ;AN000;
288 BREAK <IFS_UPDATE_CB Update SFT entry> ;AN000;
289 ;AN000;
290 ;****************************************************************************** ;AN000;
291 ; ;AN000;
292 ; IFS_UPDATE_CB ;AN000;
293 ; ;AN000;
294 ; Called by: IFSFUNC Dispatcher (Share) ;AN000;
295 ; ;AN000;
296 ; Routines called: ;AN000;
297 ; SFT_TO_SFF ;AN000;
298 ; SF_TO_SFT ;AN000;
299 ; CALL_IFS ;AN000;
300 ; ;AN000;
301 ; Inputs: ;AN000;
302 ; DS:SI -> SFT ;AN000;
303 ; ;AN000;
304 ; Function: ;AN000;
305 ; Prep IFSRH: ;AN000;
306 ; * IFS_LENGTH DW 28 ; Request length ;AN000;
307 ; * IFS_FUNCTION DB 6 ; Control Block Update ;AN000;
308 ; IFS_RETCODE DW ? ;AN000;
309 ; IFS_RETCLASS DB ? ;AN000;
310 ; IFS_RESV1 DB 16 DUP(0) ;AN000;
311 ; * IFS_CB@ DD ? ; Control Block Address ;AN000;
312 ; * IFS_TYPE DB ? ; Control Block Type ;AN000;
313 ; IFSOPEN EQU 0 ; Open instnce (SFT) entry ;AN000;
314 ; IFSCB EQU -1 ; See CB Type Field ;AN000;
315 ; IFS_RESV2 DB 0 ;AN000;
316 ; ;AN000;
317 ; Call IFS specified in SFT ;AN000;
318 ; ;AN000;
319 ; Outputs: ;AN000;
320 ; Carry set on error. Error code in AX. ;AN000;
321 ; ;AN000;
322 ; Regs: ;AN000;
323 ; ;AN000;
324 ; Programming notes: ;AN000;
325 ; ;AN000;
326 ;****************************************************************************** ;AN000;
327 ;AN000;
328 procedure IFS_UPDATE_CB,NEAR ;AN000;
329 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
330 ;AN000;
331 ifsr_fcn_def UPDATECB ;AN000;
332 ; Reset ifsfunc processing flags ;AN000;
333 MOV CS:IFSPROC_FLAGS,ISCTLFCN+ISSFT ; Set this so SFT_TO_SFF sets ;AN000;
334 ; ifsr_cb@ instead of ifsr_open_cb@ ;AN000;
335 ; ISSFT set so sft_to_sff sets ;AN000;
336 ; thisifs ;AN000;
337 invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000;
338 Context DS ;AN000;
339 invoke SFT_TO_SFF ; SFT: sets [THISIFS] ;AN000;
340 ; ES:BX -> IFSRH ;AN000;
341 ; IFSR_CB@ ;AN000;
342 ; ds - IFSSEG ;AN000;
343 MOV ES:[BX.IFSR_LENGTH],LENGTH_UPDATECB ; prep IFSRH ;AN000;
344 MOV ES:[BX.IFSR_FUNCTION],IFSUPDATECB ;AN000;
345 MOV ES:[BX.IFSR_TYPE],IFSOPEN ;AN000;
346 ;AN000;
347 invoke CALL_IFS ;AN000;
348 JC ifs_1000 ; cf already set ;AN000;
349 invoke SFF_TO_SFT ;AN000;
350 JMP ifs_990 ;AN000;
351 ;AN000;
352 EndProc IFS_UPDATE_CB ;AN000;
353 ;AN000;
354 ;AN000;
355 BREAK <SERVER_DOSCALL_CLOSEFILES_FOR_UID> ;AN000;
356 ;AN000;
357 ;************************************************************************************ ;AN000;
358 ; ;AN000;
359 ; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000;
360 ; ;AN000;
361 ; Called by: IFSFUNC Dispatcher ;AN000;
362 ; ;AN000;
363 ; Routines called: ;AN000;
364 ; CALL_IFS ;AN000;
365 ; ;AN000;
366 ; Inputs: ;AN000;
367 ; [CurrentPDB] set to UID of user aborting ;AN000;
368 ; Function: ;AN000;
369 ; Get address of IFS driver chain. ;AN000;
370 ; FOR I = 1 to last IFS driver ;AN000;
371 ; Send request below to IFS driver ;AN000;
372 ; ;AN000;
373 ; IFSRH: ;AN000;
374 ; * IFSR_LENGTH DW 40 ; Request length ;AN000;
375 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
376 ; IFSR_RETCODE DW ? ;AN000;
377 ; IFSR_RETCLASS DB ? ;AN000;
378 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
379 ; * IFSR_APIFUNC DB 19 ; End of Computer ID ;AN000;
380 ; IFSR_ERROR_CLASS DB ? ;AN000;
381 ; IFSR_ERROR_ACTION DB ? ;AN000;
382 ; IFSR_ERROR_LOCUS DB ? ;AN000;
383 ; + IFSR_ALLOWED DB ? ;AN000;
384 ; + IFSR_I24_RETRY DB ? ;AN000;
385 ; + IFSR_I24_RESP DB ? ;AN000;
386 ; IFSR_RESV2 DB ? ;AN000;
387 ; IFSR_DEVICE_CB@ DD ? ; CD ;AN000;
388 ; IFSR_OPEN_CB@ DD ? ;AN000;
389 ; * IFSR_UID DW ? ;AN000;
390 ; ;AN000;
391 ; Outputs: None ;AN000;
392 ; ;AN000;
393 ; Regs: All destroyed ;AN000;
394 ; ;AN000;
395 ;************************************************************************************ ;AN000;
396 ;AN000;
397 procedure SERVER_DOSCALL_CLOSEFILES_FOR_UID,NEAR ;AN000;
398 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
399 ;AN000;
400 ifsr_fcn_def EXECAPI ;AN000;
401 ifsr_api_def EOCID ;AN000;
402 ;AN000;
403 LDS SI,IFS_HEADER ; get 1st ifs driver ;AN000;
404 ASSUME DS:NOTHING ;AN000;
405 ;AN000;
406 SDC_20: ; ** Loop here on ifs drivers ;AN000;
407 MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000;
408 MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000;
409 ; Set thisifs for call_ifs ;AN000;
410 invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000;
411 MOV ES:[BX.IFSR_LENGTH],LENGTH_EOCID ;AN000;
412 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
413 MOV ES:[BX.IFSR_APIFUNC],IFSEOCID ;AN000;
414 MOV AX,[CurrentPDB] ;AN000;
415 MOV ES:[BX.IFSR_UID],AX ;AN000;
416 ;AN000;
417 SaveReg <DS,CS> ;AN000;
418 RestoreReg <DS> ;AN000;
419 ASSUME DS:IFSSEG ; ds - ifsseg ;AN000;
420 ;AN000;
421 invoke CALL_IFS ;AN000;
422 ;AN000;
423 RestoreReg <DS> ; ds - fs driver ;AN000;
424 LDS SI,[SI.IFS_NEXT] ; Do next fs driver ;AN000;
425 CMP SI,NULL_PTR ; if ptr null, no more ;AN000;
426 JNE SDC_20 ;AN000;
427 PUSH DS ;AN000;
428 POP AX ;AN000;
429 CMP AX,NULL_PTR ;AN000;
430 JNE SDC_20 ;AN000;
431 ;AN000;
432 jmp ifs_1000 ; go return ;AN000;
433 ;AN000;
434 ;AN000;
435 EndProc SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000;
436 ;AN000;
437 ;AN000;
438 BREAK <SERVER_IFSFUNC_DATA_AREA - IFSFUNC swappable data area> ;AN000;
439 ;AN000;
440 ;************************************************************************************ ;AN000;
441 ; ;AN000;
442 ; SERVER_IFSFUNC_DATA_AREA ;AN000;
443 ; ;AN000;
444 ; Called by: Dispatcher ;AN000;
445 ; ;AN000;
446 ; Routines called: None ;AN000;
447 ; ;AN000;
448 ; Inputs: ;AN000;
449 ; DS - DOSGroup ;AN000;
450 ; ;AN000;
451 ; Function: ;AN000;
452 ; Put IFSFUNC swappable data area info in ibmdos's swap_area_table
453 ; ;AN000;
454 ; Outputs: ;AN000;
455 ; swap_area_table filled in: ;AN000;
456 ; dw num areas - 3 ;AN000;
457 ; dd ibmdos swap indos area address
458 ; dw ibmdos swap indos area length
459 ; dd ibmdos swap always area address
460 ; dw ibmdos swap always area length
461 ; dd ifsfunc swap indos area address
462 ; dw ifsfunc swap indos area length
463 ; ;AN000;
464 ; Regs: All preserved
465 ; ;AN000;
466 ;************************************************************************************ ;AN000;
467 ;AN000;
468 procedure SERVER_IFSFUNC_DATA_AREA,NEAR ;AN000;
469 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
470 ;AN000;
471 SaveReg <AX,ES,DI,DS,SI,DX,CS> ;AN000;
472 RestoreReg <ES> ;AN000;
473 MOV DI,OFFSET CS:IFSF_SWAP_START ;AN000;
474 MOV DX,OFFSET CS:IFSF_SWAP_END ;AN000;
475 SUB DX,DI ;AN000;
476 LEA SI,SWAP_AREA_TABLE ; get offset address of swap area table ;AN000;
477
478 MOV WORD PTR DS:[SI],3 ; number of data areas increased from 2 to 3 ;AN000;
479 ADD SI,14 ; skip to ifsfunc area ;AN000;
480 MOV WORD PTR DS:[SI],DI ; fill in ifsfunc data area address ;AN000;
481 MOV WORD PTR DS:[SI+2],ES ;AN000;
482 MOV WORD PTR DS:[SI+4],DX ; fill in ifsfunc data area length ;AN000;
483 ;AN000;
484 RestoreReg <DX,SI,DS,DI,ES,AX> ;AN000;
485 ;AN000;
486 return ;AN000;
487 ;AN000;
488 EndProc SERVER_IFSFUNC_DATA_AREA ;AN000;
489 ;AN000;
490 ;AN000;
491 BREAK <DRIVE_FROM_XXX -- Compute a drive index from a CDS or SFT> ;AN000;
492 ;AN000;
493 procedure DRIVE_FROM_CDS,NEAR ;AN000;
494 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
495 ;************************************************************************************ ;AN000;
496 ; ;AN000;
497 ; DRIVE_FROM_CDS ;AN000;
498 ; ;AN000;
499 ; Inputs: ;AN000;
500 ; [THISCDS] Set ;AN000;
501 ; DS - DOSGROUP ;AN000;
502 ; Function: ;AN000;
503 ; Compute drive letter from THISCDS ;AN000;
504 ; Outputs: ;AN000;
505 ; [IFSDRV] = Drive # (0=A) ;AN000;
506 ; No registers Revised ;AN000;
507 ;************************************************************************************ ;AN000;
508 ;AN000;
509 PUSH BX ;AN000;
510 PUSH AX ;AN000;
511 MOV [IFSDRV],0FEH ; Default to ?, 0FEH + 'A' = '?' ;AN000;
512 MOV AX,WORD PTR [THISCDS] ;AN000;
513 CMP AX,-1 ;AN000;
514 JZ DFC_20 ;AN000;
515 CALL IFSDrvFromCDS ;AN000;
516 DFC_20: ;AN000;
517 POP AX ;AN000;
518 POP BX ;AN000;
519 jmp ifs_1000 ; go return ;AN000;
520 ;AN000;
521 EndProc DRIVE_FROM_CDS ;AN000;
522 ;AN000;
523 ;************************************************************************************ ;AN000;
524 ; ;AN000;
525 ; DRIVE_FROM_SFT ;AN000;
526 ; ;AN000;
527 ; Inputs: ;AN000;
528 ; [THISSFT] Set DS-Dosgroup ;AN000;
529 ; Function: ;AN000;
530 ; Compute drive letter from THISSFT ;AN000;
531 ; Outputs: ;AN000;
532 ; [IFSDRV] = Drive # (0=A) ;AN000;
533 ; [IFSDRV] = -1 if printer ;AN000;
534 ; PHONEY_NAME ;AN000;
535 ; No registers Revised ;AN000;
536 ;************************************************************************************ ;AN000;
537 ;AN000;
538 procedure DRIVE_FROM_SFT,NEAR ;AN000;
539 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
540 ;AN000;
541 SaveReg <DS,BX,CX> ;AC006;
542 LDS BX,[THISSFT] ;AN000;
543 TEST [BX.sf_flags],sf_net_spool ;AN000;
544 JNZ DFS_100 ;AN000;
545 MOV BL,BYTE PTR [BX.sf_flags] ;AN000;
546 AND BL,devid_file_mask_drive ;AN000;
547 CMP BL,0FEH AND devid_file_mask_drive ; UNC ???? ;AN000;
548 JNZ DFS_20 ; No ;AN000;
549 MOV BL,0FEH ; Restore lost bits if UNC ;AN000;
550 DFS_20: ;AN000;
551 MOV [IFSDRV],BL ;AN000;
552 RestoreReg <CX,BX,DS> ;AC006;
553 JMP ifs_1000 ; go return ;AN000;
554 ;AN000;
555 DFS_100: ;AN000;
556 SaveReg <ES,DI,SI> ;AN000;
557 MOV DI,OFFSET CS:[PHONEY_NAME] ; Set name for I24 handler ;AN000;
558 PUSH CS ;AN000;
559 POP ES ;AN000;
560 MOV SI,BX ;AN000;
561 ADD SI,SF_NAME ;AN000;
562 MOV CX,8 ;AC007;
563 REP MOVSB ;AN000;
564 ;AN000;
565 RestoreReg <SI,DI,ES> ;AN000;
566 MOV BL,-1 ;AN000;
567 JMP DFS_20 ;AN000;
568 ;AN000;
569 EndProc DRIVE_FROM_SFT ;AN000;
570 ;AN000;
571 ;AN000;
572 BREAK <PREP_IFSR -- zero out ifsr> ;AN000;
573 ;AN000;
574 ;************************************************************************************ ;AN000;
575 ; ;AN000;
576 ; PREP_IFSR ;AN000;
577 ; ;AN000;
578 ; Called by: all function routines ;AN000;
579 ; ;AN000;
580 ; Inputs: none ;AN000;
581 ; ;AN000;
582 ; Function: ;AN000;
583 ; set all ifsrh fields to zero ;AN000;
584 ; ;AN000;
585 ; Outputs: ;AN000;
586 ; ES:BX -> IFSRH ;AN000;
587 ; ;AN000;
588 ; Regs: all except ES,BX saved ;AN000;
589 ; ;AN000;
590 ;************************************************************************************ ;AN000;
591 ;AN000;
592 procedure PREP_IFSR,NEAR ;AN000;
593 ;AN000;
594 SaveReg <DS,DI,AX,CX> ; save regs ;AN000;
595 ;AN000;
596 SaveReg <CS,CS> ; get ds,es -> ifsseg ;AN000;
597 RestoreReg <DS,ES> ;AN000;
598 ASSUME DS:IFSSEG,ES:IFSSEG ;AN000;
599 ;AN000;
600 MOV DI,OFFSET IFSR ; es:di -> ifsrh ;AN000;
601 MOV BX,DI ; es:bx -> ifsrh ;AN000;
602 MOV CX,SIZE IFSRH /2 ;AN000;
603 XOR AX,AX ;AN000;
604 REP STOSW ; fill ifsr w/zeros ;AN000;
605 ;AN000;
606 RestoreReg <CX,AX,DI,DS> ; restore regs ;AN000;
607 ;AN000;
608 return ;AN000;
609 ;AN000;
610 EndProc PREP_IFSR ;AN000;
611 ;AN000;
612 ;AN000;
613 BREAK <CALL_IFS - call IFS Driver> ;AN000;
614 ;AN000;
615 ;************************************************************************************ ;AN000;
616 ; ;AN000;
617 ; CALL_IFS ;AN000;
618 ; ;AN000;
619 ; Called by: all function routines ;AN000;
620 ; ;AN000;
621 ; Inputs: ;AN000;
622 ; [THISIFS] set ;AN000;
623 ; ES:BX -> IFS request header ;AN000;
624 ; DS - IFSSEG ;AN000;
625 ; ;AN000;
626 ; Function: ;AN000;
627 ; Call file system function entry point ;AN000;
628 ; ;AN000;
629 ; Outputs: ;AN000;
630 ; Outputs of call ;AN000;
631 ; ;AN000;
632 ; Regs: none preserved ;AN000;
633 ; ;AN000;
634 ;************************************************************************************ ;AN000;
635 ;AN000;
636 procedure CALL_IFS,NEAR ;AN000;
637 ;AN000;
638 CALL CHECK_IFS_SUPPORT ; 1st check if this request ok for ifs ;AN010;
639 PUSH WORD PTR [THISIFS] ; save thisifs offset ;AN000;
640
641 CALL SET_CATEGORY ; do this to determine unc or ifs ;AN000;
642 OR CL,CL ; cl-1 for unc, 0 for ifs ;AN000;
643 JNZ CI_05 ;AN000;
644 invoke EcritIFS ; enter ifs critical section ;AN000;
645 JMP SHORT CI_10 ;AN000;
646 CI_05: ;AN000;
647 invoke EcritNET ; enter network critical section ;AN000;
648
649 CI_10:
650 LDS SI,[THISIFS] ; set thisifs=fs driver fcn entry pt ;AN000;
651 MOV AX,DS:[SI.IFS_CALL@] ; offset=contents of ifs_call@ ;AN000;
652 ;AN000;
653 PUSH CS ;AN000;
654 POP DS ;AN000;
655 ASSUME DS:IFSSEG ;AN000;
656 ;AN000;
657 MOV WORD PTR [THISIFS],AX ;AN000;
658 PUSH CX ; save this for later unc vs. ifs check ;AN000;
659 ;---------------------------------------------------------------------------- ;AN000;
660 CALL [THISIFS] ; call fs driver with request ;AN000;
661 ;---------------------------------------------------------------------------- ;AN000;
662 POP CX ; unc or ifs result ;AN000;
663 POP WORD PTR [THISIFS] ; restore thisifs offset ;AN000;
664
665 OR CL,CL ; again, determine whether to exit ifs ;AN000;
666 JNZ CI_15 ; or unc critical section ;AN000;
667 invoke LcritIFS ; leave ifs critical section ;AN000;
668 JMP SHORT CI_17 ;AN000;
669 CI_15: ;AN000;
670 invoke LcritNET ; leave network critical section ;AN000;
671
672 CI_17: ;AN000;
673 MOV AL,ES:[BX.IFSR_RETCLASS] ; check for error (class) ;AN000;
674 CMP AL,IFSR_NO_ERROR ; (any err must have class set) ;AN000;
675 JNE CI_20 ;AN000;
676 JMP ifs_990 ; no error, go ret no carry ;AN000;
677 ;AN000;
678 ;-----------------------------------------------; error processing ;AN000;
679 CI_20: ;AN000;
680 TEST IFSPROC_FLAGS,IsInit ; if in init code, skip error proc ;AN011;
681 JZ CI_22 ;AN011;
682 JMP ifs_980 ; init error- just go stc and quit ;AN011;
683 CI_22: ;AN011;
684 CMP AL,IFSR_INT21H_CRITER ; critical error? ;AN000;
685 JE CI_23 ;AN029;
686 JMP CI_30 ;AC029;
687 CI_23: ;AN029;
688 MOV AX,ES:[BX.IFSR_RETCODE] ; put retcode in al before condition ;AN000;
689
690
691 CMP AX,error_write_protect ;AN029;
692 JB NO_UNMAP ;AN029;
693 CMP AX,error_gen_failure ;AN029;
694 JA NO_UNMAP ;AN029;
695 SUB AX,error_write_protect ; BIAS old errors back down into 0-12 range ;AN029;
696 NO_UNMAP: ;AN029;
697 PUSH DS ;AN029;
698 Context DS ;AN029;
699 ASSUME DS:DOSGROUP ;AN029;
700 MOV DI,AX ;AN029;
701 MOV AX,OFFSET DOSGroup:ErrMap24End ;AN029;
702 SUB AX,OFFSET DOSGroup:ErrMap24 ;AN029;
703 ; ;AN029;
704 ; AX is the index of the first unavailable error. Do not translate if ;AN029;
705 ; greater or equal to AX. ;AN029;
706 ; ;AN029;
707 CMP DI,AX ;AN029;
708 MOV AX,DI ;AN029;
709 JAE NoTrans ;AN029;
710 MOV AL,ErrMap24[DI] ;AN029;
711 XOR AH,AH ;AN029;
712 NoTrans: ;AN029;
713 POP DS
714 invoke SET_EXTERR_INFO ; yes - set error info ;AN000;
715
716 CI_25: ;AN011;
717 SaveReg <DS,SI,ES,DI,CX,AX> ; temporarily save ifsr in tempbuf over ;AN008;
718 SaveReg <ES> ; next call ;AN008;
719 RestoreReg <DS> ; Set dssi -> ifsr (current esbx) ;AN008;
720 MOV SI,BX ;AN008;
721 MOV CX,36 ; half size of max ifsr ;AN008;
722 MOV DI,OFFSET TEMPBUF ; set esdi -> tempbuf ;AN008;
723 CLD ; next instr auto-increment ;AN008;
724 REP MOVSW ; copy the ifsr over (word move) ;AN008;
725 MOV AX,CS:IFSPROC_FLAGS ; preserve ifsproc_flags ;AN026;
726 STOSW ;AN026;
727 RestoreReg <AX,CX,DI,ES,SI,DS> ; restore regs ;AN008;
728
729 CMP DI,error_I24_gen_failure ;AN029;
730 JBE CI_26 ;AN029;
731 MOV DI,error_I24_gen_failure ;AN029;
732 CI_26: ;AN029;
733 SaveReg <AX> ; preserve dos ext err ;AN021;
734 invoke IFS_I24 ; do int 24h ;AN000;
735
736 SaveReg <DS,SI,ES,DI,CX,AX> ; restore original ifsr (over criter one);AN008;
737 SaveReg <CS,CS> ; set dssi -> tempbuf ;AN008;
738 RestoreReg <DS,ES> ; set esdi -> ifsr ;AN008;
739 MOV SI,OFFSET TEMPBUF ; ;AN008;
740 MOV DI,OFFSET IFSR ; ;AN008;
741 MOV CX,36 ; half size of max ifsr ;AN008;
742 CLD ; next instr auto-increment ;AN008;
743 REP MOVSW ; copy the ifsr over (word move) ;AN008;
744 LODSW ; restore ifsproc_flags ;AN026;
745 MOV CS:IFSPROC_FLAGS,AX ; ;AN026;
746 RestoreReg <AX,CX,DI,ES,SI,DS> ; restore regs ;AN008;
747
748 CMP AL,RETRY ; if retry, restart request ;AN000;
749 JE CI_27 ; else, go ret w/carry ;AC011;
750 RestoreReg <AX> ; retrieve dos ext err ;AN021;;AM025;
751 JMP ifs_980 ;AN000;
752 CI_27: ;AN011;
753 ADD SP,2 ; restore stack (dos ext error #) ;AN025;
754 JMP CI_80 ;AN011;
755 ;AN000;
756 CI_30: ; not critical error: ;AN000;
757 CMP AL,IFSR_BAD_FORMAT ; map ifsr bad format error to general ;AN011;
758 JNE CI_32 ; failure (12) critical error ;AN011;
759 MOV AL,12
760 MOV SS:[EXTERR],31 ; set dos error variables for abort ;AN011;
761 MOV SS:[EXTERR_CLASS],4 ; (Internal) ;AN011;
762 MOV SS:[EXTERR_ACTION],4 ; (Abort) ;AN011;
763 MOV SS:[EXTERR_LOCUS],1 ; (Unknown) ;AN011;
764 MOV SS:[ALLOWED],08H ; allow only fail ;AN011;
765 MOV DI,AX ;AN029;
766 JMP CI_25 ; go back & treat as critical error ;AN011;
767 CI_32: ;AN011;
768 CMP AL,IFSR_DRIVER_ERROR ;AN011;
769 JNE CI_37 ;AC011;
770 MOV AX,ES:[BX.IFSR_RETCODE] ; *** driver error class *** ;AN011;
771 CMP AX,IFSR_NO_FCN_SUPPORT ;AN011;
772 JG CI_34 ;AN011;
773 MOV AX,50 ; request not supported by file system ;AN011;
774 JMP CI_100 ;AN011;
775 CI_34: ;AN011;
776 CMP AX,IFSR_ACCESS_DENIED ;AN011;
777 JNE CI_35 ;AN011;
778 MOV AX,65 ; access denied by file system ;AN011;
779 JMP CI_100 ;AN011;
780 CI_35: ;AN011;
781 CMP AX,IFSR_DEVICE_TYPE_MISMATCH ;AN011;
782 JNE CI_36 ;AN011;
783 MOV AX,66 ; file sytem device type incorrect ;AN011;
784 JMP CI_100 ;AN011;
785 CI_36: ;AN011;
786 MOV AX,59 ; fs experienced an unexpected error ;AN011;
787 JMP CI_100 ;AN011;
788
789 CI_37: ;AN011;
790 CMP AL,IFSR_DEVICE_ERROR ; fs got device error ;AN011;
791 JNE CI_38 ;AN011;
792 MOV AX,ES:[BX.IFSR_RETCODE] ;AN011;
793 invoke DEVICE2EXTERR ; convert device - ext error ;AN011;
794 JMP CI_100 ; go set class/action/locus ;AN011;
795 CI_38: ;AN011;
796 MOV AX,ES:[BX.IFSR_RETCODE] ;AN011;
797 CMP AX,error_sharing_violation ;AN000;
798 JNZ CI_100 ;AN000;
799 ;AN000;
800 SaveReg <DS> ; save ifsseg ;AN018;
801 Context DS ; Share error ;AN000;
802 invoke PHONEY_DPB ; Set phoney NET DPB for INT 24 ;AN000;
803 CMP ES:[BX.IFSR_APIFUNC],IFSOPENFILE ; on open/create - share error,no int24 ;AN018;
804 JNE CI_39 ;AN018;
805 CallInstall SHARE_ERROR,MultDOS,11 ;AN018;
806 JMP SHORT CI_39_20 ;AN018;
807 CI_39: ;AN018;
808 CallInstall SHARE_VIOLATION,MultDOS,10 ;AN000;
809 CI_39_20: ;AN018;
810 RestoreReg <DS> ;AN018;
811 ;AN000;
812 JNC CI_40 ;AN000;
813 MOV AX,error_sharing_violation ; carry set - quit w/error ;AN000;
814 invoke SET_EXTERR_INFO ;AN000;
815 JMP ifs_980 ;AN000;
816 ;AN000;
817 CI_40: ; carry clear - retry ;AN000;
818 MOV AL,RETRY ;AN000;
819
820 CI_80: ;AN000;
821 INC ES:[BX.IFSR_I24_COUNT] ; retry: inc retry count ;AN000;
822 MOV ES:[BX.IFSR_I24_RESP],AL ; store i24 response ;AN000;
823 MOV ES:[BX.IFSR_RETCODE],0 ; reset retcode and class ;AN008;
824 MOV ES:[BX.IFSR_RETCLASS],0 ;AN008;
825 MOV ES:[BX.IFSR_ERROR_CLASS],0 ; reset retcode and class ;AN025;
826 MOV ES:[BX.IFSR_ERROR_ACTION],0 ;AN025;
827 MOV ES:[BX.IFSR_ERROR_LOCUS],0 ; reset retcode and class ;AN025;
828 MOV ES:[BX.IFSR_ALLOWED],0 ;AN025;
829 SaveReg <CS> ; restore ds-ifsseg ;AN000;
830 RestoreReg <DS> ;AN000;
831 ASSUME DS:IFSSEG ;AN000;
832 JMP CALL_IFS ;AN000;
833 ;AN000;
834 CI_100: ; non-critical error ;AN000;
835 TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret call to int 2f-5 stack ;AN028;
836 JNZ CI_120 ; not dosgroup so can't call next ;AN028;
837 CALL SET_EXTERR_INFO ; set exterr info and ;AN000;
838 CI_120: ;AN028;
839 JMP ifs_980 ; go ret w/carry ;AN000;
840 ;AN000;
841 ;AN000;
842 EndProc CALL_IFS ;AN000;
843 ;AN000;
844 ;AN000;
845 BREAK <CREATE_DFL_ENTRY - fill in DFL entry, add to names list if alias> ;AN000;
846 ;AN000;
847 ;************************************************************************************ ;AN000;
848 ; ;AN000;
849 ; CREATE_DFL_ENTRY ;AN000;
850 ; ;AN000;
851 ; Routine called by: ATTACH_START ;AN000;
852 ; PROCESS_ALIAS ;AN000;
853 ; ;AN000;
854 ; Routines called: DFL_TO_DF ;AN000;
855 ; ENTER_NAMES_LIST ;AN000;
856 ; ;AN000;
857 ; Inputs: ;AN000;
858 ; [THISIFS] set ;AN000;
859 ; BL = macro type ;AN000;
860 ; CX = user word
861 ; DS:SI -> ASCIIZ device name ;AN000;
862 ; ES:DI -> Target driver to attach to and parms. ;AN000;
863 ; DW ASCIIZ - FS name ;AN000;
864 ; DW n - number of parms ;AN000;
865 ; DB ASCIIZ,... parms ;AN000;
866 ; ;AN000;
867 ; Function: ;AN000;
868 ; WHILE DFL entries ;AN000;
869 ; IF entry not in use THEN ;AN000;
870 ; DO ;AN000;
871 ; Set in progress flag for this entry ;AN000;
872 ; DFL_TYPE = BL ;AN000;
873 ; DFL_DEV_NAME = name pointed to by DS:SI ;AN000;
874 ; DFL_USER_WORD = CX
875 ; IF alias, Call ENTER_NAMES_LIST ;AN000;
876 ; DFL_IFS_HDR = [THISIFS] ;AN000;
877 ; Set in use flag ;AN000;
878 ; Reset in progress flag ;AN000;
879 ; Set [THISDFL] ;AN000;
880 ; Call DFL_TO_DF ;AN000;
881 ; LEAVE WHILE ;AN000;
882 ; ENDDO ;AN000;
883 ; ELSE DO ;AN000;
884 ; Get next DFL entry ;AN000;
885 ; IF no entry THEN ;AN000;
886 ; Set error_out_of_structures ;AN000;
887 ; ENDIF ;AN000;
888 ; ENDDO ;AN000;
889 ; ENDWHILE ;AN000;
890 ; ;AN000;
891 ; Outputs: ;AN000;
892 ; carry clear: ;AN000;
893 ; DFL entry created. Names list addition if alias. ;AN000;
894 ; [THISDFL] set ;AN000;
895 ; DS:SI -> DFL ;AN000;
896 ; If not alias: ;AN000;
897 ; DF loaded ;AN000;
898 ; ES:BX -> IFSRH ;AN000;
899 ; IFSR_DEVICE_CB@ -> DF ;AN000;
900 ; ;AN000;
901 ; carry set on error, ax - error ;AN000;
902 ; ;AN000;
903 ; Regs: DS:SI -> DFL, all others destroyed ;AN000;
904 ;************************************************************************************ ;AN000;
905 ;AN000;
906 procedure CREATE_DFL_ENTRY,NEAR ;AN000;
907 ;AN000;
908 SaveReg <DS,SI> ; save input DS:SI (devname) ;AN000;
909 MOV DX,CX ; save user word in dx ;AN002;
910 ;AN000;
911 LDS SI,CS:[DFLAddr] ; Set DS:SI -> 1st DFL entry ;AN000;
912 MOV CL,CS:DFLCount ; CX = # DFL entries ;AN000;
913 OR CL,CL ; check for available dfl structure ;AN022;
914 JZ CDE_30
915 XOR CH,CH ;AN000;
916 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
917 ;AN000;
918 CALL CONSIST_DFL ; reset all in_prog flags ;AN000;
919 CDE_20: ;AN000;
920 TEST [SI.DFLL_FLAGS],DFL_INUSE ; look for unused DFL ;AN000;
921 JZ CDE_40 ; entry ;AN000;
922 ADD SI,SIZE DFLL_LIST ;AN000;
923 LOOP CDE_20 ;AN000;
924 CDE_30:
925 MOV AX,error_out_of_structures ;AN000;
926 RestoreReg <SI,DS> ; restore stack ;AN000;
927 JMP ifs_980 ; go return w/carry ;AN000;
928 CDE_40: ;AN000;
929 CALL INIT_DFL ; zero out dfl entry ;AN000;
930 OR [SI.DFLL_FLAGS],DFL_INPROG ; Found DFL entry - ;AN000;
931 ; Set in progress flag ;AN000;
932 MOV [SI.DFLL_TYPE],BL ; Store DFL_TYPE ;AN000;
933 MOV [SI.DFLL_USER_WORD],DX ; store user word ;AN002;
934 ;AN000;
935 RestoreReg <DI,ES> ; get dev name ptr off stack ;AN000;
936 CALL XCHGP ; Set DS:SI -> devname ;AN000;
937 PUSH DI ; ES:DI -> DFL ;AN000;
938 ; save dfl start offset ;AN000;
939 CDE_60: ;AN000;
940 INC DI ; mov di to dfl_dev_name ;AN000;
941 INC DI ;AN000;
942 MOV CX,8 ; Devs max of 8 ch and ':', and a NUL ;AN000;
943 CDE_70: ; dssi->source, esdi->dfl_dev_name ;AN000;
944 LODSB ; just store 1st 8 padded to right ;AN000;
945 CallInstall UCase,multDOS,19,<AX>,<BX> ; w/blanks ;AC030; ax chg to bx
946 OR AL,AL ; 0 . : signal end ;AN000;
947 JZ CDE_73 ;AN000;
948 CMP AL,'.' ;AN000;
949 JZ CDE_73 ;AN000;
950 CMP AL,':' ;AN000;
951 JZ CDE_73 ;AN000;
952 STOSB ;AN000;
953 LOOP CDE_70 ;AN000;
954 JMP SHORT CDE_80 ;AN000;
955 CDE_73: ;AN000;
956 MOV AL," " ;AN000;
957 CDE_76: ;AN000;
958 STOSB ;AN000;
959 LOOP CDE_76 ;AN000;
960 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
961 ;;;aliasCMP BL,TYPE_ALIAS ;AN000;
962 ;;;;;;;;JNE CDE_80 ;AN000;
963 ;;;;;;;;CALL ENTER_NAMES_LIST ; Store alias index ;AN000;
964 ;;;;;;;;JNC CDE_120 ;AN000;
965 ;;;;;;;;POP DI ; if error back out ;AN000;
966 ;;;;;;;;AND [SI.DFLL_FLAGS],NOT DFL_INPROG ; go exit with carry ;AN000;
967 ;;;aliasJMP ifs_980 ;AN000;
968 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
969 CDE_80: ;AN000;
970 ADD DI,4 ; skip alias index and user wd ;AC004;
971 ;;;; INC DI ;AD004;
972 CDE_100: ;AN000;
973 MOV AX,WORD PTR [THISIFS] ;AN000;
974 STOSW ; Set DFL_IFS_HDR to ;AN000;
975 MOV AX,WORD PTR [THISIFS+2] ; [THISIFS] ;AN000;
976 STOSW ;AN000;
977 CDE_120: ;AN000;
978 POP DI ; retrieve dfl start ;AN000;
979 MOV WORD PTR CS:[THISDFL],DI ; Set [thisdfl] ;AN000;
980 MOV WORD PTR CS:[THISDFL+2],ES ;AN000;
981 ;AN000;
982 PUSH ES ; Set DS:SI -> DFL ;AN000;
983 POP DS ;AN000;
984 MOV SI,DI ;AN000;
985 ;AN000;
986 CALL CHECK_REAL_DEVICE ; this will set dfl_dev_real ;AN000;
987 ;AN000;
988 OR [SI.DFLL_FLAGS],DFL_INUSE ;AN000;
989 AND [SI.DFLL_FLAGS],NOT DFL_INPROG ;AN000;
990 ;AN000;
991 ;;;aliasCMP BL,TYPE_ALIAS ;AN000;
992 ;;;aliasJNE CDE_140 ;AN000;
993 ;;;aliasJMP ifs_990 ; go ret no carry ;AN000;
994 CDE_140: ;AN000;
995 invoke PREP_IFSR ; init req hdr ;AN000;
996 invoke DFL_TO_DF ;AN000;
997 JMP ifs_990 ;AN000;
998 ;AN000;
999 EndProc CREATE_DFL_ENTRY ;AN000;
1000 ;AN000;
1001 BREAK <DELETE_DFL_ENTRY - Delete DFL entry, remove from names list if alias> ;AN000;
1002 ;AN000;
1003 ;************************************************************************************ ;AN000;
1004 ; ;AN000;
1005 ; DELETE_DFL_ENTRY ;AN000;
1006 ; ;AN000;
1007 ; Routine called by: IFS_ASSOPER ;AN000;
1008 ; ;AN000;
1009 ; Routines called: ;AN000;
1010 ; ;AN000;
1011 ; Inputs: ;AN000;
1012 ; [THISDFL] set ;AN000;
1013 ; ;AN000;
1014 ; Function: ;AN000;
1015 ; ;AN000;
1016 ; Outputs: ;AN000;
1017 ; carry clear: ;AN000;
1018 ; DFL entry deleted. ;AN000;
1019 ; carry set on error, ax - error ;AN000;
1020 ; ;AN000;
1021 ; Regs: everything preserved ;AN000;
1022 ; ;AN000;
1023 ;************************************************************************************ ;AN000;
1024 ;AN000;
1025 procedure DELETE_DFL_ENTRY,NEAR ;AN000;
1026 ;AN000;
1027 LDS SI,[THISDFL] ; simply reset in_use bit ;AN000;
1028 AND DS:[SI.DFLL_FLAGS],NOT DFL_INUSE ;AN000;
1029 ;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ; if alias, must remove name ;AN000;
1030 ;;;aliasJE DDE_20 ; from names list, and reset ;AN000;
1031 JMP ifs_1000 ;AN000;
1032 ;;;aliasDDE_20: ;AN000;
1033 ;;;aliasCALL EXIT_NAMES_LIST ; all alias indicies ;AN000;
1034 ;;;aliasJMP ifs_1000 ;AN000;
1035 ;AN000;
1036 EndProc DELETE_DFL_ENTRY ;AN000;
1037 ;AN000;
1038 ;BREAK <ENTER_NAMES_LIST - add alias name to Names List> ;AN000;
1039 ;;;alias ;AN000;
1040 ;************************************************************************************ ;AN000;
1041 ; ;AN000;
1042 ; ENTER_NAMES_LIST ;AN000;
1043 ; ;AN000;
1044 ; Routine called by: CREATE_DFL_ENTRY ;AN000;
1045 ; ;AN000;
1046 ; Routines called: DOS: DStrLen ;AN000;
1047 ; ;AN000;
1048 ; Inputs: ;AN000;
1049 ; DS:SI -> DFL ;AN000;
1050 ; ES:DI -> Target driver to attach to and parms. ;AN000;
1051 ; DW ASCIIZ - FS name ;AN000;
1052 ; DW n - number of parms ;AN000;
1053 ; DB ASCIIZ,... parms ;AN000;
1054 ; Function: ;AN000;
1055 ; Place one and only parameter (alias) into names list. ;AN000;
1056 ; Outputs: ;AN000;
1057 ; carry clear: name added ;AN000;
1058 ; carry set: AX error ;AN000;
1059 ; ;AN000;
1060 ; Notes: all preserved except AX ;AN000;
1061 ; ;AN000;
1062 ;************************************************************************************ ;AN000;
1063 ; ;AN000;
1064 ; procedure ENTER_NAMES_LIST ;AN000;
1065 ;SSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1066 ; ;AN000;
1067 ; SaveReg <ES,DI,CX,DX,DS,SI> ;AN000;
1068 ; PUSH ES ;AN000;
1069 ; POP DS ;AN000;
1070 ; MOV SI,DI ;AN000;
1071 ; ADD SI,4 ; ds:si -> alias name ;AN000;
1072 ; CallInstall DStrlen,multDOS,37 ; get size of alias name in cx ;AN000;
1073 ; LES DI,[NLAddr] ; get address of names list ;AN000;
1074 ; MOV DX,WORD PTR ES:[DI] ; DX=total size of names list ;AN000;
1075 ; INC DI ;AN000;
1076 ; INC DI ;AN000;
1077 ; MOV AX,WORD PTR ES:[DI] ; AX=used size of names list ;AN000;
1078 ; PUSH AX ; save used size for dfl_alias_index ;AN000;
1079 ; ADD AX,CX ; AX=hopefully new used size ;AN000;
1080 ; CMP DX,AX ; check that new string fits ;AN000;
1081 ; JAE ENL_20 ;AN000;
1082 ; MOV AX,error_out_of_structures ; error - doesn't fit ;AN000;
1083 ; JMP ENL_980 ; ret w/carry ;AN000;
1084 ;NL_20: ; ok - fits ;AN000;
1085 ; STOSW ; store new used size ;AN000;
1086 ; POP AX ; get index from stack ;AN000;
1087 ; PUSH AX ;AN000;
1088 ; INC DI ;AN000;
1089 ; INC DI ;AN000;
1090 ; ADD DI,AX ; Space to spot in list to put name ;AN000;
1091 ; REP MOVSB ;AN000;
1092 ; RestoreReg <SI,DS> ; Set dfl alias index to byte offset ;AN000;
1093 ; POP AX ; (+4) of name in list ;AN000;
1094 ; MOV DS:WORD PTR [SI.DFL_ALIAS_INDEX],AX ;AN000;
1095 ; JMP ENL_990 ; go ret no carry ;AN000;
1096 ; ;AN000;
1097 ; ;AN000;
1098 ;NL_980: ; Return area ;AN000;
1099 ; STC ; error ;AN000;
1100 ; RestoreReg <SI,DS,DX,CX,DI,ES> ;AN000;
1101 ; return ;AN000;
1102 ;NL_990: ;AN000;
1103 ; CLC ; no error ;AN000;
1104 ; RestoreReg <DX,CX,DI,ES> ;AN000;
1105 ;NL_1000: ;AN000;
1106 ; return ;AN000;
1107 ; ;AN000;
1108 ; ;AN000;
1109 ;ndProc ENTER_NAMES_LIST ;AN000;
1110 ; ;AN000;
1111 ; ;AN000;
1112 ;REAK <EXIT_NAMES_LIST - remove alias name from Names List> ;AN000;
1113 ; ;AN000;
1114 ;************************************************************************************ ;AN000;
1115 ; ;AN000;
1116 ; EXIT_NAMES_LIST ;AN000;
1117 ; ;AN000;
1118 ; Routine called by: DELETE_DFL_ENTRY ;AN000;
1119 ; ;AN000;
1120 ; Routines called: DOS: StrLen ;AN000;
1121 ; ;AN000;
1122 ; Inputs: ;AN000;
1123 ; DS:SI -> DFL ;AN000;
1124 ; ;AN000;
1125 ; Function: ;AN000;
1126 ; Remove alias name from Names List ;AN000;
1127 ; Outputs: ;AN000;
1128 ; name removed ;AN000;
1129 ; ;AN000;
1130 ; Notes: all preserved ;AN000;
1131 ; ;AN000;
1132 ;************************************************************************************ ;AN000;
1133 ; ;AN000;
1134 ; procedure EXIT_NAMES_LIST ;AN000;
1135 ;SSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1136 ; ;AN000;
1137 ; MOV DX,DS:[SI.DFL_ALIAS_INDEX] ; DX=index ;AN000;
1138 ; LES DI,[NLAddr] ;AN000;
1139 ; MOV AX,ES:WORD PTR [DI+2] ; AX=used size ;AN000;
1140 ; SaveReg <ES,DI,AX> ;AN000;
1141 ; ADD DI,DX+4 ;AN000;
1142 ; CallInstall StrLen,multDOS,18 ; CX=size of alias name ;AN000;
1143 ; PUSH ES ;AN000;
1144 ; POP DS ;AN000;
1145 ; MOV SI,DI ;AN000;
1146 ; ADD SI,CX ;AN000;
1147 ; MOV BX,CX ;AN000;
1148 ; SUB AX,SI ; CX= #bytes to move = ;AN000;
1149 ; MOV CX,AX ; used size - index of next name ;AN000;
1150 ; REP MOVSB ; move names up ;AN000;
1151 ; ;AN000;
1152 ; RestoreReg <AX,DI,ES> ; adjust used size ;AN000;
1153 ; SUB AX,BX ;AN000;
1154 ; MOV ES:WORD PTR [DI+2],AX ;AN000;
1155 ; ;AN000;
1156 ; LDS SI,[DFLAddr] ; loop thru all dfl entries to ;AN000;
1157 ; MOV DI,SIZE DFL_LIST ; adjust alias indicies above ;AN000;
1158 ; MOV CL,[DFLCount] ; index removed ;AN000;
1159 ; XOR CH,CH ;AN000;
1160 ;XNL_20: ; ** Loop here on dfl entries ;AN000;
1161 ; TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000;
1162 ; JZ EXNL_40 ;AN000;
1163 ; MOV AX,DS:[SI.DFL_ALIAS_INDEX] ; 0 if not alias ;AN000;
1164 ; CMP AX,DX ;AN000;
1165 ; JB EXNL_40 ;AN000;
1166 ; SUB AX,BX ; adjust by size of name deleted ;AN000;
1167 ; MOV DS:[SI.DFL_ALIAS_INDEX],AX ;AN000;
1168 ;XNL_40: ;AN000;
1169 ; ADD SI,DX ;AN000;
1170 ; LOOP EXNL_20 ;AN000;
1171 ; ;AN000;
1172 ; JMP ifs_1000 ; go return ;AN000;
1173 ; ;AN000;
1174 ; ;AN000;
1175 ;ndProc EXIT_NAMES_LIST ;AN000;
1176 ;AN000;
1177 BREAK <DFL_SINGLE_FILE_CHECK - support single file check> ;AN000;
1178 ;AN000;
1179 ;************************************************************************************ ;AN000;
1180 ; ;AN000;
1181 ; DFL_SINGLE_FILE_CHECK ;AN000;
1182 ; ;AN000;
1183 ; Routine called by: IFS_FILE_ATTRIBUTES ;AN000;
1184 ; ;AN000;
1185 ; Inputs: ;AN000;
1186 ; [THISDFL] ;AN000;
1187 ; [WFP_START] ;AN000;
1188 ; ;AN000;
1189 ; Function: ;AN000;
1190 ; IF [THISDFL] .NOT. NULL THEN ;AN000;
1191 ; DO ;AN000;
1192 ; Get IFS header from DFL_IFS_HDR ;AN000;
1193 ; IF IFSDEVICE true THEN ;AN000;
1194 ; DO ;AN000;
1195 ; Call DFL_TO_DF ;AN000;
1196 ; Clear carry ;AN000;
1197 ; ENDDO ;AN000;
1198 ; ELSE Set error - device doesn't support single file fcn ;AN000;
1199 ; ENDIF ;AN000;
1200 ; ENDDO ;AN000;
1201 ; ELSE DO ;AN000;
1202 ; CALL DFL_MATCH ;AN000;
1203 ; IF match found THEN ;AN000;
1204 ; DO ;AN000;
1205 ; Get IFS header from DFL_IFS_HDR ;AN000;
1206 ; IF IFSDEVICE true THEN ;AN000;
1207 ; DO ;AN000;
1208 ; Call DFL_TO_DF ;AN000;
1209 ; Clear carry ;AN000;
1210 ; ENDDO ;AN000;
1211 ; ELSE Set error - device doesn't support single file fcn ;AN000;
1212 ; ENDDO ;AN000;
1213 ; ELSE Set error - device not IFS ;AN000;
1214 ; ENDIF ;AN000;
1215 ; ENDDO ;AN000;
1216 ; ENDIF ;AN000;
1217 ; ;AN000;
1218 ; ;AN000;
1219 ; Outputs: ;AN000;
1220 ; no carry: carry: error ;AN000;
1221 ; [THISIFS] set ;AN000;
1222 ; ES:BX -> IFSRH ;AN000;
1223 ; IFSR_DEVICE_CB@ ;AN000;
1224 ; ds - IFSSEG ;AN000;
1225 ; ;AN000;
1226 ;************************************************************************************ ;AN000;
1227 ;AN000;
1228 procedure DFL_SINGLE_FILE_CHECK ;AN000;
1229 ASSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1230 ;; assume thisdfl aready set up here ;AN000;
1231 ;; don't want to write another parse routine ;AN000;
1232 ;; CMP WORD PTR [THISDFL],MINUS_ONE ;AN000;
1233 ;; JNZ DSFC_20 ;AN000;
1234 ;; CALL DFL_MATCH ; check for dfl entry ;AN000;
1235 ;; JNC DSFC_20 ;AN000;
1236 ;; MOV AX,error_not_ifs_device ;AN000;
1237 ;; JMP ifs_1000 ;AN000;
1238 ;AN000;
1239 DSFC_20: ;AN000;
1240 LES DI,CS:[THISDFL] ;AN000;
1241 LES DI,ES:[DI.DFLL_IFS_HDR] ; check that ifs device supports ;AN000;
1242 TEST ES:[DI.IFS_ATTRIBUTE],IFSDEVICE ; single file function ;AN000;
1243 JNZ DSFC_60 ;AN000;
1244 MOV AX,error_file_not_found ; no - set error & go return w/carry ;AN000;
1245 JMP ifs_980 ;AN000;
1246 DSFC_60: ;AN000;
1247 invoke DFL_TO_DF ;AN000;
1248 JMP ifs_990 ;AN000;
1249 ;AN000;
1250 ;AN000;
1251 EndProc DFL_SINGLE_FILE_CHECK ;AN000;
1252 ;AN000;
1253 ;BREAK <PROCESS_ALIAS -- add alias name> ;AN000;
1254 ; ;AN000;
1255 ;************************************************************************************ ;AN000;
1256 ; ;AN000;
1257 ; PROCESS_ALIAS ;AN000;
1258 ; ;AN000;
1259 ; Called by: ATTACH_START ;AN000;
1260 ; ;AN000;
1261 ; Routines called: DFL_MATCH ;AN000;
1262 ; CREATE_DFL_ENTRY ;AN000;
1263 ; ;AN000;
1264 ; Inputs: ;AN000;
1265 ; DS:SI -> ASCIIZ source name ;AN000;
1266 ; ES:DI -> ALIAS name ;AN000;
1267 ; ;AN000;
1268 ; Function: ;AN000;
1269 ; ;AN000;
1270 ; Regs: ;AN000;
1271 ; ;AN000;
1272 ;************************************************************************************ ;AN000;
1273 ; ;AN000;
1274 ; Procedure PROCESS_ALIAS,NEAR ;AN000;
1275 ;SSUME DS:NOTHING,ES:NOTHING ;AN000;
1276 ; ;AN000;
1277 ; CALL DFL_MATCH ;AN000;
1278 ; JC PA_20 ;AN000;
1279 ;;;??? match found, error or override??? ;AN000;
1280 ;A_20: ;AN000;
1281 ; CALL CREATE_DFL_ENTRY ;AN000;
1282 ; JMP ifs_1000 ;AN000;
1283 ; ;AN000;
1284 ; ;AN000;
1285 ;ndProc PROCESS_ALIAS ;AN000;
1286 ;AN000;
1287 ;AN000;
1288 BREAK <DFL_MATCH -- check for DFL entry> ;AN000;
1289 ;AN000;
1290 ;************************************************************************************ ;AN000;
1291 ; ;AN000;
1292 ; DFL_MATCH ;AN000;
1293 ; ;AN000;
1294 ; Called by: ATTACH_START CONSIST_SFT ;AN000;
1295 ; IFS_DELETE ;AN000;
1296 ; ;AN000;
1297 ; Routines called: ;AN000;
1298 ; ;AN000;
1299 ; Inputs: ;AN000;
1300 ; DS:SI -> Asciiz Device name ;AN000;
1301 ; ;AN000;
1302 ; Function: ;AN000;
1303 ; Search DFL for match on name ;AN000;
1304 ; If match found - set [THISDFL] and clear carry ;AN000;
1305 ; Else set carry ;AN000;
1306 ; ;AN000;
1307 ; Output: ;AN000;
1308 ; carry clear - match found, [THISDFL] set ;AN000;
1309 ; carry set - match not found ;AN000;
1310 ; ;AN000;
1311 ; Regs: all preserved ;AN000;
1312 ; ;AN000;
1313 ;************************************************************************************ ;AN000;
1314 ;AN000;
1315 Procedure DFL_MATCH ;AN000;
1316 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1317 ;AN000;
1318 SaveReg <DS,SI,ES,DI,AX,CX,BX> ; save registers ;AN000;
1319 ;AN000;
1320 SaveReg <CS> ; store canonicalized version of ;AN000;
1321 RestoreReg <ES> ; source asciiz dev name in ;AN000;
1322 MOV DI,OFFSET TEMPBUF+10 ; tempbuf+10 ;AN000;
1323 MOV CX,10 ; devs max of 8 ch and : and nul ;AN000;
1324 DM_20: ;AN000;
1325 LODSB ;AN000;
1326 CallInstall UCase,multDOS,19,<AX>,<BX> ;AN000;
1327 STOSB ;AN000;
1328 OR AL,AL ;AN000;
1329 JZ DM_60 ;AN000;
1330 CMP AL,"." ;AN000;
1331 JZ DM_40 ;AN000;
1332 LOOP DM_20 ;AN000;
1333 DM_40: ;AN000;
1334 XOR AL,AL ;AN000;
1335 MOV BYTE PTR ES:[DI-1],AL ;AN000;
1336 DM_60: ;AN000;
1337 CMP BYTE PTR ES:[DI-2],":" ;AN000;
1338 JNZ DM_80 ;AN000;
1339 MOV BYTE PTR ES:[DI-2],0 ;AN000;
1340 ;AN000;
1341 DM_80: ;AN000;
1342 XOR AX,AX ; ax is counter through DFL entries ;AN000;
1343 LDS SI,[DFLAddr] ; dssi -> dfl entry ;AN000;
1344 DM_100: ; <<<<< matching loop >>>>> ;AN000;
1345 CMP AL,CS:[DFLCount] ;AN000;
1346 JAE DM_980 ;AN000;
1347 TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000;
1348 JZ DM_160 ;AN000;
1349 SaveReg <SI> ; dfl entry offset ;AN000;
1350 ADD SI,DFL_DEV_NAME ;AN000;
1351 MOV DI,OFFSET TEMPBUF ;AN000;
1352 CALL CONVERT_NAME_ASCIIZ ; moves dev name into tempbuf ;AN000;
1353 ; in asciiz form - di preserved ;AN000;
1354 MOV SI,OFFSET TEMPBUF+10 ;AN000;
1355 Call PRN_CHECK ; if si->prn - chg si->lpt1 ;AN012;
1356 CallInstall StrCmp,multDOS,30,<AX>,<AX> ; check for match ;AN000;
1357 RestoreReg <SI> ; dfl entry offset ;AN000;
1358 JZ DM_990 ;AN000;
1359 DM_160: ;AN000;
1360 ADD SI,SIZE DFLL_LIST ;AN000;
1361 INC AL ;AN000;
1362 JMP SHORT DM_100 ; go up & try next entry ;AN000;
1363 ;AN000;
1364 DM_980: ;AN000;
1365 SaveReg <AX,CS> ; set thisdfl null on error ;AN020;
1366 RestoreReg <DS> ;AN020;
1367 MOV AX,NULL_PTR ;AN020;
1368 MOV WORD PTR [THISDFL],AX ;AN020;
1369 MOV WORD PTR [THISDFL+2],AX ;AN020;
1370 RestoreReg <AX> ;AN020;
1371 STC ;AN000;
1372 JMP SHORT DM_1000 ;AN000;
1373 DM_990: ;AN000;
1374 TEST DS:[SI.DFLL_FLAGS],dfl_paused ; if printer paused, no match ;AN019;
1375 JNZ DM_980 ;AN019;
1376
1377 MOV CS:WORD PTR [THISDFL],SI ;AN000;
1378 MOV CS:WORD PTR [THISDFL+2],DS ;AN000;
1379 CLC ; es:di -> dfl on match ;AN000;
1380 DM_1000: ;AN000;
1381 RestoreReg <BX,CX,AX,DI,ES,SI,DS> ; restore regs ;AN000;
1382 return ;AN000;
1383 ;AN000;
1384 EndProc DFL_MATCH ;AN000;
1385 ;AN000;
1386 BREAK <SFT_TO_SFF -- Convert SFT to SFF> ;AN000;
1387 ;AN000;
1388 ;************************************************************************************ ;AN000;
1389 ; ;AN000;
1390 ; SFT_TO_SFF ;AN000;
1391 ; ;AN000;
1392 ; Inputs: ;AN000;
1393 ; [THISSFT] set ;AN000;
1394 ; DS - DOSGROUP ;AN000;
1395 ; Function: ;AN000;
1396 ; Load SFF from SFT ;AN000;
1397 ; ;AN000;
1398 ; SFF_TYPE = 0 ;AN000;
1399 ; SFF_TYPE+1 = 0 ;AN000;
1400 ; SFF_FLAGS = SF_FLAGS ;AN000;
1401 ; SFF_MODE = SF_MODE ;AN000;
1402 ; SFF_RESV1 = 0 ;AN000;
1403 ; SFF_ATTR = SF_ATTR ;AN000;
1404 ; SFF_UID = SF_UID ;AN000;
1405 ; SFF_PID = SF_PID ;AN000;
1406 ; SFF_SIZE = SF_SIZE ;AN000;
1407 ; SFF_POSITION = SF_POSITION ;AN000;
1408 ; SFF_TIME = SF_TIME ;AN000;
1409 ; SFF_DATE = SF_DATE ;AN000;
1410 ; SFF_NAME = SF_NAME ;AN000;
1411 ; SFF_EXT = SF_NAME+8 ;AN000;
1412 ; SFF_RESV2 = 0 ;AN000;
1413 ; SFF_SF_ID = math on sft address
1414 ; SFF_FSDA = SF_CLUSPOS ;AN000;
1415 ; SFF_FSDA + 2 = SF_DIRSEC ;AN000;
1416 ; SFF_FSDA + 4 = SF_DIRSEC+2 ;AN000;
1417 ; SFF_FSDA + 6 = SF_LSTCLUS ;AN000;
1418 ; Outputs: ;AN000;
1419 ; SF loaded ;AN000;
1420 ; ES:BX -> IFSRH ;AN000;
1421 ; IFSR_OPEN_CB@ set ;AN000;
1422 ; If SetDeviceCB set then IFSR_DEVICE_CB@ set ;AN000;
1423 ; DS - IFSSEG ;AN000;
1424 ; ;AN000;
1425 ; notes: all except ES,BX,DS preserved ;AN000;
1426 ;************************************************************************************ ;AN000;
1427 ;AN000;
1428 procedure SFT_TO_SFF,NEAR ;AN000;
1429 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1430 ;AN000;
1431 SaveReg <DI,SI,AX,CX> ; save regs ;AN000;
1432 ;AN000;
1433 SaveReg <CS> ;AN000;
1434 RestoreReg <ES> ;AN000;
1435 ASSUME ES:IFSSEG ;AN000;
1436 MOV DI,OFFSET SFF1 ; DS:SI -> SFT ;AN000;
1437 LDS SI,[THISSFT] ; ES:DI -> SFF ;AN000;
1438 ;AN000;
1439 SaveReg <DI> ; save SFF offset ;AN000;
1440 MOV AH,CBTYPE_SFF ; sff_type ;AN000;
1441 XOR AL,AL ;AN000;
1442 STOSW ;AN000;
1443 ;AN000;
1444 MOV AX,WORD PTR [SI.SF_FLAGS] ; sff_flags ;AN000;
1445 STOSW ;AN015;
1446 MOV AX,WORD PTR [SI.SF_MODE] ; sff_mode ;AN000;
1447 ;;;;;;;;PUSH BX ;AD015;
1448 ;;;;;;;;AND BX,8000H ;AD015;
1449 ;;;;;;;;OR AX,BX ;AD015;
1450 STOSW ;AN000;
1451 ;;;;;;;;POP AX ;AD015;
1452 ;;;;;;;;AND AX,0EFFFH ;AD015;
1453 ;;;;;;;;STOSW ;AD015;
1454 ;;;;;;;;MOV AX,WORD PTR [SI.SF_IOMODE] ; sff_iomode ;AD024;
1455 XOR AX,AX ; just put zero in reserved area ;AN024;
1456 STOSW ;AN000;
1457 MOV AL,BYTE PTR [SI.SF_ATTR] ; sff_attr ;AN000;
1458 ;;;;;;;;MOV AH,BYTE PTR [SI.SF_ATTR_HI] ; sff_attr_hi - no longer exists ;AD024;
1459 STOSW ;AN000;
1460 MOV AX,WORD PTR [SI.SF_UID] ; sff_uid ;AN000;
1461 STOSW ;AN000;
1462 MOV AX,WORD PTR [SI.SF_PID] ; sff_pid ;AN000;
1463 STOSW ;AN000;
1464 SaveReg <SI> ;AN000;
1465 ADD SI,SF_SIZE ;AN000;
1466 MOV CX,4 ;AN000;
1467 REP MOVSW ; sff_size & position ;AN000;
1468 RestoreReg <SI> ;AN000;
1469 MOV AX,WORD PTR [SI.SF_TIME] ; sff_time ;AN000;
1470 STOSW ;AN000;
1471 MOV AX,WORD PTR [SI.SF_DATE] ; sff_date ;AN000;
1472 STOSW ;AN000;
1473 ;AN000;
1474 SaveReg <SI> ; sff_name/ext/cp ;AN000;
1475 ADD SI,SF_NAME ;AN000;
1476 MOV CX,11 ; (name - 11, cp - 2 bytes) cp out ;AC024;
1477 REP MOVSB ;AN000;
1478 XOR AX,AX ;AN024;
1479 STOSW ; just put zero in reserved area ;AN024;
1480
1481 RestoreReg <SI> ; sff_sf_id ;AN000;
1482 SaveReg <SI,DS,DS> ; calculate based on sft address ;AN016
1483 RestoreReg <AX> ;AN016;
1484 MOV CL,4 ;AN016;
1485 SHL AX,CL ;AN016;
1486 ADD SI,AX ;AN016;
1487 RestoreReg <AX> ;AN016;
1488 AND AX,0F000H ;AN016;
1489 ADD AX,SI ;AN016;
1490 STOSW ;AN016;
1491 RestoreReg <SI> ;AN016;
1492 ;AN000;
1493 ADD DI,SIZE SFF_RESV ; sff_fsda 1st word ;AN000;
1494 SaveReg <SI> ; save si for issft case ;AN015;
1495 ADD SI,SF_CLUSPOS ;AN000;
1496 MOV CX,3 ;AC017;
1497 REP MOVSW ;AN000;
1498 ;;;;;;;;ADD SI,12 ;AN017;;AD024;
1499 ;;;;;;;;MOVSW ;AN017;;AD024;
1500 RestoreReg <SI> ;AN015;
1501 MOV AX,WORD PTR [SI.SF_LSTCLUS] ; manually put lstclus in fsda+6 ;AN024;
1502 STOSW ;AN024;
1503 ;AN000;
1504 TEST CS:[IFSPROC_FLAGS],ISSFT ;AN000;
1505 JZ SFT_20 ;AN000;
1506 MOV AX,WORD PTR [SI.SF_IFS_HDR] ; Set [THISIFS] only if ;AN000;
1507 MOV WORD PTR CS:[THISIFS],AX ; no yet set by cds_to_cd or ;AN000;
1508 MOV AX,WORD PTR [SI.SF_IFS_HDR+2] ; dfl_to_df ;AN000;
1509 MOV WORD PTR CS:[THISIFS+2],AX ;AN000;
1510 ;AN000;
1511 SFT_20: ;AN000;
1512 RestoreReg <DI> ; restore ES:DI -> start of SFF ;AN000;
1513 SaveReg <ES> ; set DS:DI -> SFF ;AN000;
1514 RestoreReg <DS> ;AN000;
1515 ASSUME DS:IFSSEG ;AN000;
1516 ;AN000;
1517 MOV BX,OFFSET IFSR ; set ES:BX -> IFSRH ;AN000;
1518 ;AN000;
1519 TEST CS:IFSPROC_FLAGS,ISCTLFCN ;AN000;
1520 JNZ SFT_40 ; API fcn - ;AN000;
1521 MOV WORD PTR ES:[BX.IFSR_OPEN_CB@],DI ; set IFSR_OPEN_CB@ ;AN000;
1522 MOV WORD PTR ES:[BX.IFSR_OPEN_CB@+2],DS ;AN000;
1523 JMP SFT_60 ;AN000;
1524 SFT_40: ; Ctl fcn - ;AN000;
1525 MOV WORD PTR ES:[BX.IFSR_CB@],DI ; set IFSR_CB@ ;AN000;
1526 MOV WORD PTR ES:[BX.IFSR_CB@+2],DS ;AN000;
1527 ;AN000;
1528 SFT_60: ;AN000;
1529 TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to set ;AN000;
1530 JZ SFT_1000 ; device cb or not ;AN000;
1531 LDS SI,[THISSFT] ;AN000;
1532 CMP WORD PTR DS:[SI.SF_DEVPTR],NULL_PTR ; null if seq ;AN000;
1533 JE SFT_1000 ;AN000;
1534 TEST DS:[SI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007;
1535 LDS SI,DS:[SI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AM007;
1536 JNZ SFT_100 ; jmp if dfl ;AN000;
1537 MOV WORD PTR CS:SAVE_CB@,SI ; CDS ;AN000;
1538 MOV WORD PTR CS:SAVE_CB@+2,DS ;AN000;
1539 TEST DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000;
1540 JZ SFT_1000 ;AN000;
1541 CALL CDS_TO_CD ;AN000;
1542 JMP SHORT SFT_1000 ;AN000;
1543 ;AN000;
1544 SFT_100: ;AN000;
1545 MOV WORD PTR CS:[THISDFL],SI ; DFL ;AN000;
1546 MOV WORD PTR CS:[THISDFL+2],DS ; set this cause dfl-df ;AN000;
1547 CALL DFL_TO_DF ; expects it ;AN000;
1548 ;AN000;
1549 ;AN000;
1550 SFT_1000: ;AN000;
1551 RestoreReg <CX,AX,SI,DI> ; restore regs ;AN000;
1552 SaveReg <CS> ;AN000;
1553 RestoreReg <DS> ; set ds -ifsseg ;AN000;
1554 ;AN000;
1555 return ;AN000;
1556 ;AN000;
1557 EndProc SFT_TO_SFF ;AN000;
1558 ;AN000;
1559 ;AN000;
1560 BREAK <SFF_TO_SFT -- Convert SFF to SFT> ;AN000;
1561 ;AN000;
1562 ;************************************************************************************ ;AN000;
1563 ; ;AN000;
1564 ; SFF_TO_SFT ;AN000;
1565 ; ;AN000;
1566 ; Inputs: ;AN000;
1567 ; [THISSFT] set ;AN000;
1568 ; Function: ;AN000;
1569 ; Update SFT with SFF ;AN000;
1570 ; SF_FLAGS = SFF_FLAGS ;AN000;
1571 ; SF_MODE = SFF_MODE ;AN000;
1572 ; SF_ATTR = SFF_ATTR ;AN000;
1573 ; SF_UID = SFF_UID ;AN000;
1574 ; SF_PID = SFF_PID ;AN000;
1575 ; SF_SIZE = SFF_SIZE ;AN000;
1576 ; SF_POSITION = SFF_POSITION ;AN000;
1577 ; SF_TIME = SFF_TIME ;AN000;
1578 ; SF_DATE = SFF_DATE ;AN000;
1579 ; SF_NAME = SFF_NAME ;AN000;
1580 ; SF_NAME+8 = SFF_EXT ;AN000;
1581 ; SF_CLUSPOS = SFF_FSDA ;AN000;
1582 ; SF_DIRSEC = SFF_FSDA + 2 ;AN000;
1583 ; SF_DIRSEC+2 = SFF_FSDA + 4 ;AN000;
1584 ; SF_LSTCLUS = SFF_FSDA + 6 ;AN000;
1585 ; ;AN000;
1586 ; Outputs: ;AN000;
1587 ; SFT loaded ;AN000;
1588 ; notes: all regs preserved ;AN000;
1589 ; ;AN000;
1590 ;************************************************************************************ ;AN000;
1591 ;AN000;
1592 procedure SFF_TO_SFT,NEAR ;AN000;
1593 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1594 ;AN000;
1595 SaveReg <ES,DI,DS,SI,AX,CX> ; save regs ;AC003;
1596 ;AN000;
1597 PUSH SS ;AN000;
1598 POP DS ;AN000;
1599 ASSUME DS:DOSGROUP ;AN000;
1600 LES DI,[THISSFT] ; DS:SI -> SFF ;AN000;
1601 PUSH CS ;AN000;
1602 POP DS ;AN000;
1603 ASSUME DS:IFSSEG ;AN000;
1604 MOV SI,OFFSET SFF1 ; ES:DI -> SFT ;AN000;
1605 INC SI ;AN000;
1606 INC SI ;AN000;
1607 ;AN000;
1608 LODSW ; sff_flags ;AN000;
1609 ;;;;;;;;AND AX,0EFFFH ; (hi bit sft_flags - also mode ) ;AD015;
1610 MOV WORD PTR ES:[DI.SF_FLAGS],AX ; sft_flags ;AC015;
1611 LODSW ;AN000;
1612 ;;;;;;;;AND AX,0EFFFH ;AD015;
1613 MOV WORD PTR ES:[DI.SF_MODE],AX ; sft_mode ;AC015;
1614 LODSW ;AN000;
1615 ;;;;;;;;MOV WORD PTR ES:[DI.SF_IOMODE],AX ; sft_iomode ...no longer exists ;AD024;
1616 LODSW ;AN000;
1617 MOV BYTE PTR ES:[DI.SF_ATTR],AL ; sft_attr ;AN000;
1618 ;;;;;;;;MOV BYTE PTR ES:[DI.SF_ATTR_HI],AH ; no longer exists ;AD024;
1619 LODSW ;AN000;
1620 MOV WORD PTR ES:[DI.SF_UID],AX ; sft_uid ;AN000;
1621 LODSW ;AN000;
1622 MOV WORD PTR ES:[DI.SF_PID],AX ; sft_pid ;AN000;
1623 SaveReg <DI> ;AN000;
1624 ADD DI,SF_SIZE ;AN000;
1625 MOV CX,4 ;AN000;
1626 REP MOVSW ; sft_size & position ;AN000;
1627 RestoreReg <DI> ;AN000;
1628 LODSW ;AN000;
1629 MOV WORD PTR ES:[DI.SF_TIME],AX ; sft_time ;AN000;
1630 LODSW ;AN000;
1631 MOV WORD PTR ES:[DI.SF_DATE],AX ; sft_date ;AN000;
1632 ;AN000;
1633 ;AN000;
1634 PUSH DI ; sft_name/ext/cp ;AN000;
1635 ADD DI,SF_NAME ;AN000;
1636 MOV CX,11 ; (name - 11, cp - 2 bytes) ;AN000;
1637 REP MOVSB ;AN000;
1638 ;AN000;
1639 ADD SI,SIZE SFF_RESV ; sft_fsda 1st word ;AN000;
1640 ADD SI,4 ; for sff_sf_id ;AN016;;AC024;
1641 POP DI ;AN000;
1642 ;AN000;
1643 SaveReg <DI> ;AN003;
1644 ADD DI,SF_CLUSPOS ;AN000;
1645 MOV CX,3 ;AC017;
1646 REP MOVSW ;AN000;
1647 ;;;;;;;;ADD DI,12 ;AN017;;AD024;
1648 ;;;;;;;;MOVSW ;AN017;;AD024;
1649 LODSW ;AN024;
1650 RestoreReg <DI> ;AN003;;AM024;
1651 MOV WORD PTR ES:[DI.SF_LSTCLUS],AX ;AN024;
1652 ;AN000;
1653 TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to update ;AN000;
1654 JZ SFF_1000 ; device cb or not ;AN000;
1655 TEST IFSPROC_FLAGS,IsSeq ;AN000;
1656 JNZ SFF_1000 ;AN000;
1657 ;AN000;
1658 TEST ES:[DI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007;
1659 PUSHF ; save results of this test for later ;AN007;
1660 LES DI,ES:[DI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AN000;
1661 CMP DI,NULL_PTR ;AN000;
1662 JNE SFF_20 ;AN000;
1663 POPF ;AN000;
1664 JMP SFF_1000 ;AN000;
1665
1666 SFF_20: ;AN000;
1667 POPF ; retrieve cd/df test results ;AN000;
1668 JNZ SFF_100 ; jmp if dfl ;AN000;
1669 MOV DI,WORD PTR CS:SAVE_CB@ ; CDS ;AN000;
1670 PUSH WORD PTR CS:SAVE_CB@+2 ;AN000;
1671 POP ES ;AN000;
1672 TEST ES:[DI.CURDIR_FLAGS],CURDIR_ISIFS
1673 JZ SFF_1000
1674 CALL CD_TO_CDS ;AN000;
1675 JMP SHORT SFF_1000 ;AN000;
1676 ;AN000;
1677 SFF_100: ;AN000;
1678 MOV WORD PTR CS:[THISDFL],DI ; DFL ;AN000;
1679 MOV WORD PTR CS:[THISDFL+2],ES ; set this cause DF_TO_DFL ;AN000;
1680 CALL DF_TO_DFL ; expects it ;AN000;
1681 ;AN000;
1682 SFF_1000: ;AN000;
1683 RestoreReg <CX,AX,SI,DS,DI,ES> ; restore regs ;AC003;
1684 ;AN000;
1685 return ;AN000;
1686 ;AN000;
1687 EndProc SFF_TO_SFT ;AN000;
1688 ;AN000;
1689 BREAK <CDS_TO_CD -- Convert CDS to CD> ;AN000;
1690 ;AN000;
1691 ;************************************************************************************ ;AN000;
1692 ; ;AN000;
1693 ; CDS_TO_CD ;AN000;
1694 ; ;AN000;
1695 ; Inputs: ;AN000;
1696 ; DS:SI -> CDS ;AN000;
1697 ; ;AN000;
1698 ; Function: ;AN000;
1699 ; Load CD from CDS ;AN000;
1700 ; CD_TYPE = 1 ;AN000;
1701 ; CD_TYPE+1 = 0 ;AN000;
1702 ; CD_END = CURDIR_END ;AN000;
1703 ; CD_TEXT = CURDIR_TEXT ;AN000;
1704 ; CD_FSDA = CURDIR_ID ;AN000;
1705 ; CD_FSDA+2 = CURDIR_ID+2 ;AN000;
1706 ; CD_FSDA+4 = CURDIR_USER_WORD ;AN000;
1707 ; CD_FSDA+6 = CURDIR_FSDA ;AN000;
1708 ; Outputs: ;AN000;
1709 ; CD loaded ;AN000;
1710 ; ES:BX -> IFSRH ;AN000;
1711 ; IFSR_DEVICE_CB@ -> CD ;AN000;
1712 ; [THISIFS] = CURDIR_IFS_HDR ;AN000;
1713 ; DS - IFSSEG ;AN000;
1714 ; ;AN000;
1715 ; Regs: all except DS,ES,BX saved ;AN000;
1716 ; ;AN000;
1717 ;************************************************************************************ ;AN000;
1718 ;AN000;
1719 procedure CDS_TO_CD,NEAR ;AN000;
1720 ;AN000;
1721 SaveReg <DI,SI,AX,CX> ; save regs ;AN000;
1722 ;AN000;
1723 PUSH CS ;AN000;
1724 POP ES ; DS:SI -> CDS ;AN000;
1725 ASSUME ES:IFSSEG ; ES:DI -> CD ;AN000;
1726 MOV DI,OFFSET CS:CD1 ;AN000;
1727 ;AN000;
1728 PUSH DI ; save cd offset ;AN000;
1729 MOV AL,CBTYPE_CD ; cd_type ;AN000;
1730 TEST CS:IFSPROC_FLAGS,ISDUMMYCDS ; check for dummy cd ;AN000;
1731 JZ CCD_10 ;AN000;
1732 MOV AL,CBTYPE_DUMMYCD ;AN000;
1733 CCD_10: ;AN000;
1734 XOR AH,AH ;AN000;
1735 STOSW ; move di down thru cd during store ;AN000;
1736 ;AN000;
1737 MOV AX,WORD PTR [SI.CURDIR_END] ; cd_end ;AN000;
1738 STOSW ;AN000;
1739 ;AN000;
1740 PUSH SI ; cd_text ;AN000;
1741 MOV CX,DIRSTRLEN ;AN000;
1742 REP MOVSB ;AN000;
1743 POP SI ;AN000;
1744 ;AN000;
1745 MOV AX,WORD PTR [SI.CURDIR_ID] ; cd_fsda ;AN000;
1746 ADD DI,SIZE CD_RESV ;AN000;
1747 STOSW ;AN000;
1748 MOV AX,WORD PTR [SI.CURDIR_ID+2] ;AN000;
1749 STOSW ;AN000;
1750 MOV AX,WORD PTR [SI.CURDIR_USER_WORD] ;AN000;
1751 STOSW ;AN000;
1752 MOV AX,WORD PTR [SI.CURDIR_FSDA] ;AN000;
1753 STOSW ;AN000;
1754 ;AN000;
1755 TEST CS:IFSPROC_FLAGS,THISIFS_SET ;AN000;
1756 JNZ CCD_20 ;AN000;
1757 MOV AX,WORD PTR [SI.CURDIR_IFS_HDR] ; Set [THISIFS] ;AN000;
1758 MOV WORD PTR CS:[THISIFS],AX ;AN000;
1759 MOV AX,WORD PTR [SI.CURDIR_IFS_HDR+2] ;AN000;
1760 MOV WORD PTR CS:[THISIFS+2],AX ;AN000;
1761 CCD_20: ;AN000;
1762 POP DI ; restore CD offset ;AN000;
1763 PUSH CS ; get DS -> IFSSEG ;AN000;
1764 POP DS ;AN000;
1765 ASSUME DS:IFSSEG ;AN000;
1766 ;AN000;
1767 MOV BX,OFFSET IFSR ; ES:BX -> IFSRH ;AN000;
1768 SaveReg <BX> ;AN000;
1769 ADD BX,DEVICE_CB@_OFFSET ;AN000;
1770 MOV WORD PTR ES:[BX],DI ; set IFSR_DEVICE_CB@ ;AN000;
1771 ADD BX,2 ;AN000;
1772 MOV WORD PTR ES:[BX],ES ;AN000;
1773 RestoreReg <BX> ;AN000;
1774 ;AN000;
1775 RestoreReg <CX,AX,SI,DI> ; restore regs ;AN000;
1776 ;AN000;
1777 return ;AN000;
1778 ;AN000;
1779 EndProc CDS_TO_CD ;AN000;
1780 ;AN000;
1781 ;AN000;
1782 BREAK <CD_TO_CDS -- Convert CD to CDS> ;AN000;
1783 ;AN000;
1784 ;************************************************************************************ ;AN000;
1785 ; ;AN000;
1786 ; CD_TO_CDS ;AN000;
1787 ; ;AN000;
1788 ; Inputs: ;AN000;
1789 ; ES:DI -> CDS ;AN000;
1790 ; DS -> IFSSEG ;AN000;
1791 ; Function: ;AN000;
1792 ; Update CDS with CD ;AN000;
1793 ; CURDIR_TEXT = CD_TEXT ;AN000;
1794 ; CURDIR_ID = CD_FSDA ;AN000;
1795 ; CURDIR_ID+2 = CD_FSDA+2 ;AN000;
1796 ; CURDIR_USER_WORD = CD_FSDA+4 ;AN000;
1797 ; CURDIR_END = CD_END ;AN000;
1798 ; CURDIR_FSDA = CD_FSDA+6 ;AN000;
1799 ; Outputs: ;AN000;
1800 ; CDS updated ;AN000;
1801 ; ;AN000;
1802 ; notes: all regs preserved ;AN000;
1803 ; ;AN000;
1804 ;************************************************************************************ ;AN000;
1805 ;AN000;
1806 procedure CD_TO_CDS,NEAR ;AN000;
1807 ASSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1808 ;AN000;
1809 SaveReg <ES,DI,DS,SI,AX,CX> ; save regs ;AC005;
1810 ;AN000;
1811 MOV SI,OFFSET CD1 ; ES:DI -> CDS ;AN000;
1812 ; DS:SI -> CD ;AN000;
1813 INC SI ;AN000;
1814 INC SI ;AN000;
1815 ;AN000;
1816 LODSW ; curdir_end ;AN000;
1817 MOV ES:[DI.CURDIR_END],AX ;AN000;
1818 ;AN000;
1819 PUSH DI ;AN000;
1820 MOV CX,DIRSTRLEN ;AN000;
1821 REP MOVSB ;AN000;
1822 POP DI ;AN000;
1823 ;AN000;
1824 ADD SI,SIZE CD_RESV ; curdir_id ;AN000;
1825 LODSW ;AN000;
1826 MOV WORD PTR ES:[DI.CURDIR_ID],AX ;AN000;
1827 LODSW ;AN000;
1828 MOV WORD PTR ES:[DI.CURDIR_ID+2],AX ;AN000;
1829 LODSW ; curdir_user_word ;AN000;
1830 MOV WORD PTR ES:[DI.CURDIR_USER_WORD],AX ;AN000;
1831 LODSW ; curdir_fsda ;AN000;
1832 MOV WORD PTR ES:[DI.CURDIR_FSDA],AX ;AN000;
1833 ;AN000;
1834 RestoreReg <CX,AX,SI,DS,DI,ES> ; restore regs ;AC005;
1835 ;AN000;
1836 return ;AN000;
1837 ;AN000;
1838 EndProc CD_TO_CDS ;AN000;
1839 ;AN000;
1840 ;AN000;
1841 BREAK <DFL_TO_DF -- Convert DFL to DF> ;AN000;
1842 ;AN000;
1843 ;************************************************************************************ ;AN000;
1844 ; ;AN000;
1845 ; DFL_TO_DF ;AN000;
1846 ; ;AN000;
1847 ; Inputs: ;AN000;
1848 ; [THISDFL] ;AN000;
1849 ; Function: ;AN000;
1850 ; Load DF from DFL ;AN000;
1851 ; ;AN000;
1852 ; DF_TYPE = 2 ;AN000;
1853 ; DF_TYPE + 1 = 0 ;AN000;
1854 ; DF_DEV_NAME = DFL_DEV_NAME ;AN000;
1855 ; DF_FSDA = DFL_FSDA ;AN000;
1856 ; Outputs: ;AN000;
1857 ; DF loaded ;AN000;
1858 ; ES:BX -> IFSRH ;AN000;
1859 ; IFSR_DEVICE_CB@ -> DF ;AN000;
1860 ; [THISIFS] = DFL_IFS_HDR ;AN000;
1861 ; DS - IFSSEG ;AN000;
1862 ; ;AN000;
1863 ; notes: es,bx,ds Revised, others saved ;AN000;
1864 ; ;AN000;
1865 ;************************************************************************************ ;AN000;
1866 ;AN000;
1867 procedure DFL_TO_DF,NEAR ;AN000;
1868 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1869 ;AN000;
1870 SaveReg <DI,SI,AX> ; save regs ;AN000;
1871 ;AN000;
1872 PUSH CS ;AN000;
1873 POP ES ;AN000;
1874 ASSUME ES:IFSSEG ;AN000;
1875 MOV DI,OFFSET DF1 ; es:di -> df ;AN000;
1876 ;AN000;
1877 MOV BX,OFFSET IFSR ; set es:bx - ifsrh ;AN000;
1878 PUSH BX ; fill in device cb@ ;AN000;
1879 ADD BX,CS:DEVICE_CB@_OFFSET ;AN000;
1880 MOV WORD PTR ES:[BX],DI ;AN000;
1881 ADD BX,2 ;AN000;
1882 MOV WORD PTR ES:[BX],ES ;AN000;
1883 POP BX ;AN000;
1884 ;AN000;
1885 LDS SI,[THISDFL] ; ds:si -> dfl ;AN000;
1886 ;AN000;
1887 MOV AL,CBTYPE_DF ; df_type ;AN000;
1888 XOR AH,AH ;AN000;
1889 STOSW ;AN000;
1890 ;AN000;
1891 PUSH SI ; df_dev_name ;AN000;
1892 ADD SI,DFL_DEV_NAME ;AN000;
1893 MOV CX,8 ;AN000;
1894 REP MOVSB ;AN000;
1895 POP SI ;AN000;
1896 PUSH SI ;AN000;
1897 ADD SI,DFL_FSDA ; df_fsda ;AN000;
1898
1899 TEST CS:IFSPROC_FLAGS,SetDeviceCB ; if this flag set, i24 already taken ;AN004;
1900 JNZ DDF_20 ; care of, otherwise take care of it ;AN004;
1901 SaveReg <DI,SI> ; df, dfl dev name offsets ;AN004;
1902 MOV DI,OFFSET CS:[PHONEY_NAME] ; set phoney name and ifsdrv ;AN004;
1903 MOV CX,4 ;AN004;
1904 REP MOVSW ;AN004;
1905 MOV CS:[IFSDRV],-1 ;AN004;
1906 RestoreReg <SI,DI> ; dfl dev name, df offsets ;AN004;
1907
1908 DDF_20: ;AN004;
1909 MOV CX,SIZE DFL_FSDA ;AN000;
1910 REP MOVSB ;AN000;
1911 POP SI ;AN000;
1912 ;AN000;
1913 MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR] ; Set [THISIFS] ;AN000;
1914 MOV WORD PTR [THISIFS],AX ;AN000;
1915 MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR+2] ;AN000;
1916 MOV WORD PTR [THISIFS+2],AX ;AN000;
1917 ;AN000;
1918 PUSH CS ; set ds - ifsseg ;AN000;
1919 POP DS ;AN000;
1920 ;AN000;
1921 RestoreReg <AX,SI,DI> ; restore regs ;AN000;
1922 ;AN000;
1923 return ;AN000;
1924 ;AN000;
1925 EndProc DFL_TO_DF ;AN000;
1926 ;AN000;
1927 ;AN000;
1928 BREAK <DF_TO_DFL -- Convert DF to DFL> ;AN000;
1929 ;AN000;
1930 ;************************************************************************************ ;AN000;
1931 ; ;AN000;
1932 ; DF_TO_DFL ;AN000;
1933 ; ;AN000;
1934 ; Inputs: ;AN000;
1935 ; [THISDFL] set ;AN000;
1936 ; Function: ;AN000;
1937 ; Update DFL with DF ;AN000;
1938 ; DFL_DEV_NAME = DF_DEV_NAME ;AN000;
1939 ; DFL_FSDA = DF_FSDA ;AN000;
1940 ; Outputs: ;AN000;
1941 ; DFL updated ;AN000;
1942 ; ;AN000;
1943 ; notes: all regs preserved ;AN000;
1944 ; ;AN000;
1945 ;************************************************************************************ ;AN000;
1946 ;AN000;
1947 procedure DF_TO_DFL,NEAR ;AN000;
1948 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1949 ;AN000;
1950 SaveReg <ES,DI,DS,SI> ; save regs ;AN000;
1951 ;AN000;
1952 LES DI,[THISDFL] ; esdi -> dfl ;AN000;
1953 PUSH CS ;AN000;
1954 POP DS ;AN000;
1955 ASSUME DS:IFSSEG ;AN000;
1956 MOV SI,OFFSET DF1 ; dssi -> df ;AN000;
1957 ;AN000;
1958 INC SI ; space si,di to dev_name ;AN000;
1959 INC SI ;AN000;
1960 PUSH DI ;AN000;
1961 ADD DI,DFL_DEV_NAME ;AN000;
1962 MOV CX,8 ;AN000;
1963 REP MOVSB ; update dfl_dev_name for some reason ;AN000;
1964 ;AN000;
1965 POP DI ;AN000;
1966 ADD DI,DFL_FSDA ;AN000;
1967 MOV CX,SIZE DFL_FSDA ;AN000;
1968 REP MOVSB ; update dfl_fsda ;AN000;
1969 ;AN000;
1970 RestoreReg <SI,DS,DI,ES> ; restore regs ;AN000;
1971 ;AN000;
1972 return ;AN000;
1973 ;AN000;
1974 EndProc DF_TO_DFL ;AN000;
1975 ;AN000;
1976 ;AN000;
1977 BREAK <CONSIST_SFT -- Make SFT caches consistent with state of IFSFUNC> ;AN000;
1978 ;AN000;
1979 ;************************************************************************************ ;AN000;
1980 ; ;AN000;
1981 ; CONSIST_SFT ;AN000;
1982 ; ;AN000;
1983 ; Inputs: ;AN000;
1984 ; None ;AN000;
1985 ; ;AN000;
1986 ; Function: ;AN000;
1987 ; Make sure all device SFTs are consistent with current IFSFUNC state ;AN000;
1988 ; ;AN000;
1989 ; Outputs: ;AN000;
1990 ; None ;AN000;
1991 ; ;AN000;
1992 ; Regs: DS,ES,SI,DI preserved others destroyed ;AN000;
1993 ; ;AN000;
1994 ;************************************************************************************ ;AN000;
1995 ;AN000;
1996 procedure CONSIST_SFT,NEAR ;AN000;
1997 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1998 ;AN000;
1999 CMP CS:[DFLCount],0 ; if no dfl, forget it ;AN022;
2000 JE CS_20
2001 SaveReg <DS,SI,ES,DI> ;AN000;
2002 CLI ; This scan of the SFT tables is ;AN000;
2003 ; a critical section we must protect ;AN000;
2004 ; with CLI and STI as CritNET must ;AN000;
2005 ; be disjoint from all other critical ;AN000;
2006 ; sections ;AN000;
2007 LDS SI,[SFTFCB] ;AN000;
2008 ASSUME DS:NOTHING ;AN000;
2009 MOV CX,[SI].sfCount ;AN000;
2010 LEA SI,[SI].sfTable ;AN000;
2011 JCXZ DONE_LOOK_FCB ;AN000;
2012 CALL LOOK_FIX ;AN000;
2013 DONE_LOOK_FCB: ;AN000;
2014 LDS SI,[SFT_Addr] ; get pointer to beginning of table ;AN000;
2015 ScanLoop: ;AN000;
2016 MOV CX,[SI].SFCount ;AN000;
2017 PUSH DS ;AN000;
2018 PUSH SI ;AN000;
2019 LEA SI,[SI].sfTable ;AN000;
2020 CALL LOOK_FIX ;AN000;
2021 POP SI ;AN000;
2022 POP DS ;AN000;
2023 LDS SI,[SI].SFLink ; get next table segment ;AN000;
2024 CMP SI,-1 ; end of tables? ;AN000;
2025 JNZ ScanLoop ; no, try again ;AN000;
2026 STI ;AN000;
2027 RestoreReg <DI,ES,SI,DS> ;AN000;
2028 CS_20:
2029 return ;AN000;
2030 ;AN000;
2031 LOOK_FIX: ;AN000;
2032 CMP [SI].sf_ref_count,0 ;AN000;
2033 JZ NEXT_SFT ; Ignore Free ones ;AN000;
2034 TEST [SI].sf_flags,devid_device ;AN000;
2035 JZ NEXT_SFT ; Only look at device SFTs ;AN000;
2036 TEST [SI].sf_flags,sf_isnet
2037 ;AN000;
2038 PUSH CX ; sft loop count ;AN000;
2039 PUSH DS ; sft ptr ;AN000;
2040 PUSH SI ;AN000;
2041 PUSHF ; Save result of above TEST ;AN000;
2042 ADD SI,sf_name ; put asciiz form of sf_name in tempbuf ;AN000;
2043 PUSH CS ; to call dfl_match with ;AN000;
2044 POP ES ;AN000;
2045 MOV DI,OFFSET TEMPBUF ;AN000;
2046 CALL CONVERT_NAME_ASCIIZ ;AN000;
2047 PUSH CS ;AN000;
2048 POP DS ;AN000;
2049 MOV SI,DI ;AN000;
2050 CALL DFL_MATCH ; is this sft attached? cf1-no,cf0-yes ;AN000;
2051 JC NOT_R_DEV ;AN000;
2052 PUSH CS ; IS ATTACHED - recover test for sf_isnet ;AN000;
2053 CALL PIRET ;AN000;
2054 JNZ NOT_REDIR ; jmp if marked attached - ok ;AN000;
2055 ; [THISDFL] dfl entry ;AN000;
2056 ; (TOS+2):(TOS) -> SFT ;AN000;
2057 ; (TOS+4) = CX loop count ;AN000;
2058 ; Not marked attached, but should & will be ;AN000;
2059 LES DI,[THISDFL] ;AN000;
2060 POP SI ;AN000;
2061 POP DS ; DS:SI -> SFT ;AN000;
2062 MOV AX,WORD PTR [SI.sf_devptr+2] ; save original devptr ;AN031;
2063 MOV WORD PTR ES:[DI.DFLL_DEVPTR+2],AX ;AN031;
2064 MOV AX,WORD PTR [SI.sf_devptr] ;AN031;
2065 MOV WORD PTR ES:[DI.DFLL_DEVPTR],AX ;AN031;
2066 MOV WORD PTR [SI.sf_devptr+2],ES ;AC027;
2067 MOV WORD PTR [SI.sf_devptr],DI ;AC027;
2068 MOV AX,WORD PTR ES:[DI.DFL_FSDA] ; put dfl fsda into sft fsda ;AN027;
2069 MOV WORD PTR [SI.sf_cluspos],AX ;AN027;
2070 MOV AX,WORD PTR ES:[DI.DFL_FSDA+2] ;AN027;
2071 MOV WORD PTR [SI.sf_dirsec],AX ;AN027;
2072 MOV AX,WORD PTR ES:[DI.DFL_FSDA+4] ;AN027;
2073 MOV WORD PTR [SI.sf_dirsec+2],AX ;AN027;
2074 MOV AX,WORD PTR ES:[DI.DFL_FSDA+6] ;AN027;
2075 MOV WORD PTR [SI.sf_lstclus],AX ;AN027;
2076 OR [SI.sf_flags],sf_isnet + sf_net_spool ; Turn on bits ;AC027;
2077 JMP SHORT CLEAN_CX ;AN000;
2078 ;AN000;
2079 PIRET: ;AN000;
2080 IRET ;AN000;
2081 ;AN000;
2082 NOT_R_DEV: ;AN000;
2083 PUSH CS ; NOT ATTACHED - recover test for sf_isnet ;AN000;
2084 CALL PIRET ;AN000;
2085 JNZ UNDO_BITS ; jmp if marked attached - problem ;AN000;
2086 NOT_REDIR: ;AN000;
2087 POP SI ;AN000;
2088 POP DS ;AN000;
2089 CLEAN_CX: ;AN000;
2090 POP CX ;AN000;
2091 NEXT_SFT: ;AN000;
2092 ADD SI,size sf_entry ;AN000;
2093 LOOP LOOK_FIX ;AN000;
2094 return ;AN000;
2095 ;AN000;
2096 ; [THISDFL] dfl entry ;AN000;
2097 ; (TOS+2):(TOS) -> SFT ;AN000;
2098 ; (TOS+4) = CX loop count ;AN000;
2099 UNDO_BITS: ; device not attached, but marked so ;AN000;
2100 POP SI ; unmark it, restore original devptr ;AN000;
2101 POP DS ; DS:SI -> SFT ;AN000;
2102 AND [SI.sf_flags],NOT (sf_isnet + sf_net_spool) ; Turn off bits ;AN000;
2103 MOV ES,WORD PTR [SI.sf_devptr+2] ; set esdi -> dfl ;AN031;
2104 MOV DI,WORD PTR [SI.sf_devptr] ;AN031;
2105 MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR+2] ; restore original devptr ;AN031;
2106 MOV WORD PTR [SI.sf_devptr+2],AX ;AN031;
2107 MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR] ;AN031;
2108 MOV WORD PTR [SI.sf_devptr],AX ;AN031;
2109 JMP SHORT CLEAN_CX ;AN000;
2110 ;AN000;
2111 EndProc CONSIST_SFT ;AN000;
2112 ;AN000;
2113 ;AN000;
2114 BREAK <CONSIST_DFL -- Reset all DFL in_prog flags> ;AN000;
2115 ;AN000;
2116 ;************************************************************************************ ;AN000;
2117 ; ;AN000;
2118 ; CONSIST_DFL ;AN000;
2119 ; ;AN000;
2120 ; Inputs: ;AN000;
2121 ; DS:SI -> 1st DFL entry ;AN000;
2122 ; CX = DFLCount ;AN000;
2123 ; Function: ;AN000;
2124 ; Set all dfl_inprog flags to zero ;AN000;
2125 ; Outputs: ;AN000;
2126 ; dfl_inprog flags all zero ;AN000;
2127 ; ;AN000;
2128 ; notes: all regs preserved ;AN000;
2129 ; ;AN000;
2130 ;************************************************************************************ ;AN000;
2131 ;AN000;
2132 procedure CONSIST_DFL,NEAR ;AN000;
2133 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2134 ;AN000;
2135 SaveReg <SI,DX,CX> ;AC023;
2136 MOV DX,SIZE DFLL_LIST ;AN000;
2137 CD_20: ; reset loop ;AN000;
2138 AND BYTE PTR DS:[SI],NOT DFL_INPROG ;AN000;
2139 ADD SI,DX ;AN000;
2140 LOOP CD_20 ;AN000;
2141 ;AN000;
2142 RestoreReg <CX,DX,SI> ;AC023;
2143 return ;AN000;
2144 ;AN000;
2145 EndProc CONSIST_DFL ;AN000;
2146
2147
2148 BREAK <PRN_CHECK -- change PRN to LPT1>
2149
2150 ;************************************************************************************
2151 ;
2152 ; PRN_CHECK
2153 ;
2154 ; Inputs:
2155 ; DS -> IFSSEG
2156 ; SI -> asciiz canonicalized device name
2157 ; Function:
2158 ; IF DSSI-> "PRN",0 THEN
2159 ; Set SI -> LPT1_NAME
2160 ; ENDIF
2161 ; Outputs:
2162 ; SI possibly Revised
2163 ;
2164 ; notes: all but si preserved
2165 ;
2166 ;************************************************************************************
2167
2168 procedure PRN_CHECK,NEAR ;AN012;
2169 ASSUME DS:IFSSEG,ES:NOTHING ;AN012;
2170
2171 SaveReg <ES,DI,AX,CS> ;AN012;;AC014;
2172 RestoreReg <ES> ;AN012;
2173 MOV DI,OFFSET PRN_NAME ;AN012;
2174 SaveReg <SI> ;AN012;
2175 CallInstall StrCmp,MultDOS,30 ;AN012;
2176 RestoreReg <SI> ;AN012;
2177 JNZ PC_20 ;AN012;
2178 MOV SI,OFFSET LPT1_NAME ;AN012;
2179 PC_20: ;AN012;
2180 RestoreReg <AX,DI,ES> ;AN012;;AC014;
2181 return ;AN012;
2182
2183 EndProc PRN_CHECK ;AN012;
2184
2185
2186 BREAK <CHECK_REAL_DEVICE -- Match dfl_dev_name to real device> ;AN000;
2187 ;AN000;
2188 ;************************************************************************************
2189 ;
2190 ; CHECK_REAL_DEVICE
2191 ;
2192 ; Inputs:
2193 ; DS:SI -> DFL entry
2194 ;
2195 ; Function:
2196 ; Match device name to device driver chain names
2197 ; IF match found
2198 ; set dfl_dev_real
2199 ; IF device name = "prn" THEN
2200 ; set to "LPT1"
2201 ; Outputs:
2202 ; dfl_dev_real set
2203 ; device name changed to "LPT1" if "PRN"
2204 ;
2205 ; Regs: AX,CX destroyed. All others preserved.
2206 ;
2207 ;************************************************************************************
2208 ;AN000;
2209 procedure CHECK_REAL_DEVICE,NEAR ;AN000;
2210 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2211 ;AN000;
2212 SaveReg <ES,DI,DS,SI,CS> ;AN000;
2213 RestoreReg <ES> ;AN000;
2214 ASSUME ES:IFSSEG ;AN000;
2215 MOV DI,OFFSET TEMPBUF+10 ; esdi-> tempbuf+10 ;AN000;
2216 ADD SI,DFL_DEV_NAME ; dssi -> dfl_dev_name ;AN000;
2217 CALL CONVERT_NAME_ASCIIZ ; asciiz form of dfl_dev_name ;AN000;
2218 ; at tempbuf+10 ;AN000;
2219 ; Use this to match real devnames ;AN000;
2220 ;AN000;
2221 Context DS ; get addressability to dosgroup ;AN000;
2222 ; to access device driver chain ;AN000;
2223 LDS SI,NULDEV ; dssi -> real device driver chain ;AN000;
2224 CRD_20: ; <<< matching loop on dev drvrs >>> ;AN000;
2225 SaveReg <DS,SI> ;AN000;
2226 ADD SI,SDEVNAME ; dssi -> real dev name ;AN000;
2227 MOV DI,OFFSET TEMPBUF ;AN000;
2228 CALL CONVERT_NAME_ASCIIZ ;AN000;
2229 SaveReg <ES> ;AN000;
2230 RestoreReg <DS> ;AN000;
2231 MOV SI,DI ; dssi -> tempbuf (real) ;AN000;
2232 ADD DI,10 ; esdi -> tempbuf+10 (dfl) ;AN000;
2233 CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000;
2234 RestoreReg <SI,DS> ; device driver chain ;AN000;
2235 JZ CRD_40 ;AN000;
2236 LDS SI,DS:[SI.SDEVNEXT] ;AN000;
2237 CMP SI,NULL_PTR ;AN000;
2238 JNE CRD_20 ;AN000;
2239 ;;;;;;;;SaveReg <DS> ; only offset null ;AD022;
2240 ; RestoreReg <AX> ;AD022;
2241 ; CMP AX,NULL_PTR ;AD022;
2242 ;;;;;;;;JNE CRD_20 ;AD022;
2243 RestoreReg <SI,DS> ; dfl entry ;AN000;
2244 JMP SHORT CRD_100 ; go check "prn" ;AN000;
2245 ;AN000;
2246 CRD_40: ; match found ;AN000;
2247 RestoreReg <SI,DS> ; dfl entry ;AN000;
2248 OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000;
2249 ;AN000;
2250 CRD_100: ;AN000;
2251 SaveReg <DS,SI> ; dfl entry ;AN000;
2252 SaveReg <CS> ;AN000;
2253 RestoreReg <DS> ;AN000;
2254 ASSUME DS:IFSSEG ;AN000;
2255 MOV SI,OFFSET PRN_NAME ; ds:si -> "prn",0 ;AN000;
2256 ; es:di -> tempbuf+10 (dfl) ;AN000;
2257 CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000;
2258 RestoreReg <SI,DS> ; dfl entry ;AN000;
2259 JNZ CRD_120 ;AN000;
2260 ; prn match ;AN000;
2261 CALL XCHGP ; after call: ds ifsseg ;AN000;
2262 ; esdi->dfl entry ;AN000;
2263 ASSUME DS:IFSSEG ;AN000;
2264 MOV SI,OFFSET LPT1_NAME ;AN000;
2265 SaveReg <ES,DI> ; dfl entry offset ;AN000;
2266 ADD DI,DFL_DEV_NAME ; make dfl_dev_name = "LPT1 " ;AN000;
2267 MOV CX,4 ;AN000;
2268 REP MOVSB ;AN000;
2269 RestoreReg <SI,DS> ; dfl entry offset ;AN000;
2270 OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN022;
2271 ;AN000;
2272 CRD_120: ;AN000;
2273 RestoreReg <DI,ES> ; restore es,di ;AN000;
2274 return ;AN000;
2275 ;AN000;
2276 EndProc CHECK_REAL_DEVICE ;AN000;
2277 ;AN000;
2278 ;AN000;
2279 Break <XCHGP - exchange source and destination pointers> ;AN000;
2280 ;AN000;
2281 ;************************************************************************************ ;AN000;
2282 ; ;AN000;
2283 ; XCHGP ;AN000;
2284 ; ;AN000;
2285 ; Inputs: ;AN000;
2286 ; DS:SI & ES:DI ;AN000;
2287 ; Function: ;AN000;
2288 ; Swap ds:si with es:di ;AN000;
2289 ; Outputs: ;AN000;
2290 ; ds<=>es, si<=>di ;AN000;
2291 ; ;AN000;
2292 ; notes: all preserved ;AN000;
2293 ; ;AN000;
2294 ;************************************************************************************ ;AN000;
2295 ;AN000;
2296 Procedure XCHGP,NEAR ;AN000;
2297 SaveReg <DS,ES> ;AN000;
2298 RestoreReg <DS,ES> ;AN000;
2299 XCHG SI,DI ;AN000;
2300 return ;AN000;
2301 EndProc XCHGP ;AN000;
2302 ;AN000;
2303 ;AN000;
2304 Break <IFSDrvFromCDS - convert an offset to a CDS into the 0-based drive> ;AN000;
2305 ;AN000;
2306 ;************************************************************************************ ;AN000;
2307 ; ;AN000;
2308 ; IFSDrvFromCDS - convert an offset to a CDS into a 0-based drive number. ;AN000;
2309 ; Sets IFSDrv also. ;AN000;
2310 ; ;AN000;
2311 ; Inputs: AX contains offset from the beginning of CDSAddr ;AN000;
2312 ; Outputs: AL contains the 0-based drive number ;AN000;
2313 ; IFSDrv is set ;AN000;
2314 ; Registers Revised: AH, BL ;AN000;
2315 ; ;AN000;
2316 ;************************************************************************************ ;AN000;
2317 ;AN000;
2318 Procedure IFSDrvFromCDS,NEAR ;AN000;
2319 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2320 SUB AX,WORD PTR [CDSADDR] ; AX is offset of THISCDS ;AN000;
2321 MOV BL,SIZE CurDir_list ; size in convenient spot ;AN000;
2322 DIV BL ; get drive number ;AN000;
2323 MOV CS:[IFSDRV],AL ;AN000;
2324 return ;AN000;
2325 EndProc IFSDrvFromCDS ;AN000;
2326 ;AN000;
2327 ;AN000;
2328 Break <SET_THISIFS_UNC - put UNC_FS_HDR into [THISIFS]> ;AN000;
2329 ;AN000;
2330 ;************************************************************************************ ;AN000;
2331 ; ;AN000;
2332 ; SET_THISIFS_UNC ;AN000;
2333 ; ;AN000;
2334 ; Inputs: DS - IFSSEG, UNC_FS_HDR set ;AN000;
2335 ; Outputs: [THISIFS] = UNC_FS_HDR ;AN000;
2336 ; ;AN000;
2337 ; Registers Revised: none ;AN000;
2338 ; ;AN000;
2339 ;************************************************************************************ ;AN000;
2340 ;AN000;
2341 Procedure SET_THISIFS_UNC,NEAR ;AN000;
2342 MOV AX,CS:WORD PTR [UNC_FS_HDR] ;AN000;
2343 MOV CS:WORD PTR [THISIFS],AX ;AN000;
2344 MOV AX,CS:WORD PTR [UNC_FS_HDR+2] ;AN000;
2345 MOV CS:WORD PTR [THISIFS+2],AX ;AN000;
2346 return ;AN000;
2347 EndProc SET_THISIFS_UNC ;AN000;
2348 ;AN000;
2349 ;AN000;
2350 Break <SET_CATEGORY - set category for ifs dependent ioctl request> ;AN000;
2351 ;AN000;
2352 ;************************************************************************************
2353 ;
2354 ; SET_CATEGORY
2355 ;
2356 ; Inputs: DS - IFSSEG, ES:BX -> IFSR, THISIFS set
2357 ; Outputs: CL set to 1 for unc fs, 0 otherwize
2358 ;
2359 ; Registers Revised: CX
2360 ;
2361 ;************************************************************************************
2362 ;AN000;
2363 Procedure SET_CATEGORY,NEAR ;AN000;
2364 SaveReg <AX> ; preserve used regs ;AN000;
2365 XOR CH,CH ;AN000;
2366 MOV CL,CATEGORY_FS ; set category: 0 - non-UNC ;AN000;
2367 TEST IFSFUNC_FLAGS,UNC_INSTALLED ; check if unc fs installed ;AN000;
2368 JZ SC_20 ; no unc - go set category to fs ;AN000;
2369 MOV AX,WORD PTR [THISIFS] ; now must check if thisifs=unc ;AN000;
2370 CMP AX,WORD PTR [UNC_FS_HDR] ;AN000;
2371 JNE SC_20 ;AN000;
2372 MOV AX,WORD PTR [THISIFS+2] ;AN000;
2373 CMP AX,WORD PTR [UNC_FS_HDR+2] ;AN000;
2374 JNE SC_20 ;AN000;
2375 INC CL ; is unc - inc category to 1=unc ;AN000;
2376 SC_20: ;AN000;
2377 RestoreReg <AX> ;AN000;
2378 return ;AN000;
2379 EndProc SET_CATEGORY ;AN000;
2380 ;AN000;
2381 ;AN000;
2382 Break <SET_DEPIOCTL_IFSR - set length,function,apifunc,func ifsr fields> ;AN000;
2383 ;AN000;
2384 ;************************************************************************************ ;AN000;
2385 ; ;AN000;
2386 ; SET_DEPIOCTL_IFSR ;AN000;
2387 ; ;AN000;
2388 ; Inputs: ES:BX -> IFSR
2389 ; Outputs: IFSR_LENGTH, IFSR_FUNCTION, IFSR_APIFUNC, IFSR_FUNC set ;AN000;
2390 ; ;AN000;
2391 ; Registers Revised: none ;AN000;
2392 ; ;AN000;
2393 ;************************************************************************************ ;AN000;
2394 ;AN000;
2395 Procedure SET_DEPIOCTL_IFSR,NEAR ;AN000;
2396 ifsr_fcn_def EXECAPI ;AN000;
2397 ifsr_api_def DEPIOCTL ;AN000;
2398 MOV ES:[BX.IFSR_LENGTH],LENGTH_DEPIOCTL ;AN000;
2399 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
2400 MOV ES:[BX.IFSR_APIFUNC],IFSDEPIOCTL ;AN000;
2401 MOV ES:[BX.IFSR_FUNC],GEN_IOCTL_BY_DEVNUM ;AN000;
2402 return ;AN000;
2403 EndProc SET_DEPIOCTL_IFSR ;AN000;
2404 ;AN000;
2405
2406 Break <GET_UNC_FS_NAME - put UNC ifs driver name into esdi> ;AN000;
2407 ;AN000;
2408 ;************************************************************************************ ;AN000;
2409 ; ;AN000;
2410 ; GET_UNC_FS_NAME ;AN000;
2411 ; ;AN000;
2412 ; Inputs:
2413 ; ES:DI -> BUFFER ;AN000;
2414 ; ;AN000;
2415 ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000;
2416 ; ;AN000;
2417 ; Registers Revised: none ;AN000;
2418 ; ;AN000;
2419 ;************************************************************************************ ;AN000;
2420 ;AN000;
2421 Procedure GET_UNC_FS_NAME,NEAR ;AN000;
2422 ;AN000;
2423 SaveReg <DS,SI,DI>
2424 LDS SI,CS:UNC_FS_HDR
2425 CALL MOVE_DRIVER_NAME
2426 RestoreReg <DI,SI,DS> ;AN000;
2427 return ;AN000;
2428 EndProc GET_UNC_FS_NAME ;AN000;
2429
2430 ;AN000;
2431 Break <MOVE_DRIVER_NAME - put ifs driver name into esdi> ;AN000;
2432 ;AN000;
2433 ;************************************************************************************ ;AN000;
2434 ; ;AN000;
2435 ; MOVE_DRIVER_NAME ;AN000;
2436 ; ;AN000;
2437 ; Inputs: DS:SI -> IFS DRIVER ;AN000;
2438 ; ES:DI -> BUFFER ;AN000;
2439 ; ;AN000;
2440 ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000;
2441 ; ;AN000;
2442 ; Registers Revised: SI,DI ;AN000;
2443 ; ;AN000;
2444 ;************************************************************************************ ;AN000;
2445 ;AN000;
2446 Procedure MOVE_DRIVER_NAME,NEAR ;AN000;
2447 ;AN000;
2448 ADD SI,IFS_NAME ; space to name in ifs hdr ;AN000;
2449 MOV CX,8 ;AN000;
2450 MDN_20: ; move name into buffer ;AN000;
2451 LODSB ; move till 1st space or 8 chars ;AN000;
2452 CMP AL," " ; then add 0 ;AN000;
2453 JE MDN_40 ;AN000;
2454 STOSB ;AN000;
2455 LOOP MDN_20 ;AN000;
2456 MDN_40: ;AN000;
2457 XOR AL,AL ;AN000;
2458 STOSB ;AN000;
2459 ;AN000;
2460 return ;AN000;
2461 EndProc MOVE_DRIVER_NAME ;AN000;
2462 ;AN000;
2463 ;AN000;
2464 Break <CONVERT_NAME_ASCIIZ - put name into buffer in asciiz form> ;AN000;
2465
2466 ;************************************************************************************
2467 ;
2468 ; CONVERT_NAME_ASCIIZ
2469 ;
2470 ; Inputs: DS:SI -> NAME
2471 ; ES:DI -> BUFFER
2472 ;
2473 ; Outputs: Buffer contains asciiz form of name
2474 ;
2475 ; Regs: All but SI preserved
2476 ;
2477 ;************************************************************************************
2478
2479 Procedure CONVERT_NAME_ASCIIZ,NEAR ;AN000;
2480 SaveReg <DI,AX> ; esdi buffer offset ;AC014;
2481 CLD ; store name in asciiz format ;AN000;
2482 MOV CX,8 ; in esdi buffer ;AN000;
2483 CNA_20: ;AN000;
2484 LODSB ;AN000;
2485 CMP AL," " ;AN000;
2486 JE CNA_40 ;AN000;
2487 STOSB ;AN000;
2488 LOOP CNA_20 ;AN000;
2489 CNA_40: ;AN000;
2490 XOR AL,AL ;AN000;
2491 STOSB ;AN000;
2492 ;AN000;
2493 RestoreReg <AX,DI> ; esdi buffer offset ;AC014;
2494 ;AN000;
2495 return ;AN000;
2496 ;AN000;
2497 EndProc CONVERT_NAME_ASCIIZ ;AN000;
2498 ;AN000;
2499 ;AN000;
2500 Break <CHECK_SEQ - check for unc vs ifs device> ;AN000;
2501 ;AN000;
2502 ;************************************************************************************
2503 ;
2504 ; CHECK_SEQ
2505 ;
2506 ; Inputs: [THISCDS],[THISDFL]
2507 ; DS - dosgroup
2508 ;
2509 ; Function: Check whether function has device_cb@ associated with it.
2510 ; (Rule out deviceless attach function)
2511 ;
2512 ; Outputs: cf = 0 seq (deviceless)
2513 ; cf = 1 device
2514 ;
2515 ; Registers Revised: none
2516 ;
2517 ;************************************************************************************
2518
2519 Procedure CHECK_SEQ,NEAR ;AN000;
2520 ASSUME DS:DOSGROUP ;AN000;
2521 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2522 ; SaveReg <SI,AX> ; ;AD007;
2523 ; MOV SI,[WFP_START] ; ;AD007;
2524 ; LODSW ; ;AD007;
2525 ; CMP AX,"\\" ; ;AD007;
2526 ; JE CS_10 ; ;AD007;
2527 ; STC ; ;AD007;
2528 ; JMP SHORT CS_20 ; ;AD007;
2529 ;S_10: ; ;AD007;
2530 ; CLC ; ;AD007;
2531 ; ; ;AD007;
2532 ;S_20: ; ;AD007;
2533 ; RestoreReg <AX,SI> ; ;AD007;
2534 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2535 SaveReg <DS,SI> ; save used regs ;AN007;
2536 LDS SI,[THISCDS] ; check for cds ;AN007;
2537 CMP SI,NULL_PTR ;AN007;
2538 JNE CS_10 ;AN007;
2539 LDS SI,CS:[THISDFL] ; no cds, check dfl ;AN007;
2540 CMP SI,NULL_PTR ;AN007;
2541 JNE CS_10 ;AN007;
2542 CLC ; no cds, no dfl - is deviceless - clear carry ;AN007;
2543 JMP SHORT CS_1000 ;AN007;
2544 ;AN007;
2545 CS_10: ;AN007;
2546 STC ; has device - set carry ;AN007;
2547 ;AN007;
2548 CS_1000: ;AN007;
2549 RestoreReg <SI,DS> ; restore used regs ;AN007;
2550 return ;AN000;
2551 ;AN000;
2552 EndProc CHECK_SEQ ;AN000;
2553 ;AN000;
2554 ;AN000;
2555 Break <INIT_DFL - zero out dfl entry> ;AN000;
2556 ;AN000;
2557 ;************************************************************************************ ;AN000;
2558 ; ;AN000;
2559 ; INIT_DFL ;AN000;
2560 ; ;AN000;
2561 ; Inputs: DS:SI -> dfl entry ;AN000;
2562 ; ;AN000;
2563 ; Outputs: dfl entry zeroed out ;AN000;
2564 ; ;AN000;
2565 ; Registers Revised: none ;AN000;
2566 ; ;AN000;
2567 ;************************************************************************************ ;AN000;
2568 ;AN000;
2569 Procedure INIT_DFL,NEAR ;AN000;
2570 SaveReg <ES,DI,AX,CX,DS> ;AN000;
2571 RestoreReg <ES> ;AN000;
2572 MOV DI,SI ;AN000;
2573 MOV CX,SIZE DFLL_LIST / 2 ;AN000;
2574 XOR AX,AX ;AN000;
2575 CLD ;AN000;
2576 REP STOSW ;AN000;
2577 RestoreReg <CX,AX,DI,ES> ;AN000;
2578 ;AN000;
2579 return ;AN000;
2580 ;AN000;
2581 EndProc INIT_DFL ;AN000;
2582 ;AN000;
2583 ;AN000;
2584 BREAK <NET_TRANS -- A Routine which does NAMETRANS on session start strings> ;AN000;
2585 ;AN000;
2586 ;************************************************************************************ ;AN000;
2587 ; ;AN000;
2588 ; NET_TRANS ;AN000;
2589 ; ;AN000;
2590 ; Inputs: ;AN000;
2591 ; ES:DI -> Double string session start string for blockredir ;AC001;
2592 ; or printerredir. ;AN000;
2593 ; ;AN000;
2594 ; Function: ;AN000;
2595 ; Perform NAMETRANS DOS function on the connect part of the string ;AN000;
2596 ; ;AN000;
2597 ; Outputs: ;AN000;
2598 ; ES:DI points to NAMETRANSed REDIR string ;AC001;
2599 ; password, or extra 0, appended at end of string ;AC001;
2600 ; ;AN000;
2601 ; Registers Revised: ;AN000;
2602 ; ES,DI Revised, others preserved ;AC001;
2603 ; ;AN000;
2604 ;************************************************************************************ ;AN000;
2605 ;AN000;
2606 procedure NET_TRANS,NEAR ;AN000;
2607 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2608 ;AN000;
2609 SaveReg <DS,SI,AX,BX> ;AC001;
2610 ;AN000;
2611 SaveReg <ES> ; set ds:si -> string ;AN001;
2612 RestoreReg <DS> ; for nametrans input ;AN001;
2613 MOV SI,DI ;AN001;
2614
2615 PUSH CS ;AN000;
2616 POP ES ;AN000;
2617 MOV DI,OFFSET NET_TRANS_BUFFER ; name transed string will be placed ;AC013;
2618 ; in temporary buffer
2619 SaveReg <DI,DS,SI> ; $NAMETRANS zaps these ;AC013;
2620 CallInstall $Nametrans,MultDOS,33 ;AN000;
2621 RestoreReg <SI,DS> ;AN000;
2622 JNC NT_20 ;AN023;
2623 RestoreReg <DI> ; nametrans error - set carry & exit ;AN023;
2624 JMP SHORT NT_60 ;AN023;
2625
2626 ; dssi -> input target string
2627 NT_20: ; esdi -> nametrans version in nettranbuf;AC001;;AC013;
2628 LODSB ; move password or zero ;AC001;
2629 OR AL,AL ;AC001;
2630 JNZ NT_20 ; skip to password (or zero) ;AC001;
2631 ;;;;;;;;MOV DI,OFFSET TEMPBUF ; no need for this; ;AC001;;AD013;
2632 ; SaveReg <DI> ; nametrans already does it; ;AC001;;AD013;
2633 ;NT_40: ; ;AC001;;AD013;
2634 ; MOV AL,BYTE PTR ES:[DI] ; ;AC001;;AD013;
2635 ; INC DI ; ;AC001;;AD013;
2636 ; OR AL,AL ; ;AC001;;AD013;
2637 ;;;;;;;;;JNZ NT_40 ; Skip first part; ;AD013;
2638 CallInstall StrCpy,MultDOS,17 ; Copy password string ;AC001;
2639 RestoreReg <DI> ;AC001;
2640 CLC ;AN023;
2641 NT_60: ;AN023;
2642 RestoreReg <BX,AX,SI,DS> ;AC001;
2643 ;AN001;
2644 return ;AN000;
2645 ;AN000;
2646 EndProc NET_TRANS ;AN000;
2647 ;AN000;
2648
2649 Break <STRIP_WFP_START - strip leading d:\ > ;AN000;
2650 ;AN000;
2651 ;************************************************************************************ ;AN000;
2652 ; ;AN000;
2653 ; STRIP_WFP_START ;AN000;
2654 ;
2655 ; Called by: IFS_SEARCH_FIRST
2656 ; ;AN000;
2657 ; Inputs: DS:SI -> WFP_START ;AN000;
2658 ; ;AN000;
2659 ; Outputs: none ;AN000;
2660 ; ;AN000;
2661 ; Registers Revised: none ;AN000;
2662 ; ;AN000;
2663 ;************************************************************************************ ;AN000;
2664 ;AN000;
2665 Procedure STRIP_WFP_START,NEAR ;AN000;
2666 ;AN000;
2667 CMP BYTE PTR DS:[SI+1],":" ;AN000;
2668 JNE SW_1000 ;AN000;
2669 ADD SI,2 ;AN000;
2670 CMP BYTE PTR DS:[SI],"\" ;AN000;
2671 JE SW_20 ;AN000;
2672 CMP BYTE PTR DS:[SI],"/" ;AN000;
2673 JNE SW_1000 ;AN000;
2674 SW_20: ;AN000;
2675 INC SI ;AN000;
2676 ;AN000;
2677 SW_1000: ;AN000;
2678 return ;AN000;
2679 ;AN000;
2680 EndProc STRIP_WFP_START ;AN000;
2681
2682
2683 Break <CHECK_IFS_ATTRIBUTE - check if fs supports function in DX>
2684
2685 ;************************************************************************************
2686 ;
2687 ; CHECK_IFS_ATTRIBUTE
2688 ;
2689 ; Called by: IFS_DEPENDENT_IOCTL
2690 ;
2691 ; Inputs: DX = ifs_attribute equate
2692 ;
2693 ; Outputs: ZF = attribute not supported
2694 ; NZ = attribute supported
2695 ;
2696 ; Registers Revised: none
2697 ;
2698 ;************************************************************************************
2699 ;AN000;
2700 Procedure CHECK_IFS_ATTRIBUTE,NEAR ;AN000;
2701 ;AN000;
2702 SaveReg <ES,DI>
2703
2704 LES DI,[THISIFS] ; esdi -> ifs header
2705 TEST ES:[DI.IFS_ATTRIBUTE],DX ; test attribute
2706
2707 RestoreReg <DI,ES>
2708 ;AN000;
2709 return ;AN000;
2710 ;AN000;
2711 EndProc CHECK_IFS_ATTRIBUTE ;AN000;
2712
2713
2714 Break <CHECK_IFS_SUPPORT - check if IFS supports request>
2715
2716 ;************************************************************************************
2717 ;
2718 ; CHECK_IFS_SUPPORT
2719 ;
2720 ; Called by: CALL_IFS
2721 ;
2722 ; Inputs: TBD
2723 ;
2724 ; Outputs: TBD
2725 ;
2726 ;
2727 ; Registers Revised: TBD
2728 ;
2729 ;************************************************************************************
2730 ;AN000;
2731 Procedure CHECK_IFS_SUPPORT,NEAR ;AN000;
2732
2733 return ;AN010;
2734
2735 EndProc CHECK_IFS_SUPPORT ;AN010;
2736
2737 ;AN000;
2738 IFSSEG ENDS ;AN000;
2739 END ;AN000;