1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsutil.asm 1.0 87/05/05 ;AN000;
3 TITLE IFSFUNC UTILITY ROUTINES
- Routines for IFSFUNC
;AN000;
5 ;************************************************************************************ ;AN000;
7 ; Miscellaneous routines ;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;
17 ; CREATE_DFL_ENTRY ;AN000;
18 ;;;alias ENTER_NAMES_LIST ;AN000;
19 ; DELETE_DFL_ENTRY ;AN000;
20 ;;;alias EXIT_NAMES_LIST ;AN000;
22 ; DFL_SINGLE_FILE_CHECK ;AN000;
23 ;;;alias PROCESS_ALIAS ;AN000;
34 ; IFSDrvFromCDS ;AN000;
35 ; SET_THISIFS_UNC ;AN000;
36 ; SET_CATEGORY ;AN000;
37 ; SET_DEPIOCTL_IFSR ;AN000;
39 ; MOVE_DRIVER_NAME ;AN000;
40 ; CONVERT_NAME_ASCIIZ ;AN000;
42 ; CHECK_REAL_DEVICE ;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;
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
86 ;************************************************************************************ ;AN000;
90 INCLUDE IFSSYM
.INC ;AN000;
91 INCLUDE IFSFSYM
.INC ;AN000;
92 INCLUDE DOSSYM
.INC ;AN000;
93 INCLUDE DEVSYM
.INC ;AN000;
97 AsmVars
<IBM
, Installed
, DEBUG
> ;AN000;
99 ; define the base code segment of the network support first ;AN000;
101 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
104 ; include the rest of the segment definitions for normal MSDOS ;AN000;
106 include dosseg
.asm
;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
132 Extrn BugLev
:WORD ;AN000;
133 Extrn BugTyp
:WORD ;AN000;
134 include bugtyp
.asm
;AN000;
138 ; define our own code segment ;AN000;
140 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
141 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;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;
164 PUBLIC LPT1_NAME
;AN000;
165 LPT1_NAME
DB "LPT1",0 ;AN000;
166 PRN_NAME
DB "PRN",0 ;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;
174 ; This buffer should later be taken out when time permits to do this right ;AN013;
176 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013;
177 NET_TRANS_BUFFER
DB 128 DUP (0) ; temporary buffer used for $Nametrans ;AN013;
178 ; storage of canonicalized pathname ;AN013;
180 BREAK <IFSFlushBuf
-- Flush all Net Cache Buffers
> ;AN000;
182 ;************************************************************************************ ;AN000;
184 ; IFSFlushBuf ;AN000;
186 ; Called by: Dispatcher ;AN000;
188 ; Routines called: CD_TO_CDS ;AN000;
192 ; Input: AL = 0 Flush all Net buffers. ;AN000;
193 ; -1 " " " plus invalidate them. ;AN000;
196 ; FOR I = 1 to # CDSs ;AN000;
198 ; IF CURDIR_ISIFS = true THEN ;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;
221 ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
226 ; Output: None ;AN000;
228 ; Notes: all destroyed ;AN000;
230 ;************************************************************************************ ;AN000;
232 procedure IFSFlushBuf
,NEAR ;AN000;
233 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
235 ifsr_fcn_def EXECAPI
;AN000;
236 ifsr_api_def DRIVERESET
;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;
243 TEST DS:[SI.curdir_flags
],curdir_isnet
;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;
255 SaveReg
<CX> ; preserve loop count
256 invoke CALL_IFS
; Call IFS ;AN000;
257 RestoreReg
<CX> ; retrieve loop count
259 RestoreReg
<SI,DS> ; restore cds ptr ;AN000;
260 JMP SHORT IFB_60
;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;
269 ADD SI,DX ; Skip to next CDS ;AN000;
273 ;*********************************************************************************** ;AN000;
274 ; ifs common return area ;AN000;
275 ;*********************************************************************************** ;AN000;
276 entry IFS_980
;AN000;
279 entry IFS_990
;AN000;
281 entry IFS_1000
;AN000;
285 EndProc IFSFlushBuf
;AN000;
288 BREAK <IFS_UPDATE_CB Update SFT
entry> ;AN000;
290 ;****************************************************************************** ;AN000;
292 ; IFS_UPDATE_CB ;AN000;
294 ; Called by: IFSFUNC Dispatcher (Share) ;AN000;
296 ; Routines called: ;AN000;
302 ; DS:SI -> SFT ;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;
317 ; Call IFS specified in SFT ;AN000;
320 ; Carry set on error. Error code in AX. ;AN000;
324 ; Programming notes: ;AN000;
326 ;****************************************************************************** ;AN000;
328 procedure IFS_UPDATE_CB
,NEAR ;AN000;
329 ASSUME
DS:NOTHING
,ES:NOTHING
;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;
337 invoke PREP_IFSR
; sets es:bx -> ifsr (zeroed out) ;AN000;
339 invoke SFT_TO_SFF
; SFT: sets [THISIFS] ;AN000;
340 ; ES:BX -> IFSRH ;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;
347 invoke CALL_IFS
;AN000;
348 JC ifs_1000
; cf already set ;AN000;
349 invoke SFF_TO_SFT
;AN000;
352 EndProc IFS_UPDATE_CB
;AN000;
355 BREAK <SERVER_DOSCALL_CLOSEFILES_FOR_UID
> ;AN000;
357 ;************************************************************************************ ;AN000;
359 ; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000;
361 ; Called by: IFSFUNC Dispatcher ;AN000;
363 ; Routines called: ;AN000;
367 ; [CurrentPDB] set to UID of user aborting ;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;
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;
391 ; Outputs: None ;AN000;
393 ; Regs: All destroyed ;AN000;
395 ;************************************************************************************ ;AN000;
397 procedure SERVER_DOSCALL_CLOSEFILES_FOR_UID
,NEAR ;AN000;
398 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
400 ifsr_fcn_def EXECAPI
;AN000;
401 ifsr_api_def EOCID
;AN000;
403 LDS SI,IFS_HEADER
; get 1st ifs driver ;AN000;
404 ASSUME
DS:NOTHING
;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;
417 SaveReg
<DS,CS> ;AN000;
418 RestoreReg
<DS> ;AN000;
419 ASSUME
DS:IFSSEG
; ds - ifsseg ;AN000;
421 invoke CALL_IFS
;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;
429 CMP AX,NULL_PTR
;AN000;
432 jmp ifs_1000
; go return ;AN000;
435 EndProc SERVER_DOSCALL_CLOSEFILES_FOR_UID
;AN000;
438 BREAK <SERVER_IFSFUNC_DATA_AREA
- IFSFUNC swappable
data area
> ;AN000;
440 ;************************************************************************************ ;AN000;
442 ; SERVER_IFSFUNC_DATA_AREA ;AN000;
444 ; Called by: Dispatcher ;AN000;
446 ; Routines called: None ;AN000;
449 ; DS - DOSGroup ;AN000;
452 ; Put IFSFUNC swappable data area info in ibmdos's swap_area_table
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
464 ; Regs: All preserved
466 ;************************************************************************************ ;AN000;
468 procedure SERVER_IFSFUNC_DATA_AREA
,NEAR ;AN000;
469 ASSUME
DS:DOSGROUP
,ES:NOTHING
;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;
476 LEA SI,SWAP_AREA_TABLE
; get offset address of swap area table ;AN000;
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;
484 RestoreReg
<DX,SI,DS,DI,ES,AX> ;AN000;
488 EndProc SERVER_IFSFUNC_DATA_AREA
;AN000;
491 BREAK <DRIVE_FROM_XXX
-- Compute a drive index
from a CDS
or SFT
> ;AN000;
493 procedure DRIVE_FROM_CDS
,NEAR ;AN000;
494 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
495 ;************************************************************************************ ;AN000;
497 ; DRIVE_FROM_CDS ;AN000;
500 ; [THISCDS] Set ;AN000;
501 ; DS - DOSGROUP ;AN000;
503 ; Compute drive letter from THISCDS ;AN000;
505 ; [IFSDRV] = Drive # (0=A) ;AN000;
506 ; No registers Revised ;AN000;
507 ;************************************************************************************ ;AN000;
511 MOV [IFSDRV
],0FEH ; Default to ?, 0FEH + 'A' = '?' ;AN000;
512 MOV AX,WORD PTR [THISCDS
] ;AN000;
515 CALL IFSDrvFromCDS
;AN000;
519 jmp ifs_1000
; go return ;AN000;
521 EndProc DRIVE_FROM_CDS
;AN000;
523 ;************************************************************************************ ;AN000;
525 ; DRIVE_FROM_SFT ;AN000;
528 ; [THISSFT] Set DS-Dosgroup ;AN000;
530 ; Compute drive letter from THISSFT ;AN000;
532 ; [IFSDRV] = Drive # (0=A) ;AN000;
533 ; [IFSDRV] = -1 if printer ;AN000;
534 ; PHONEY_NAME ;AN000;
535 ; No registers Revised ;AN000;
536 ;************************************************************************************ ;AN000;
538 procedure DRIVE_FROM_SFT
,NEAR ;AN000;
539 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
541 SaveReg
<DS,BX,CX> ;AC006;
542 LDS BX,[THISSFT
] ;AN000;
543 TEST [BX.sf_flags
],sf_net_spool
;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;
551 MOV [IFSDRV
],BL ;AN000;
552 RestoreReg
<CX,BX,DS> ;AC006;
553 JMP ifs_1000
; go return ;AN000;
556 SaveReg
<ES,DI,SI> ;AN000;
557 MOV DI,OFFSET
CS:[PHONEY_NAME
] ; Set name for I24 handler ;AN000;
561 ADD SI,SF_NAME
;AN000;
565 RestoreReg
<SI,DI,ES> ;AN000;
569 EndProc DRIVE_FROM_SFT
;AN000;
572 BREAK <PREP_IFSR
-- zero
out ifsr
> ;AN000;
574 ;************************************************************************************ ;AN000;
578 ; Called by: all function routines ;AN000;
580 ; Inputs: none ;AN000;
583 ; set all ifsrh fields to zero ;AN000;
586 ; ES:BX -> IFSRH ;AN000;
588 ; Regs: all except ES,BX saved ;AN000;
590 ;************************************************************************************ ;AN000;
592 procedure PREP_IFSR
,NEAR ;AN000;
594 SaveReg
<DS,DI,AX,CX> ; save regs ;AN000;
596 SaveReg
<CS,CS> ; get ds,es -> ifsseg ;AN000;
597 RestoreReg
<DS,ES> ;AN000;
598 ASSUME
DS:IFSSEG
,ES:IFSSEG
;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;
604 REP STOSW ; fill ifsr w/zeros ;AN000;
606 RestoreReg
<CX,AX,DI,DS> ; restore regs ;AN000;
610 EndProc PREP_IFSR
;AN000;
613 BREAK <CALL_IFS
- call IFS Driver
> ;AN000;
615 ;************************************************************************************ ;AN000;
619 ; Called by: all function routines ;AN000;
622 ; [THISIFS] set ;AN000;
623 ; ES:BX -> IFS request header ;AN000;
624 ; DS - IFSSEG ;AN000;
627 ; Call file system function entry point ;AN000;
630 ; Outputs of call ;AN000;
632 ; Regs: none preserved ;AN000;
634 ;************************************************************************************ ;AN000;
636 procedure CALL_IFS
,NEAR ;AN000;
638 CALL CHECK_IFS_SUPPORT
; 1st check if this request ok for ifs ;AN010;
639 PUSH WORD PTR [THISIFS
] ; save thisifs offset ;AN000;
641 CALL SET_CATEGORY
; do this to determine unc or ifs ;AN000;
642 OR CL,CL ; cl-1 for unc, 0 for ifs ;AN000;
644 invoke EcritIFS
; enter ifs critical section ;AN000;
645 JMP SHORT CI_10
;AN000;
647 invoke EcritNET
; enter network critical section ;AN000;
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;
655 ASSUME
DS:IFSSEG
;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;
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;
670 invoke LcritNET
; leave network critical section ;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;
676 JMP ifs_990
; no error, go ret no carry ;AN000;
678 ;-----------------------------------------------; error processing ;AN000;
680 TEST IFSPROC_FLAGS
,IsInit
; if in init code, skip error proc ;AN011;
682 JMP ifs_980
; init error- just go stc and quit ;AN011;
684 CMP AL,IFSR_INT21H_CRITER
; critical error? ;AN000;
688 MOV AX,ES:[BX.IFSR_RETCODE
] ; put retcode in al before condition ;AN000;
691 CMP AX,error_write_protect
;AN029;
693 CMP AX,error_gen_failure
;AN029;
695 SUB AX,error_write_protect
; BIAS old errors back down into 0-12 range ;AN029;
699 ASSUME
DS:DOSGROUP
;AN029;
701 MOV AX,OFFSET DOSGroup
:ErrMap24End
;AN029;
702 SUB AX,OFFSET DOSGroup
:ErrMap24
;AN029;
704 ; AX is the index of the first unavailable error. Do not translate if ;AN029;
705 ; greater or equal to AX. ;AN029;
710 MOV AL,ErrMap24
[DI] ;AN029;
714 invoke SET_EXTERR_INFO
; yes - set error info ;AN000;
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;
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;
727 RestoreReg
<AX,CX,DI,ES,SI,DS> ; restore regs ;AN008;
729 CMP DI,error_I24_gen_failure
;AN029;
731 MOV DI,error_I24_gen_failure
;AN029;
733 SaveReg
<AX> ; preserve dos ext err ;AN021;
734 invoke IFS_I24
; do int 24h ;AN000;
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;
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;
753 ADD SP,2 ; restore stack (dos ext error #) ;AN025;
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;
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;
766 JMP CI_25
; go back & treat as critical error ;AN011;
768 CMP AL,IFSR_DRIVER_ERROR
;AN011;
770 MOV AX,ES:[BX.IFSR_RETCODE
] ; *** driver error class *** ;AN011;
771 CMP AX,IFSR_NO_FCN_SUPPORT
;AN011;
773 MOV AX,50 ; request not supported by file system ;AN011;
776 CMP AX,IFSR_ACCESS_DENIED
;AN011;
778 MOV AX,65 ; access denied by file system ;AN011;
781 CMP AX,IFSR_DEVICE_TYPE_MISMATCH
;AN011;
783 MOV AX,66 ; file sytem device type incorrect ;AN011;
786 MOV AX,59 ; fs experienced an unexpected error ;AN011;
790 CMP AL,IFSR_DEVICE_ERROR
; fs got device error ;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;
796 MOV AX,ES:[BX.IFSR_RETCODE
] ;AN011;
797 CMP AX,error_sharing_violation
;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;
805 CallInstall SHARE_ERROR
,MultDOS
,11 ;AN018;
806 JMP SHORT CI_39_20
;AN018;
808 CallInstall SHARE_VIOLATION
,MultDOS
,10 ;AN000;
810 RestoreReg
<DS> ;AN018;
813 MOV AX,error_sharing_violation
; carry set - quit w/error ;AN000;
814 invoke SET_EXTERR_INFO
;AN000;
817 CI_40: ; carry clear - retry ;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;
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;
839 JMP ifs_980
; go ret w/carry ;AN000;
842 EndProc CALL_IFS
;AN000;
845 BREAK <CREATE_DFL_ENTRY
- fill
in DFL
entry, add to names list
if alias
> ;AN000;
847 ;************************************************************************************ ;AN000;
849 ; CREATE_DFL_ENTRY ;AN000;
851 ; Routine called by: ATTACH_START ;AN000;
852 ; PROCESS_ALIAS ;AN000;
854 ; Routines called: DFL_TO_DF ;AN000;
855 ; ENTER_NAMES_LIST ;AN000;
858 ; [THISIFS] set ;AN000;
859 ; BL = macro type ;AN000;
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;
868 ; WHILE DFL entries ;AN000;
869 ; IF entry not in use THEN ;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;
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;
884 ; Get next DFL entry ;AN000;
885 ; IF no entry THEN ;AN000;
886 ; Set error_out_of_structures ;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;
898 ; ES:BX -> IFSRH ;AN000;
899 ; IFSR_DEVICE_CB@ -> DF ;AN000;
901 ; carry set on error, ax - error ;AN000;
903 ; Regs: DS:SI -> DFL, all others destroyed ;AN000;
904 ;************************************************************************************ ;AN000;
906 procedure CREATE_DFL_ENTRY
,NEAR ;AN000;
908 SaveReg
<DS,SI> ; save input DS:SI (devname) ;AN000;
909 MOV DX,CX ; save user word in dx ;AN002;
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;
916 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
918 CALL CONSIST_DFL
; reset all in_prog flags ;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;
925 MOV AX,error_out_of_structures
;AN000;
926 RestoreReg
<SI,DS> ; restore stack ;AN000;
927 JMP ifs_980
; go return w/carry ;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;
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;
940 INC DI ; mov di to dfl_dev_name ;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;
954 JMP SHORT CDE_80
;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;
970 ADD DI,4 ; skip alias index and user wd ;AC004;
973 MOV AX,WORD PTR [THISIFS
] ;AN000;
974 STOSW ; Set DFL_IFS_HDR to ;AN000;
975 MOV AX,WORD PTR [THISIFS
+2] ; [THISIFS] ;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;
982 PUSH ES ; Set DS:SI -> DFL ;AN000;
986 CALL CHECK_REAL_DEVICE
; this will set dfl_dev_real ;AN000;
988 OR [SI.DFLL_FLAGS
],DFL_INUSE
;AN000;
989 AND [SI.DFLL_FLAGS
],NOT DFL_INPROG
;AN000;
991 ;;;aliasCMP BL,TYPE_ALIAS ;AN000;
992 ;;;aliasJNE CDE_140 ;AN000;
993 ;;;aliasJMP ifs_990 ; go ret no carry ;AN000;
995 invoke PREP_IFSR
; init req hdr ;AN000;
996 invoke DFL_TO_DF
;AN000;
999 EndProc CREATE_DFL_ENTRY
;AN000;
1001 BREAK <DELETE_DFL_ENTRY
- Delete DFL
entry, remove
from names list
if alias
> ;AN000;
1003 ;************************************************************************************ ;AN000;
1005 ; DELETE_DFL_ENTRY ;AN000;
1007 ; Routine called by: IFS_ASSOPER ;AN000;
1009 ; Routines called: ;AN000;
1012 ; [THISDFL] set ;AN000;
1017 ; carry clear: ;AN000;
1018 ; DFL entry deleted. ;AN000;
1019 ; carry set on error, ax - error ;AN000;
1021 ; Regs: everything preserved ;AN000;
1023 ;************************************************************************************ ;AN000;
1025 procedure DELETE_DFL_ENTRY
,NEAR ;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;
1036 EndProc DELETE_DFL_ENTRY
;AN000;
1038 ;BREAK <ENTER_NAMES_LIST - add alias name to Names List> ;AN000;
1040 ;************************************************************************************ ;AN000;
1042 ; ENTER_NAMES_LIST ;AN000;
1044 ; Routine called by: CREATE_DFL_ENTRY ;AN000;
1046 ; Routines called: DOS: DStrLen ;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;
1055 ; Place one and only parameter (alias) into names list. ;AN000;
1057 ; carry clear: name added ;AN000;
1058 ; carry set: AX error ;AN000;
1060 ; Notes: all preserved except AX ;AN000;
1062 ;************************************************************************************ ;AN000;
1064 ; procedure ENTER_NAMES_LIST ;AN000;
1065 ;SSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1067 ; SaveReg <ES,DI,CX,DX,DS,SI> ;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;
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;
1090 ; ADD DI,AX ; Space to spot in list to put name ;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;
1098 ;NL_980: ; Return area ;AN000;
1099 ; STC ; error ;AN000;
1100 ; RestoreReg <SI,DS,DX,CX,DI,ES> ;AN000;
1103 ; CLC ; no error ;AN000;
1104 ; RestoreReg <DX,CX,DI,ES> ;AN000;
1109 ;ndProc ENTER_NAMES_LIST ;AN000;
1112 ;REAK <EXIT_NAMES_LIST - remove alias name from Names List> ;AN000;
1114 ;************************************************************************************ ;AN000;
1116 ; EXIT_NAMES_LIST ;AN000;
1118 ; Routine called by: DELETE_DFL_ENTRY ;AN000;
1120 ; Routines called: DOS: StrLen ;AN000;
1123 ; DS:SI -> DFL ;AN000;
1126 ; Remove alias name from Names List ;AN000;
1128 ; name removed ;AN000;
1130 ; Notes: all preserved ;AN000;
1132 ;************************************************************************************ ;AN000;
1134 ; procedure EXIT_NAMES_LIST ;AN000;
1135 ;SSUME DS:IFSSEG,ES:IFSSEG ;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;
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;
1152 ; RestoreReg <AX,DI,ES> ; adjust used size ;AN000;
1154 ; MOV ES:WORD PTR [DI+2],AX ;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;
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;
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;
1170 ; LOOP EXNL_20 ;AN000;
1172 ; JMP ifs_1000 ; go return ;AN000;
1175 ;ndProc EXIT_NAMES_LIST ;AN000;
1177 BREAK <DFL_SINGLE_FILE_CHECK
- support single
file check
> ;AN000;
1179 ;************************************************************************************ ;AN000;
1181 ; DFL_SINGLE_FILE_CHECK ;AN000;
1183 ; Routine called by: IFS_FILE_ATTRIBUTES ;AN000;
1187 ; [WFP_START] ;AN000;
1190 ; IF [THISDFL] .NOT. NULL THEN ;AN000;
1192 ; Get IFS header from DFL_IFS_HDR ;AN000;
1193 ; IF IFSDEVICE true THEN ;AN000;
1195 ; Call DFL_TO_DF ;AN000;
1196 ; Clear carry ;AN000;
1198 ; ELSE Set error - device doesn't support single file fcn ;AN000;
1202 ; CALL DFL_MATCH ;AN000;
1203 ; IF match found THEN ;AN000;
1205 ; Get IFS header from DFL_IFS_HDR ;AN000;
1206 ; IF IFSDEVICE true THEN ;AN000;
1208 ; Call DFL_TO_DF ;AN000;
1209 ; Clear carry ;AN000;
1211 ; ELSE Set error - device doesn't support single file fcn ;AN000;
1213 ; ELSE Set error - device not IFS ;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;
1226 ;************************************************************************************ ;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;
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;
1244 MOV AX,error_file_not_found
; no - set error & go return w/carry ;AN000;
1247 invoke DFL_TO_DF
;AN000;
1251 EndProc DFL_SINGLE_FILE_CHECK
;AN000;
1253 ;BREAK <PROCESS_ALIAS -- add alias name> ;AN000;
1255 ;************************************************************************************ ;AN000;
1257 ; PROCESS_ALIAS ;AN000;
1259 ; Called by: ATTACH_START ;AN000;
1261 ; Routines called: DFL_MATCH ;AN000;
1262 ; CREATE_DFL_ENTRY ;AN000;
1265 ; DS:SI -> ASCIIZ source name ;AN000;
1266 ; ES:DI -> ALIAS name ;AN000;
1272 ;************************************************************************************ ;AN000;
1274 ; Procedure PROCESS_ALIAS,NEAR ;AN000;
1275 ;SSUME DS:NOTHING,ES:NOTHING ;AN000;
1277 ; CALL DFL_MATCH ;AN000;
1279 ;;;??? match found, error or override??? ;AN000;
1281 ; CALL CREATE_DFL_ENTRY ;AN000;
1282 ; JMP ifs_1000 ;AN000;
1285 ;ndProc PROCESS_ALIAS ;AN000;
1288 BREAK <DFL_MATCH
-- check for DFL
entry> ;AN000;
1290 ;************************************************************************************ ;AN000;
1294 ; Called by: ATTACH_START CONSIST_SFT ;AN000;
1295 ; IFS_DELETE ;AN000;
1297 ; Routines called: ;AN000;
1300 ; DS:SI -> Asciiz Device name ;AN000;
1303 ; Search DFL for match on name ;AN000;
1304 ; If match found - set [THISDFL] and clear carry ;AN000;
1305 ; Else set carry ;AN000;
1308 ; carry clear - match found, [THISDFL] set ;AN000;
1309 ; carry set - match not found ;AN000;
1311 ; Regs: all preserved ;AN000;
1313 ;************************************************************************************ ;AN000;
1315 Procedure DFL_MATCH
;AN000;
1316 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1318 SaveReg
<DS,SI,ES,DI,AX,CX,BX> ; save registers ;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;
1326 CallInstall UCase
,multDOS
,19,<AX>,<BX> ;AN000;
1335 MOV BYTE PTR ES:[DI-1],AL ;AN000;
1337 CMP BYTE PTR ES:[DI-2],":" ;AN000;
1339 MOV BYTE PTR ES:[DI-2],0 ;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;
1347 TEST DS:[SI.DFLL_FLAGS
],DFL_INUSE
;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;
1360 ADD SI,SIZE DFLL_LIST
;AN000;
1362 JMP SHORT DM_100
; go up & try next entry ;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;
1372 JMP SHORT DM_1000
;AN000;
1374 TEST DS:[SI.DFLL_FLAGS
],dfl_paused
; if printer paused, no match ;AN019;
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;
1381 RestoreReg
<BX,CX,AX,DI,ES,SI,DS> ; restore regs ;AN000;
1384 EndProc DFL_MATCH
;AN000;
1386 BREAK <SFT_TO_SFF
-- Convert SFT to SFF
> ;AN000;
1388 ;************************************************************************************ ;AN000;
1390 ; SFT_TO_SFF ;AN000;
1393 ; [THISSFT] set ;AN000;
1394 ; DS - DOSGROUP ;AN000;
1396 ; Load SFF from SFT ;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;
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;
1425 ; notes: all except ES,BX,DS preserved ;AN000;
1426 ;************************************************************************************ ;AN000;
1428 procedure SFT_TO_SFF
,NEAR ;AN000;
1429 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1431 SaveReg
<DI,SI,AX,CX> ; save regs ;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;
1439 SaveReg
<DI> ; save SFF offset ;AN000;
1440 MOV AH,CBTYPE_SFF
; sff_type ;AN000;
1444 MOV AX,WORD PTR [SI.SF_FLAGS
] ; sff_flags ;AN000;
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;
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;
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;
1460 MOV AX,WORD PTR [SI.SF_UID
] ; sff_uid ;AN000;
1462 MOV AX,WORD PTR [SI.SF_PID
] ; sff_pid ;AN000;
1464 SaveReg
<SI> ;AN000;
1465 ADD SI,SF_SIZE
;AN000;
1467 REP MOVSW ; sff_size & position ;AN000;
1468 RestoreReg
<SI> ;AN000;
1469 MOV AX,WORD PTR [SI.SF_TIME
] ; sff_time ;AN000;
1471 MOV AX,WORD PTR [SI.SF_DATE
] ; sff_date ;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;
1479 STOSW ; just put zero in reserved area ;AN024;
1481 RestoreReg
<SI> ; sff_sf_id ;AN000;
1482 SaveReg
<SI,DS,DS> ; calculate based on sft address ;AN016
1483 RestoreReg
<AX> ;AN016;
1487 RestoreReg
<AX> ;AN016;
1488 AND AX,0F000H ;AN016;
1491 RestoreReg
<SI> ;AN016;
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;
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;
1504 TEST CS:[IFSPROC_FLAGS
],ISSFT
;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;
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;
1517 MOV BX,OFFSET IFSR
; set ES:BX -> IFSRH ;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;
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;
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;
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;
1541 CALL CDS_TO_CD
;AN000;
1542 JMP SHORT SFT_1000
;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;
1551 RestoreReg
<CX,AX,SI,DI> ; restore regs ;AN000;
1552 SaveReg
<CS> ;AN000;
1553 RestoreReg
<DS> ; set ds -ifsseg ;AN000;
1557 EndProc SFT_TO_SFF
;AN000;
1560 BREAK <SFF_TO_SFT
-- Convert SFF to SFT
> ;AN000;
1562 ;************************************************************************************ ;AN000;
1564 ; SFF_TO_SFT ;AN000;
1567 ; [THISSFT] set ;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;
1587 ; SFT loaded ;AN000;
1588 ; notes: all regs preserved ;AN000;
1590 ;************************************************************************************ ;AN000;
1592 procedure SFF_TO_SFT
,NEAR ;AN000;
1593 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1595 SaveReg
<ES,DI,DS,SI,AX,CX> ; save regs ;AC003;
1599 ASSUME
DS:DOSGROUP
;AN000;
1600 LES DI,[THISSFT
] ; DS:SI -> SFF ;AN000;
1603 ASSUME
DS:IFSSEG
;AN000;
1604 MOV SI,OFFSET SFF1
; ES:DI -> SFT ;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;
1612 ;;;;;;;;AND AX,0EFFFH ;AD015;
1613 MOV WORD PTR ES:[DI.SF_MODE
],AX ; sft_mode ;AC015;
1615 ;;;;;;;;MOV WORD PTR ES:[DI.SF_IOMODE],AX ; sft_iomode ...no longer exists ;AD024;
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;
1620 MOV WORD PTR ES:[DI.SF_UID
],AX ; sft_uid ;AN000;
1622 MOV WORD PTR ES:[DI.SF_PID
],AX ; sft_pid ;AN000;
1623 SaveReg
<DI> ;AN000;
1624 ADD DI,SF_SIZE
;AN000;
1626 REP MOVSW ; sft_size & position ;AN000;
1627 RestoreReg
<DI> ;AN000;
1629 MOV WORD PTR ES:[DI.SF_TIME
],AX ; sft_time ;AN000;
1631 MOV WORD PTR ES:[DI.SF_DATE
],AX ; sft_date ;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;
1639 ADD SI,SIZE SFF_RESV
; sft_fsda 1st word ;AN000;
1640 ADD SI,4 ; for sff_sf_id ;AN016;;AC024;
1643 SaveReg
<DI> ;AN003;
1644 ADD DI,SF_CLUSPOS
;AN000;
1647 ;;;;;;;;ADD DI,12 ;AN017;;AD024;
1648 ;;;;;;;;MOVSW ;AN017;;AD024;
1650 RestoreReg
<DI> ;AN003;;AM024;
1651 MOV WORD PTR ES:[DI.SF_LSTCLUS
],AX ;AN024;
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;
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;
1664 JMP SFF_1000
;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;
1672 TEST ES:[DI.CURDIR_FLAGS
],CURDIR_ISIFS
1674 CALL CD_TO_CDS
;AN000;
1675 JMP SHORT SFF_1000
;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;
1683 RestoreReg
<CX,AX,SI,DS,DI,ES> ; restore regs ;AC003;
1687 EndProc SFF_TO_SFT
;AN000;
1689 BREAK <CDS_TO_CD
-- Convert CDS to CD
> ;AN000;
1691 ;************************************************************************************ ;AN000;
1696 ; DS:SI -> CDS ;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;
1710 ; ES:BX -> IFSRH ;AN000;
1711 ; IFSR_DEVICE_CB@ -> CD ;AN000;
1712 ; [THISIFS] = CURDIR_IFS_HDR ;AN000;
1713 ; DS - IFSSEG ;AN000;
1715 ; Regs: all except DS,ES,BX saved ;AN000;
1717 ;************************************************************************************ ;AN000;
1719 procedure CDS_TO_CD
,NEAR ;AN000;
1721 SaveReg
<DI,SI,AX,CX> ; save regs ;AN000;
1724 POP ES ; DS:SI -> CDS ;AN000;
1725 ASSUME
ES:IFSSEG
; ES:DI -> CD ;AN000;
1726 MOV DI,OFFSET
CS:CD1
;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;
1732 MOV AL,CBTYPE_DUMMYCD
;AN000;
1735 STOSW ; move di down thru cd during store ;AN000;
1737 MOV AX,WORD PTR [SI.CURDIR_END
] ; cd_end ;AN000;
1740 PUSH SI ; cd_text ;AN000;
1741 MOV CX,DIRSTRLEN
;AN000;
1745 MOV AX,WORD PTR [SI.CURDIR_ID
] ; cd_fsda ;AN000;
1746 ADD DI,SIZE CD_RESV
;AN000;
1748 MOV AX,WORD PTR [SI.CURDIR_ID
+2] ;AN000;
1750 MOV AX,WORD PTR [SI.CURDIR_USER_WORD
] ;AN000;
1752 MOV AX,WORD PTR [SI.CURDIR_FSDA
] ;AN000;
1755 TEST CS:IFSPROC_FLAGS
,THISIFS_SET
;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;
1762 POP DI ; restore CD offset ;AN000;
1763 PUSH CS ; get DS -> IFSSEG ;AN000;
1765 ASSUME
DS:IFSSEG
;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;
1772 MOV WORD PTR ES:[BX],ES ;AN000;
1773 RestoreReg
<BX> ;AN000;
1775 RestoreReg
<CX,AX,SI,DI> ; restore regs ;AN000;
1779 EndProc CDS_TO_CD
;AN000;
1782 BREAK <CD_TO_CDS
-- Convert CD to CDS
> ;AN000;
1784 ;************************************************************************************ ;AN000;
1789 ; ES:DI -> CDS ;AN000;
1790 ; DS -> IFSSEG ;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;
1800 ; CDS updated ;AN000;
1802 ; notes: all regs preserved ;AN000;
1804 ;************************************************************************************ ;AN000;
1806 procedure CD_TO_CDS
,NEAR ;AN000;
1807 ASSUME
DS:IFSSEG
,ES:IFSSEG
;AN000;
1809 SaveReg
<ES,DI,DS,SI,AX,CX> ; save regs ;AC005;
1811 MOV SI,OFFSET CD1
; ES:DI -> CDS ;AN000;
1812 ; DS:SI -> CD ;AN000;
1816 LODSW ; curdir_end ;AN000;
1817 MOV ES:[DI.CURDIR_END
],AX ;AN000;
1820 MOV CX,DIRSTRLEN
;AN000;
1824 ADD SI,SIZE CD_RESV
; curdir_id ;AN000;
1826 MOV WORD PTR ES:[DI.CURDIR_ID
],AX ;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;
1834 RestoreReg
<CX,AX,SI,DS,DI,ES> ; restore regs ;AC005;
1838 EndProc CD_TO_CDS
;AN000;
1841 BREAK <DFL_TO_DF
-- Convert DFL to
DF> ;AN000;
1843 ;************************************************************************************ ;AN000;
1850 ; Load DF from DFL ;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;
1858 ; ES:BX -> IFSRH ;AN000;
1859 ; IFSR_DEVICE_CB@ -> DF ;AN000;
1860 ; [THISIFS] = DFL_IFS_HDR ;AN000;
1861 ; DS - IFSSEG ;AN000;
1863 ; notes: es,bx,ds Revised, others saved ;AN000;
1865 ;************************************************************************************ ;AN000;
1867 procedure DFL_TO_DF
,NEAR ;AN000;
1868 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1870 SaveReg
<DI,SI,AX> ; save regs ;AN000;
1874 ASSUME
ES:IFSSEG
;AN000;
1875 MOV DI,OFFSET DF1
; es:di -> df ;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;
1882 MOV WORD PTR ES:[BX],ES ;AN000;
1885 LDS SI,[THISDFL
] ; ds:si -> dfl ;AN000;
1887 MOV AL,CBTYPE_DF
; df_type ;AN000;
1891 PUSH SI ; df_dev_name ;AN000;
1892 ADD SI,DFL_DEV_NAME
;AN000;
1897 ADD SI,DFL_FSDA
; df_fsda ;AN000;
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;
1905 MOV CS:[IFSDRV
],-1 ;AN004;
1906 RestoreReg
<SI,DI> ; dfl dev name, df offsets ;AN004;
1909 MOV CX,SIZE DFL_FSDA
;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;
1918 PUSH CS ; set ds - ifsseg ;AN000;
1921 RestoreReg
<AX,SI,DI> ; restore regs ;AN000;
1925 EndProc DFL_TO_DF
;AN000;
1928 BREAK <DF_TO_DFL
-- Convert
DF to DFL
> ;AN000;
1930 ;************************************************************************************ ;AN000;
1935 ; [THISDFL] set ;AN000;
1937 ; Update DFL with DF ;AN000;
1938 ; DFL_DEV_NAME = DF_DEV_NAME ;AN000;
1939 ; DFL_FSDA = DF_FSDA ;AN000;
1941 ; DFL updated ;AN000;
1943 ; notes: all regs preserved ;AN000;
1945 ;************************************************************************************ ;AN000;
1947 procedure DF_TO_DFL
,NEAR ;AN000;
1948 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1950 SaveReg
<ES,DI,DS,SI> ; save regs ;AN000;
1952 LES DI,[THISDFL
] ; esdi -> dfl ;AN000;
1955 ASSUME
DS:IFSSEG
;AN000;
1956 MOV SI,OFFSET DF1
; dssi -> df ;AN000;
1958 INC SI ; space si,di to dev_name ;AN000;
1961 ADD DI,DFL_DEV_NAME
;AN000;
1963 REP MOVSB ; update dfl_dev_name for some reason ;AN000;
1966 ADD DI,DFL_FSDA
;AN000;
1967 MOV CX,SIZE DFL_FSDA
;AN000;
1968 REP MOVSB ; update dfl_fsda ;AN000;
1970 RestoreReg
<SI,DS,DI,ES> ; restore regs ;AN000;
1974 EndProc DF_TO_DFL
;AN000;
1977 BREAK <CONSIST_SFT
-- Make SFT caches consistent with state of IFSFUNC
> ;AN000;
1979 ;************************************************************************************ ;AN000;
1981 ; CONSIST_SFT ;AN000;
1987 ; Make sure all device SFTs are consistent with current IFSFUNC state ;AN000;
1992 ; Regs: DS,ES,SI,DI preserved others destroyed ;AN000;
1994 ;************************************************************************************ ;AN000;
1996 procedure CONSIST_SFT
,NEAR ;AN000;
1997 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1999 CMP CS:[DFLCount
],0 ; if no dfl, forget it ;AN022;
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;
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;
2016 MOV CX,[SI].SFCount
;AN000;
2019 LEA SI,[SI].sfTable
;AN000;
2020 CALL LOOK_FIX
;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;
2027 RestoreReg
<DI,ES,SI,DS> ;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
2038 PUSH CX ; sft loop count ;AN000;
2039 PUSH DS ; sft ptr ;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;
2045 MOV DI,OFFSET TEMPBUF
;AN000;
2046 CALL CONVERT_NAME_ASCIIZ
;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;
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;
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;
2083 PUSH CS ; NOT ATTACHED - recover test for sf_isnet ;AN000;
2085 JNZ UNDO_BITS
; jmp if marked attached - problem ;AN000;
2092 ADD SI,size sf_entry
;AN000;
2093 LOOP LOOK_FIX
;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;
2111 EndProc CONSIST_SFT
;AN000;
2114 BREAK <CONSIST_DFL
-- Reset all DFL in_prog flags
> ;AN000;
2116 ;************************************************************************************ ;AN000;
2118 ; CONSIST_DFL ;AN000;
2121 ; DS:SI -> 1st DFL entry ;AN000;
2122 ; CX = DFLCount ;AN000;
2124 ; Set all dfl_inprog flags to zero ;AN000;
2126 ; dfl_inprog flags all zero ;AN000;
2128 ; notes: all regs preserved ;AN000;
2130 ;************************************************************************************ ;AN000;
2132 procedure CONSIST_DFL
,NEAR ;AN000;
2133 ASSUME
DS:NOTHING
,ES:NOTHING
;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;
2142 RestoreReg
<CX,DX,SI> ;AC023;
2145 EndProc CONSIST_DFL
;AN000;
2148 BREAK <PRN_CHECK
-- change PRN to LPT1
>
2150 ;************************************************************************************
2156 ; SI -> asciiz canonicalized device name
2158 ; IF DSSI-> "PRN",0 THEN
2159 ; Set SI -> LPT1_NAME
2162 ; SI possibly Revised
2164 ; notes: all but si preserved
2166 ;************************************************************************************
2168 procedure PRN_CHECK
,NEAR ;AN012;
2169 ASSUME
DS:IFSSEG
,ES:NOTHING
;AN012;
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;
2178 MOV SI,OFFSET LPT1_NAME
;AN012;
2180 RestoreReg
<AX,DI,ES> ;AN012;;AC014;
2183 EndProc PRN_CHECK
;AN012;
2186 BREAK <CHECK_REAL_DEVICE
-- Match dfl_dev_name to real device
> ;AN000;
2188 ;************************************************************************************
2193 ; DS:SI -> DFL entry
2196 ; Match device name to device driver chain names
2199 ; IF device name = "prn" THEN
2203 ; device name changed to "LPT1" if "PRN"
2205 ; Regs: AX,CX destroyed. All others preserved.
2207 ;************************************************************************************
2209 procedure CHECK_REAL_DEVICE
,NEAR ;AN000;
2210 ASSUME
DS:NOTHING
,ES:NOTHING
;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;
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;
2236 LDS SI,DS:[SI.SDEVNEXT
] ;AN000;
2237 CMP SI,NULL_PTR
;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;
2246 CRD_40: ; match found ;AN000;
2247 RestoreReg
<SI,DS> ; dfl entry ;AN000;
2248 OR DS:[SI.DFLL_FLAGS
],DFL_DEV_REAL
;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;
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;
2269 RestoreReg
<SI,DS> ; dfl entry offset ;AN000;
2270 OR DS:[SI.DFLL_FLAGS
],DFL_DEV_REAL
;AN022;
2273 RestoreReg
<DI,ES> ; restore es,di ;AN000;
2276 EndProc CHECK_REAL_DEVICE
;AN000;
2279 Break <XCHGP
- exchange source
and destination pointers
> ;AN000;
2281 ;************************************************************************************ ;AN000;
2286 ; DS:SI & ES:DI ;AN000;
2288 ; Swap ds:si with es:di ;AN000;
2290 ; ds<=>es, si<=>di ;AN000;
2292 ; notes: all preserved ;AN000;
2294 ;************************************************************************************ ;AN000;
2296 Procedure XCHGP
,NEAR ;AN000;
2297 SaveReg
<DS,ES> ;AN000;
2298 RestoreReg
<DS,ES> ;AN000;
2301 EndProc XCHGP
;AN000;
2304 Break <IFSDrvFromCDS
- convert an offset to a CDS
into the
0-based drive
> ;AN000;
2306 ;************************************************************************************ ;AN000;
2308 ; IFSDrvFromCDS - convert an offset to a CDS into a 0-based drive number. ;AN000;
2309 ; Sets IFSDrv also. ;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;
2316 ;************************************************************************************ ;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;
2325 EndProc IFSDrvFromCDS
;AN000;
2328 Break <SET_THISIFS_UNC
- put UNC_FS_HDR
into [THISIFS
]> ;AN000;
2330 ;************************************************************************************ ;AN000;
2332 ; SET_THISIFS_UNC ;AN000;
2334 ; Inputs: DS - IFSSEG, UNC_FS_HDR set ;AN000;
2335 ; Outputs: [THISIFS] = UNC_FS_HDR ;AN000;
2337 ; Registers Revised: none ;AN000;
2339 ;************************************************************************************ ;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;
2347 EndProc SET_THISIFS_UNC
;AN000;
2350 Break <SET_CATEGORY
- set category for ifs dependent ioctl request
> ;AN000;
2352 ;************************************************************************************
2356 ; Inputs: DS - IFSSEG, ES:BX -> IFSR, THISIFS set
2357 ; Outputs: CL set to 1 for unc fs, 0 otherwize
2359 ; Registers Revised: CX
2361 ;************************************************************************************
2363 Procedure SET_CATEGORY
,NEAR ;AN000;
2364 SaveReg
<AX> ; preserve used regs ;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;
2372 MOV AX,WORD PTR [THISIFS
+2] ;AN000;
2373 CMP AX,WORD PTR [UNC_FS_HDR
+2] ;AN000;
2375 INC CL ; is unc - inc category to 1=unc ;AN000;
2377 RestoreReg
<AX> ;AN000;
2379 EndProc SET_CATEGORY
;AN000;
2382 Break <SET_DEPIOCTL_IFSR
- set length
,function
,apifunc
,func ifsr fields
> ;AN000;
2384 ;************************************************************************************ ;AN000;
2386 ; SET_DEPIOCTL_IFSR ;AN000;
2388 ; Inputs: ES:BX -> IFSR
2389 ; Outputs: IFSR_LENGTH, IFSR_FUNCTION, IFSR_APIFUNC, IFSR_FUNC set ;AN000;
2391 ; Registers Revised: none ;AN000;
2393 ;************************************************************************************ ;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;
2403 EndProc SET_DEPIOCTL_IFSR
;AN000;
2406 Break <GET_UNC_FS_NAME
- put UNC ifs driver name
into esdi
> ;AN000;
2408 ;************************************************************************************ ;AN000;
2410 ; GET_UNC_FS_NAME ;AN000;
2413 ; ES:DI -> BUFFER ;AN000;
2415 ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000;
2417 ; Registers Revised: none ;AN000;
2419 ;************************************************************************************ ;AN000;
2421 Procedure GET_UNC_FS_NAME
,NEAR ;AN000;
2424 LDS SI,CS:UNC_FS_HDR
2425 CALL MOVE_DRIVER_NAME
2426 RestoreReg
<DI,SI,DS> ;AN000;
2428 EndProc GET_UNC_FS_NAME
;AN000;
2431 Break <MOVE_DRIVER_NAME
- put ifs driver name
into esdi
> ;AN000;
2433 ;************************************************************************************ ;AN000;
2435 ; MOVE_DRIVER_NAME ;AN000;
2437 ; Inputs: DS:SI -> IFS DRIVER ;AN000;
2438 ; ES:DI -> BUFFER ;AN000;
2440 ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000;
2442 ; Registers Revised: SI,DI ;AN000;
2444 ;************************************************************************************ ;AN000;
2446 Procedure MOVE_DRIVER_NAME
,NEAR ;AN000;
2448 ADD SI,IFS_NAME
; space to name in ifs hdr ;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;
2461 EndProc MOVE_DRIVER_NAME
;AN000;
2464 Break <CONVERT_NAME_ASCIIZ
- put name
into buffer
in asciiz form
> ;AN000;
2466 ;************************************************************************************
2468 ; CONVERT_NAME_ASCIIZ
2470 ; Inputs: DS:SI -> NAME
2473 ; Outputs: Buffer contains asciiz form of name
2475 ; Regs: All but SI preserved
2477 ;************************************************************************************
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;
2493 RestoreReg
<AX,DI> ; esdi buffer offset ;AC014;
2497 EndProc CONVERT_NAME_ASCIIZ
;AN000;
2500 Break <CHECK_SEQ
- check for unc vs ifs device
> ;AN000;
2502 ;************************************************************************************
2506 ; Inputs: [THISCDS],[THISDFL]
2509 ; Function: Check whether function has device_cb@ associated with it.
2510 ; (Rule out deviceless attach function)
2512 ; Outputs: cf = 0 seq (deviceless)
2515 ; Registers Revised: none
2517 ;************************************************************************************
2519 Procedure CHECK_SEQ
,NEAR ;AN000;
2520 ASSUME
DS:DOSGROUP
;AN000;
2521 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2522 ; SaveReg <SI,AX> ; ;AD007;
2523 ; MOV SI,[WFP_START] ; ;AD007;
2525 ; CMP AX,"\\" ; ;AD007;
2526 ; JE CS_10 ; ;AD007;
2528 ; JMP SHORT CS_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;
2539 LDS SI,CS:[THISDFL
] ; no cds, check dfl ;AN007;
2540 CMP SI,NULL_PTR
;AN007;
2542 CLC ; no cds, no dfl - is deviceless - clear carry ;AN007;
2543 JMP SHORT CS_1000
;AN007;
2546 STC ; has device - set carry ;AN007;
2549 RestoreReg
<SI,DS> ; restore used regs ;AN007;
2552 EndProc CHECK_SEQ
;AN000;
2555 Break <INIT_DFL
- zero
out dfl
entry> ;AN000;
2557 ;************************************************************************************ ;AN000;
2561 ; Inputs: DS:SI -> dfl entry ;AN000;
2563 ; Outputs: dfl entry zeroed out ;AN000;
2565 ; Registers Revised: none ;AN000;
2567 ;************************************************************************************ ;AN000;
2569 Procedure INIT_DFL
,NEAR ;AN000;
2570 SaveReg
<ES,DI,AX,CX,DS> ;AN000;
2571 RestoreReg
<ES> ;AN000;
2573 MOV CX,SIZE DFLL_LIST
/ 2 ;AN000;
2577 RestoreReg
<CX,AX,DI,ES> ;AN000;
2581 EndProc INIT_DFL
;AN000;
2584 BREAK <NET_TRANS
-- A Routine which does NAMETRANS
on session start strings
> ;AN000;
2586 ;************************************************************************************ ;AN000;
2591 ; ES:DI -> Double string session start string for blockredir ;AC001;
2592 ; or printerredir. ;AN000;
2595 ; Perform NAMETRANS DOS function on the connect part of the string ;AN000;
2598 ; ES:DI points to NAMETRANSed REDIR string ;AC001;
2599 ; password, or extra 0, appended at end of string ;AC001;
2601 ; Registers Revised: ;AN000;
2602 ; ES,DI Revised, others preserved ;AC001;
2604 ;************************************************************************************ ;AN000;
2606 procedure NET_TRANS
,NEAR ;AN000;
2607 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
2609 SaveReg
<DS,SI,AX,BX> ;AC001;
2611 SaveReg
<ES> ; set ds:si -> string ;AN001;
2612 RestoreReg
<DS> ; for nametrans input ;AN001;
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;
2623 RestoreReg
<DI> ; nametrans error - set carry & exit ;AN023;
2624 JMP SHORT NT_60
;AN023;
2626 ; dssi -> input target string
2627 NT_20: ; esdi -> nametrans version in nettranbuf;AC001;;AC013;
2628 LODSB ; move password or zero ;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;
2642 RestoreReg
<BX,AX,SI,DS> ;AC001;
2646 EndProc NET_TRANS
;AN000;
2649 Break <STRIP_WFP_START
- strip leading d
:\ > ;AN000;
2651 ;************************************************************************************ ;AN000;
2653 ; STRIP_WFP_START ;AN000;
2655 ; Called by: IFS_SEARCH_FIRST
2657 ; Inputs: DS:SI -> WFP_START ;AN000;
2659 ; Outputs: none ;AN000;
2661 ; Registers Revised: none ;AN000;
2663 ;************************************************************************************ ;AN000;
2665 Procedure STRIP_WFP_START
,NEAR ;AN000;
2667 CMP BYTE PTR DS:[SI+1],":" ;AN000;
2670 CMP BYTE PTR DS:[SI],"\" ;AN000;
2672 CMP BYTE PTR DS:[SI],"/" ;AN000;
2680 EndProc STRIP_WFP_START ;AN000;
2683 Break <CHECK_IFS_ATTRIBUTE - check if fs supports function in DX>
2685 ;************************************************************************************
2687 ; CHECK_IFS_ATTRIBUTE
2689 ; Called by: IFS_DEPENDENT_IOCTL
2691 ; Inputs: DX = ifs_attribute equate
2693 ; Outputs: ZF = attribute not supported
2694 ; NZ = attribute supported
2696 ; Registers Revised: none
2698 ;************************************************************************************
2700 Procedure CHECK_IFS_ATTRIBUTE,NEAR ;AN000;
2704 LES DI,[THISIFS] ; esdi -> ifs header
2705 TEST ES:[DI.IFS_ATTRIBUTE],DX ; test attribute
2711 EndProc CHECK_IFS_ATTRIBUTE ;AN000;
2714 Break <CHECK_IFS_SUPPORT - check if IFS supports request>
2716 ;************************************************************************************
2720 ; Called by: CALL_IFS
2727 ; Registers Revised: TBD
2729 ;************************************************************************************
2731 Procedure CHECK_IFS_SUPPORT,NEAR ;AN000;
2735 EndProc CHECK_IFS_SUPPORT ;AN010;