summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM2739
1 files changed, 2739 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM
new file mode 100644
index 0000000..7c9e303
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM
@@ -0,0 +1,2739 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsutil.asm 1.0 87/05/05 ;AN000;
3TITLE IFSFUNC UTILITY ROUTINES - Routines for IFSFUNC ;AN000;
4NAME 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;
90INCLUDE IFSSYM.INC ;AN000;
91INCLUDE IFSFSYM.INC ;AN000;
92INCLUDE DOSSYM.INC ;AN000;
93INCLUDE DEVSYM.INC ;AN000;
94.cref ;AN000;
95.list ;AN000;
96 ;AN000;
97AsmVars <IBM, Installed, DEBUG> ;AN000;
98 ;AN000;
99; define the base code segment of the network support first ;AN000;
100 ;AN000;
101IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
102IFSSEG ENDS ;AN000;
103 ;AN000;
104; include the rest of the segment definitions for normal MSDOS ;AN000;
105 ;AN000;
106include dosseg.asm ;AN000;
107 ;AN000;
108DATA 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
131if debug ;AN000;
132 Extrn BugLev:WORD ;AN000;
133 Extrn BugTyp:WORD ;AN000;
134 include bugtyp.asm ;AN000;
135endif ;AN000;
136DATA ENDS ;AN000;
137 ;AN000;
138; define our own code segment ;AN000;
139 ;AN000;
140IFSSEG 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;
165LPT1_NAME DB "LPT1",0 ;AN000;
166PRN_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;
177NET_TRANS_BUFFER DB 128 DUP (0) ; temporary buffer used for $Nametrans ;AN013;
178 ; storage of canonicalized pathname ;AN013;
179 ;AN000;
180BREAK <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;
233ASSUME 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;
242IFB_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;
261IFB_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;
268IFB_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;
285EndProc IFSFlushBuf ;AN000;
286 ;AN000;
287 ;AN000;
288BREAK <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;
329ASSUME 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;
352EndProc IFS_UPDATE_CB ;AN000;
353 ;AN000;
354 ;AN000;
355BREAK <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;
398ASSUME 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;
404ASSUME DS:NOTHING ;AN000;
405 ;AN000;
406SDC_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;
419ASSUME 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;
435EndProc SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000;
436 ;AN000;
437 ;AN000;
438BREAK <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;
469ASSUME 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;
488EndProc SERVER_IFSFUNC_DATA_AREA ;AN000;
489 ;AN000;
490 ;AN000;
491BREAK <DRIVE_FROM_XXX -- Compute a drive index from a CDS or SFT> ;AN000;
492 ;AN000;
493 procedure DRIVE_FROM_CDS,NEAR ;AN000;
494ASSUME 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;
516DFC_20: ;AN000;
517 POP AX ;AN000;
518 POP BX ;AN000;
519 jmp ifs_1000 ; go return ;AN000;
520 ;AN000;
521EndProc 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;
539ASSUME 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;
550DFS_20: ;AN000;
551 MOV [IFSDRV],BL ;AN000;
552 RestoreReg <CX,BX,DS> ;AC006;
553 JMP ifs_1000 ; go return ;AN000;
554 ;AN000;
555DFS_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;
569EndProc DRIVE_FROM_SFT ;AN000;
570 ;AN000;
571 ;AN000;
572BREAK <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;
598ASSUME 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;
610EndProc PREP_IFSR ;AN000;
611 ;AN000;
612 ;AN000;
613BREAK <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;
646CI_05: ;AN000;
647 invoke EcritNET ; enter network critical section ;AN000;
648
649CI_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;
655ASSUME 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;
669CI_15: ;AN000;
670 invoke LcritNET ; leave network critical section ;AN000;
671
672CI_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;
679CI_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;
683CI_22: ;AN011;
684 CMP AL,IFSR_INT21H_CRITER ; critical error? ;AN000;
685 JE CI_23 ;AN029;
686 JMP CI_30 ;AC029;
687CI_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;
696NO_UNMAP: ;AN029;
697 PUSH DS ;AN029;
698 Context DS ;AN029;
699ASSUME 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;
712NoTrans: ;AN029;
713 POP DS
714 invoke SET_EXTERR_INFO ; yes - set error info ;AN000;
715
716CI_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;
732CI_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;
752CI_27: ;AN011;
753 ADD SP,2 ; restore stack (dos ext error #) ;AN025;
754 JMP CI_80 ;AN011;
755 ;AN000;
756CI_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;
767CI_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;
775CI_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;
780CI_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;
785CI_36: ;AN011;
786 MOV AX,59 ; fs experienced an unexpected error ;AN011;
787 JMP CI_100 ;AN011;
788
789CI_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;
795CI_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;
807CI_39: ;AN018;
808 CallInstall SHARE_VIOLATION,MultDOS,10 ;AN000;
809CI_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;
817CI_40: ; carry clear - retry ;AN000;
818 MOV AL,RETRY ;AN000;
819
820CI_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;
831ASSUME DS:IFSSEG ;AN000;
832 JMP CALL_IFS ;AN000;
833 ;AN000;
834CI_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;
838CI_120: ;AN028;
839 JMP ifs_980 ; go ret w/carry ;AN000;
840 ;AN000;
841 ;AN000;
842EndProc CALL_IFS ;AN000;
843 ;AN000;
844 ;AN000;
845BREAK <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;
916ASSUME DS:NOTHING,ES:NOTHING ;AN000;
917 ;AN000;
918 CALL CONSIST_DFL ; reset all in_prog flags ;AN000;
919CDE_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;
924CDE_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;
928CDE_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;
939CDE_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;
943CDE_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;
955CDE_73: ;AN000;
956 MOV AL," " ;AN000;
957CDE_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;
969CDE_80: ;AN000;
970 ADD DI,4 ; skip alias index and user wd ;AC004;
971;;;; INC DI ;AD004;
972CDE_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;
977CDE_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;
994CDE_140: ;AN000;
995 invoke PREP_IFSR ; init req hdr ;AN000;
996 invoke DFL_TO_DF ;AN000;
997 JMP ifs_990 ;AN000;
998 ;AN000;
999EndProc CREATE_DFL_ENTRY ;AN000;
1000 ;AN000;
1001BREAK <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;
1036EndProc 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;
1177BREAK <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;
1229ASSUME 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;
1239DSFC_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;
1246DSFC_60: ;AN000;
1247 invoke DFL_TO_DF ;AN000;
1248 JMP ifs_990 ;AN000;
1249 ;AN000;
1250 ;AN000;
1251EndProc 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;
1288BREAK <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;
1316ASSUME 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;
1324DM_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;
1333DM_40: ;AN000;
1334 XOR AL,AL ;AN000;
1335 MOV BYTE PTR ES:[DI-1],AL ;AN000;
1336DM_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;
1341DM_80: ;AN000;
1342 XOR AX,AX ; ax is counter through DFL entries ;AN000;
1343 LDS SI,[DFLAddr] ; dssi -> dfl entry ;AN000;
1344DM_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;
1359DM_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;
1364DM_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;
1373DM_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;
1380DM_1000: ;AN000;
1381 RestoreReg <BX,CX,AX,DI,ES,SI,DS> ; restore regs ;AN000;
1382 return ;AN000;
1383 ;AN000;
1384EndProc DFL_MATCH ;AN000;
1385 ;AN000;
1386BREAK <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;
1429ASSUME 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;
1435ASSUME 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;
1511SFT_20: ;AN000;
1512 RestoreReg <DI> ; restore ES:DI -> start of SFF ;AN000;
1513 SaveReg <ES> ; set DS:DI -> SFF ;AN000;
1514 RestoreReg <DS> ;AN000;
1515ASSUME 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;
1524SFT_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;
1528SFT_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;
1544SFT_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;
1550SFT_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;
1557EndProc SFT_TO_SFF ;AN000;
1558 ;AN000;
1559 ;AN000;
1560BREAK <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;
1593ASSUME 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;
1599ASSUME DS:DOSGROUP ;AN000;
1600 LES DI,[THISSFT] ; DS:SI -> SFF ;AN000;
1601 PUSH CS ;AN000;
1602 POP DS ;AN000;
1603ASSUME 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
1666SFF_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;
1677SFF_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;
1682SFF_1000: ;AN000;
1683 RestoreReg <CX,AX,SI,DS,DI,ES> ; restore regs ;AC003;
1684 ;AN000;
1685 return ;AN000;
1686 ;AN000;
1687EndProc SFF_TO_SFT ;AN000;
1688 ;AN000;
1689BREAK <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;
1725ASSUME 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;
1733CCD_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;
1761CCD_20: ;AN000;
1762 POP DI ; restore CD offset ;AN000;
1763 PUSH CS ; get DS -> IFSSEG ;AN000;
1764 POP DS ;AN000;
1765ASSUME 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;
1779EndProc CDS_TO_CD ;AN000;
1780 ;AN000;
1781 ;AN000;
1782BREAK <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;
1807ASSUME 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;
1838EndProc CD_TO_CDS ;AN000;
1839 ;AN000;
1840 ;AN000;
1841BREAK <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;
1868ASSUME 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;
1874ASSUME 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
1908DDF_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;
1925EndProc DFL_TO_DF ;AN000;
1926 ;AN000;
1927 ;AN000;
1928BREAK <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;
1948ASSUME 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;
1955ASSUME 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;
1974EndProc DF_TO_DFL ;AN000;
1975 ;AN000;
1976 ;AN000;
1977BREAK <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;
1997ASSUME 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;
2008ASSUME 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;
2013DONE_LOOK_FCB: ;AN000;
2014 LDS SI,[SFT_Addr] ; get pointer to beginning of table ;AN000;
2015ScanLoop: ;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;
2028CS_20:
2029 return ;AN000;
2030 ;AN000;
2031LOOK_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;
2079PIRET: ;AN000;
2080 IRET ;AN000;
2081 ;AN000;
2082NOT_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;
2086NOT_REDIR: ;AN000;
2087 POP SI ;AN000;
2088 POP DS ;AN000;
2089CLEAN_CX: ;AN000;
2090 POP CX ;AN000;
2091NEXT_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;
2099UNDO_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;
2111EndProc CONSIST_SFT ;AN000;
2112 ;AN000;
2113 ;AN000;
2114BREAK <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;
2133ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2134 ;AN000;
2135 SaveReg <SI,DX,CX> ;AC023;
2136 MOV DX,SIZE DFLL_LIST ;AN000;
2137CD_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;
2145EndProc CONSIST_DFL ;AN000;
2146
2147
2148BREAK <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;
2169ASSUME 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;
2179PC_20: ;AN012;
2180 RestoreReg <AX,DI,ES> ;AN012;;AC014;
2181 return ;AN012;
2182
2183EndProc PRN_CHECK ;AN012;
2184
2185
2186BREAK <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;
2210ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2211 ;AN000;
2212 SaveReg <ES,DI,DS,SI,CS> ;AN000;
2213 RestoreReg <ES> ;AN000;
2214ASSUME 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;
2224CRD_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;
2246CRD_40: ; match found ;AN000;
2247 RestoreReg <SI,DS> ; dfl entry ;AN000;
2248 OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000;
2249 ;AN000;
2250CRD_100: ;AN000;
2251 SaveReg <DS,SI> ; dfl entry ;AN000;
2252 SaveReg <CS> ;AN000;
2253 RestoreReg <DS> ;AN000;
2254ASSUME 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;
2263ASSUME 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;
2272CRD_120: ;AN000;
2273 RestoreReg <DI,ES> ; restore es,di ;AN000;
2274 return ;AN000;
2275 ;AN000;
2276EndProc CHECK_REAL_DEVICE ;AN000;
2277 ;AN000;
2278 ;AN000;
2279Break <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;
2296Procedure XCHGP,NEAR ;AN000;
2297 SaveReg <DS,ES> ;AN000;
2298 RestoreReg <DS,ES> ;AN000;
2299 XCHG SI,DI ;AN000;
2300 return ;AN000;
2301EndProc XCHGP ;AN000;
2302 ;AN000;
2303 ;AN000;
2304Break <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;
2318Procedure 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;
2325EndProc IFSDrvFromCDS ;AN000;
2326 ;AN000;
2327 ;AN000;
2328Break <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;
2341Procedure 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;
2347EndProc SET_THISIFS_UNC ;AN000;
2348 ;AN000;
2349 ;AN000;
2350Break <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;
2363Procedure 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;
2376SC_20: ;AN000;
2377 RestoreReg <AX> ;AN000;
2378 return ;AN000;
2379EndProc SET_CATEGORY ;AN000;
2380 ;AN000;
2381 ;AN000;
2382Break <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;
2395Procedure 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;
2403EndProc SET_DEPIOCTL_IFSR ;AN000;
2404 ;AN000;
2405
2406Break <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;
2421Procedure 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;
2428EndProc GET_UNC_FS_NAME ;AN000;
2429
2430 ;AN000;
2431Break <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;
2446Procedure MOVE_DRIVER_NAME,NEAR ;AN000;
2447 ;AN000;
2448 ADD SI,IFS_NAME ; space to name in ifs hdr ;AN000;
2449 MOV CX,8 ;AN000;
2450MDN_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;
2456MDN_40: ;AN000;
2457 XOR AL,AL ;AN000;
2458 STOSB ;AN000;
2459 ;AN000;
2460 return ;AN000;
2461EndProc MOVE_DRIVER_NAME ;AN000;
2462 ;AN000;
2463 ;AN000;
2464Break <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
2479Procedure 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;
2483CNA_20: ;AN000;
2484 LODSB ;AN000;
2485 CMP AL," " ;AN000;
2486 JE CNA_40 ;AN000;
2487 STOSB ;AN000;
2488 LOOP CNA_20 ;AN000;
2489CNA_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;
2497EndProc CONVERT_NAME_ASCIIZ ;AN000;
2498 ;AN000;
2499 ;AN000;
2500Break <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
2519Procedure CHECK_SEQ,NEAR ;AN000;
2520ASSUME 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;
2545CS_10: ;AN007;
2546 STC ; has device - set carry ;AN007;
2547 ;AN007;
2548CS_1000: ;AN007;
2549 RestoreReg <SI,DS> ; restore used regs ;AN007;
2550 return ;AN000;
2551 ;AN000;
2552EndProc CHECK_SEQ ;AN000;
2553 ;AN000;
2554 ;AN000;
2555Break <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;
2569Procedure 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;
2581EndProc INIT_DFL ;AN000;
2582 ;AN000;
2583 ;AN000;
2584BREAK <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;
2607ASSUME 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
2627NT_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;
2641NT_60: ;AN023;
2642 RestoreReg <BX,AX,SI,DS> ;AC001;
2643 ;AN001;
2644 return ;AN000;
2645 ;AN000;
2646EndProc NET_TRANS ;AN000;
2647 ;AN000;
2648
2649Break <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;
2665Procedure 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;
2674SW_20: ;AN000;
2675 INC SI ;AN000;
2676 ;AN000;
2677SW_1000: ;AN000;
2678 return ;AN000;
2679 ;AN000;
2680EndProc STRIP_WFP_START ;AN000;
2681
2682
2683Break <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;
2700Procedure 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;
2711EndProc CHECK_IFS_ATTRIBUTE ;AN000;
2712
2713
2714Break <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;
2731Procedure CHECK_IFS_SUPPORT,NEAR ;AN000;
2732
2733 return ;AN010;
2734
2735EndProc CHECK_IFS_SUPPORT ;AN010;
2736
2737 ;AN000;
2738IFSSEG ENDS ;AN000;
2739 END ;AN000;