summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/IFSFUNC
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSDEV.ASM1267
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSDIR.ASM313
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSERROR.ASM637
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM476
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFILE.ASM1778
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM202
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFSYM.INC162
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK12
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL49
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSHAND.ASM903
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSINIT.ASM1373
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSPARSE.INC92
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSSESS.ASM2187
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM2739
-rw-r--r--v4.0/src/CMD/IFSFUNC/MAKEFILE127
15 files changed, 12317 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM
new file mode 100644
index 0000000..1ad88ff
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM
@@ -0,0 +1,1267 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC DEVICE ROUTINES - Device/IOCTL routines ;AN000;
4NAME IFSDEV ;AN000;
5 ;AN000;
6;******************************************************************************
7;
8; Device related IFS calls
9;
10; Printer_GetSet_String
11; IFS_Device_Check
12; IFS_Device_Close
13; IFS_Device_Oper
14; IFS_Spool_Echo_Check
15; IFS_DEPENDENT_IOCTL
16; DEVICE_IOCTL
17; GET_DFL_FROM_INDEX
18;
19; Programming notes:
20; Old redirector segmentation and DOS interface preserved.
21; Routine prologues are accurate for input/output.
22; However, the pseudocode was not kept up to date.
23; Use it for a rough idea of the routine function.
24;
25; REVISION HISTORY:
26; A000 Original version 4.00 May 1987
27; A001 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA
28; A002 PTM 764 - printer attach problems 8/87 RGAZZIA
29; A003 PTM 849 - printer open problems 8/87 RGAZZIA
30; A004 PTM 1244- Net Print problems 8/87 RGAZZIA
31; A005 PTM 1600- dev ioctl ds bug 8/87 RGAZZIA
32; A006 PTM 3619- thiscds,thissft not set in ifs dep ioctl 2/88 RGazzia
33; A007 PTM 3971 Austin Print bug raid 3/88 RMG
34; A008 PTM 4055 UNC problems (make sure thisdfl null on error) 3/30/88 RMG
35; A009 PTM 4188 Names=0 problems 4/08/88 RMG
36; A010 PTM 4554 Echo across network in vitt alt task 5/12/88 RMG
37; A011 PTM 4841 Ctrl ptrsc problems 5/13/88 RMG
38; A012 PTM 4885 ifs dept ioctl not recog non-ifs drive 5/17/88 RMG
39; A013 PTM 4791 problem with ax error code overwrite 5/19/88 RMG
40; A014 PTM 4946 net - no ptrs 5E02 doesn't return error 5/20/88 RMG
41; A015 PTM 5005 get truncate flag faulty - ret on user stack 6/02/88 RMG
42; LOC - 477
43;
44;******************************************************************************
45 ;AN000;
46.xlist ;AN000;
47.xcref ;AN000;
48INCLUDE IFSSYM.INC ;AN000;
49INCLUDE IFSFSYM.INC ;AN000;
50INCLUDE DOSSYM.INC ;AN000;
51INCLUDE DEVSYM.INC ;AN000;
52.cref ;AN000;
53.list ;AN000;
54 ;AN000;
55AsmVars <IBM,KANJI,DEBUG> ;AN000;
56 ;AN000;
57; define the base code segment of the network support first ;AN000;
58 ;AN000;
59IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
60IFSSEG ENDS ;AN000;
61 ;AN000;
62; include THE REST Of the segment definitions for normal MSDOS ;AN000;
63 ;AN000;
64.xlist ;AN000;
65include dosseg.asm ;AN000;
66.list ;AN000;
67 ;AN000;
68DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
69 ; DOSGROUP Data ;AN000;
70 Extrn THISCDS:DWORD ;AN000;
71 Extrn THISSFT:DWORD ;AN000;
72 Extrn CDSAddr:DWORD ;AN000;
73 Extrn CDSCount:BYTE ;AN000;
74 Extrn CurrentPDB:WORD ;AN000;
75DATA ENDS ;AN000;
76 ;AN000;
77 ;AN000;
78IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
79 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
80 ;AN000;
81 ; IFS data ;AN000;
82;;;aliasExtrn NLAddr:DWORD ;AN000;
83 Extrn TEMPBUF:BYTE ;AN000;
84 Extrn UNC_FS_HDR:DWORD ;AN000;
85 Extrn THISIFS:DWORD ;AN000;
86 Extrn THISDFL:DWORD ;AN000;
87 Extrn DFLCount:BYTE ;AN000;
88 Extrn DFLAddr:DWORD ;AN000;
89 Extrn IFSDRV:BYTE ;AN000;
90 Extrn fAssign:BYTE ;AN000;
91 Extrn CDSAlt:DWORD ;AN000;
92 Extrn TRUNCATE_FLAG:BYTE ;AN000;
93 Extrn IFSPROC_FLAGS:WORD ;AN000;
94 Extrn IFSFUNC_FLAGS:WORD ;AN000;
95 Extrn IFSR:WORD ;AN000;
96 Extrn LPT1_NAME:BYTE ;AN000;
97 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
98 ;AN000;
99 ;AN000;
100BREAK <PRINTER_GETSET_STRING Get/Set a Pre-pend string> ;AN000;
101 ;AN000;
102;****************************************************************************** ;AN000;
103; ;AN000;
104; PRINTER_GETSET_STRING Get or Set the printer string and flag word ;AN000;
105; ;AN000;
106; Called by: Dispatcher ;AN000;
107; ;AN000;
108; Routines called: CALL_IFS DOS: Get_User_Stack ;AN000;
109; GET_DFL_FROM_INDEX ;AN000;
110; DF_TO_DFL ;AN000;
111; ;AN000;
112; Inputs: ;AN000;
113; AL has function type (2-printer-set 3-printer-get ;AN000;
114; 4-printer-set-flags 5-printer-get-flags ;AN000;
115; VALUE ALREADY RANGE CHECKED BY CALLER ;AN000;
116; DS:SI is user string pointer (call 2) ;AN000;
117; ES:DI is user buffer (call 3) ;AN000;
118; BX is assign index (calls 2,3,4,5) ;AN000;
119; CX is length DS:SI (call 2) ;AN000;
120; DX is flag word (call 4) ;AN000;
121; ;AN000;
122; Function: ;AN000;
123; Prep IFSRH: ;AN000;
124; * IFSR_LENGTH DW 48 ; Request length ;AN000;
125; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
126; IFSR_RETCODE DW ? ;AN000;
127; IFSR_RETCLASS DB ? ;AN000;
128; IFSR_RESV1 DB 16 DUP(0) ;AN000;
129; * IFSR_APIFUNC DB 16 ; REDIR IOCTL (Printer Getset String) ;AN000;
130; IFSR_ERROR_CLASS DB ? ;AN000;
131; IFSR_ERROR_ACTION DB ? ;AN000;
132; IFSR_ERROR_LOCUS DB ? ;AN000;
133; IFSR_ALLOWED DB ? ;AN000;
134; IFSR_I24_RETRY DB ? ;AN000;
135; IFSR_I24_RESP DB ? ;AN000;
136; IFSR_RESV2 DB ? ;AN000;
137; * IFSR_DEVICE_CB@ DD ? ; DFL entry found by IFSFUNC ;AN000;
138; ; Step through CDS & DFL lists counting ;AN000;
139; ; (0,1,2,...) ones with IFS bit set. ;AN000;
140; ; Stop at BXth one. Pass that in ;AN000;
141; ; IFSR_DEVICE_CB@. ;AN000;
142; IFSR_OPEN_CB@ DD ? ;AN000;
143; * IFSR_FUNC DB 0 ; subfunction: ;AN000;
144; ; 00 Generic IOCTL by device number ;AN000;
145; IFSR_RESV3 DB 0 ;AN000;
146; * IFSR_BUFFER@ DD ? ; user buffer (see below) ;AN000;
147; * IFSR_BUFSIZE DW ? ; length ;AN000;
148; * IFSR_CATEGORY DB 1 ; category 1 for REDIR ;AN000;
149; * IFSR_CTLFUNC DB ? ; For AL=2,3 00F00001H F=0 GET,F=1 SET ;AN000;
150; ; printer string ;AN000;
151; ; For AL=4,5 00F00010H F=0 GET,F=1 SET ;AN000;
152; ; printer flag ;AN000;
153; ;AN000;
154; BUFFER LABEL WORD ; AL=2,3 ;AN000;
155; DATA DB ... ;AN000;
156; ;AN000;
157; BUFFER LABEL WORD ; AL=4,5 ;AN000;
158; DW FLAGS ; Printer mode flags ;AN000;
159; ; 8000H=binary (vs.ascii) ;AN000;
160; ;AN000;
161; ;AN000;
162; CALL routine, CALL_IFS, with pointer to UNC capable IFS header ;AN000;
163; IF IFSR_RETCODE = 0 THEN ;AN000;
164; DO ;AN000;
165; IF AL=5 THEN DX = Flags ;AN000;
166; Call DF_TO_DFL ;AN000;
167; ENDDO ;AN000;
168; ELSE ;AN000;
169; Set carry ;AN000;
170; Put error code in AX ;AN000;
171; ENDIF ;AN000;
172; ;AN000;
173; Outputs: ;AN000;
174; If AL = 3 then CX bytes have been put at input ES:DI ;AN000;
175; If AL = 5 then DX is the flag word ;AN000;
176; ;AN000;
177; Regs: nothing preserved ;AN000;
178; ;AN000;
179; Notes: This request is a REDIR.SYS dependent ioctl request ;AN000;
180; ;AN000;
181;****************************************************************************** ;AN000;
182 ;AN000;
183 procedure PRINTER_GETSET_STRING,NEAR ;AN000;
184ASSUME DS:NOTHING,ES:NOTHING ;AN000;
185 ;AN000;
186 TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; unc (redir.sys) must be ;AN000;
187 JNZ PGS_05 ; installed, else do nothing ;AN000;
188 MOV AX,error_invalid_function ;AN000;
189 transfer ifs_980 ;AN000;
190 ;AN000;
191PGS_05: ;AN000;
192 ifsr_fcn_def EXECAPI ;AN000;
193 ifsr_api_def DEPIOCTL ;AN000;
194 ;AN000;
195 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
196 ; right ;AN000;
197 SaveReg <ES,AX> ; preserve input es since ;AC007;
198 ; next call destroys it ;AN000;
199 ; preserve ax too ;AN007;
200 CALL GET_DFL_FROM_INDEX ; sets [THISDFL], ;AN000;
201 ; ifsr_device_cb@ & ;AN000;
202 ; [THISIFS] ;AN000;
203 JNC PGS_10 ; error on carry - no dfl ;AN000;
204 ADD SP,4 ; restore stack and ;AC007;
205 transfer IFS_980 ; go return in ifsutil ;AC007;
206 ;AN000;
207PGS_10: ;AN000;
208 RestoreReg <AX> ; restore input al ;AN007;
209 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
210 MOV ES:[BX.IFSR_CATEGORY],CATEGORY_REDIR ;AN000;
211 CMP AL,PRINTER_SET_STRING ;AN000;
212 JNE PGS_20 ;AN000;
213 ; printer set string ;AN000;
214 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ; ;AN000;
215 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ; ;AN000;
216 MOV ES:[BX.IFSR_BUFSIZE],CX ; ;AN000;
217 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_STRING ;AN000;
218 ADD SP,2 ; restore stack (es) & ;AN000;
219 JMP SHORT PGS_100 ; go call redir.sys ;AN000;
220 ;AN000;
221PGS_20: ;AN000;
222 CMP AL,PRINTER_GET_STRING ; printer get string ;AN000;
223 JNE PGS_40 ;AN000;
224 POP CX ; retrieve es in cx ;AN000;
225 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ; ;AN000;
226 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000;
227 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_STRING ;AN000;
228 JMP SHORT PGS_100 ;AN000;
229 ;AN000;
230PGS_40: ; flags ;AN000;
231 ADD SP,2 ; 1st clean stack of es ;AN000;
232 PUSH CS ; not needed here ;AN000;
233 POP DS ; must set up buffer ;AN000;
234ASSUME DS:IFSSEG ; to hold flag word ;AN000;
235 MOV SI,OFFSET TEMPBUF ;AN000;
236 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000;
237 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
238 CMP AL,PRINTER_SET_FLAGS ;AN000;
239 JNE PGS_60 ;AN000;
240 MOV DS:[SI],DX ; printer set flags ;AN000;
241 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_FLAGS ;AN000;
242 JMP PGS_100 ;AN000;
243 ;AN000;
244PGS_60: ; printer get flags ;AN000;
245 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_FLAGS ;AN000;
246 ;AN000;
247PGS_100: ;AN000;
248 PUSH AX ; save function ;AN000;
249 ;AN000;
250 PUSH CS ;AN000;
251 POP DS ;AN000;
252ASSUME DS:IFSSEG ;AN000;
253 ;AN000;
254 invoke SET_THISIFS_UNC ; set thisifs to unc ;AN000;
255 ;AN000;
256 invoke CALL_IFS ; call ifs driver w/request ;AN000;
257 ;AN000;
258 JNC PGS_120 ;AN000;
259 ADD SP,2 ; clean stack of ax (fcn #) ;AN013;
260 transfer ifs_980 ; go ret on error ;AN000;
261 ;AN000;
262PGS_120: ;AN000;
263 POP AX ; restore original input fcn ;AN000;;AM013;
264 invoke DF_TO_DFL ; Update dfl entry ;AN000;
265 ;AN000;
266 CMP AL,PRINTER_GET_FLAGS ; if printer get flags ;AN000;
267 JE PGS_140 ; put flags in DX ;AN000;
268 CMP AL,PRINTER_GET_STRING ; if printer get string ;AN000;
269 JE PGS_160 ; put stg size in CX ;AN000;
270 ;AN000;
271 transfer ifs_990 ;AN000;
272PGS_140: ;AN000;
273 LES DI,ES:[BX.IFSR_BUFFER@] ;AN000;
274 MOV DX,WORD PTR ES:[DI] ;AC004;
275 CallInstall Get_User_Stack,multDOS,24 ;AN000;
276 MOV [SI].User_DX,DX ; return user flags to dos ;AN000;
277 transfer ifs_990 ; go return with no carry ;AN000;
278 ;AN000;
279PGS_160: ;AN000;
280 MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000;
281 CallInstall Get_User_Stack,multDOS,24 ;AN000;
282 MOV [SI].User_CX,CX ; Size of pre string just transferred ;AN000;
283 transfer ifs_990 ; go return with no carry ;AN000;
284 ;AN000;
285EndProc PRINTER_GETSET_STRING ;AN000;
286 ;AN000;
287 ;AN000;
288 ;AN000;
289BREAK <IFS_DEVICE_CHECK See if given path is device> ;AN000;
290 ;AN000;
291;****************************************************************************** ;AN000;
292; ;AN000;
293; IFS_DEVICE_CHECK ;AN000;
294; ;AN000;
295; Called by: Dispatcher ;AN000;
296; ;AN000;
297; Routines called: DFL_MATCH DOS: PathChrCmp ;AN000;
298; DFL_TO_DF StrCpy ;AN000;
299; CALL_IFS ;AN000;
300; Inputs: ;AN000;
301; DS:SI -> name ;AN000;
302; ES:DI -> buffer ;AN000;
303; ;AN000;
304; Function: ;AN000;
305; Search DFL for match on name. ;AN000;
306; IF match found THEN ;AN000;
307; DO /* match found */ ;AN000;
308; IF DFL_TYPE = 3 (net device) THEN ;AN000;
309; ES:DI -> parms ;AN000;
310; Clear carry ;AN000;
311; ENDDO ;AN000;
312; ELSE /* no match found */ ;AN000;
313; Set carry ;AN000;
314; ENDIF ;AN000;
315; ;AN000;
316; Outputs: ;AN000;
317; no match: carry set ;AN000;
318; match: carry clear, es:di -> parms if unc ;AN000;
319; ;AN000;
320; ;AN000;
321; Regs: nothing preserved ;AN000;
322; ;AN000;
323; Programming notes: Most of this code lifted right out of the Redirector. ;AN000;
324; ;AN000;
325;****************************************************************************** ;AN000;
326 ;AN000;
327 procedure IFS_DEVICE_CHECK,NEAR ;AN000;
328ASSUME DS:NOTHING,ES:NOTHING ;AN000;
329 ;AN000;
330 ifsr_fcn_def ATTSTAT ;AN000;
331 ;AN000;
332 LocalVar Src,DWORD ; ** netprn parse code begins ;AN000;
333 LocalVar Dst,DWORD ;AN000;
334 LocalVar DotPos,WORD ;AN000;
335 Enter ;AN000;
336; ;AN000;
337; Preserve all of the input quantities ;AN000;
338; ;AN000;
339 MOV SrcL,SI ;AN000;
340 MOV SrcH,DS ;AN000;
341 MOV DstL,DI ;AN000;
342 MOV DstH,ES ;AN000;
343 MOV DotPos,-1 ;AN000;
344; ;AN000;
345; Check for a UNC string. If UNC, is not spooled. ;AN000;
346; ;AN000;
347 MOV AX,[SI] ;AN000;
348 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
349 JNZ NOT_UNC ;AN000;
350 XCHG AH,AL ;AN000;
351 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
352 JZ NOTSpool ;AN000;
353NOT_UNC: ;AN000;
354; ;AN000;
355; Scan string remembering previous path separator char. ;AN000;
356; ;AN000;
357 MOV DI,SI ; remember first character ;AN000;
358PathSkip: ;AN000;
359 LODSB ;AN000;
360 OR AL,AL ;AN000;
361 JZ FoundEnd ;AN000;
362IF Kanji ;AN000;
363 kanji load of next char too ;AN000;
364ENDIF ;AN000;
365 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
366 JZ SaveSI ;AN000;
367 CMP AL,':' ;AN000;
368 JNZ TestDot ;AN000;
369SaveSI: ;AN000;
370 MOV DI,SI ;AN000;
371 JMP PathSkip ;AN000;
372TestDot: ;AN000;
373 CMP AL,'.' ;AN000;
374 JNZ PathSkip ;AN000;
375 MOV DotPos,SI ;AN000;
376 JMP PathSkip ;AN000;
377 ;AN000;
378; ;AN000;
379; Better check for trailing :. They are ILLEGAL (read this comment, IBM) in ;AN000;
380; file names. ;AN000;
381; ;AN000;
382FoundEnd: ;AN000;
383 CMP BYTE PTR [SI-2],':' ;AN000;
384 JNZ NOCOL ;AN000;
385NotSpool: ;AN000;
386 SaveReg <AX,CS> ;AN008;
387 RestoreReg <DS> ;AN008;
388 MOV AX,NULL_PTR ;AN008;
389 MOV WORD PTR [THISDFL],AX ;AN008;
390 MOV WORD PTR [THISDFL+2],AX ;AN008;
391 RestoreReg <AX> ;AN008;
392 LDS SI,Src ;AN000;
393 STC ;AN000;
394Done: ;AN000;
395 LES DI,Dst ;AN000;
396 Leave ;AN000;
397 return ;AN000;
398 ;AN000;
399NotSpoolLv: ;AN000;
400 LeaveCrit critNet ;AN000;
401 JMP NotSpool ;AN000;
402 ;AN000;
403NOCOL: ;AN000;
404 XCHG SI,DI ;AN000;
405; ;AN000;
406; DS:SI points to remainder of string. DS:DI points to 1 past NUL. AL = 0 ;AN000;
407; ;AN000;
408 CMP DotPos,-1 ;AN000;
409 JZ GetP ;AN000;
410 MOV DI,DotPos ;AN000;
411 XCHG AL,[DI-1] ;AN000;
412; ;AN000;
413; DI points to 1 past either former . (now NUL) or terminating NUL. AL has ;AN000;
414; former character (. or NUL) ;AN000;
415; ;AN000;
416 ; ** end of netprn code ;AN000;
417GETP: ; ds:si -> parsed string ;AN000;
418 invoke DFL_MATCH ;AN000;
419 MOV ES,SrcH ;AN000;
420 MOV ES:[DI-1],AL ; replace original character ;AN000;
421 JNC IDC_100 ; not in dfl; set bl=ff ;AN000;
422 JMP NotSpool ;AN000;
423 ;AN000;
424IDC_100: ; match found ;AN000;
425 LES DI,[THISDFL] ;AN000;
426 CMP ES:[DI.DFL_TYPE],TYPE_NET_DEVICE ;AN000;
427 JE IDC_120 ;AN000;
428 LES DI,Dst ;AN000;
429 JMP IDC_220 ;AN000;
430 ;AN000;
431IDC_120: ; ifs: get parms ;AN000;
432 invoke PREP_IFSR ; clear ifsr ;AN003;
433 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN003;
434 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
435 ; ES:BX -> IFSRH ;AN000;
436 ; IFSR_DEVICE_CB@ ;AN000;
437 ; ds - IFSSEG ;AN000;
438 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AN000;
439 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AN000;
440 invoke SET_CATEGORY ; this has nothing to do w/catrgory ;AN000;
441 ; want to determine if unc or not ;AN000;
442 OR CL,CL ; unc cl=1, other cl=0 ;AN000;
443 JNE IDC_140 ;AN000;
444 MOV ES:[BX.IFSR_TYPE],TYPE_DEVICE ;AN000;
445 JMP SHORT IDC_160 ;AN000;
446IDC_140: ;AN000;
447 MOV ES:[BX.IFSR_TYPE],TYPE_NET_DEVICE ;AN000;
448IDC_160: ;AN000;
449 PUSH CS ;AN000;
450 POP DS ;AN000;
451ASSUME DS:IFSSEG ;AN000;
452 MOV SI,OFFSET TEMPBUF ;AN000;
453 MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000;
454 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000;
455 ;AN000;
456 invoke CALL_IFS ;AN000;
457 JNC IDC_200 ;AN008;
458 JMP NotSpool ;AC008;
459 ;AN000;
460IDC_200: ;AN000;
461 MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AN000;
462 MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AN000;
463 MOV BL,ES:[BX.IFSR_TYPE] ;AC001;
464 XOR BH,BH ;AN001;
465 INC SI ; ds:si -> parms returned by redir ;AN000;
466 INC SI ;AN000;
467 LES DI,Dst ;AN000;
468 CallInstall StrCpy,multDOS,17 ;AN000;
469 DEC DI ; now append device name to net path ;AN003;
470 MOV AL,'\' ; | ;AN003;
471 STOSB ; | ;AN003;
472 LDS SI,CS:[THISDFL] ; | ;AN003;
473 ADD SI,2 ; | ;AN003;
474 invoke CONVERT_NAME_ASCIIZ ; | mov name string over ;AN003;
475
476IDC_220: ;AN000;
477 LDS SI,Dst ;AN000;
478 CLC ;AN000;
479 JMP DONE ;AN000;
480 ;AN000;
481 ;AN000;
482EndProc IFS_DEVICE_CHECK ;AN000;
483 ;AN000;
484 ;AN000;
485 ;AN000;
486 ;AN000;
487BREAK <IFS_DEVICE_CLOSE Do a close on a device session directly> ;AN000;
488 ;AN000;
489;****************************************************************************** ;AN000;
490; ;AN000;
491; IFS_DEVICE_CLOSE ;AN000;
492; ;AN000;
493; Called by: IFSFUNC Dispatcher ;AN000;
494; ;AN000;
495; Routines called: ;AN000;
496; SFT_TO_SFF ;AN000;
497; SFF_TO_SFT ;AN000;
498; CALL_IFS ;AN000;
499; ;AN000;
500; Inputs: ES:DI -> SFT ;AN000;
501; ;AN000;
502; Function: ;AN000;
503; Send request below to IFS specified if SFT. ;AN000;
504; ;AN000;
505; Prep IFSRH: ;AN000;
506; * IFSR_LENGTH DW 48 ; Request length ;AN000;
507; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
508; IFSR_RETCODE DW ? ;AN000;
509; IFSR_RETCLASS DB ? ;AN000;
510; IFSR_RESV1 DB 16 DUP(0) ;AN000;
511; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
512; IFSR_ERROR_CLASS DB ? ;AN000;
513; IFSR_ERROR_ACTION DB ? ;AN000;
514; IFSR_ERROR_LOCUS DB ? ;AN000;
515; IFSR_ALLOWED DB ? ;AN000;
516; IFSR_I24_RETRY DB ? ;AN000;
517; IFSR_I24_RESP DB ? ;AN000;
518; IFSR_RESV2 DB ? ;AN000;
519; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
520; * IFSR_OPEN_CB@ DD ? ; SF ;AN000;
521; * IFSR_FUNC DB 0 ; generic IOCTL by handle ;AN000;
522; IFSR_RESV3 DB 0 ;AN000;
523; IFSR_BUFFER@ DD ? ;AN000;
524; IFSR_BUFSIZE DW ? ;AN000;
525; IFSR_CATEGORY DB 1 for UNC, 0 for all other FSs ;AN000;
526; IFSR_CTLFUNC DB 00000101B ; device spool close ;AN000;
527; ;AN000;
528; Outputs: ;AN000;
529; Carry set - error code in AX ;AN000;
530; ;AN000;
531; ;AN000;
532; Regs: nothing preserved ;AN000;
533; ;AN000;
534; ;AN000;
535;****************************************************************************** ;AN000;
536 ;AN000;
537 procedure IFS_DEVICE_CLOSE,NEAR ;AN000;
538ASSUME DS:NOTHING,ES:NOTHING ;AN000;
539 ;AN000;
540 ifsr_fcn_def EXECAPI ;AN000;
541 ifsr_api_def DEPIOCTL ;AN000;
542 ;AN000;
543 SaveReg <DS,SI,ES,DI> ; preserve these for dos - guesing ;AN011;
544 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002;
545 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000;
546 ;AN000;
547 Context DS ;AN000;
548 MOV WORD PTR [THISSFT],DI ;AN000;
549 MOV WORD PTR [THISSFT+2],ES ;AN000;
550
551 invoke PREP_IFSR ; & ifsr ;AM011;
552 invoke SFT_TO_SFF ; sets [THISIFS] ;AN000;
553 ; ES:BX -> IFSRH ;AN000;
554 ; IFSR_OPEN_CB@ ;AN000;
555 ; IFSR_DEVICE_CB@ ;AN000;
556 ; ds - IFSSEG ;AN000;
557 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
558;;;;;;;;INC ES:[BX.IFSR_FUNC] ; inc func from gen_ioctl_by_devnum ;AD011;
559;;;;;;;; ; to gen_ioctl_by_handle ;AD011;
560 invoke SET_CATEGORY ;AN000;
561 MOV ES:[BX.IFSR_CATEGORY],CL ;AN002;
562 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVCLOSE ;AN000;
563 ;AN000;
564 invoke CALL_IFS ; call ifs w/device close request ;AN000;
565 ;AN000;
566 JNC IDCL_60 ;AN000;
567 JMP IDCL_1000 ; go ret w/carry already set ;AC011;
568 ;AN000;
569IDCL_60: ;AN000;
570 invoke SFF_TO_SFT ;AN000;
571;;;;;;;;transfer ifs_990 ;AD011;
572IDCL_1000: ;AN011;
573 RestoreReg <DI,ES,SI,DS> ;AN011;
574 XOR CX,CX ; set zero flag ;AN011;;AC013;
575 return ;AN011;
576 ;AN000;
577 ;AN000;
578EndProc IFS_DEVICE_CLOSE ;AN000;
579 ;AN000;
580 ;AN000;
581BREAK <IFS_DEVICE_OPER Do various device control functions> ;AN000;
582 ;AN000;
583;****************************************************************************** ;AN000;
584; ;AN000;
585; IFS_DEVICE_OPER ;AN000;
586; ;AN000;
587; Called by: IFSFUNC Dispatcher ;AN000;
588; ;AN000;
589; Routines called: PREP_IFSR ;AN000;
590; CALL_IFS ;AN000;
591; DFL_TO_DF ;AN000;
592; ;AN000;
593; Inputs: AL = 7 Get truncate flag ;AN000;
594; AL = 8 Set truncate flag ;AN000;
595; DL = value ;AN000;
596; AL = 9 Close all spool files ;AN000;
597; ;AN000;
598; Function: ;AN000;
599; IF AL=7 THEN DL = [TRUNCATE_FLAG] ;AN000;
600; ELSE DO ;AN000;
601; Get addr of 1st DFL entry. ;AN000;
602; FOR I = 1 to last DFL entry in use ;AN000;
603; Send request below to IFS specified if DFL. ;AN000;
604; ENDDO ;AN000;
605; ;AN000;
606; Prep IFSRH: ;AN000;
607; * IFSR_LENGTH DW 48 ; Request length ;AN000;
608; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609; IFSR_RETCODE DW ? ;AN000;
610; IFSR_RETCLASS DB ? ;AN000;
611; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
613; IFSR_ERROR_CLASS DB ? ;AN000;
614; IFSR_ERROR_ACTION DB ? ;AN000;
615; IFSR_ERROR_LOCUS DB ? ;AN000;
616; IFSR_ALLOWED DB ? ;AN000;
617; IFSR_I24_RETRY DB ? ;AN000;
618; IFSR_I24_RESP DB ? ;AN000;
619; IFSR_RESV2 DB ? ;AN000;
620; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
621; IFSR_OPEN_CB@ DD ? ;AN000;
622; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by device number ;AN000;
623; IFSR_RESV3 DB 0 ;AN000;
624; * IFSR_BUFFER@ DD ? ;AN000;
625; * IFSR_BUFSIZE DW 1 ;AN000;
626; IFSR_CATEGORY DB 1 for UNC, 0 for other FSs ;AN000;
627; IFSR_CTLFUNC DB 00000110 ; device_oper ;AN000;
628; ;AN000;
629; BUFFER LABEL BYTE ;AN000;
630; DB function ; 8 set truncate flag ;AN000;
631; ; 9 close all spool files ;AN000;
632; DB truncate flag on set ;AN000;
633; ;AN000;
634; Outputs: ;AN000;
635; Carry clear - DL = truncate flag on get ;AN000;
636; Carry set - AX = error code ;AN000;
637; ;AN000;
638; Regs: nothing preserved ;AN000;
639; ;AN000;
640; Notes: DFL not updated ;AN000;
641; ;AN000;
642;****************************************************************************** ;AN000;
643 ;AN000;
644 procedure IFS_DEVICE_OPER,NEAR ;AN000;
645 ;AN000;
646 CMP AL,GET_TRUNCATE_FLAG ;AN000;
647 JNE IDO_20 ;AN000;
648 MOV DL,[TRUNCATE_FLAG] ; Get truncate flag ;AN000;
649 XOR DH,DH ;AN015;
650 CallInstall Get_User_Stack,multDOS,24 ;AN015;
651 MOV [SI].User_DX,DX ;AN015;
652 transfer ifs_990 ; go ret no carry ;AN000;
653 ;AN000;
654IDO_20: ; Set truncate flag or close all ;AN000;
655 ifsr_fcn_def EXECAPI ; spool files ;AN000;
656 ifsr_api_def DEPIOCTL ;AN000;
657 ;AN000;
658 PUSH CS ; get addressability to IFSSEG ;AN000;
659 POP DS ;AN000;
660ASSUME DS:IFSSEG,ES:NOTHING ;AN000;
661 ;AN000;
662 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002;
663 CMP AL,SET_TRUNCATE_FLAG ; Set local storage of truncate_flag ;AN000;
664 JNE IDO_30 ;AN000;
665 MOV [TRUNCATE_FLAG],DL ;AC002;
666 MOV AH,DL ; for safekeeping ;AN002;
667 ;AN000;
668IDO_30: ;AN000;
669 MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000;
670 OR CL,CL ; check for no dfl ;AN009;
671 JNZ IDO_35 ;AN009;
672 transfer ifs_990 ; no dfl - just go successfully ;AN009;
673IDO_35:
674 XOR CH,CH ;AN000;
675 MOV DX,SIZE DFLL_LIST ;AN000;
676 LDS SI,[DFLAddr] ;AN000;
677 ;AN000;
678IDO_40: ; ** Loop here thru DFL list entries ;AN000;
679;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ;AN000;
680;;;aliasJE IDO_100 ; skip alias dfl entries ;AN000;
681;;;alias ;AN000;
682 TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ; skip unused dfl entries ;AN000;
683 JZ IDO_100 ;AN000;
684 MOV WORD PTR [THISDFL],SI ; Prep IFSRH ;AN000;
685 MOV WORD PTR [THISDFL+2],DS ;AN000;
686 invoke PREP_IFSR ;AN000;
687 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
688 ; ES:BX -> IFSRH ;AN000;
689 ; IFSR_DEVICE_CB@ ;AN000;
690 ; ds - IFSSEG ;AN000;
691 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
692 MOV SI,OFFSET TEMPBUF ; prep devoper buffer ;AN000;
693 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000;
694 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
695 MOV BYTE PTR DS:[SI],AL ; buffer contains: db fcn ;AN000;
696 MOV ES:[BX.IFSR_BUFSIZE],1 ;AN002;
697 CMP AL,CLOSE_SPOOL_FILES ; db truncate flag ;AN000;
698 JE IDO_60 ;AN000;
699 MOV BYTE PTR DS:[SI+1],AH ;AC002;
700 INC ES:[BX.IFSR_BUFSIZE]
701IDO_60: ;AN000;
702 invoke SET_CATEGORY ;AN000;
703 MOV ES:[BX.IFSR_CATEGORY],CL ;AN002;
704 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVOPER ;AN000;
705 ;AN000;
706 SaveReg <CX> ; save count ;AN000;
707 invoke CALL_IFS ; call ifs with device oper request ;AN000;
708 RestoreReg <CX> ; restore count ;AN000;
709 ;AN000;
710IDO_100: ;AN000;
711 ADD SI,DX ; prep for next dfl ;AN000;
712 LOOP IDO_40 ; go process next dfl ;AN000;
713 transfer ifs_990 ; Finished. Go ret no carry. ;AN000;
714 ;AN000;
715 ;AN000;
716EndProc IFS_DEVICE_OPER ;AN000;
717 ;AN000;
718 ;AN000;
719BREAK <IFS_SPOOL_ECHO_CHECK See if FS controling LPT1 allows echo> ;AN000;
720 ;AN000;
721;****************************************************************************** ;AN000;
722; ;AN000;
723; IFS_SPOOL_ECHO_CHECK ;AN000;
724; ;AN000;
725; Called by: Dispatcher ;AN000;
726; ;AN000;
727; Routines called: DFL_MATCH ;AN000;
728; DFL_TO_DF ;AN000;
729; CALL_IFS ;AN000;
730; Inputs: None ;AN000;
731; ;AN000;
732; Function: ;AN000;
733; Call DFL_MATCH for match on "LPT1". ;AN000;
734; IF match found THEN ;AN000;
735; DO ;AN000;
736; Prep IFSRH: ;AN000;
737; * IFSR_LENGTH DW 48 ; Request length ;AN000;
738; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
739; IFSR_RETCODE DW ? ;AN000;
740; IFSR_RETCLASS DB ? ;AN000;
741; IFSR_RESV1 DB 16 DUP(0) ;AN000;
742; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
743; IFSR_ERROR_CLASS DB ? ;AN000;
744; IFSR_ERROR_ACTION DB ? ;AN000;
745; IFSR_ERROR_LOCUS DB ? ;AN000;
746; IFSR_ALLOWED DB ? ;AN000;
747; IFSR_I24_RETRY DB ? ;AN000;
748; IFSR_I24_RESP DB ? ;AN000;
749; IFSR_RESV2 DB ? ;AN000;
750; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
751; IFSR_OPEN_CB@ DD ? ;AN000;
752; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by devnum ;AN000;
753; IFSR_RESV2 DB 0 ;AN000;
754; * IFSR_BUFFER@ DD ? ;AN000;
755; * IFSR_BUFSIZE DW ? ;AN000;
756; IFSR_CATEGORY DB ? ; 0 non-unc, 1 unc ;AN000;
757; IFSR_CTLFUNC DB 00000011B ;AN000;
758; ;AN000;
759; BUFFER LABEL BYTE ;AN000;
760; DB VALUE,0 ; 0 echo allowed ;AN000;
761; ; 1 echo not allowed ;AN000;
762; ;AN000;
763; ;AN000;
764; Call routine, CALL_IFS, with DFL_IFSR_HDR ;AN000;
765; ENDDO ;AN000;
766; ;AN000;
767; Outputs: ;AN000;
768; Carry clear - echo allowed ;AN000;
769; Carry set - echo NOT allowed ;AN000;
770; ;AN000;
771; ;AN000;
772; Regs: nothing preserved ;AN000;
773; ;AN000;
774; Programming notes: DFL FSDA not updated ;AN000;
775; ;AN000;
776;****************************************************************************** ;AN000;
777 ;AN000;
778 procedure IFS_SPOOL_ECHO_CHECK,NEAR ;AN000;
779ASSUME DS:NOTHING,ES:NOTHING ;AN000;
780 ;AN000;
781 ifsr_fcn_def EXECAPI ;AN000;
782 ifsr_api_def DEPIOCTL ;AN000;
783 ;AN000;
784 SaveReg <ES,DI,DS,SI> ; save these for ibmdos (guessing which) ;AN011;
785 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
786 ; right ;AN000;
787 PUSH CS ; Set ds:si -> "lpt1",0 ;AN000;
788 POP DS ; want to find dfl entry with ;AN000;
789ASSUME DS:IFSSEG ; this dev name ;AN000;
790 MOV SI,OFFSET LPT1_NAME ;AN000;
791 ;AN000;
792 invoke DFL_MATCH ;AN000;
793 JNC ISEC_10 ;AN000;
794 CLC ; not in dfl; assume echo ok ;AN011;
795 JMP ISEC_1000 ;AC011;
796 ;AN000;
797ISEC_10: ;AN000;
798 LES DI,[THISDFL] ;AN000;
799;;;aliasCMP ES:[DI.DFL_TYPE],TYPE_ALIAS ;AN000;
800;;;aliasJNE ISEC_15 ;AN000;
801;;;aliastransfer ifs_980 ; lpt1 is alias, assume no echo ;AN000;
802 ;AN000;
803ISEC_15: ;AN000;
804 invoke PREP_IFSR ; zero out ifsr ;AN000;
805 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
806 ; ES:BX -> IFSRH ;AN000;
807 ; IFSR_DEVICE_CB@ ;AN000;
808 ; ds - IFSSEG ;AN000;
809 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
810 MOV SI,OFFSET TEMPBUF ;AN000;
811 MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ; use tempbuf for ;AN000;
812 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ; return byte value ;AN000;
813 MOV ES:[BX.IFSR_BUFSIZE],LENGTH_DEVECHOCHECK_BUFFER ; (1) ;AN000;
814 ;AN000;
815 invoke SET_CATEGORY ;AN000;
816 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVECHOCHECK ; (00000011) ;AN000;
817 ;AN000;
818 invoke CALL_IFS ;AN000;
819 ;AN000;
820 JNC ISEC_60 ;AN000;
821 JMP SHORT ISEC_1000 ; no echo on err, cf set ;AC011;
822 ;AN000;
823ISEC_60: ;AN000;
824 CMP BYTE PTR DS:[SI],0 ; else byte returned in buffr ;AN000;
825 JE ISEC_80 ; determines echo (0-yes,1-no) ;AN000;
826 STC ;AN011;
827 JMP SHORT ISEC_1000 ; no echo ret ;AC011;
828ISEC_80: ;AN000;
829 CLC ;AN011;
830
831
832ISEC_1000: ; echo ret ;AN011;
833 RestoreReg <SI,DS,DI,ES> ;AN011;
834 RET ;AN011;
835
836 ;AN000;
837EndProc IFS_SPOOL_ECHO_CHECK ;AN000;
838 ;AN000;
839BREAK <IFS_DEPENDENT_IOCTL - dependent ioctl> ;AN000;
840 ;AN000;
841;****************************************************************************** ;AN000;
842; ;AN000;
843; IFS_DEPENDENT_IOCTL ;AN000;
844; ;AN000;
845; Called by: Dispatcher ;AN000;
846; ;AN000;
847; Routines called: CALL_IFS ;AN000;
848; CDS_TO_CD SFT_TO_SFF ;AN000;
849; CD_TO_CDS SFF_TO_SFT ;AN000;
850; ;AN000;
851; Inputs: ;AN000;
852; AL = 0 - Generic by device number ;AN000;
853; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000;
854; CX = private subfunction ;AN000;
855; DS:DX -> buffer ;AN000;
856; AL = 1 - Generic by handle ;AN000;
857; BX = handle [THISSFT] set ;AN000;
858; CX = private subfunction ;AN000;
859; DS:DX -> buffer ;AN000;
860; AL = 2 - Query OS type ;AN000;
861; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000;
862; CX = buffer size ;AN000;
863; ES:DI -> buffer ;AN000;
864; ;AN000;
865; Function: ;AN000;
866; Prep IFSRH: ;AN000;
867; * IFSR_LENGTH DW 48 ; Request length ;AN000;
868; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
869; IFSR_RETCODE DW ? ;AN000;
870; IFSR_RETCLASS DB ? ;AN000;
871; IFSR_RESV1 DB 16 DUP(0) ;AN000;
872; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
873; IFSR_ERROR_CLASS DB ? ;AN000;
874; IFSR_ERROR_ACTION DB ? ;AN000;
875; IFSR_ERROR_LOCUS DB ? ;AN000;
876; IFSR_ALLOWED DB ? ;AN000;
877; IFSR_I24_RETRY DB ? ;AN000;
878; IFSR_I24_RESP DB ? ;AN000;
879; IFSR_RESV2 DB ? ;AN000;
880; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (subfs 0,2) ;AN000;
881; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SFF (subf 1) ;AN000;
882; * IFSR_FUNC DB 0 ; AL - 0,1,or 2 ;AN000;
883; IFSR_RESV2 DB 0 ;AN000;
884; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000;
885; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000;
886;;;; for al=0,1 ;AN000;
887; * IFSR_CATEGORY DB 1 ; 1 for UNC, 0 for non-UNC ;AN000;
888; * IFSR_CTLFUNC DB ? ; al-2 ???, else cx ;AN000;
889; ;AN000;
890; ;AN000;
891; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
892; IF IFSR_RETCODE = 0 THEN ;AN000;
893; DO ;AN000;
894; IF CDS THEN ;AN000;
895; Call CD_TO_CDS ;AN000;
896; ELSE Call SFF_TO_SFT ;AN000;
897; ENDDO ;AN000;
898; ELSE ;AN000;
899; Set carry ;AN000;
900; Put error code in AX ;AN000;
901; ENDIF ;AN000;
902; ;AN000;
903; Outputs: function dependent ;AN000;
904; ;AN000;
905; Regs: nothing preserved ;AN000;
906; ;AN000;
907;****************************************************************************** ;AN000;
908 ;AN000;
909 procedure IFS_DEPENDENT_IOCTL,NEAR ;AN000;
910ASSUME DS:NOTHING,ES:NOTHING ;AN000;
911 ;AN000;
912 ifsr_fcn_def EXECAPI ;AN000;
913 ifsr_api_def DEPIOCTL ;AN000;
914 ;AN000;
915 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
916 ; right ;AN000;
917 SaveReg <BX,ES> ; save input es for query os type ;AC006;
918 ; and bx for drive # / handle ;AN006;
919 ;AN000;
920 MOV CS:IFSPROC_FLAGS,ZERO ; init ifsfunc flags ;AN000;
921 invoke PREP_IFSR ; & IFSR ;AN000;
922 ;AN000;
923 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
924 MOV ES:[BX.IFSR_FUNC],AL ; 0,1, or 2 ;AN000;
925 CMP AL,QUERY_OS_TYPE ;AN000;
926 JE IDI_10 ;AN000;
927 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ; ioctl generic ;AN000;
928 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
929 MOV ES:[BX.IFSR_CTLFUNC],CL ;AN000;
930 ADD SP,2 ; ditch es stored on stack ;AN000;
931 JMP SHORT IDI_15 ;AN000;
932IDI_10: ; query os type ;AN000;
933 MOV ES:[BX.IFSR_BUFSIZE],CX ; cx is bufsize ;AN000;
934 POP CX ; pop input es in cx ;AN000;
935 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ;AN000;
936 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000;
937IDI_15: ;AN000;
938 CMP AL,GEN_IOCTL_BY_HANDLE ;AN000;
939 RestoreReg <CX> ; restore input bx into ax, no cx ;AN006;;AC012;
940 ; (drive # or handle) ;AN006;
941 JE IDI_20 ;AN000;
942 ;AN000;
943;;;;;;; LDS SI,[THISCDS] ; have device number (block only???) ;AD006;
944 ; Now get CDS: ;AN006;
945 SaveReg <AX> ; function 0,1,2 ;AN012;
946 MOV AX,CX ; input bx ;AN012;
947 DEC AL ; make 0-based ;AN006;
948 MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN006;
949 CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN006;
950 RestoreReg <AX> ; fcn 0,1,2 ;AN012;
951 JNC IDI_17 ;AN006;
952IDI_16: ;AN012;
953 MOV AX,error_invalid_drive ; no cds, set error & ret ;AN006;
954 JMP IDI_120 ; ret up in FA to preserve DS ;AN006;
955IDI_17: ; (welcome lock) ;AN006;
956 TEST DS:[SI.curdir_flags],curdir_isifs ; check if drive ifs ;AN012;
957 JZ IDI_16
958 SaveReg <DS,SI> ; save cds ptr al=0,2 ;AN000;
959 OR IFSPROC_FLAGS,ISCDS ;AN000;
960 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
961 ; IFSR_DEVICE_CB@ ;AN000;
962 ; ds - netwrk ;AN000;
963 CMP AL,QUERY_OS_TYPE ;AN000;
964 JNE IDI_40 ;AN000;
965 JMP SHORT IDI_60 ;AN000;
966 ;AN000;
967IDI_20: ; al=1 ;AN000;
968 Context DS ;AN000;
969 OR IFSPROC_FLAGS,SETDEVICECB ;AN000;
970 ; Now, need to get THISSFT set: ;AN006;
971 SaveReg <ES,DI,BX> ; these about to be clobbered ;AN006;
972 MOV BX,CX ; put handle in bx ;AC012;
973 CallInstall pJFNFromHandle,multDOS,32 ; intermediate step to getting sft ;AN006;
974 JC IDI_25 ;AN006;
975 CMP BYTE PTR ES:[DI],-1 ; unused handle ;AN006;
976 JE IDI_25 ;AN006;
977 MOV BL,BYTE PTR ES:[DI] ; get SFN ;AN006;
978 XOR BH,BH ; ignore upper half ;AN006;
979 CallInstall SFFromSFN,multDOS,22 ; get real sf spot ;AN006;
980 MOV WORD PTR [THISSFT],DI ;AN006;
981 MOV WORD PTR [THISSFT+2],ES ;AN006;
982 RestoreReg <BX,DI,ES> ;AN006;
983 JMP SHORT IDI_30 ;AN006;
984IDI_25: ; sft error ;AN006;
985 RestoreReg <BX,DI,ES> ; restore regs ;AN006;
986 MOV AX,error_invalid_handle ;AN006;
987 JMP IDI_120 ;AN006;
988
989IDI_30: ;AN006;
990 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
991 ; IFSR_OPEN_CB@ ;AN000;
992 ; ds - netwrk ;AN000;
993IDI_40: ;AN000;
994 invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000;
995 MOV ES:[BX.IFSR_CATEGORY],CL ;AN000;
996IDI_60:
997 MOV DX,IFSIOCTL ; check if fs supports fs ioctl
998 invoke CHECK_IFS_ATTRIBUTE
999 JZ IDI_80 ; Z = no support, NZ = yes support
1000 JMP DI_70 ; continues in device_ioctl ;AN000;
1001 ;AN000;
1002IDI_80: ; error invalid fcn - fs doesn't support ;AN000;
1003 TEST IFSPROC_FLAGS,ISCDS ; if cds, must clean stack of ;AN000;
1004 JZ IDI_100 ; cds ptr ;AN000;
1005 ADD SP,4 ;AN000;
1006IDI_100: ;AN000;
1007 MOV AX,error_invalid_function ;AN000;
1008IDI_120: ;AN006;
1009 invoke SET_EXTERR_INFO ; set error info ;AN006;
1010 transfer ifs_980 ; go to general error return ;AN000;
1011 ;AN000;
1012EndProc IFS_DEPENDENT_IOCTL ;AN000;
1013
1014
1015BREAK <DEVICE_IOCTL - device ioctl> ;AN000;
1016 ;AN000;
1017;******************************************************************************
1018;
1019; DEVICE_IOCTL
1020;
1021; Called by: Dispatcher
1022;
1023; Routines called: CALL_IFS
1024; CDS_TO_CD SFT_TO_SFF
1025; CD_TO_CDS SFF_TO_SFT
1026;
1027; Inputs:
1028; AL = 02H(03H0 Read from(Write to) character device
1029; BX = handle [THISSFT] set
1030; CX = number of bytes to read(write)
1031; DS:DX -> buffer
1032; AL = 0CH Character Generic IOCTL
1033; CH = 1-async, 3-display, 5-printer
1034; CL = 5F-set, 7F-get
1035; DS:DX -> buffer
1036; AL = 0DH Block Generic IOCTL
1037; BH = 0
1038; BL = Drive number [THISCDS] set (0-based)
1039; CH = 08
1040; CL = 43-set, 63-get media id
1041; DS:DX -> buffer
1042;
1043; Function:
1044; Prep IFSRH:
1045; * IFSR_LENGTH DW 48 ; Request length
1046; * IFSR_FUNCTION DB 4 ; Execute API function
1047; IFSR_RETCODE DW ?
1048; IFSR_RETCLASS DB ?
1049; IFSR_RESV1 DB 16 DUP(0)
1050; * IFSR_APIFUNC DB 17 ; IFS device IOCTL
1051; IFSR_ERROR_CLASS DB ?
1052; IFSR_ERROR_ACTION DB ?
1053; IFSR_ERROR_LOCUS DB ?
1054; IFSR_ALLOWED DB ?
1055; IFSR_I24_RETRY DB ?
1056; IFSR_I24_RESP DB ?
1057; IFSR_RESV2 DB ?
1058; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (0DH)
1059; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SF (0CH)
1060; * IFSR_FUNC DB 0 ; AL 2,3,12,or 13
1061; IFSR_RESV2 DB 0
1062; * IFSR_BUFFER@ DD ? ; ds:dx
1063; * IFSR_BUFSIZE DW ? ; cx for al=2,3
1064; * IFSR_CATEGORY DB 1 ; ch for al=12,13
1065; * IFSR_CTLFUNC DB ? ; cl for al=12,13
1066;
1067;
1068; CALL routine, CALL_IFS
1069; IF IFSR_RETCODE = 0 THEN
1070; DO
1071; IF CDS THEN
1072; Call CD_TO_CDS
1073; ELSE Call SFF_TO_SFT
1074; ENDDO
1075; ELSE
1076; Set carry
1077; Put error code in AX
1078; ENDIF
1079;
1080; Outputs: function dependent
1081;
1082; Regs: nothing preserved
1083;
1084;******************************************************************************
1085 ;AN000;
1086 procedure DEVICE_IOCTL,NEAR ;AN000;
1087ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1088 ;AN000;
1089; mov ax,26 ; these two instrs temporary
1090; transfer ifs_980
1091
1092 ifsr_fcn_def EXECAPI ;AN000;
1093 ifsr_api_def DEVIOCTL ;AN000;
1094 ;AN000;
1095 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
1096 ; right ;AN000;
1097 PUSH DS ; save input ds ;AN000;
1098 ;AN000;
1099 MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000;
1100 invoke PREP_IFSR ; & ifsr ;AN000;
1101 POP ES:WORD PTR [BX.IFSR_BUFFER@+2] ; put input ds in now before clobber it ;AN005;
1102 ;AN000;
1103 CMP AL,BLOCK_GENERIC ;AN000;
1104 JNE DI_20 ;AN000;
1105 ;AN000;
1106 LDS SI,[THISCDS] ; block generic - cds processing ;AN000;
1107 SaveReg <DS,SI> ; save cds ptr ;AN000;
1108 OR IFSPROC_FLAGS,ISCDS ;AN000;
1109 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
1110 ; IFSR_DEVICE_CB@ ;AN000;
1111 ; ds - netwrk ;AN000;
1112 JMP SHORT DI_40 ;AN000;
1113 ;AN000;
1114DI_20: ; handle function ;AN000;
1115 OR CS:IFSPROC_FLAGS,SetDeviceCB ; to get possible related cd or df ;AN000;
1116 Context DS ;AN000;
1117 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
1118 ; IFSR_OPEN_CB@ ;AN000;
1119 ; ds - netwrk ;AN000;
1120DI_40: ;AN000;
1121 MOV ES:[BX.IFSR_LENGTH],LENGTH_DEVIOCTL ;AN000;
1122 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
1123 MOV ES:[BX.IFSR_APIFUNC],IFSDEVIOCTL ;AN000;
1124 MOV ES:[BX.IFSR_FUNC],AL ; 2,3,12 or 13 ;AN000;
1125;;;;; POP DS ; retrieve input ds ;AD005;
1126 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ;AN000;
1127;;;;; MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AD005;
1128 CMP AL,CHAR_GENERIC ; fork 2,3 vs 12,13 ;AN000;
1129 JGE DI_60 ; go if 12,13
1130 MOV ES:[BX.IFSR_BUFSIZE],CX ; 2,3 processing
1131 JMP SHORT DI_70
1132DI_60: ; 12,13 processing
1133 MOV ES:[BX.IFSR_CATEGORY],CH ; 1,3,5,or 8
1134 MOV ES:[BX.IFSR_CTLFUNC],CL ; 5F,7F,4E,or 6E
1135 ;AN000;
1136DI_70: ;AN000;
1137;-----------------------------------------------------------------------------------------
1138 invoke CALL_IFS ; call ifs driver w/request ;AN000;
1139;-----------------------------------------------------------------------------------------
1140 ;AN000;
1141 JNC DI_100 ;AN000;
1142 TEST IFSPROC_FLAGS,ISCDS ; error return ;AN000;
1143 JNZ DI_80 ; if cds clean up stack ;AN000;
1144 transfer ifs_1000 ; go return in ifsutil ;AN000;
1145DI_80: ;AN000;
1146 ADD SP,4 ; restore stack ;AN000;
1147 transfer ifs_980 ;AN000;
1148 ;AN000;
1149DI_100: ;AN000;
1150 TEST IFSPROC_FLAGS,ISCDS ;AN000;
1151 JNZ DI_120 ;AN000;
1152 MOV AX,ES:[BX.IFSR_BUFSIZE] ; set return size for 2,3 (won't hurt ;AN000;
1153 invoke SFF_TO_SFT ; for 12 either ;AN000;
1154 transfer ifs_990 ;AN000;
1155DI_120: ;AN000;
1156 MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000;
1157 RestoreReg <DI,ES> ; restore cds ptr into esdi ;AN000;
1158 invoke CD_TO_CDS ;AN000;
1159 transfer ifs_990 ;AN000;
1160 ;AN000;
1161 ;AN000;
1162EndProc DEVICE_IOCTL ;AN000;
1163 ;AN000;
1164 ;AN000;
1165 ;AN000;
1166BREAK <GET_DFL_FROM_INDEX Get DFL entry from index> ;AN000;
1167 ;AN000;
1168;****************************************************************************** ;AN000;
1169; ;AN000;
1170; GET_DFL_FROM_INDEX ;AN000;
1171; ;AN000;
1172; Called by: PRINTER_GETSET_STRING ;AN000;
1173; ;AN000;
1174; Routines called: none ;AN000;
1175; ;AN000;
1176; Inputs: ;AN000;
1177; BX is index number (as in GetIFSFUNCItem) ;AN000;
1178; ;AN000;
1179; Outputs: ;AN000;
1180; Carry Clear ;AN000;
1181; [THISDFL] set ;AN000;
1182; Carry Set ;AN000;
1183; Bad index number ;AN000;
1184; ;AN000;
1185; Regs: Preserves Printer Get/Set String input regs ;AN000;
1186; ;AN000;
1187;****************************************************************************** ;AN000;
1188 ;AN000;
1189 procedure GET_DFL_FROM_INDEX,NEAR ;AN000;
1190ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1191 ;AN000;
1192 SaveReg <DS,SI,CX,DX> ; save Ptr GetSet Str input regs ;AC007;
1193 ; (removed ax from above) ;AN007;
1194 PUSH BX ;AN000;
1195; Compute index # of first device ;AN000;
1196 XOR BX,BX ;AN000;
1197 MOV CX,BX ;AN000;
1198 Context DS ; DS-Dosgroup ;AN003;
1199 MOV CL,[CDSCount] ;AN000;
1200 LDS SI,[CDSAddr] ; Assume not paused ;AN000;
1201 CMP CS:[fAssign],0 ;AN000;
1202 JNZ GDFI_20 ;AN000;
1203 LDS SI,CS:[CDSAlt] ; Paused, get REAL CDSs from here ;AN000;
1204GDFI_20: ;AN000;
1205 TEST [SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000;
1206 JZ GDFI_40 ;AN000;
1207 INC BX ;AN000;
1208;;; TEST [SI.CURDIR_TYPE],TYPE_NET_DRIVE ;AD003;
1209;;; JZ GDFI_40 ; count 2 for redir ;AD003;
1210;;; INC BX ;AD003;
1211GDFI_40: ;AN000;
1212 ADD SI,SIZE CURDIR_LIST ; Next CDS ;AN000;
1213 LOOP GDFI_20 ;AN000;
1214 ; BX is index # of first device ;AN000;
1215 POP AX ; Get user index # ;AN000;
1216 SUB AX,BX ;AN000;
1217 JB GDFI_60 ; if carry set (JB), user index < ;AN000;
1218 ; 1st device index - too low ;AN000;
1219 ; go return w/carry already set ;AN000;
1220 MOV CL,CS:[DFLCount] ;AN000;
1221 CMP CL,AL ; AL is now device index # ;AN000;
1222 JAE GDFI_80 ;AN000;
1223GDFI_60: ;AN000;
1224 MOV AX,error_invalid_parameter ; user index too high ;AN000;
1225 JMP GDFI_980 ; go return w/carry already set ;AN000;
1226GDFI_80: ;AN000;
1227 LDS SI,CS:[DFLAddr] ;AN000;
1228 MOV BL,SIZE DFLL_list ; size in convenient spot ;AN000;
1229;;; DEC AX ;AD003
1230 MUL BL ; get net offset ;AN000;
1231 ADD SI,AX ; convert to true pointer ;AN000;
1232 TEST DS:[SI.DFLL_FLAGS],dfl_inuse ; is this device attached????? ;AN014;
1233 JZ GDFI_60 ; error if not
1234 ;AN000;
1235 PUSH DS ;AN000;
1236 POP DX ;AN000;
1237 PUSH CS ;AN000;
1238 POP DS ;AN000;
1239ASSUME DS:IFSSEG ;AN000;
1240 MOV WORD PTR [THISDFL],SI ;AN000;
1241 MOV WORD PTR [THISDFL+2],DX ;AN000;
1242 invoke PREP_IFSR ; init ifsr ;AN000;
1243 invoke DFL_TO_DF ;AN000;
1244 JMP GDFI_990 ;AN000;
1245 ;AN000;
1246 ;AN000;
1247GDFI_980: ; Return area ;AN000;
1248 SaveReg <AX,CS> ; set thisdfl null on error ;AN008;
1249 RestoreReg <DS> ;AN008;
1250 MOV AX,NULL_PTR ;AN008;
1251 MOV WORD PTR [THISDFL],AX ;AN008;
1252 MOV WORD PTR [THISDFL+2],AX ;AN008;
1253 RestoreReg <AX> ;AN008;
1254 STC ;AN000;
1255 JMP GDFI_1000 ;AN000;
1256GDFI_990: ;AN000;
1257 CLC ;AN000;
1258GDFI_1000: ;AN000;
1259 RestoreReg <DX,CX,SI,DS> ; restore regs ;AC007;
1260 ; (removed ax from above) ;AN007;
1261 return ;AN000;
1262 ;AN000;
1263EndProc GET_DFL_FROM_INDEX ;AN000;
1264 ;AN000;
1265 ;AN000;
1266IFSSEG ENDS ;AN000;
1267 END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM
new file mode 100644
index 0000000..dc64893
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM
@@ -0,0 +1,313 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsdir.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC DIRECTORY ROUTINES - Routines for IFS driver dispatch ;AN000;
4NAME NETDIR ;AN000;
5;************************************************************************************ ;AN000;
6; ;AN000;
7; DIRECTORY related IFS driver calls ;AN000;
8; ;AN000;
9; IFS_RMDIR ;AN000;
10; IFS_MKDIR ;AN000;
11; IFS_CHDIR ;AN000;
12; ;AN000;
13; Programming notes: ;AN000;
14; Old redirector segmentation preserved. ;AN000;
15; Directory routines do not generate critical errors. ;AN000;
16; ;AN000;
17; REVISION HISTORY: ;AN000;
18; A000 Original version 4.00 May 1987
19; A001 PTM 3671- check for null cds 3/88 RPS/RMG
20; ;AN000;
21; LOC - 67 ;AN000;
22; LOD - 4 ;AN000;
23; ;AN000;
24;************************************************************************************ ;AN000;
25 ;AN000;
26.xlist ;AN000;
27.xcref ;AN000;
28INCLUDE IFSSYM.INC ;AN000;
29INCLUDE IFSFSYM.INC ;AN000;
30INCLUDE DOSSYM.INC ;AN000;
31INCLUDE DEVSYM.INC ;AN000;
32.cref ;AN000;
33.list ;AN000;
34 ;AN000;
35AsmVars <IBM, Installed, Debug> ;AN000;
36 ;AN000;
37; define the base code segment of the network support first ;AN000;
38 ;AN000;
39ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000;
40ifsseg ENDS ;AN000;
41 ;AN000;
42; include the rest of the segment definitions for normal MSDOS ;AN000;
43 ;AN000;
44include dosseg.asm ;AN000;
45 ;AN000;
46DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
47 ;AN000;
48 ; DOSGROUP data ;AN000;
49 Extrn WFP_START:WORD ;AN000;
50 Extrn THISCDS:DWORD ;AN000;
51 ;AN000;
52DATA ENDS ;AN000;
53 ;AN000;
54 ;AN000;
55; define our own code segment ;AN000;
56 ;AN000;
57ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000;
58 ASSUME SS:DOSGROUP,CS:ifsseg ;AN000;
59 ;AN000;
60 ;IFS Data ;AN000;
61 Extrn IFSR:WORD ;AN000;
62 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
63 ;AN000;
64BREAK <IFS_RMDIR Remove an IFS Directory> ;AN000;
65;************************************************************************************ ;AN000;
66; ;AN000;
67; IFS_RMDIR ;AN000;
68; ;AN000;
69;Called by: ;AN000;
70; IFSFUNC Dispatcher ;AN000;
71; ;AN000;
72; Routines called: ;AN000;
73; CDS_TO_CD ;AN000;
74; CALL_IFS ;AN000;
75; ;AN000;
76; Inputs: ;AN000;
77; [WFP_START] Points to WFP string ;AN000;
78; [THISCDS] Points to CDS being used ;AN000;
79; ;AN000;
80; Function: ;AN000;
81; Prep IFSRH as follows: (* indicate which fields set) ;AN000;
82; * IFSR_LENGTH DW 42 ; Request length ;AN000;
83; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
84; IFSR_RETCODE DW ? ;AN000;
85; IFSR_RETCLASS DB ? ;AN000;
86; IFSR_RESV1 DB 16 DUP(0) ;AN000;
87; * IFSR_APIFUNC DB 4 ; Remove Directory ;AN000;
88; IFSR_ERROR_CLASS DB ? ;AN000;
89; IFSR_ERROR_ACTION DB ? ;AN000;
90; IFSR_ERROR_LOCUS DB ? ;AN000;
91; IFSR_ALLOWED DB ? ;AN000;
92; IFSR_I24_RETRY DB ? ;AN000;
93; IFSR_I24_RESP DB ? ;AN000;
94; IFSR_RESV2 DB ? ;AN000;
95; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000;
96; ; and set this as pointer to it. ;AN000;
97; IFSR_OPEN_CB@ DD ? ;AN000;
98; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000;
99; ;AN000;
100; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
101; IF IFSR_RETCODE = 0 THEN ;AN000;
102; Call CD_TO_CDS ;AN000;
103; Clear carry ;AN000;
104; ELSE ;AN000;
105; Set carry ;AN000;
106; Put error code in AX ;AN000;
107; ENDIF ;AN000;
108; ;AN000;
109; Outputs: ;AN000;
110; Carry clear: CDS FSDA updated ;AN000;
111; Carry set on error: error_path_not_found (bad path) ;AN000;
112; error_access_denied (file/device not empty) ;AN000;
113; ;AN000;
114; Notes: DS preserved, others destroyed ;AN000;
115; ;AN000;
116;************************************************************************************ ;AN000;
117 ;AN000;
118 ;AN000;
119 procedure IFS_RMDIR,NEAR ;AN000;
120 ;AN000;
121 entry IFS_SEQ_RMDIR ;AN000;
122 ;AN000;
123 ifsr_fcn_def EXECAPI ; define ifsr fields for rmdir ;AN000;
124 ifsr_api_def RMDIR ;AN000;
125 ;AN000;
126 PUSH DS ; preserve DS ;AN000;
127 ;AN000;
128 invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000;
129 ;AN000;
130 MOV ES:[BX.IFSR_APIFUNC],IFSRMDIR ;AN000;
131 JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000;
132 ;AN000;
133EndProc IFS_RMDIR ;AN000;
134 ;AN000;
135BREAK <IFS_MKDIR Create an IFS Directory> ;AN000;
136 ;AN000;
137;************************************************************************************ ;AN000;
138; ;AN000;
139; IFS_MKDIR ;AN000;
140; ;AN000;
141; Called by: IFSFUNC Dispatcher ;AN000;
142; ;AN000;
143; Routines called: CDS_TO_CD ;AN000;
144; CALL_IFS ;AN000;
145; ;AN000;
146; Inputs: ;AN000;
147; [WFP_START] Points to WFP string ;AN000;
148; [THISCDS] Points to CDS being used. Not NULL. ;AN000;
149; ;AN000;
150; Function: ;AN000;
151; Prep IFSRH as follows: (* indicate which fields set) ;AN000;
152; * IFSR_LENGTH DW 42 ; Request length ;AN000;
153; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
154; IFSR_RETCODE DW ? ;AN000;
155; IFSR_RETCLASS DB ? ;AN000;
156; IFSR_RESV1 DB 16 DUP(0) ;AN000;
157; * IFSR_APIFUNC DB 3 ; Create Directory ;AN000;
158; IFSR_ERROR_CLASS DB ? ;AN000;
159; IFSR_ERROR_ACTION DB ? ;AN000;
160; IFSR_ERROR_LOCUS DB ? ;AN000;
161; IFSR_ALLOWED DB ? ;AN000;
162; IFSR_I24_RETRY DB ? ;AN000;
163; IFSR_I24_RESP DB ? ;AN000;
164; IFSR_RESV2 DB ? ;AN000;
165; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000;
166; ; and set this as pointer to it. ;AN000;
167; IFSR_OPEN_CB@ DD ? ;AN000;
168; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000;
169; ;AN000;
170; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
171; ;AN000;
172; IF IFSR_RETCODE = 0 THEN ;AN000;
173; Call CD_TO_CDS ;AN000;
174; Clear carry ;AN000;
175; ELSE ;AN000;
176; Set carry ;AN000;
177; Put error code in AX ;AN000;
178; ENDIF ;AN000;
179; ;AN000;
180; Outputs: ;AN000;
181; Carry clear: CDS FSDA updated ;AN000;
182; Carry set on error: error_path_not_found (bad path) ;AN000;
183; error_access_denied ;AN000;
184; (Attempt to re-create read only file , or ;AN000;
185; create a second volume id or create a dir) ;AN000;
186; ;AN000;
187; Notes: DS preserved, others destroyed ;AN000;
188; ;AN000;
189;************************************************************************************ ;AN000;
190 ;AN000;
191 procedure IFS_MKDIR,NEAR ;AN000;
192 ;AN000;
193 entry IFS_SEQ_MKDIR ;AN000;
194 ;AN000;
195 ifsr_fcn_def EXECAPI ; define ifsr fields for mkdir ;AN000;
196 ifsr_api_def MKDIR ;AN000;
197 ;AN000;
198 PUSH DS ; preserve DS ;AN000;
199 ;AN000;
200 invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000;
201 ;AN000;
202 MOV ES:[BX.IFSR_APIFUNC],IFSMKDIR ;AN000;
203 JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000;
204 ;AN000;
205EndProc IFS_MKDIR ;AN000;
206 ;AN000;
207BREAK <IFS_CHDIR Check for validity and change directory> ;AN000;
208 ;AN000;
209 ;AN000;
210;************************************************************************************ ;AN000;
211; ;AN000;
212; IFS_CHDIR ;AN000;
213; ;AN000;
214; Called by: IFSFUNC Dispatcher ;AN000;
215; ;AN000;
216; Routines called: CDS_TO_CD ;AN000;
217; CD_TO_CDS ;AN000;
218; CALL_IFS ;AN000;
219; ;AN000;
220; Inputs: ;AN000;
221; [WFP_START] Points to WFP string ;AN000;
222; [THISCDS] Points to CDS being used. Not NUL. ;AN000;
223; ;AN000;
224; Function: ;AN000;
225; Prep IFSRH as follows: (* indicate which fields set) ;AN000;
226; * IFSR_LENGTH DW 42 ; Request length ;AN000;
227; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
228; IFSR_RETCODE DW ? ;AN000;
229; IFSR_RETCLASS DB ? ;AN000;
230; IFSR_RESV1 DB 16 DUP(0) ;AN000;
231; * IFSR_APIFUNC DB 5 ; Change Directory ;AN000;
232; IFSR_ERROR_CLASS DB ? ;AN000;
233; IFSR_ERROR_ACTION DB ? ;AN000;
234; IFSR_ERROR_LOCUS DB ? ;AN000;
235; IFSR_ALLOWED DB ? ;AN000;
236; IFSR_I24_RETRY DB ? ;AN000;
237; IFSR_I24_RESP DB ? ;AN000;
238; IFSR_RESV2 DB ? ;AN000;
239; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000;
240; ; and set this as pointer to it. ;AN000;
241; IFSR_OPEN_CB@ DD ? ;AN000;
242; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000;
243; ;AN000;
244; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
245; ;AN000;
246; IF IFSR_RETCODE = 0 THEN ;AN000;
247; Call CD_TO_CDS to update CDS ;AN000;
248; Clear carry ;AN000;
249; ELSE ;AN000;
250; Set carry ;AN000;
251; Put error code in AX ;AN000;
252; ENDIF ;AN000;
253; ;AN000;
254; Outputs: ;AN000;
255; Carry clear: CDS updated. ;AN000;
256; Carry set on error: error_path_not_found (bad path) ;AN000;
257; error_access_denied ;AN000;
258; ;AN000;
259; Notes: DS preserved, others destroyed ;AN000;
260; ;AN000;
261;************************************************************************************ ;AN000;
262 ;AN000;
263 procedure IFS_CHDIR,NEAR ;AN000;
264 ;AN000;
265 ifsr_fcn_def EXECAPI ; define ifsr fields for chdir ;AN000;
266 ifsr_api_def CHDIR ;AN000;
267 ;AN000;
268 PUSH DS ; preserve DS ;AN000;
269 ;AN000;
270 invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000;
271 ;AN000;
272 MOV ES:[BX.IFSR_APIFUNC],IFSCHDIR ;AN000;
273 ;AN000;
274CHDIR_10: ; Welcome rmdir/mkdir code ;AN000;
275 MOV ES:[BX.IFSR_LENGTH],LENGTH_CHDIR ;AN000;
276 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
277 ; ds -> dosgroup ;AN000;
278 MOV SI,WORD PTR [WFP_START] ; to access thiscds & wfp ;AN000;
279 invoke STRIP_WFP_START ; ditch leading d:\ ;AN000;
280 MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000;
281 MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000;
282 LDS SI,[THISCDS] ;AN000;
283 SaveReg <DS,SI> ;AN000;
284 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
285 CMP SI,NULL_PTR ; skip cds work if cds null ;AN001;
286 JE CHDIR_20 ;AN001;
287 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
288 ; IFSR_DEVICE_CB@ ;AN000;
289 ; ds - ifsseg ;AN000;
290CHDIR_20: ;AN001;
291 SaveReg <CS> ; make sure ds = ifsseg ;AN001;
292 RestoreReg <DS> ;AN001;
293;************************************************
294 invoke CALL_IFS ; call fs with dir request ;AN000;
295;************************************************
296 ;AN000;
297 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
298 JC CHDIR_1000 ;AN000;
299 CMP DI,NULL_PTR ; skip cds work if cds null ;AN001;
300 JE CHDIR_40 ;AN001;
301 invoke CD_TO_CDS ; update cds ;AN000;
302
303CHDIR_40: ;AN001;
304 CLC ;AN000;
305 ;AN000;
306CHDIR_1000: ; finished ;AN000;
307 POP DS ; restore DS ;AN000;
308 return ;AN000;
309 ;AN000;
310EndProc IFS_CHDIR ;AN000;
311 ;AN000;
312ifsseg ENDS ;AN000;
313 END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM
new file mode 100644
index 0000000..5240556
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM
@@ -0,0 +1,637 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)IFSERROR.INC 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC ERROR ROUTINES ;AN000;
4NAME IFSERROR ;AN000;
5;************************************************************************************ ;AN000;
6; ;AN000;
7; IFS error Routines ;AN000;
8; ;AN000;
9; INT_2F_5 ;AN000;
10; ;AN000;
11; IFS_I24 ;AN000;
12; SET_EXTERR_INFO ;AN000;
13; PHONEY_DPB ;AN000;
14; ;AN000;
15; REVISION HISTORY: ;AN000;
16; Evolved from Network Redirector NETERROR: MAY 11 1987 ;AN000;
17; A000 - Original version 4.00 MAY 1987 ;AN000;
18; A001 - PTM 842 Messages
19; A002 - PTM 1602 INT 2f-5 interface ds bug RG 10/87
20; A003 - PTM 1683/1769 error msg problems RG 10/87
21; A004 - PTM 2827 error proc chgs RG 1/88
22; A005 - PTM 4140 int 2f 5 interface change RMG 4/12/88
23; A006 - P4789 message problems w/no ifs drivers loaded 5/18/88 RMG
24; A007 - P4962 I24 AH not set right for printer 5/24/88 RMG
25; A008 - P5030 I24 tempbuf conflict 6/03/88 RMG
26; ;AN000;
27; LOC - 167 ;AN000;
28; ;AN000;
29;************************************************************************************ ;AN000;
30 ;AN000;
31.xlist ;AN000;
32.xcref ;AN000;
33INCLUDE IFSSYM.INC ;AN000;
34INCLUDE IFSFSYM.INC ;AN000;
35INCLUDE DOSSYM.INC ;AN000;
36INCLUDE DEVSYM.INC ;AN000;
37INCLUDE SYSMSG.INC
38msg_utilname <IFSFUNC>
39.cref ;AN000;
40.list ;AN000;
41 ;AN000;
42AsmVars <IBM, Installed, Debug> ;AN000;
43 ;AN000;
44; define the base code segment of the network support first ;AN000;
45 ;AN000;
46IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
47IFSSEG ENDS ;AN000;
48 ;AN000;
49; include the rest of the segment definitions for normal MSDOS ;AN000;
50 ;AN000;
51include dosseg.asm ;AN000;
52 ;AN000;
53DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
54 ; DOSGROUP Data ;AN000;
55 Extrn THISDPB:DWORD ;AN000;
56 Extrn EXTERR:WORD ;AN000;
57 Extrn EXTERR_ACTION:BYTE ;AN000;
58 Extrn EXTERR_CLASS:BYTE ;AN000;
59 Extrn EXTERR_LOCUS:BYTE ;AN000;
60 Extrn ALLOWED:BYTE ;AN000;
61 Extrn ExitHold:DWORD ;AN000;
62 Extrn ERR_TABLE_21:BYTE
63DATA ENDS ;AN000;
64 ;AN000;
65IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
66 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
67 ;AN000;
68 ; IFS Data ;AN000;
69 Extrn IFSDRV:BYTE ;AN000;
70 Extrn IFSR:WORD ;AN000;
71 Extrn TEMPBUF:BYTE ;AN003;
72 Extrn IFSPROC_FLAGS:WORD ;AN003;
73 Extrn SYSGetMsg:NEAR
74 Extrn IFSSEM:BYTE
75 Extrn THISIFS:DWORD ;AN006;
76 ;AN000;
77; Phoney DPB used by IFS Share/Lock errors ;AN000;
78 ;AN000;
79DUMMY_DPB LABEL BYTE ;AN000;
80 DB 0 ; dpb_drive ;AN000;
81 DB 0 ; dpb_UNIT ;AN000;
82 DW 512 ; dpb_sector_size ;AN000;
83 DB 0 ; dpb_cluster_mask ;AN000;
84 DB 0 ; dpb_cluster_shift ;AN000;
85 DW 1 ; dpb_first_FAT ;AN000;
86 DB 1 ; dpb_FAT_count ;AN000;
87 DW 16 ; dpb_root_entries ;AN000;
88 DW 3 ; dpb_first_sector ;AN000;
89 DW 3 ; dpb_max_cluster ;AN000;
90 DB 1 ; dpb_FAT_size ;AN000;
91 DW 2 ; dpb_dir_sector ;AN000;
92 DD ? ; dpb_driver_addr ;AN000;
93 DB 0F8H ; dpb_media ;AN000;
94 DB -1 ; dpb_first_access ;AN000;
95 DW -1 ; dpb_next_dpb low ;AN000;
96 DW -1 ; dpb_next_dpb high ;AN000;
97 DW 0 ; dpb_next_free ;AN000;
98 DW -1 ; dpb_free_cnt ;AN000;
99 ;AN000;
100; Phoney device headers used by IFS INT 24H ;AN000;
101 ;AN000;
102PHONEY_BLOCK LABEL BYTE ;AN000;
103 DD ? ; Pointer ;AN000;
104 DW ISNET ; Block net dev ;AN000;
105 DW ? ; Strat entry ;AN000;
106 DW ? ; Int entry ;AN000;
107 DB 8 DUP (0) ;AN000;
108 ;AN000;
109PHONEY_DEVICE LABEL BYTE ;AN000;
110 DD ? ; Pointer ;AN000;
111 DW DEVTYP + ISNET ; Char net dev ;AN000;
112 DW ? ; Strat entry ;AN000;
113 DW ? ; Int entry ;AN000;
114 ;AN000;
115 PUBLIC PHONEY_NAME ;AN000;
116PHONEY_NAME DB " " ;AN000;
117 ;AN000;
118 ;AN000;
119NEXT_2F_5 DD ? ;AN000;
120PUBLIC NEXT_2F_5 ;AN000;
121 ;AN000;
122; ;AN000;
123; ;AN000;
124MAXERR EQU 89 ; Don't know errors above 79 ;AN000;
125 ;AN000;
126 PUBLIC RODS_LABEL
127RODS_LABEL LABEL BYTE
128.xcref ;AN000;
129.xlist
130MSG_SERVICES <IFSFUNC.CL1>
131.cref ;AN000;
132.list
133
134;
135; The following table defines CLASS ACTION and LOCUS info for the INT 21H/24H
136; errors. Each entry is 5 bytes long:
137;
138; Err#,Class,Action,Locus,Allowed_Val
139;
140
141ERR_TABLE_IFS LABEL BYTE
142 DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;50 ;AN003;
143 DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;51 ;AN003;
144 DB errCLASS_Already, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;52 ;AN003;
145 DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;53 ;AN003;
146 DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;54 ;AN003;
147 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;55 ;AN003;
148 DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;56 ;AN003;
149 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;57 ;AN003;
150 DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;58 ;AN003;
151 DB errCLASS_SysFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;59 ;AN003;
152 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;60 ;AN003;
153 DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;61 ;AN003;
154 DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;62 ;AN003;
155 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;63 ;AN003;
156 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;64 ;AN003;
157 DB errCLASS_Auth, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;65 ;AN003;
158 DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;66 ;AN003;
159 DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;67 ;AN003;
160 DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;68 ;AN003;
161 DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;69 ;AN003;
162 DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;70 ;AN003;
163 DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;71 ;AN003;
164 DB errCLASS_TempSit, errACT_Retry, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;72 ;AN003;
165 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;73 ;AN003;
166 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;74 ;AN003;
167 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;75 ;AN003;
168 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;76 ;AN003;
169 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;77 ;AN003;
170 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;78 ;AN003;
171 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;79 ;AN003;
172 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;80 ;AN003;
173 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;81 ;AN003;
174 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;82 ;AN003;
175 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;83 ;AN003;
176 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;84 ;AN003;
177 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;85 ;AN003;
178 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;86 ;AN003;
179 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;87 ;AN003;
180 DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;88 ;AN003;
181 DB errCLASS_Unk, errACT_Panic, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;?? ;AN003;
182
183;
184; We need to map old int 24 errors and device driver errors into the new set
185; of errors. The following table is indexed by the new errors
186;
187ErrMap24 Label BYTE
188 DB error_write_protect ; 0
189 DB error_bad_unit ; 1
190 DB error_not_ready ; 2
191 DB error_bad_command ; 3
192 DB error_CRC ; 4
193 DB error_bad_length ; 5
194 DB error_Seek ; 6
195 DB error_not_DOS_disk ; 7
196 DB error_sector_not_found ; 8
197 DB error_out_of_paper ; 9
198 DB error_write_fault ; A
199 DB error_read_fault ; B
200 DB error_gen_failure ; C
201 DB error_gen_failure ; D RESERVED
202 DB error_gen_failure ; E RESERVED
203 DB error_wrong_disk ; F
204
205ErrMap24End LABEL BYTE
206
207
208BREAK <INT_2F_5 -- Routine for Extended error messages>
209
210;************************************************************************************
211;
212; INT_2F_5
213;
214; Called by: COMMAND.COM
215;
216; Routines called: CALL_IFS
217;
218; Input: [THISIFS] set
219; BX = extended error number ;AN005;
220; AL = component ID 0 - install check ;AN005;
221; 1 - command.com ;AN005;
222; 2 - message retriever ;AN005;
223; Function:
224; This handler uses 2F multiplex number 5. It allows the INT 24H
225; Handler in COMMAND to get message texts for NET extended errors.
226;
227; IF AH = 5 THEN
228; DO
229; IF AL < 0F8H THEN
230; DO
231; ³ IF AL .NE. 0 THEN
232; ³ DO
233; ³ ³ IF AL >= 50 .AND. AL <= 74 THEN /* or AL = 88 */
234; ³ ³ DO
235; ³ ³ ³ Prep IFSRH below
236; ³ ³ ³ * IFSR_LENGTH DW 28 ; Request length
237; ³ ³ ³ * IFSR_FUNCTION DB 6 ; Get Criter Text
238; ³ ³ ³ *+ IFSR_RETCODE DB ? ; AL
239; ³ ³ ³ IFSR_RETCLASS DB ?
240; ³ ³ ³ IFSR_RESV1 DB 17 DUP(0)
241; ³ ³ ³ *+ IFSR_MSG@ DD ? ; Msg buffer address
242; ³ ³ ³ *+ IFSR_MSG_TYPE DB ? ; Msg type
243; ³ ³ ³ IFSR_RESV2 DB ?
244; ³ ³ ³
245; ³ ³ ³ Call IFS specified in [THISIFS]
246; ³ ³ ³ IF IFSR_RETCODE = 0 THEN
247; ³ ³ ³ DO
248; ³ ³ ³ ES:DI = IFSR_MSG@
249; ³ ³ ³ AL = IFSR_MSG_TYPE
250; ³ ³ ³ ENDDO
251; ³ ³ ³ ELSE get ifsfunc standard msg
252; ³ ³ ³ ENDIF
253; ³ ³ ³ RET 2
254; ³ ³ ENDDO
255; ³ ³ ELSE RET 2
256; ³ ³ ENDIF
257; ³ ENDDO
258; ³ ELSE DO
259; ³ AL = 0FFH /* install check */
260; ³ iret
261; ³ ENDDO
262; ³ ENDIF
263; ENDDO
264; ELSE iret
265; ENDIF
266; ENDDO
267; ELSE jump far to [NEXT_2F_5]
268; ENDIF
269;
270; Output: carry clear - AL = msg type (0 or 1)
271; If EType is 1 then message is printed in form
272; <message>
273; Abort, Retry Ignore
274; If EType is 0 then message is printed in form
275; <message> error (read/writ)ing (drive/device) XXX
276; Abort, Retry Ignore
277; The message is ASCIZ and DOES NOT
278; include a trailing CR,LF
279; ES:DI -> message text
280; carry set - no message
281;
282; Notes: all destroyed
283;
284;************************************************************************************
285 ;AN000;
286 procedure INT_2F_5,FAR ;AN000;
287ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
288 ;AN000;
289 ifsr_fcn_def CRITMSG ;AN000;
290 ;AN000;
291 CMP AH,5 ; check for IFS error 2F call ;AN000;
292 JZ I2F5_20 ;AN000;
293 JMP [NEXT_2F_5] ;AN000;
294 ;AN000;
295I2F5_20: ; call ok ;AN000;
296 STI ; INTs OK ;AN000;
297 CMP AL,0F8H ;AN000;
298 JB I2F5_40 ;AN000;
299 IRET ; IRET on reserved functions ;AN000;
300I2F5_40: ;AN000;
301 OR AL,AL ;AN000;
302 JNZ I2F5_60 ;AN000;
303 MOV AL,0FFH ; Tell Ellen I'm here ;AN000;
304 IRET ;AN000;
305I2F5_60: ;AN000;
306;;;;;;;;CMP AL,error_NET_write_fault ; check for special error ;AN000;
307;;;;;;;;JE I2F5_80 ;AN000;
308 CMP BX,50 ;AC005;
309 JAE I2F5_70
310 JMP I2F5_1000 ; Carry set ;AN000;
311I2F5_70:
312 CMP BX,MAXERR ;AC005;
313 JBE I2F5_80 ;AN000;
314I2F5_75: ;AN005;
315 STC ;AN000;
316 JMP I2F5_1000 ;AN000;
317 ;AN000;
318I2F5_80: ;AN000;
319 CMP WORD PTR CS:[THISIFS+2],NULL_PTR ;if no ifs driver set, quit w/carry ;AN006;
320 JNE I2F5_85 ;AN006;
321 CMP WORD PTR CS:[THISIFS],NULL_PTR ;AN006;
322 JZ I2F5_75 ;AN006;
323I2F5_85: ;AN006;
324 TEST CS:IFSSEM,MR_ERRMSG_SEM ; if already in msgret loop, exit fast ;AN005;
325 JNZ I2F5_75 ;AN005;
326 MOV CS:IFSPROC_FLAGS,0 ;AN005;
327 CMP AL,I2F5_MsgRet ;AN005;
328 JNE I2F5_90 ;AN005;
329 OR CS:IFSPROC_FLAGS,IsMsgRet ;AN005;
330 OR CS:IFSSEM,MR_ERRMSG_SEM ; set msgret error msg semaphore ;AN005;
331I2F5_90: ;AN005;
332 SaveReg <DS,SI,BX,CS> ; save command.com regs ;AN002;AC003;
333 RestoreReg <DS> ; set ds-ifsseg ;AN002;
334 MOV AX,BX ; whole ax now ext error ;AN003;;AC005;
335 SaveReg <AX> ; save ext err # ;AN000;
336 invoke PREP_IFSR ; zero out ifsr, sets es:bx -> ifsr ;AN000;
337 MOV ES:[BX.IFSR_LENGTH],LENGTH_CRITMSG ;AN000;
338 MOV ES:[BX.IFSR_FUNCTION],IFSCRITMSG ;AN000;
339 MOV ES:[BX.IFSR_RETCODE],AX ;AN003;
340
341;***********************************************************************************************
342 invoke CALL_IFS ; call ifs with chance to set errmsg ;AN000;
343;***********************************************************************************************
344
345 JNC I2F5_200 ;AN000;
346 POP AX ; fs error set - get ifsfunc msg ;AN000;
347 TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret don't call msg ret for ;AN005;
348 JZ I2F5_95 ; default msg - just fail ;AN005;
349 STC ;AN005;
350 JMP SHORT I2F5_220 ;AN005;
351I2F5_95: ;AN005;
352 MOV DH,1 ;AN000;
353 CALL SYSGETMSG ; puts msg in dssi,cx=msg size ;AN000;
354 MOV AH,1 ; set al = msg type 0 or 1 ;AN000;
355 CMP AL,55 ; all but 55,64,65,88 are 1 ;AN000;
356 JL I2F5_120 ;AN000;
357 JE I2F5_100 ;AN000;
358 CMP AL,64 ;AN000;
359 JL I2F5_120 ;AN000;
360 JE I2F5_100 ;AN000;
361 CMP AL,65 ;AN000;
362 JE I2F5_100 ;AN000;
363 CMP AL,88 ;AN000;
364 JNE I2F5_120 ;AN000;
365 ;AN000;
366I2F5_100: ;AN000;
367 DEC AH ;AN000;
368 ;AN000;
369I2F5_120: ;AN000;
370 MOV AL,AH ;AN000;
371 SaveReg <CS> ; msg ret has 0D0A24 at end of msg ;AN003;
372 RestoreReg <ES> ; must change this to asciiz ;AN003;
373 MOV DI,OFFSET CS:TEMPBUF+80 ; move to temp buff and put 0 at 0DH ;AN003;;AC008;(80)
374 SaveReg <DI,AX> ; preserve msg offset and msg type ;AN003;
375 REP MOVSB ; move msg to temp buff ;AN003;
376 XOR AL,AL ;AN003;
377 STOSB ; store zero at end ;AN003;
378I2F5_160: ;AN003;
379 RestoreReg <AX,DI> ; msg type/ msg offset ;AN003;
380 JMP SHORT I2F5_220 ;AN000;
381 ;AN000;
382 ;AN000;
383I2F5_200: ; fs supplies error msg ;AN000;
384 MOV AL,ES:[BX.IFSR_MSG_TYPE] ; grab ifs msg info ;AN000;
385 MOV DI,WORD PTR ES:[BX.IFSR_MSG@] ;AN000;
386 MOV ES,WORD PTR ES:[BX.IFSR_MSG@+2] ;AN000;
387 ADD SP,2 ; restore stack ;AN000;
388I2F5_220: ;AN000;
389 PUSHF ; save carry ;AN005;
390 TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msgret reset semaphore ;AN005;
391 JZ I2F5_240 ;AN005;
392 AND CS:IFSSEM,NOT MR_ERRMSG_SEM ;AN005;
393I2F5_240: ;AN005;
394 POPF ; restore carry ;AN005;
395 RestoreReg <BX,SI,DS> ; retrieve command.com regs ;AN002;AC003;
396 ;AN000;
397I2F5_1000: ;AN000;
398 RET 2 ; Fakey IRET ;AN000;
399 ;AN000;
400EndProc INT_2F_5 ;AN000;
401 ;AN000;
402ASSUME SS:DOSGROUP ;AN000;
403 ;AN000;
404 ;AN000;
405 ;AN000;
406BREAK <SET_EXTERR_INFO -- Set IBMDOS error info> ;AN000;
407 ;AN000;
408;************************************************************************************ ;AN000;
409; ;AN000;
410; SET_EXTERR_INFO ;AN000;
411; ;AN000;
412; Inputs: ;AN000;
413; AL is extended error ;AN000;
414; IFSR ;AN000;
415; ;AN000;
416; Function: ;AN000;
417; Set all the EXTERR stuff and ALLOWED ;AN000;
418; ;AN000;
419; Outputs: ;AN000;
420; following set: ;AN000;
421; EXTERR word ;AN000;
422; EXTERR_ACTION byte ;AN000;
423; EXTERR_CLASS " ;AN000;
424; EXTERR_LOCUS " ;AN000;
425; ALLOWED " ;AN000;
426; ;AN000;
427; Regs: all preserved ;AN000;
428; ;AN000;
429;************************************************************************************ ;AN000;
430 ;AN000;
431 procedure SET_EXTERR_INFO,NEAR ;AN000;
432 ASSUME DS:IFSSEG,ES:NOTHING ;AN000;
433 ;AN000;
434 ifsr_fcn_def EXECAPI ;AN000;
435 ;AN000;
436 PUSHF ;AN000;
437 SaveReg <AX,CX,SI,DS> ;AC003;
438 ;AN000;
439 XOR AH,AH ; set unknown ah=0 ;AN003;
440 MOV SS:[EXTERR],AX ; Set extended error ;AC003;
441 MOV SI,OFFSET ERR_TABLE_IFS ;AC003;
442 SaveReg <CS> ;AN003;
443 RestoreReg <DS> ; ds-ifsseg to access err_table_ifs ;AN003;
444 CMP AL,50 ; if err not in range, set to ?? ;AN003;
445 JL SEI_10 ;AN003;
446 CMP AL,88 ;AN003;
447 JLE SEI_20 ;AN003;
448SEI_10: ;AN003;
449 MOV AL,89 ;AN003;
450 ;AN003;
451SEI_20: ;AN003;
452 SUB AL,50 ; space to correct table entry ;AN003;
453 MOV CL,4
454 MUL CL ;AN003;
455 ADD SI,AX ;AN003;
456
457SEI_40: ;AN003;
458 LODSW ; AL is CLASS, AH is ACTION ;AN003;
459 MOV [EXTERR_ACTION],AH ; Set ACTION ;AN003;
460 MOV [EXTERR_CLASS],AL ; Set CLASS ;AN003;
461 LODSW ; al- LOCUS ah- ALLOWED ;AN003;
462 TEST IFSPROC_FLAGS,ISCDS ;AN003;
463 JNZ SEI_50 ;AN003;
464 ADD AL,2 ;AN003;
465SEI_50: ;AN003;
466 MOV [EXTERR_LOCUS],AL ;AN003;
467 MOV [ALLOWED],AH ;AN003;
468 ;AN003;
469 MOV SI,BX ; Set ds:si -> ifsr so can use ;AN003;
470 SaveReg <ES> ; lodsw to get cl,act,loc,allowed ;AN003;
471 RestoreReg <DS> ;AN003;
472 ADD SI,IFSR_ERROR_CLASS ;AN003;
473 ; only set if ifs set (not -1) ;AN000;
474 LODSW ; AH = action, AL = class ;AN000;
475 CMP AL,ERROR_INFO_NOT_SET ;AN000;
476 JE SEI_60 ;AN000;
477 MOV [EXTERR_CLASS],AL ; set class ;AN000;
478SEI_60: ;AN000;
479 CMP AH,ERROR_INFO_NOT_SET ;AN000;
480 JE SEI_80 ;AN000;
481 MOV [EXTERR_ACTION],AH ; set action ;AN000;
482SEI_80: ;AN000;
483 LODSW ; AH = allowed, AL = locus ;AN000;
484 CMP AL,ERROR_INFO_NOT_SET ;AN000;
485 JE SEI_100 ;AN000;
486 MOV [EXTERR_LOCUS],AL ; Set locus ;AN000;
487SEI_100: ;AN000;
488 CMP AH,ERROR_INFO_NOT_SET ;AN000;
489 JE SEI_1000 ;AN000;
490 MOV [ALLOWED],AH ;AN000;
491
492SEI_1000: ;AN003;
493 RestoreReg <DS,SI,CX,AX> ;AN000;
494 POPF ;AN000;
495 return ;AN000;
496
497EndProc SET_EXTERR_INFO ;AN000;
498
499
500BREAK <DEVICE2EXTERR -- Convert device error to extended error > ;AN004;
501
502;************************************************************************************
503;
504; DEVICE2EXTERR
505;
506; Inputs:
507; AX is device error
508;
509; Function:
510; Convert device error to extended error
511; This is essentially the same routine as in IBMDOS
512;
513; Outputs:
514; AX = extended error
515;
516; Regs: all preserved
517;
518;************************************************************************************
519
520 procedure DEVICE2EXTERR,NEAR ;AN004;
521 ;AN004;
522 SaveReg <DI> ;AN004;
523 MOV DI,AX ;AN004;
524 MOV AX,OFFSET ErrMap24End ;AN004;
525 SUB AX,OFFSET ErrMap24 ; AX is the index of the first ;AN004;
526 ; unavailable error. ;AN004;
527 ; Do not translate if >= AX. ;AN004;
528 CMP DI,AX ;AN004;
529 MOV AX,DI ;AN004;
530 JAE D2E_20 ;AN004;
531 MOV AL,ErrMap24[DI] ;AN004;
532 XOR AH,AH ;AN004;
533D2E_20: ;AN004;
534 RestoreReg <DI> ;AN004;
535 return ;AN004;
536 ;AN004;
537EndProc DEVICE2EXTERR ;AN004;
538
539BREAK <IFS_I24 -- Do an INT 24 error> ;AN000;
540 ;AN000;
541;************************************************************************************ ;AN000;
542; ;AN000;
543; IFS_I24 ;AN000;
544; ;AN000;
545; Called by: CALL_IFS ;AN000;
546; ;AN000;
547; Routines called: DOS: NET_I24_ENTRY ;AN000;
548; ;AN000;
549; Inputs: ;AN000;
550; [IFSDRV] set (-1 = device, PHONEY_NAME set) ;AN000;
551; [EXTERR...] Set ;AN000;
552; [ALLOWED] Set ;AN000;
553; IFSR ;AN000;
554; ;AN000;
555; Function: ;AN000;
556; DI = Mapped I 24 error code (0-12) ;AN000;
557; AH is bit info (if block) ;AN000;
558; Perform I 24 error to get user response ;AN000;
559; ;AN000;
560; Outputs: ;AN000;
561; AL = 0 ;AN000;
562; Ignore ;AN000;
563; AL = 1 ;AN000;
564; Retry ;AN000;
565; AL = 3 ;AN000;
566; Fail ;AN000;
567; ;AN000;
568; Regs: DI, AX Revised ;AN000;
569; ;AN000;
570;************************************************************************************ ;AN000;
571 ;AN000;
572 procedure IFS_I24,NEAR ;AN000;
573ASSUME DS:NOTHING,ES:NOTHING ;AN000;
574 ;AN000;
575 XOR AH,AH ; AL - extended error (retcode) ;AD007;
576 MOV DI,AX ; set DI = i24 error code C-general fail ;AC007;
577 MOV WORD PTR [EXITHOLD+2],ES ; save es:bp here since fetchi ;AN000;
578 MOV WORD PTR [EXITHOLD],BP ; restores in NET_I24_ENTRY ;AN000;
579 PUSH CS ;AN000;
580 POP BP ; BP=seg part of BP:SI dev ptr ;AN000;
581 ;AN000;
582 MOV AL,[IFSDRV] ; set dev hdr offset ;AN000;
583 CMP AL,-1 ;AN000;
584 JZ I24_20 ;AN000;
585 MOV SI,OFFSET PHONEY_BLOCK ; block device ;AN000;
586 JMP SHORT I24_40 ;AN000;
587I24_20: ;AN000;
588 MOV SI,OFFSET PHONEY_DEVICE ; char device ;AN000;
589 MOV AH,87H ; char dev, write, data area ;AN007;
590 ;AN000;
591I24_40: ;AN000;
592 OR AH,ES:[BX.IFSR_ALLOWED] ; bit 7 = 0-disk or 1(other),... ;AC007;
593 ;AN000;
594 CallInstall NET_I24_ENTRY,MultDOS,6,<AX>,<SI> ;AN000;
595 ;AN000;
596 return ;AN000;
597 ;AN000;
598EndProc IFS_I24 ;AN000;
599 ;AN000;
600BREAK <PHONEY_DPB -- Set up a phoney DPB for sharing NET INT 24 errors> ;AN000;
601 ;AN000;
602;************************************************************************************ ;AN000;
603; ;AN000;
604; PHONEY_DPB ;AN000;
605; ;AN000;
606; Input: ;AN000;
607; [IFSDRV] Set ;AN000;
608; ;AN000;
609; Function: ;AN000;
610; Build a phoney DPB for IFS Share/Lock errors ;AN000;
611; ;AN000;
612; Outputs: ;AN000;
613; [THISDPB] Set ;AN000;
614; ;AN000;
615; Regs: ALL preserved ;AN000;
616; ;AN000;
617;************************************************************************************ ;AN000;
618 ;AN000;
619 procedure PHONEY_DPB,NEAR ;AN000;
620ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
621 ;AN000;
622 PUSH AX ;AN000;
623 MOV WORD PTR [THISDPB],OFFSET DUMMY_DPB ;AN000;
624 MOV WORD PTR [THISDPB+2],CS ;AN000;
625 MOV AL,[IFSDRV] ;AN000;
626 MOV BYTE PTR [DUMMY_DPB + dpb_drive],AL ;AN000;
627 MOV WORD PTR [DUMMY_DPB + dpb_driver_addr],OFFSET PHONEY_BLOCK ;AN000;
628 MOV WORD PTR [DUMMY_DPB + dpb_driver_addr + 2],CS ;AN000;
629 POP AX ;AN000;
630 return ;AN000;
631 ;AN000;
632EndProc PHONEY_DPB ;AN000;
633
634include msgdcl.inc ;AN000;
635 ;AN000;
636IFSSEG ENDS ;AN000;
637 END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM
new file mode 100644
index 0000000..6f3ff2d
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM
@@ -0,0 +1,476 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsfdos.asm 1.0 87/08/29 ;AN000;
3TITLE IFSFUNC DOS CALLBACK ROUTINES - Routines for ifs ;AN000;
4NAME IFSFDOS ;AN000;
5;*********************************************************************************** ;AN000;
6; ;AN000;
7; IFS DOS Callback Routines ;AN000;
8; ;AN000;
9; IFSFDOS ;AN000;
10; ;AN000;
11; REVISION HISTORY: ;AN000;
12; A000 - Original version 4.00 AUG 1987 DCR - 96 ;AN000;
13; A001 - DCR 47 Get disk/device pause status AUG '87 RG ;AN000;
14; A002 - PTM 2610 Time/date problems DEC '87 RG ;AN000;
15; ;AN000;
16; LOC - ;AN000;
17; ;AN000;
18;*********************************************************************************** ;AN000;
19 ;AN000;
20.xlist ;AN000;
21.xcref ;AN000;
22INCLUDE IFSFSYM.INC ;AN000;
23INCLUDE IFSSYM.INC ;AN000;
24INCLUDE DOSSYM.INC ;AN000;
25INCLUDE DEVSYM.INC ;AN000;
26.cref ;AN000;
27.list ;AN000;
28.sall ;AN000;
29 ;AN000;
30AsmVars <IBM, INSTALLED, DEBUG, PATHGEN> ;AN000;
31 ;AN000;
32IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
33IFSSEG ENDS ;AN000;
34 ;AN000;
35include dosseg.asm ;AN000;
36 ;AN000;
37DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
38 ; DOSGROUP data ;AN000;
39 Extrn YEAR:WORD
40 Extrn YRTAB:BYTE
41 Extrn MONTAB:BYTE
42DATA ENDS ;AN000;
43 ;AN000;
44IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
45 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
46 ;AN000;
47 ;IFS Data ;AN000;
48 ;AN000;
49 Extrn IFSFUNC_FLAGS:WORD ;AN000;
50 Extrn DOSCALL@:DWORD ;AN000;
51 Extrn fAssign:BYTE ;AN001;
52 Extrn fPrint:BYTE ;AN001;
53 ;AN000;
54 ;AN000;
55BREAK <SET_IFS_DOSCALL@ - prep for ifs dos requests to come to ifsfunc> ;AN000;
56;************************************************************************************ ;AN000;
57; ;AN000;
58; SET_IFS_DOSCALL@ ;AN000;
59; ;AN000;
60;Called by: ;AN000;
61; IFSFUNCINIT ;AN000;
62; ;AN000;
63; Routines called: ;AN000;
64; none ;AN000;
65; ;AN000;
66; Inputs: ;AN000;
67; DS-ifsseg ;AN000;
68; ;AN000;
69; Function: ;AN000;
70; replace ifs_doscall@ addresses in all ifs driver headers with ;AN000;
71; ifsfunc address ;AN000;
72; ;AN000;
73; Outputs: ;AN000;
74; none ;AN000;
75; ;AN000;
76; Notes: all preserved ;AN000;
77; ;AN000;
78;************************************************************************************ ;AN000;
79 ;AN000;
80 procedure SET_IFS_DOSCALL@,NEAR ;AN000;
81ASSUME DS:IFSSEG ;AN000;
82 TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000;
83 JZ SID_20 ;AN000;
84 transfer ifs_1000 ;AN000;
85SID_20: ;AN000;
86 SaveReg <AX,BX,ES,DI,SI> ;AN000;
87 MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000;
88 INT 21h ; es:bx -> sysinitvars ;AN000;
89 LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000;
90 SaveReg <ES,DI> ;AN000;
91 LES DI,ES:[DI.IFS_DOSCALL@] ;AN000;
92 MOV WORD PTR [DOSCALL@],DI ;AN000;
93 MOV WORD PTR [DOSCALL@+2],ES ;AN000;
94 RestoreReg <DI,ES> ; 1st driver addr ;AN000;
95 MOV SI,OFFSET IFSFUNC_DOSCALL@ ;AN000;
96SID_40: ; *** loop here on ifs_doscall@ fixing ;AN000;
97 MOV WORD PTR ES:[DI.IFS_DOSCALL@],SI ;AN000;
98 MOV WORD PTR ES:[DI.IFS_DOSCALL@+2],DS ;AN000;
99 LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000;
100 CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000;
101 JNE SID_40 ;AN000;
102 MOV AX,ES ;AN000;
103 CMP AX,NULL_PTR ;AN000;
104 JNE SID_40 ;AN000;
105 ;AN000;
106SID_1000: ;AN000;
107 RestoreReg <SI,DI,ES,BX,AX> ;AN000;
108 return ;AN000;
109 ;AN000;
110EndProc SET_IFS_DOSCALL@ ;AN000;
111 ;AN000;
112 ;AN000;
113 ;AN000;
114BREAK <IFSFUNC_DOSCALL@ - DOS Callbacks> ;AN000;
115;************************************************************************************ ;AN000;
116; ;AN000;
117; IFSFUNC_DOSCALL@ ;AN000;
118; ;AN000;
119;Called by: ;AN000;
120; IFS Drivers ;AN000;
121; ;AN000;
122; Routines called: ;AN000;
123; none ;AN000;
124; ;AN000;
125; Inputs: ;AN000;
126; SS-dosgroup ;AN000;
127; ;AN000;
128; Function: ;AN000;
129; ;AN000;
130; Outputs: ;AN000;
131; none ;AN000;
132; ;AN000;
133; Notes: none preserved ;AN000;
134; ;AN000;
135;************************************************************************************ ;AN000;
136 ;AN000;
137 procedure IFSFUNC_DOSCALL@,FAR ;AN000;
138 ;AN000;
139 CMP AH,33 ;AN001;
140 JNE ID_20 ;AN000;
141 CALL DOS_RETURN_ASSIGN_MODE ;AN001;
142 JMP SHORT ID_1000 ;AN001;
143ID_20: ;AN001;
144 CMP AH,34 ;AN000;
145 JNE ID_40 ;AN000;
146 CALL DOS_TO_NET_DATE ;AN000;
147 JMP SHORT ID_1000 ;AN000;
148ID_40: ;AN000;
149 CMP AH,35 ;AN000;
150 JNE ID_100 ;AN000;
151 CALL NET_TO_DOS_DATE ;AN000;
152 JMP SHORT ID_1000 ;AN000;
153ID_100: ;AN000;
154 CALL CS:[DOSCALL@] ;AN000;
155 ;AN000;
156ID_1000: ;AN000;
157 RET ;AN000;
158 ;AN000;
159 ;AN000;
160EndProc IFSFUNC_DOSCALL@ ;AN000;
161
162
163BREAK <DOS_RETURN_ASSIGN_MODE -- Return Assign Mode> ;AN000;
164
165;************************************************************************************
166;
167; DOS_RETURN_ASSIGN_MODE
168;
169; Called by: IFSFUNC_DOSCALL@
170;
171; Routines called: None
172;
173; Inputs:
174; BL = macro type
175; 3 - device
176; 4 - drive
177; Function:
178; If macro type = 3 (network printer) THEN
179; BX = fPrint .AND. 1
180; Elseif macro type = 4 (network disk) THEN
181; BX = fAssign .AND. 1
182; Else set error_invalid_function
183;
184; Output:
185; Carry clear - BH = mode (0 - off, 1 - on)
186; Carry set - AL error code
187;
188; Notes: This routine needed only for UNC file system. This is the
189; only FS that supports pause.
190;
191;************************************************************************************
192
193 Procedure DOS_RETURN_ASSIGN_MODE,NEAR ;AN001;
194ASSUME DS:NOTHING,ES:NOTHING ;AN001;
195 ;AN001;
196 CMP BL,3 ; if (type == drive) ;AN001;
197 JZ DRAM_20 ;AN001;
198 CMP BL,4 ;AN001;
199 JNZ DRAM_60 ;AN001;
200 MOV BH,fAssign ; t = fAssign; ;AN001;
201 JMP Short DRAM_40 ; else ;AN001;
202DRAM_20: ; if (type == print) ;AN001;
203 MOV BH,fPrint ; t = fPrint; ;AN001;
204DRAM_40: ;AN001;
205 AND BH,1 ; return t&1; ;AN001;
206 transfer ifs_990 ; go to general good ret in util ;AN001;
207 ;AN001;
208DRAM_60: ;AN001;
209 MOV AL,error_invalid_function ;AN001;
210 transfer ifs_980 ; go to general bad ret in util ;AN001;
211 ;AN001;
212EndProc DOS_RETURN_ASSIGN_MODE ;AN001;
213
214BREAK <DOS_TO_NET_DATE -- Convert dos date/time to network date> ;AN000;
215
216;************************************************************************************
217;
218; DOS_TO_NET
219;
220; Called by: IFSFUNC_DOSCALL@
221;
222; Routines called: None
223;
224; Inputs: ;AN000;
225; DX = MS-DOS Date ;AN000;
226; CX = MS-DOS Time ;AN000;
227; Function: ;AN000;
228; Convert DOS Date Time to Network date ;AN000;
229; Outputs: ;AN000;
230; DX:CX = Seconds since 1-1-70 ;AN000;
231; No other registers Revised ;AN000;
232;
233;************************************************************************************
234
235FOURYEARS = (3*365) + 366 ; Days in four years ;AN000;
236
237 procedure DOS_TO_NET_DATE,NEAR ;AN000;
238ASSUME DS:NOTHING,ES:NOTHING ;AN000;
239 ;AN000;
240 OR AL,AL ; check where to get dos date/time ;AN002;
241 JNZ DTND_20 ;AN002;
242 CallInstall DATE16,MultDOS,13 ; Get local date/time ;AN000;
243 MOV CX,DX ;AN000;
244 XCHG AX,DX ;AN000;
245 ;AN000;
246DTND_20: ;AN002;
247 PUSH DS ;AN000;
248 PUSH SS ;AN000;
249 POP DS ;AN000;
250ASSUME DS:DOSGROUP ;AN000;
251 PUSH [YEAR] ; The routines in DOS (in particular ;AN000;
252 ; GET_DATE) do not like [YEAR] ;AN000;
253 ; getting changed by the call ;AN000;
254 ; to SETYEAR. ;AN000;
255 PUSH SI ;AN000;
256 PUSH BX ;AN000;
257 PUSH AX ;AN000;
258 PUSH CX ;AN000;
259 PUSH DX ;AN000;
260 ;AN000;
261 MOV CL,9 ;AN000;
262 SHR DX,CL ; Year to DL ;AN000;
263 MOV CX,DX ; Year in CX (CL) ;AN000;
264 POP DX ;AN000;
265 AND DX,1FFH ; Mask off year ;AN000;
266 SHL DX,1 ;AN000;
267 SHL DX,1 ;AN000;
268 SHL DX,1 ; Month in DH ;AN000;
269 SHR DL,1 ;AN000;
270 SHR DL,1 ;AN000;
271 SHR DL,1 ; Right justify day in DL ;AN000;
272 CallInstall SetYear,MultDOS,27 ; Set [YEAR] and # days in FEB ;AN000;
273 SHR CX,1 ;AN000;
274 SHR CX,1 ; Divide year by 4, chuck remainder ;AN000;
275 MOV AX,FOURYEARS ;AN000;
276 MOV BX,DX ; Get DX out of way ;AN000;
277 MUL CX ; # days in AX ;AN000;
278 MOV CL,BYTE PTR [YEAR] ;AN000;
279 AND CL,3 ; Get remainder from / by 4 ;AN000;
280 MOV SI,OFFSET DOSGROUP:YRTAB ;AN000;
281 MOV DX,AX ;AN000;
282 SHL CX,1 ; Two entries/year ;AN000;
283 CallInstall DSum,MultDOS,28,<AX>,<SI> ;AN000;
284 MOV CL,BH ; Month ;AN000;
285 DEC CX ; Make 0 indexed ;AN000;
286 MOV SI,OFFSET DOSGROUP:MONTAB ;AN000;
287 CallInstall DSum,MultDOS,28,<AX>,<AX> ;AN000;
288 MOV CL,BL ; day of month ;AN000;
289 DEC CX ; Make 0 indexed ;AN000;
290 ADD CX,DX ; CX is days since 1-1-80 ;AN000;
291; ;AN000;
292; The following three instructions implement this: ;AN000;
293; ;AN000;
294; CX * 15180H sec/day = (CX * 5180H) + (CX * 10000H) ;AN000;
295; ;AN000;
296 MOV AX,5180h ;AN000;
297 MUL CX ; (DX:AX) = days * 5180h ;AN000;
298 ADD DX,CX ; (DX:AX) = days * 15180h = seconds ;AN000;
299 ;AN000;
300 ADD AX,0A600H ;AN000;
301 ADC DX,012CEH ; Bias by # seconds from 1-1-70 to ;AN000;
302 ; 1-1-80 (12CEA600H) ;AN000;
303 POP BX ; Get DOS time ;AN000;
304 PUSH AX ;AN000;
305 PUSH DX ; Save date seconds ;AN000;
306 PUSH BX ;AN000;
307 MOV CL,11 ;AN000;
308 SHR BX,CL ; BX is hours ;AN000;
309 MOV AX,60 ;AN000;
310 MUL BX ; AX hours converted to minutes ;AN000;
311 ; 5A0H min/day so DX = 0 ;AN000;
312 POP BX ;AN000;
313 PUSH BX ;AN000;
314 AND BX,7FFH ; Mask off hours ;AN000;
315 MOV CL,5 ;AN000;
316 SHR BX,CL ; BX is minutes ;AN000;
317 ADD AX,BX ; AX is minutes ;AN000;
318 MOV BX,60 ;AN000;
319 MUL BX ; DX:AX is hours:min converted to sec ;AN000;
320 POP BX ;AN000;
321 AND BX,1FH ; BX is seconds/2 ;AN000;
322 SHL BX,1 ; BX is seconds ;AN000;
323 ADD AX,BX ;AN000;
324 ADC DX,0 ;AN000;
325 MOV CX,AX ; DX:CX is DOS time in seconds ;AN000;
326 POP BX ;AN000;
327 POP SI ; BX:SI is DOS Date in seconds ;AN000;
328 ADD CX,SI ;AN000;
329 ADC DX,BX ; DX:CX is NET time ;AN000;
330 POP AX ;AN000;
331 POP BX ;AN000;
332 POP SI ;AN000;
333 POP [YEAR] ;AN000;
334 POP DS ;AN000;
335 return ;AN000;
336 ;AN000;
337EndProc DOS_TO_NET_DATE ;AN000;
338 ;AN000;
339; Inputs: ;AN000;
340; DX:CX = Seconds since 1-1-70 ;AN000;
341; Function: ;AN000;
342; Convert Network date to DOS Date Time ;AN000;
343; NOTE: WARNING!!!!!!! ;AN000;
344; This routine WILL NOT convert network times > 92CEA5FFH ;AN000;
345; (7FFFFFFF + 12CEA600). If such a time is encountered this ;AN000;
346; routine returns 1-1-80 0:0:0. ;AN000;
347; Outputs: ;AN000;
348; DX = MS-DOS Date ;AN000;
349; CX = MS-DOS Time ;AN000;
350; No other registers Revised ;AN000;
351 ;AN000;
352 procedure NET_TO_DOS_DATE,NEAR ;AN000;
353ASSUME DS:NOTHING,ES:NOTHING ;AN000;
354 SUB CX,0A600H ;AN000;
355 SBB DX,012CEH ; UnBias by # seconds from 1-1-70 to ;AN000;
356 ; 1-1-80 (12CEA600H) ;AN000;
357 JNC GO_ON ;AN000;
358 ; Date is before 1-1-80 ;AN000;
359TO_BIG_LITTLE_TIME: ;AN000;
360 XOR DX,DX ;AN000;
361 MOV CX,DX ; Set 1-1-80 0:0:0 ;AN000;
362 return ;AN000;
363 ;AN000;
364GO_ON: ;AN000;
365 TEST DX,8000H ; Check for high bit ;AN000;
366 JNZ TO_BIG_LITTLE_TIME ;AN000;
367 PUSH DS ;AN000;
368 PUSH SS ;AN000;
369 POP DS ;AN000;
370ASSUME DS:DOSGROUP ;AN000;
371 PUSH [YEAR] ; The routines in DOS (in particular ;AN000;
372 ; GET_DATE) do not like [YEAR] ;AN000;
373 ; getting changed by the call ;AN000;
374 ; to SETYEAR. ;AN000;
375 PUSH AX ;AN000;
376 PUSH BX ;AN000;
377 PUSH SI ;AN000;
378 PUSH BP ;AN000;
379 XCHG AX,CX ; DX:AX # seconds ;AN000;
380 MOV SI,0A8C0h ; (si) = seconds in a half day ;AN000;
381 ; 15180H/2 ;AN000;
382; ;AN000;
383; NOTE: The following DIV is the reason we can't convert times with the ;AN000;
384; high bit set (after they're unbiased by 1-1-80 - 1-1-70). ;AN000;
385; If we tried one it MIGHT overflow. The cutoff is ;AN000;
386; actually (A8C0 * FFFF) + A8BF = A8BFFFFF but we choose a smaller ;AN000;
387; number (7FFFFFFF) because it's easier to test for. 7FFFFFFF = ;AN000;
388; about 68 years from 1-1-80 which is 1-1-2048. ;AN000;
389; ;AN000;
390 DIV SI ; (AX) = 2*days ;AN000;
391 ; (CX) = half-day remainder ;AN000;
392 MOV BX,DX ;AN000;
393 XOR DX,DX ;AN000;
394 MOV CX,DX ;AN000;
395 SHR AX,1 ; DX:AX = days ;AN000;
396 JNC NTDD1 ; didn't shift off a bit, no extra rem ;AN000;
397 ADD BX,0A8C0h ; did shift bit, adjust remainder ;AN000;
398 ADC CX,0 ; by extra 1/2 day of seconds ;AN000;
399 ;AN000;
400 ;DX:AX is # days since 1-1-80 ;AN000;
401 ;CX:BX is seconds into that day ;AN000;
402NTDD1: ;AN000;
403 PUSH DX ;AN000;
404 PUSH AX ;AN000;
405 MOV DX,CX ;AN000;
406 MOV AX,BX ;AN000;
407 MOV CX,60 ; 60 sec/min ;AN000;
408 DIV CX ;AN000;
409 ;AX is min, DX(DL) is secs ;AN000;
410 DIV CL ; 60 min/hr ;AN000;
411 ;AH is Min, AL is hrs ;AN000;
412 SHR DL,1 ; Div seconds by 2 ;AN000;
413 AND DL,1FH ; DL is seconds/2 ;AN000;
414 MOV DH,AH ; Copy min to DH ;AN000;
415 MOV CL,5 ;AN000;
416 SHL AH,CL ; Low 3 bits of min in high 3 bits ;AN000;
417 OR DL,AH ; DL is now low byte of time ;AN000;
418 MOV CL,3 ;AN000;
419 SHR DH,CL ; High 3 bits of min to low 3 bits ;AN000;
420 AND DH,7 ;AN000;
421 MOV CL,3 ;AN000;
422 SHL AL,CL ; Hours to high 5 bits ;AN000;
423 AND AL,0F8H ;AN000;
424 OR DH,AL ; DX is now DOS time ;AN000;
425 MOV CX,DX ;AN000;
426 POP AX ;AN000;
427 POP DX ; DX:AX days since 1-1-80 ;AN000;
428 PUSH CX ; Stash time ;AN000;
429 MOV CX,FOURYEARS ;AN000;
430 DIV CX ; AX # four year increments ;AN000;
431 ; DX remainder days ;AN000;
432 SHL AX,1 ;AN000;
433 SHL AX,1 ;AN000;
434 SHL AX,1 ; Mult by 8 (AX # 1/2 years) ;AN000;
435 MOV CX,AX ;AN000;
436 MOV SI,OFFSET DOSGROUP:YRTAB ;AN000;
437 CallInstall DSlide,MultDOS,29,<AX>,<AX> ;AN000;
438 SHR CX,1 ; 1/2 years to whole years ;AN000;
439 JNC SK ;AN000;
440 ADD DX,200 ; Extra 1/2 year ;AN000;
441SK: ;AN000;
442 CallInstall SetYear,multDOS,27 ;AN000;
443 PUSH CX ;AN000;
444 MOV CL,1 ; At least at first month in year ;AN000;
445 MOV SI,OFFSET DOSGROUP:MONTAB ;AN000;
446 CallInstall DSlide,MultDOS,29,<AX>,<AX> ;AN000;
447 INC DX ; Days start at 1 ;AN000;
448 POP AX ;AN000;
449 MOV CH,CL ;AN000;
450 ; DL is day, CH is month, AL is year ;AN000;
451 SHL AL,1 ; Year to high 7 bits ;AN000;
452 AND AL,0FEH ;AN000;
453 MOV AH,CH ;AN000;
454 MOV CL,3 ;AN000;
455 SHR AH,CL ; High bit of month to bit 0 ;AN000;
456 AND AH,1 ;AN000;
457 OR AH,AL ; AH is high byte of date ;AN000;
458 AND DL,1FH ; Day is low 5 bits ;AN000;
459 MOV CL,5 ;AN000;
460 SHL CH,CL ; Low 3 bits of month to high 3 bits ;AN000;
461 AND CH,0E0H ;AN000;
462 OR DL,CH ;AN000;
463 MOV DH,AH ; Date in DX ;AN000;
464 POP CX ; Time to CX ;AN000;
465 POP BP ;AN000;
466 POP SI ;AN000;
467 POP BX ;AN000;
468 POP AX ;AN000;
469 POP [YEAR] ;AN000;
470 POP DS ;AN000;
471 return ;AN000;
472 ;AN000;
473EndProc NET_TO_DOS_DATE ;AN000;
474 ;AN000;
475IFSSEG ENDS ;AN000;
476END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM
new file mode 100644
index 0000000..5b0188f
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM
@@ -0,0 +1,1778 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsfile.asm 1.0 87/05/11 ;AN000;
3TITLE IFS FILE ROUTINES - Routines for IFS dispatch ;AN000;
4NAME IFSFILE ;AN000;
5;************************************************************************************
6;
7; FILE (WFP_START) related Network calls
8;
9; IFS_DISK_INFO
10; IFS_SEQ_SET_FILE_ATTRIBUTE
11; IFS_SET_FILE_ATTRIBUTE
12; IFS_SEQ_GET_FILE_INFO
13; IFS_GET_FILE_INFO
14; IFS_SEQ_RENAME
15; IFS_RENAME
16; IFS_SEQ_DELETE
17; IFS_DELETE
18; IFS_SEQ_OPEN
19; IFS_OPEN
20; IFS_SEQ_CREATE
21; IFS_CREATE
22; IFS_SEQ_XOPEN
23; IFS_XOPEN
24; IFS_SEQ_SEARCH_FIRST
25; IFS_SEQ_SEARCH_NEXT
26; IFS_SEARCH_FIRST
27; IFS_SEARCH_NEXT
28; OPEN_CHECK_SEQ
29;
30; Programming notes:
31; Old redirector segmentation and DOS interface preserved.
32; Routine prologues are accurate for input/output.
33; However, the pseudocode was not kept up to date.
34; Use it for a rough idea of the routine function.
35;
36; REVISION HISTORY:
37; A000 Original version 4.00 - May 1987
38; A001 PTM 316 - Fix search next drive byte interpretation
39; Set drive number in DMAADD
40; A002 PTM 845 - Disk info ignored
41; A003 PTM 869 - Lock failure due to sf_ifs_hdr not set
42; A004 DCR 213 - SFT Serial number
43; A005 PTM 849 - Printer open problems
44; A006 PTM 1518- open mode/flag finalized
45; A007 PTM ????- Action Taken not set on Extended open 10/27 FEIGENBAUM
46; A008 PTM ????- Old Open/Creates pass parms list 10/27 FEIGENBAUM
47; A009 PTM 2247- Delete does not return carry on error 11/3 RG
48; A010 PTM 2248- Old Create mode incorrect - must be 2 11/3 RG
49; A011 DCR 285 - Remove Extended Attribute/Lock support 1/88 RG
50; A012 PTM 3968- set sft time/date on create 3/25/88 RMG
51; A013 - sft analysis changes 3/25/88 RMG
52; A014 Austin Deviceless Attach problems 3/28/88 RMG
53; A015 P4392 SFT change - attr_hi gone 4/19/88 RMG
54; A016 P4801 File size segment not right 5/10/88 RMG
55; A017 P???? DS not preserved during CALLBACK 5/13/88 RPS
56; LOC - 486
57;
58;************************************************************************************
59
60.xlist ;AN000;
61.xcref ;AN000;
62INCLUDE IFSSYM.INC ;AN000;
63INCLUDE IFSFSYM.INC ;AN000;
64INCLUDE DOSSYM.INC ;AN000;
65INCLUDE DEVSYM.INC ;AN000;
66INCLUDE DOSCNTRY.INC
67.cref ;AN000;
68.list ;AN000;
69 ;AN000;
70AsmVars <IBM, Installed, DEBUG> ;AN000;
71 ;AN000;
72; then define the base code segment of the ifsfunc support first ;AN000;
73 ;AN000;
74IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
75IFSSEG ENDS ;AN000;
76 ;AN000;
77; include the rest of the segment definitions for normal MSDOS ;AN000;
78 ;AN000;
79include dosseg.asm ;AN000;
80 ;AN000;
81DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
82 ;DOSGROUP Data ;AN000;
83 Extrn REN_WFP:WORD ;AN000;
84 Extrn WFP_START:WORD ;AN000;
85 Extrn SATTRIB:BYTE ;AN000;
86 Extrn ATTRIB:BYTE ;AN000;
87 Extrn THISCDS:DWORD ;AN000;
88 Extrn THISSFT:DWORD ;AN000;
89 Extrn DMAADD:DWORD ;AN000;
90 Extrn CDSADDR:DWORD ;AN000;
91 Extrn SAVE_BX:WORD ;AN000;
92 Extrn SAVE_CX:WORD ;AN000;
93 Extrn SAVE_DX:WORD ;AN000;
94 Extrn SAVE_SI:WORD ;AN000;
95 Extrn SAVE_DI:WORD ;AN000;
96 Extrn SAVE_DS:WORD ;AN000;
97 Extrn SAVE_ES:WORD ;AN000;
98 Extrn Name1:BYTE ;AN000;
99 Extrn DEVPT:DWORD ;AN000;
100 Extrn CPSWFLAG:BYTE
101 Extrn COUNTRY_CDPG:BYTE
102if debug ;AN000;
103 Extrn BugLev:WORD ;AN000;
104 Extrn BugTyp:WORD ;AN000;
105 include bugtyp.asm ;AN000;
106endif ;AN000;
107DATA ENDS ;AN000;
108 ;AN000;
109 ;AN000;
110; define our own code segment ;AN000;
111 ;AN000;
112IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
113 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
114 ;AN000;
115 ;IFS Data ;AN000;
116 Extrn IFSR:WORD ;AN000;
117 Extrn IFSDRV:BYTE ;AN000;
118 Extrn IFSPROC_FLAGS:WORD ;AN000;
119 Extrn UNC_FS_HDR:DWORD ;AN000;
120 Extrn THISIFS:DWORD ;AN000;
121 Extrn THISDFL:DWORD ;AN000;
122 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
123 Extrn SFT_SERIAL_NUMBER:WORD ;AN004;
124 Extrn fAssign:BYTE ;AN014;
125 ;AN000;
126BREAK <IFS_DISK_INFO Get disk Info> ;AN000;
127 ;AN000;
128;************************************************************************************ ;AN000;
129; ;AN000;
130; IFS_DISK_INFO ;AN000;
131; ;AN000;
132; Input: ;AN000;
133; ES:DI -> CDS (not NULL) ;AN000;
134; DS -> DOSGROUP ;AN000;
135; Function: ;AN000;
136; Prep IFSRH: ;AN000;
137; * IFSR_LENGTH DW 48 ; Total length of request ;AN000;
138; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
139; + IFSR_RETCODE DW ? ;AN000;
140; + IFSR_RETCLASS DB ? ;AN000;
141; IFSR_RESV1 DB 16 DUP(0) ;AN000;
142; * IFSR_APIFUNC DB 2 ; Disk Attributes ;AN000;
143; + IFSR_ERROR_CLASS DB ? ;AN000;
144; + IFSR_ERROR_ACTION DB ? ;AN000;
145; + IFSR_ERROR_LOCUS DB ? ;AN000;
146; + IFSR_ALLOWED DB ? ;AN000;
147; + IFSR_I24_RETRY DB ? ;AN000;
148; + IFSR_I24_RESP DB ? ;AN000;
149; IFSR_RESV2 DB ? ;AN000;
150; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000;
151; ; and set this as pointer to it. ;AN000;
152; IFSR_OPEN_CB@ DD ? ;AN000;
153; + IFSR_ALLOCUNITS DW number of allocation units ;AN000;
154; + IFSR_ALLOCSIZE DW allocation unit sectors ;AN000;
155; + IFSR_SECTSIZE DW sector size ;AN000;
156; + IFSR_AVAILALLOC DW free allocation units ;AN000;
157; + IFSR_FSID DB file system media id ;AN000;
158; IFSR_RESV3 DB 0 ;AN000;
159; ;AN000;
160; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
161; IF IFSR_RETCODE = 0 THEN ;AN000;
162; DO ;AN000;
163; Call CD_TO_CDS to update CDS ;AN000;
164; Set: ;AN000;
165; DX = IFSR_AVAILALLOC ;AN000;
166; BX = IFSR_ALLOCUNITS ;AN000;
167; CX = IFSR_SECTSIZE ;AN000;
168; AL = IFSR_ALLOCSIZE ;AN000;
169; AH = IFSR_FSID ;AN000;
170; Clear carry ;AN000;
171; ENDDO ;AN000;
172; ELSE DO ;AN000;
173; Put error code in AX ;AN000;
174; Set carry ;AN000;
175; ENDDO ;AN000;
176; ENDIF ;AN000;
177; ;AN000;
178; Output: ;AN000;
179; DX = Number of free allocation units ;AN000;
180; BX = Total Number of allocation units on disk ;AN000;
181; CX = Sector size ;AN000;
182; AL = Sectors per allocation unit ;AN000;
183; AH = Media ID BYTE ;AN000;
184; Carry set if error ;AN000;
185; ;AN000;
186; Regs: Segs and DI preserved, others destroyed ;AN000;
187; ;AN000;
188;************************************************************************************ ;AN000;
189 ;AN000;
190 procedure IFS_DISK_INFO,NEAR ;AN000;
191ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
192 ;AN000;
193 MOV AX,DI ; set ifsDrv for possible I24 ;AN000;
194 invoke IFSDrvFromCDS ;AN000;
195 ;AN000;
196 ifsr_fcn_def EXECAPI ; define ifsr for diskattr ;AN000;
197 ifsr_api_def DISKATTR ;AN000;
198 MOV CS:IFSPROC_FLAGS,ZERO ; & processing flags ;AN000;
199 ;AN000;
200 PUSH ES ; set ds:si -> cds ;AN000;
201 POP DS ;AN000;
202 MOV SI,DI ;AN000;
203 ;AN000;
204 invoke PREP_IFSR ; init ifsr ;AN000;
205 SaveReg <DS,SI> ; save for cd_to_cds ;AN000;
206 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
207 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
208 ; ES:BX -> IFSRH ;AN000;
209 ; IFSR_DEVICE_CB@ ;AN000;
210 ; ds - IFSSEG ;AN000;
211 MOV ES:[BX.IFSR_LENGTH],LENGTH_DISKATTR ; prep IFSRH ;AN000;
212 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
213 MOV ES:[BX.IFSR_APIFUNC],IFSDISKATTR ;AN000;
214 ;AN000;
215 invoke CALL_IFS ; call fs with diskattr request ;AN000;
216 ;AN000;
217 JNC DA_20 ;AN000;
218 RestoreReg <DI,ES> ; error - restore stack ;AN000;
219 JMP FA_1000 ; go return ;AN000;
220DA_20: ;AN000;
221 MOV DX,ES:[BX.IFSR_AVAILALLOC] ; no error - load return regs ;AN000;
222 MOV CX,ES:[BX.IFSR_SECTSIZE] ;AN000;
223 MOV AX,ES:[BX.IFSR_ALLOCSIZE] ;AN000;
224 MOV AH,ES:[BX.IFSR_FSID] ;AN000;
225 MOV BX,ES:[BX.IFSR_ALLOCUNITS] ;AM002;
226 RestoreReg <DI,ES> ; restore cds into es:di ;AN000;
227 invoke CD_TO_CDS ;AN000;
228 CLC ;AN000;
229 JMP FA_1000 ; go ret in file attr routine ;AN000;
230 ; since it restores ds-dosgroup ;AN000;
231 ;AN000;
232EndProc IFS_DISK_INFO ;AN000;
233 ;AN000;
234 ;AN000;
235BREAK <IFS_SEQ_SET_FILE_ATTRIBUTE - Seq Set File Attributes> ;AN000;
236 ;AN000;
237;************************************************************************************ ;AN000;
238; ;AN000;
239; IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000;
240; ;AN000;
241; see IFS_GET_FILE_INFO for details ;AN000;
242; ;AN000;
243;************************************************************************************ ;AN000;
244 ;AN000;
245 procedure IFS_SEQ_SET_FILE_ATTRIBUTE,NEAR ;AN000;
246 ;AN000;
247 ifsr_fcn_def EXECAPI ;AN000;
248 ifsr_api_def FILEATTR ;AN000;
249 ;AN000;
250 PUSH AX ; save file attrs ;AN000;
251 ;AN000;
252 invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000;
253 JC SA_20 ; cf=0 unc, cf=1 device ;AN000;
254 ;AN000;
255 PUSH CS ; get addressability to IFSSEG ;AN000;
256 POP DS ; prep ifsflags for set ;AN000;
257ASSUME DS:IFSSEG ;AN000;
258 MOV IFSPROC_FLAGS,ZERO ;AN000;
259 JMP SHORT SFA_20 ; cont. in ifs_seq_get_fa ;AN000;
260 ;AN000;
261EndProc IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000;
262 ;AN000;
263BREAK <IFS_SET_FILE_ATTRIBUTE - Set File Attributes> ;AN000;
264 ;AN000;
265;************************************************************************************ ;AN000;
266; ;AN000;
267; IFS_SET_FILE_ATTRIBUTE ;AN000;
268; ;AN000;
269; see IFS_GET_FILE_INFO for details ;AN000;
270; ;AN000;
271;************************************************************************************ ;AN000;
272 ;AN000;
273 procedure IFS_SET_FILE_ATTRIBUTE,NEAR ;AN000;
274 ;AN000;
275 ifsr_fcn_def EXECAPI ;AN000;
276 ifsr_api_def FILEATTR ;AN000;
277 ;AN000;
278 PUSH AX ; save file attrs ;AN000;
279SA_20: ;AN000;
280 MOV CS:IFSPROC_FLAGS,0 ; prep ifsflags ;AN000;
281 JMP SHORT FA_20 ; cont. in ifs_get_file_info ;AN000;
282 ;AN000;
283EndProc IFS_SET_FILE_ATTRIBUTE ;AN000;
284 ;AN000;
285BREAK <IFS_SEQ_GET_FILE_INFO - Seq Get File Attributes> ;AN000;
286 ;AN000;
287;************************************************************************************ ;AN000;
288; ;AN000;
289; IFS_SEQ_GET_FILE_ATTRIBUTE ;AN000;
290; ;AN000;
291; see IFS_GET_FILE_INFO for details ;AN000;
292; ;AN000;
293;************************************************************************************ ;AN000;
294 ;AN000;
295 procedure IFS_SEQ_GET_FILE_INFO,NEAR ;AN000;
296 ;AN000;
297 ifsr_fcn_def EXECAPI ;AN000;
298 ifsr_api_def FILEATTR ;AN000;
299 ;AN000;
300 invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000;
301 JC FA_10 ; cf=0 unc, cf=1 device ;AN000;
302 ;AN000;
303 PUSH CS ; prep ifsflags for get & seq ;AN000;
304 POP DS ;AN000;
305ASSUME DS:IFSSEG ;AN000;
306 MOV IFSPROC_FLAGS,ISGET ;AN000;
307 ;AN000;
308SFA_20: ;AN000;
309 OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000;
310 invoke SET_THISIFS_UNC ; set thisifs = unc ;AN000;
311 invoke PREP_IFSR ; init ifsr ;AN000;
312 JMP SHORT FA_200 ; cont. in ifs_get_file_info ;AN000;
313 ;AN000;
314EndProc IFS_SEQ_GET_FILE_INFO ;AN000;
315 ;AN000;
316BREAK <IFS_GET_FILE_INFO - Get File Attributes> ;AN000;
317 ;AN000;
318;************************************************************************************ ;AN000;
319; ;AN000;
320; GET_FILE_INFO ;AN000;
321; ;AN000;
322; Routines called: DFL_SINGLE_FILE_CHECK ;AN000;
323; ;AN000;
324; Inputs: ;AN000;
325; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000;
326; terminated) ;AN000;
327; [THISCDS] Points to CDS being used ;AN000;
328; (Low word = -1 if NUL CDS (dfl)) ;AN000;
329; [SATTRIB] is attribute of search (determines what files may be found) ;AN000;
330; AX is new attributes to give to file (already checked for bad bits) ;AN000;
331; Function: ;AN000;
332; ;AN000;
333; IF seq call THEN ;AN000;
334; DO ;AN000;
335; Set IFS Header pointer to UNC IFS ;AN000;
336; Set IFSR_DEVICE_CB@ = null ;AN000;
337; ENDDO ;AN000;
338; ELSE DO ;AN000;
339; IF [THISCDS] .NOT. NULL THEN ;AN000;
340; CALL CDS_TO_CD ;AN000;
341; ELSE DO ;AN000;
342; CALL DFL_SINGLE_FILE_CHECK ;AN000;
343; IF have DFL that supports single file fcns THEN ;AN000;
344; call DFL_TO_DF ;AN000;
345; ELSE set error - device not IFS or no single file support ;AN000;
346; ENDIF ;AN000;
347; ENDDO ;AN000;
348; ENDIF ;AN000;
349; ENDDO ;AN000;
350; IF no error THEN ;AN000;
351; DO ;AN000;
352; Prep IFSRH: ;AN000;
353; * IFSR_LENGTH DW 66 ; Total length of request ;AN000;
354; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
355; + IFSR_RETCODE DW ? ;AN000;
356; + IFSR_RETCLASS DB ? ;AN000;
357; IFSR_RESV1 DB 16 DUP(0) ;AN000;
358; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name ;AN000;
359; + IFSR_ERROR_CLASS DB ? ;AN000;
360; + IFSR_ERROR_ACTION DB ? ;AN000;
361; + IFSR_ERROR_LOCUS DB ? ;AN000;
362; + IFSR_ALLOWED DB ? ;AN000;
363; + IFSR_I24_RETRY DB ? ;AN000;
364; + IFSR_I24_RESP DB ? ;AN000;
365; IFSR_RESV2 DB ? ;AN000;
366; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF ;AN000;
367; IFSR_OPEN_CB@ DD ? ;AN000;
368; * IFSR_FUNC DB ? ; 2=get 3=set depends on INT 2FH ;AN000;
369; * IFSR_RESV3 DB ?
370; * IFSR_SUBFUNC DB 0 ; in-line parms ;AN000;
371; * IFSR_RESV4 DB ?
372; IFSR_BUFFER1@ DD ? ; not used here
373; IFSR_BUFFER2@ DD ? ; not used here
374; IFSR_COUNT DW ? ; not used here
375; * IFSR_MATCHATTR DW ? ; format 0000000re0advshr ;AN000;
376; * IFSR_NAME@ DD ? ; ASCIIZ file name ptr ;AN000;
377; + IFSR_SIZE DD ? ; file size ;AN000;
378; + IFSR_DATE DW ? ; file date ;AN000;
379; + IFSR_TIME DW ? ; file time ;AN000;
380; *+ IFSR_ATTR DW ? ; file attribute ;AN000;
381; ; format 0000000re0advshr ;AN000;
382; ; Set to AX on set ;AN000;
383; ;AN000;
384; IF set THEN ;AN000;
385; DO ;AN000;
386; IFSR_FUNC = 3 ;AN000;
387; IFSR_ATTR = AX ;AN000;
388; ENDDO ;AN000;
389; ELSE IFSR_FUNC = 2 ;AN000;
390; ENDIF ;AN000;
391; CALL routine, CALL_IFS, with pointer to IFS Header ;AN000;
392; IF IFSR_RETCODE = 0 THEN ;AN000;
393; DO ;AN000;
394; IF cds THEN Call CD_TO_CDS ;AN000;
395; IF dfl THEN Call DF_TO_DFL ;AN000;
396; IF get THEN ;AN000;
397; DO ;AN000;
398; AX = IFSR_ATTR ;AN000;
399; CX = IFSR_TIME ;AN000;
400; DX = IFSR_DATE ;AN000;
401; BX:DI = IFSR_SIZE ;AN000;
402; ENDDO ;AN000;
403; Clear carry ;AN000;
404; ENDDO ;AN000;
405; ELSE DO ;AN000;
406; AX = IFSR_RETCODE ;AN000;
407; Set carry ;AN000;
408; ENDDO ;AN000;
409; ENDIF ;AN000;
410; ENDDO ;AN000;
411; ELSE Set carry ;AN000;
412; ENDIF ;AN000;
413; Outputs: ;AN000;
414; CARRY CLEAR ;AN000;
415; AX = ATTR ;AN000;
416; CX = TIME ;AN000;
417; DX = DATE ;AN000;
418; BX:DI = SIZE ;AN000;
419; CARRY SET ;AN000;
420; AX is error code ;AN000;
421; error_file_not_found ;AN000;
422; Last element of path not found ;AN000;
423; error_path_not_found ;AN000;
424; Bad path (not in curr dir part if present) ;AN000;
425; error_access_denied ;AN000;
426; Attempt to set an attribute which cannot be set ;AN000;
427; (attr_directory, attr_volume_ID) ;AN000;
428; error_sharing_violation ;AN000;
429; Sharing mode of file did not allow the change ;AN000;
430; (this request requires exclusive write/read access) ;AN000;
431; (INT 24H generated) ;AN000;
432; ;AN000;
433; Regs: DS preserved, others destroyed ;AN000;
434; ;AN000;
435;************************************************************************************ ;AN000;
436 ;AN000;
437 procedure IFS_GET_FILE_INFO,NEAR ;AN000;
438 ;AN000;
439 ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000;
440 ifsr_api_def FILEATTR ;AN000;
441 ;AN000;
442FA_10: ;AN000;
443 MOV CS:IFSPROC_FLAGS,ISGET ; set for get ;AN000;
444 ;AN000;
445FA_20: ;AN000;
446ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
447 CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000;
448 JE FA_100 ;AN000;
449 LDS SI,[THISCDS] ;AN000;
450ASSUME DS:NOTHING ;AN000;
451 TEST CS:IFSPROC_FLAGS,ISGET ;AN000;
452 JZ FA_40 ;AN000;
453 SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000;
454 JMP SHORT FA_60 ;AN000;
455FA_40: ;AN000;
456 RestoreReg <AX> ; want attr on stack to stay on top ;AN000;
457 SaveReg <DS,SI,AX> ; stack - ax,si,ds ;AN000;
458 ;AN000;
459FA_60: ;AN000;
460 invoke PREP_IFSR ; clear ifsrh ;AN000;
461 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
462 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
463 ; ES:BX -> IFSRH ;AN000;
464 ; IFSR_DEVICE_CB@ ;AN000;
465 ; DS - IFSSEG ;AN000;
466 OR IFSPROC_FLAGS,ISCDS ;AN000;
467 JMP FA_200 ;AN000;
468 ;AN000;
469FA_100: ;AN000;
470 invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000;
471 ; ES:BX -> IFSRH ;AN000;
472 ; IFSR_DEVICE_CB@ ;AN000;
473 ; DS - IFSSEG ;AN000;
474 JNC SHORT FA_200 ;AN000;
475 MOV AX,error_invalid_function ; error - invalid fcn ;AN000;
476 invoke SET_EXTERR_INFO ; set error info & ;AN000;
477 JMP FA_980 ; go return ;AN000;
478 ;AN000;
479FA_200: ;AN000;
480 invoke DRIVE_FROM_CDS ; set IFSDrv for possible I24 ;AN000;
481 ;AN000;
482 MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; continue prepping ifsr ;AN000;
483 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
484 MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000;
485 TEST IFSPROC_FLAGS,ISGET ;AN000;
486 JNZ FA_220 ;AN000;
487 MOV ES:[BX.IFSR_FUNC],FUNC_SET_BY_NAME ;AN000;
488 POP ES:[BX.IFSR_ATTR] ; retrieve attr from stack ;AN000;
489 JMP SHORT FA_240 ;AN000;
490FA_220: ;AN000;
491 MOV ES:[BX.IFSR_FUNC],FUNC_GET_BY_NAME ; get file info ;AN000;
492 ;AN000;
493FA_240: ;AN000;
494 PUSH DS ; save ds - IFSSEG ;AN000;
495 PUSH SS ; get ds = dosgroup so can access ;AN000;
496 POP DS ; wfp_start, sattrib ;AN000;
497ASSUME DS:DOSGROUP ;AN000;
498 ;AN000;
499 MOV SI,[WFP_START] ;AN000;
500 invoke STRIP_WFP_START ;AN000;
501 MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000;
502 MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000;
503 MOV AL,[SATTRIB] ;AN000;
504 XOR AH,AH ;AN000;
505 MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000;
506 ;AN000;
507 POP DS ; restore ds=IFSSEG ;AN000;
508ASSUME DS:IFSSEG ;AN000;
509
510;************************************************
511 invoke CALL_IFS ; call ifs with file attr request ;AN000;
512;************************************************
513 ;AN000;
514 JNC FA_260 ;AN000;
515 TEST IFSPROC_FLAGS,ISCDS ; request failed - ;AN000;
516 JZ FA_980 ; go set carry & return ;AN000;
517 ADD SP,4 ; if cds, restore stack first ;AN000;
518 JMP FA_980 ;AN000;
519 ;AN000;
520FA_260: ; request successful ;AN000;
521 TEST IFSPROC_FLAGS,ISGET ; if get - prep return regs with ;AN000;
522 JZ FA_270 ; file info ;AN000;
523 MOV AX,ES:[BX.IFSR_ATTR] ;AN000;
524 MOV CX,ES:[BX.IFSR_TIME] ;AN000;
525 MOV DX,ES:[BX.IFSR_DATE] ;AN000;
526 MOV DI,ES:WORD PTR [BX.IFSR_SIZE] ;AN000;
527 MOV BX,ES:WORD PTR [BX.IFSR_SIZE+2] ;AC016;
528FA_270: ;AN000;
529 TEST IFSPROC_FLAGS,ISCDS ; if cds - update cds w/cd ;AN000;
530 JZ FA_280 ;AN000;
531 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
532 invoke CD_TO_CDS ; cd-cds ;AN000;
533 JMP SHORT FA_990 ; go clc & return ;AN000;
534FA_280: ;AN000;
535 TEST IFSPROC_FLAGS,ISSEQ ;AN000;
536 JNZ FA_990 ;AN000;
537 invoke DF_TO_DFL ; update dfl w/df ;AN000;
538 JMP SHORT FA_990 ;AN000;
539 ;AN000;
540FA_980: ;AN000;
541 STC ;AN000;
542 JMP SHORT FA_1000 ;AN000;
543FA_990: ;AN000;
544 CLC ;AN000;
545FA_1000: ;AN000;
546 PUSH SS ; restore original ds (dosgroup) ;AN000;
547 POP DS ; since this routine preserves ds ;AN000;
548 return ;AN000;
549 ;AN000;
550 ;AN000;
551EndProc IFS_GET_FILE_INFO ;AN000;
552 ;AN000;
553BREAK <IFS_SEQ_RENAME Rename> ;AN000;
554;************************************************************************************ ;AN000;
555; ;AN000;
556; IFS_SEQ_RENAME ;AN000;
557; ;AN000;
558; see ifs_rename for details ;AN000;
559; ;AN000;
560;************************************************************************************ ;AN000;
561 procedure IFS_SEQ_RENAME,NEAR ;AN000;
562 ;AN000;
563 ifsr_fcn_def EXECAPI ;AN000;
564 ifsr_api_def RENFILE ;AN000;
565 ;AN000;
566 MOV CS:IFSPROC_FLAGS,ISREN ; set for rename and cont. ;AN000;
567 JMP SHORT SD_10 ; in ifs_seq_delete ;AN000;
568 ;AN000;
569 ;AN000;
570EndProc IFS_SEQ_RENAME ;AN000;
571 ;AN000;
572 ;AN000;
573BREAK <IFS_RENAME Rename> ;AN000;
574 ;AN000;
575;************************************************************************************ ;AN000;
576; ;AN000;
577; IFS_RENAME ;AN000;
578; ;AN000;
579; Inputs: ;AN000;
580; [WFP_START] Points to SOURCE WFP string ("//" must be first 2 ;AN000;
581; chars, NUL terminated) ;AN000;
582; [REN_WFP] Points to DEST WFP string ("//" must be first 2 ;AN000;
583; chars, NUL terminated) ;AN000;
584; [THISCDS] Points to CDS being used ;AN000;
585; [SATTRIB] Is attribute of search, determines what files can be found ;AN000;
586; Function: ;AN000;
587; same processing as delete except for following parms: ;AN000;
588; * IFSR_LENGTH DB 48 ;AN000;
589; * IFSR_APIFUNC DB 7 ; Rename file ;AN000;
590; * IFSR_NAME1@ DD ? ; addr of WFP_START ;AN000;
591; * IFSR_NAME2@ DD ? ; addr of REN_WFP ;AN000;
592; ;AN000;
593; Outputs: ;AN000;
594; CARRY CLEAR ;AN000;
595; OK ;AN000;
596; CARRY SET ;AN000;
597; AX is error code ;AN000;
598; error_file_not_found ;AN000;
599; No match for source, or dest path invalid ;AN000;
600; error_not_same_device ;AN000;
601; Source and dest are on different devices ;AN000;
602; error_access_denied ;AN000;
603; Directory specified (not simple rename), ;AN000;
604; Device name given, Destination exists. ;AN000;
605; NOTE: In third case some renames may have ;AN000;
606; been done if metas. ;AN000;
607; error_path_not_found ;AN000;
608; Bad path (not in curr dir part if present) ;AN000;
609; SOURCE ONLY ;AN000;
610; error_sharing_violation ;AN000;
611; Deny both access required, generates an INT 24. ;AN000;
612; DS preserved, others destroyed ;AN000;
613; ;AN000;
614;************************************************************************************ ;AN000;
615 ;AN000;
616 procedure IFS_RENAME,NEAR ;AN000;
617 ;AN000;
618 ifsr_fcn_def EXECAPI ;AN000;
619 ifsr_api_def RENFILE ;AN000;
620 ;AN000;
621 MOV CS:IFSPROC_FLAGS,ISREN ; set for rename ;AN000;
622 JMP SHORT D_20 ; processing continues in ifs_delete ;AN000;
623 ;AN000;
624EndProc IFS_RENAME ;AN000;
625 ;AN000;
626 ;AN000;
627BREAK <IFS_SEQ_DELETE Delete> ;AN000;
628 ;AN000;
629;************************************************************************************ ;AN000;
630; ;AN000;
631; IFS_SEQ_DELETE ;AN000;
632; ;AN000;
633; see ifs_delete for details ;AN000;
634; ;AN000;
635;************************************************************************************ ;AN000;
636 procedure IFS_SEQ_DELETE,NEAR ;AN000;
637 ;AN000;
638 ifsr_fcn_def EXECAPI ;AN000;
639 ifsr_api_def DELFILE ;AN000;
640 ;AN000;
641 MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000;
642SD_10: ;AN000;
643 invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000;
644 JC D_20 ; cf=0 unc, cf=1 device ;AN000;
645 ;AN000;
646SD_20: ; welcome ifs_seq_rename code ;AN000;
647 PUSH CS ;AN000;
648 POP DS ;AN000;
649ASSUME DS:IFSSEG ;AN000;
650 OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000;
651 invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000;
652 JMP SHORT D_30 ; cont. in ifs_delete ;AN000;
653 ;AN000;
654EndProc IFS_SEQ_DELETE ;AN000;
655 ;AN000;
656 ;AN000;
657BREAK <IFS_DELETE Delete> ;AN000;
658 ;AN000;
659;************************************************************************************ ;AN000;
660; ;AN000;
661; IFS_DELETE ;AN000;
662; ;AN000;
663; Called by: IFSFUNC Dispatcher ;AN000;
664; ;AN000;
665; Routines called: CDS_TO_CD ;AN000;
666; CD_TO_CDS CALL_IFS ;AN000;
667; ;AN000;
668; Inputs: ;AN000;
669; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000;
670; terminated) ;AN000;
671; [THISCDS] Points to CDS being used ;AN000;
672; [SATTRIB] Is attribute of search, determines what files can be found ;AN000;
673; Function: ;AN000;
674; IF INT 2FH call .NOT. SEQ version THEN ;AN000;
675; DO ;AN000;
676; IF [THISCDS] .NOT. NULL THEN ;AN000;
677; DO ;AN000;
678; CALL CDS_TO_CD ;AN000;
679; Set IFS_DEVICE_CB@ as pointer to CD ;AN000;
680; Set IFS_HDR_PTR = CURDIR_IFS_HDR ;AN000;
681; ENDDO ;AN000;
682; ELSE DO ;AN000;
683; Set AX = invalid function ;AN000;
684; Set extended error info ;AN000;
685; ENDDO ;AN000;
686; ENDIF ;AN000;
687; ENDDO ;AN000;
688; ELSE DO ;AN000;
689; Set IFS_DEVICE_CB@ to NULL ;AN000;
690; Set IFS_HDR_PTR = [UNC_FS_HDR] ;AN000;
691; ENDDO ;AN000;
692; ENDIF ;AN000;
693; IF no error THEN ;AN000;
694; DO ;AN000;
695; Prep IFSRH: ;AN000;
696; * IFSR_LENGTH DW 44 ; Total length of request ;AN000;
697; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
698; + IFSR_RETCODE DW ? ;AN000;
699; + IFSR_RETCLASS DB ? ;AN000;
700; IFSR_RESV1 DB 16 DUP(0) ;AN000;
701; * IFSR_APIFUNC DB 6 ; Delete file ;AN000;
702; + IFSR_ERROR_CLASS DB ? ;AN000;
703; + IFSR_ERROR_ACTION DB ? ;AN000;
704; + IFSR_ERROR_LOCUS DB ? ;AN000;
705; + IFSR_ALLOWED DB ? ;AN000;
706; + IFSR_I24_RETRY DB ? ;AN000;
707; + IFSR_I24_RESP DB ? ;AN000;
708; IFSR_RESV2 DB ? ;AN000;
709; *+ IFSR_DEVICE_CB@ DD ? ; CD ;AN000;
710; IFSR_OPEN_CB@ DD ? ;AN000;
711; * IFSR_MATCHATTR DW ? ; attribute - format 00000000e0a00shr ;AN000;
712; * IFSR_NAME@ DD ? ; filename to delete ;AN000;
713; ;AN000;
714; Call routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
715; IF IFSR_RETCODE = 0 THEN ;AN000;
716; DO ;AN000;
717; Call CD_TO_CDS or DF_TO_DFL ;AN000;
718; Clear carry ;AN000;
719; ENDDO ;AN000;
720; ELSE DO ;AN000;
721; AX = IFSR_RETCODE ;AN000;
722; Set carry ;AN000;
723; ENDDO ;AN000;
724; ENDIF ;AN000;
725; ENDDO ;AN000;
726; ELSE set carry ;AN000;
727; ENDIF ;AN000;
728; ;AN000;
729; Outputs: ;AN000;
730; CARRY CLEAR ;AN000;
731; OK ;AN000;
732; CARRY SET ;AN000;
733; AX is error code ;AN000;
734; error_file_not_found ;AN000;
735; Last element of path not found ;AN000;
736; error_path_not_found ;AN000;
737; Bad path ;AN000;
738; error_access_denied ;AN000;
739; Attempt to delete device or directory ;AN000;
740; DS preserved, others destroyed ;AN000;
741; ;AN000;
742;************************************************************************************ ;AN000;
743 ;AN000;
744 procedure IFS_DELETE,NEAR ;AN000;
745 ;AN000;
746 ifsr_fcn_def EXECAPI ;AN000;
747 ifsr_api_def DELFILE ;AN000;
748 ;AN000;
749 MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000;
750 ;AN000;
751D_20: ; (Welcome ifs_ren) ;AN000;
752ASSUME DS:DOSGROUP ;AN000;
753 invoke DRIVE_FROM_CDS ; ds - dosgroup ;AN000;
754 CMP WORD PTR [THISCDS],NULL_PTR ; CDS must not be null ;AN000;
755 JNE D_30 ;AN000;
756 MOV AX,error_invalid_function ;AN000;
757 invoke SET_EXTERR_INFO ;AN000;
758 JMP FA_980 ; go up, preserve ds, ret w/carry ;AN000;
759D_30: ; (Welcome seq ren/del code) ;AN000;
760 invoke PREP_IFSR ; zero ifsr, es:bx -> ifsr ;AN000;
761 MOV SI,[WFP_START] ;AN000;
762 invoke STRIP_WFP_START ;AN000;
763 TEST CS:IFSPROC_FLAGS,ISREN ;AN000;
764 JZ D_40 ; rename ;AN000;
765 MOV ES:WORD PTR [BX.IFSR_NAME1@],SI ; ifsr_name1@ & 2@ ;AN000;
766 MOV ES:WORD PTR [BX.IFSR_NAME1@+2],DS ;AN000;
767 MOV SI,[REN_WFP] ;AN000;
768 CMP BYTE PTR DS:[SI+1],":" ;AN000;
769 JNE D_36 ;AN000;
770 ADD SI,2 ;AN000;
771D_36: ;AN000;
772 MOV ES:WORD PTR [BX.IFSR_NAME2@],SI ;AN000;
773 MOV ES:WORD PTR [BX.IFSR_NAME2@+2],DS ;AN000;
774 MOV ES:[BX.IFSR_LENGTH],LENGTH_RENFILE ; ifsr_length ;AN000;
775 MOV ES:[BX.IFSR_APIFUNC],IFSRENFILE ; ifsr_apifunc ;AN000;
776 JMP SHORT D_60 ;AN000;
777D_40: ; delete ;AN000;
778 MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000;
779 MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000;
780 MOV ES:[BX.IFSR_LENGTH],LENGTH_DELFILE ; ifsr_length ;AN000;
781 MOV ES:[BX.IFSR_APIFUNC],IFSDELFILE ; ifsr_apifunc ;AN000;
782D_60: ;AN000;
783 MOV AL,[SATTRIB] ;AN000;
784 XOR AH,AH ;AN000;
785 MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000;
786 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ; ifsr_function ;AN000;
787 ;AN000;
788 TEST CS:IFSPROC_FLAGS,ISSEQ ; if unc, don't do cds stuff ;AN000;
789 JNZ D_70 ;AN000;
790 LDS SI,[THISCDS] ;AN000;
791ASSUME DS:NOTHING ;AN000;
792 SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000;
793 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
794 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
795 ; ES:BX -> IFSRH ;AN000;
796 ; IFSR_DEVICE_CB@ ;AN000;
797 ; ds - IFSSEG ;AN000;
798 ;AN000;
799D_70: ;AN000;
800 invoke CALL_IFS ; call ifs w/request ;AN000;
801 ;AN000;
802 JNC D_80 ;AN000;
803 TEST IFSPROC_FLAGS,ISSEQ ; fs error - restore stack ;AN000;
804 JZ D_75 ; if not unc - go ret ;AN000;
805 JMP FA_980 ;AC009;
806D_75: ;AN000;
807 ADD SP,4 ;AN000;
808 JMP FA_980 ;AC009;
809 ;AN000;
810D_80: ;AN000;
811 TEST IFSPROC_FLAGS,ISSEQ ; fs successful ;AN000;
812 JZ D_90 ; if seq, just ret ;AN000;
813 JMP FA_990 ;AN000;
814D_90: ; else - ;AN000;
815 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
816 invoke CD_TO_CDS ;AN000;
817 JMP FA_990 ; go up & ret in fa to preserve ds ;AN000;
818 ;AN000;
819 ;AN000;
820EndProc IFS_DELETE ;AN000;
821 ;AN000;
822BREAK <IFS_SEQ_OPEN Open> ;AN000;
823;************************************************************************************ ;AN000;
824; see IFS_OPEN for details ;AN000;
825;************************************************************************************ ;AN000;
826 ;AN000;
827 procedure IFS_SEQ_OPEN,NEAR ;AN000;
828 ;AN000;
829 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
830 ifsr_api_def OPENFILE ;AN000;
831 ;AN000;
832 PUSH AX ; save access/share byte ;AN000;
833 ;AN000;
834 MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; remember this is old open ;AN000;
835 JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000;
836 ;AN000;
837EndProc IFS_SEQ_OPEN ;AN000;
838 ;AN000;
839BREAK <IFS_OPEN Open> ;AN000;
840 ;AN000;
841;************************************************************************************ ;AN000;
842; ;AN000;
843; IFS_OPEN ;AN000;
844; ;AN000;
845; Inputs: ;AN000;
846; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000;
847; terminated) ;AN000;
848; [THISCDS] Points to CDS being used ;AN000;
849; [THISSFT] Points to SFT to fill in if file found ;AN000;
850; (sf_mode field set so that FCB may be detected) ;AN000;
851; ES:DI = [THISSFT] ;AN000;
852; [SATTRIB] Is attribute of search, determines what files can be found ;AN000;
853; AX is Access and Sharing mode ;AN000;
854; High NIBBLE of AL (Sharing Mode) ;AN000;
855; sharing_compat file is opened in compatibility mode ;AN000;
856; sharing_deny_none file is opened Multi reader, Multi writer ;AN000;
857; sharing_deny_read file is opened Only reader, Multi writer ;AN000;
858; sharing_deny_write file is opened Multi reader, Only writer ;AN000;
859; sharing_deny_both file is opened Only reader, Only writer ;AN000;
860; Low NIBBLE of AL (Access Mode) ;AN000;
861; open_for_read file is opened for reading ;AN000;
862; open_for_write file is opened for writing ;AN000;
863; open_for_both file is opened for both reading and writing. ;AN000;
864; ;AN000;
865; For FCB SFTs AL should = -1 ;AN000;
866; (not checked) ;AN000;
867; Function: ;AN000;
868; see IFS_XOPEN ;AN000;
869; Outputs: ;AN000;
870; sf_ref_count is NOT altered ;AN000;
871; CARRY CLEAR ;AN000;
872; THISSFT filled in. ;AN000;
873; CARRY SET ;AN000;
874; AX is error code ;AN000;
875; error_file_not_found ;AN000;
876; Last element of path not found ;AN000;
877; error_path_not_found ;AN000;
878; Bad path ;AN000;
879; error_access_denied ;AN000;
880; Attempt to open read only file for writting, or ;AN000;
881; open a directory ;AN000;
882; error_sharing_violation ;AN000;
883; The sharing mode was correct but not allowed ;AN000;
884; generates an INT 24 on compatibility mode SFTs ;AN000;
885; Regs: DS preserved, others destroyed ;AN000;
886; ;AN000;
887;************************************************************************************ ;AN000;
888 ;AN000;
889 procedure IFS_OPEN,NEAR ;AN000;
890 ;AN000;
891 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
892 ifsr_api_def OPENFILE ;AN000;
893 ;AN000;
894 PUSH AX ; save access/share mode ;AN000;
895 ;AN000;
896 MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; set for old open ;AN000;
897 JMP SHORT XO_20 ; Rest of processing in ;AN000;
898 ; extended open routine. ;AN000;
899EndProc IFS_Open ;AN000;
900 ;AN000;
901BREAK <IFS_SEQ_CREATE Open> ;AN000;
902 ;AN000;
903;************************************************************************************ ;AN000;
904; ;AN000;
905; IFS_SEQ_CREATE ;AN000;
906; ;AN000;
907; see IFS_CREATE for details ;AN000;
908; ;AN000;
909;************************************************************************************ ;AN000;
910 ;AN000;
911 procedure IFS_SEQ_CREATE,NEAR ;AN000;
912 ;AN000;
913 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
914 ifsr_api_def OPENFILE ;AN000;
915 ;AN000;
916 PUSH AX ; save attribute ;AN000;
917 ;AN000;
918 MOV CS:IFSPROC_FLAGS,IsOldCreate + IsCreate ; remember is old create ;AN012;
919 JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000;
920 ;AN000;
921EndProc IFS_SEQ_CREATE ;AN000;
922 ;AN000;
923BREAK <IFS_CREATE Create> ;AN000;
924 ;AN000;
925;************************************************************************************ ;AN000;
926; ;AN000;
927; IFS_CREATE ;AN000;
928; ;AN000;
929; Inputs: ;AN000;
930; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000;
931; terminated) ;AN000;
932; [CURR_DIR_END] Points to end of Current dir part of string ;AN000;
933; ( = -1 if current dir not involved, else ;AN000;
934; Points to first char after last "/" of current dir part) ;AN000;
935; [THISCDS] Points to CDS being used ;AN000;
936; [THISSFT] Points to SFT to fill in if file created ;AN000;
937; (sf_mode field set so that FCB may be detected) ;AN000;
938; ES:DI = [THISSFT] ;AN000;
939; [SATTRIB] Is attribute of search, determines what files can be found ;AN000;
940; AL is Attribute to create ;AN000;
941; AH is 0 if CREATE, non zero if CREATE_NEW ;AN000;
942; Function: ;AN000;
943; See IFS_XOPEN for details ;AN000;
944; Outputs: ;AN000;
945; sf_ref_count is NOT altered ;AN000;
946; CARRY CLEAR ;AN000;
947; THISSFT filled in. ;AN000;
948; sf_mode = sharing_compat + open_for_both for Non-FCB SFT ;AN000;
949; CARRY SET ;AN000;
950; AX is error code ;AN000;
951; error_path_not_found ;AN000;
952; Bad path (not in curr dir part if present) ;AN000;
953; error_access_denied ;AN000;
954; Attempt to re-create read only file , or ;AN000;
955; create a second volume id or create a dir ;AN000;
956; error_sharing_violation ;AN000;
957; The sharing mode was correct but not allowed ;AN000;
958; generates an INT 24 ;AN000;
959; Regs: DS preserved, others destroyed ;AN000;
960; ;AN000;
961;************************************************************************************ ;AN000;
962 ;AN000;
963 procedure IFS_CREATE,NEAR ;AN000;
964 ;AN000;
965 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
966 ifsr_api_def OPENFILE ;AN000;
967 ;AN000;
968 PUSH AX ; save attribute ;AN000;
969 ;AN000;
970 MOV CS:IFSPROC_FLAGS,ISOLDCREATE ; remember is old create ;AN000;
971 JMP SHORT XO_20 ; cont. in ifs_xopen ;AN000;
972 ;AN000;
973EndProc IFS_Create ;AN000;
974 ;AN000;
975 ;AN000;
976BREAK <IFS_SEQ_XOPEN Open> ;AN000;
977 ;AN000;
978;************************************************************************************ ;AN000;
979; ;AN000;
980; IFS_SEQ_XOPEN ;AN000;
981; ;AN000;
982; see IFS_XOPEN for details ;AN000;
983; ;AN000;
984;************************************************************************************ ;AN000;
985 ;AN000;
986 procedure IFS_SEQ_XOPEN,NEAR ;AN000;
987 ;AN000;
988 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
989 ifsr_api_def OPENFILE ;AN000;
990 ;AN000;
991 MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000;
992SXO_10: ;AN000;
993 invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000;
994 JC XO_20 ; cf=0 unc, cf=1 device ;AN000;
995 ;AN000;
996SXO_20: ;AN000;
997 PUSH CS ; ds-ifsseg ;AN000;
998 POP DS ;AN000;
999ASSUME DS:IFSSEG ;AN000;
1000 ;AN000;
1001 OR IFSPROC_FLAGS,ISSEQ ; SEQ = UNC ;AN000;
1002 invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000;
1003 invoke PREP_IFSR ; zero out ifsr ;AN000;
1004 JMP XO_200 ; cont. in ifs_xopen ;AN000;
1005 ;AN000;
1006EndProc IFS_SEQ_XOPEN ;AN000;
1007 ;AN000;
1008 ;AN000;
1009BREAK <IFS_XOPEN Open> ;AN000;
1010 ;AN000;
1011;************************************************************************************
1012;
1013; IFS_XOPEN
1014;
1015; Called by: IFSFUNC dispatcher
1016;
1017; Routines called: CALL_IFS DFL_MATCH
1018; CD_TO_CDS DFL_TO_DF
1019; CDS_TO_CD DF_TO_DFL
1020; SFT_TO_SFF
1021; SF_TO_SFT
1022;
1023; Inputs:
1024; [THISCDS] Set
1025; [THISSFT] Set
1026; [SAVE_DX] = FLAG: FUNCTION CONTROL, FORMAT=0000000C NNNN EEEE
1027; C 0=VALIDATE CODE PAGE, 1=NO CODE PAGE CHECK
1028; NNNN=DOES NOT EXIST ACTION: 0=FAIL, 1=CREATE
1029; EEEE=EXISTS ACTION : 0=FAIL, 1=OPEN, 2=REPLACE/OPEN
1030; [SAVE_BX] = MODE OPEN MODE FORMAT : 0WF00000ISSS0AAA
1031; AAA = ACCESS CODE: 0=READ, 1=WRITE, 2=READ/WRITE
1032; 3=EXECUTE (UNDOCUMENTED)
1033; 7=FCB (UNDOCUMENTED)
1034; SSS=SHARING MODE : 0=COMPATIBILITY, 1=DENY READ/WRITE
1035; 2=DENY WRITE, 3=DENY READ,
1036; 4=DENY NONE
1037; I 0=PASS HANDLE TO CHILD, 1=NO INHERIT
1038; F 0=INT 24H, 1=RETURN ERROR
1039; ON THIS OPEN AND ANY IO TO THIS HANDLE
1040; W 0=NO COMMIT, 1=AUTO-COMMIT ON WRITE
1041; AX = ATTR SEARCH/CREATE ATTRIBUTE
1042; [SAVE_DS]:[SAVE_SI] = Full path name
1043; [SAVE_ES]:[SAVE_DI] = Parameter list
1044; Null list if DI=-1
1045;
1046; Function:
1047; IF SEQ THEN
1048; prep for UNC
1049; ELSE DO
1050; IF [THISCDS] .NOT. NULL THEN
1051; DO
1052; Call CDS_TO_CD
1053; Set IFSR_DEVICE_CB@ as pointer to CD
1054; Set IFS pointer to CURDIR_IFSR_HDR
1055; DFL_FLAG = 0
1056; ENDDO
1057; ELSE DO
1058; Call DFL_TO_DF
1059; Set IFSR_DEVICE_CB@ as pointer to DF
1060; Set IFS pointer to DFL_IFSR_HDR
1061; DFL_FLAG = 1
1062; ENDDO
1063; ENDIF
1064; ENDDO
1065; ENDIF
1066; Prep IFSRH:
1067; * IFSR_LENGTH DW 62 ; Request length
1068; * IFSR_FUNCTION DB 4 ; Execute API function
1069; + IFSR_RETCODE DW ?
1070; + IFSR_RETCLASS DB ?
1071; IFSR_RESV1 DB 16 DUP(0)
1072; * IFSR_APIFUNC DB 9 ; Open/Create File
1073; + IFSR_ERROR_CLASS DB ?
1074; + IFSR_ERROR_ACTION DB ?
1075; + IFSR_ERROR_LOCUS DB ?
1076; + IFSR_ALLOWED DB ?
1077; + IFSR_I24_RETRY DB ?
1078; + IFSR_I24_RESP DB ?
1079; IFSR_RESV2 DB ?
1080; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF
1081; *+ IFSR_OPEN_CB@ DD ? ; convert SFT to SFF
1082; ; and set this as pointer to it.
1083; * IFSR_MODE DW ? ; BX - open mode
1084; * IFSR_FLAG DW ? ; AL
1085; * IFSR_CP DW ? ; Global code page
1086; * IFSR_CPSW DB 0 ; Code page switch flag
1087; IFSR_RESV3 DB 0
1088; * IFSR_NAME@ DD ? ; ptr to full asciiz filename
1089; * IFSR_PARMS@ DD ? ; ES:DI
1090; * IFSR_MATCHATTR DW ? ; CX
1091; + IFSR_ACTION DW 0 ; Action taken code: 1=file opened
1092; ; 2=file created/opened
1093; ; 3=file replaced/opened
1094;
1095; CALL routine, CALL_IFS, with IFS pointer
1096; IF IFSR_RETCODE = 0 THEN
1097; DO
1098; IF DFL_FLAG = 0 THEN
1099; Call CD_TO_CDS
1100; ELSE Call DF_TO_DFL
1101; Call SF_TO_SFT
1102; CX = IFSR_ACTION
1103; ENDDO
1104; ELSE DO /* error */
1105; AX = IFSR_RETCODE
1106; Set carry
1107; ENDDO
1108; ENDIF
1109;
1110; Outputs:
1111; CX=ACTION TAKEN CODE
1112; 1 = FILE OPENED
1113; 2 = FILE CREATED/OPENED
1114; 3 = FILE REPLACED/OPENED
1115; sf_ref_count is NOT altered
1116; THISSFT filled in or updated
1117; AX set on error:
1118; error_file_not_found
1119; Last element of path not found
1120; error_path_not_found
1121; Bad path
1122; error_access_denied
1123; Attempt to open read only file for writing,
1124; or open a directory
1125; error_sharing_violation
1126; The sharing mode was correct but not allowed
1127; generates an INT 24 on compatibility mode SFTs
1128; DS preserved, others destroyed
1129;
1130;************************************************************************************
1131 ;AN000;
1132 procedure IFS_XOPEN,NEAR ;AN000;
1133 ;AN000;
1134 ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000;
1135 ifsr_api_def OPENFILE ;AN000;
1136 ;AN000;
1137 PUSH AX ; srch attr/create attr
1138 MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000;
1139 JMP SHORT XO_25 ;AN008; BAF
1140 ;AN000;
1141XO_20: ; (welcome all old open/create calls) ;AN000;
1142ASSUME DS:DOSGROUP ;AN000;
1143 MOV [SAVE_DI],-1 ; set no parms list on old calls ;AN008; BAF
1144XO_25: ;AN008; BAF
1145 invoke PREP_IFSR ; zero out ifsr ;AN000;
1146 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
1147 ;AN000;
1148 LEA SI,COUNTRY_CDPG ; load cp and cpsw ;AN000;
1149 MOV AX,DS:[SI.ccDosCodePage] ; | ;AN000;
1150 MOV ES:[BX.IFSR_CP],AX ; | ;AN000;
1151 MOV AL,[CPSWFLAG] ; | ;AN000;
1152 MOV ES:[BX.IFSR_CPSW],AL ; | ;AN000;
1153
1154 CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000;
1155 JE XO_100 ;AN000;
1156 ;AN000;
1157 LDS SI,[THISCDS] ; cds--cds--cds--cds--cds--cds ;AN000;
1158 MOV AX,SI ; set ifsDrv for possible I24 ;AN000;
1159 invoke IFSDrvFromCDS ;AN000;
1160 RestoreReg <AX> ; must have ax 1st on stack ;AN000;
1161 SaveReg <DS,SI,AX> ; cds ptr, attr ;AN000;
1162XO_60: ;AN000;
1163 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
1164 ; ES:BX -> IFSRH ;AN000;
1165 ; IFSR_DEVICE_CB@ ;AN000;
1166 ; ds - IFSSEG ;AN000;
1167 OR IFSPROC_FLAGS,ISCDS ;AN000;
1168 JMP SHORT XO_200 ; go prep IFSRH ;AN000;
1169 ;AN000;
1170XO_100: ;AN000;
1171 SaveReg <ES> ; if deviceless attach, skip device stuff;AN014;
1172 LES DI,CS:[THISDFL] ;AN014;
1173 CMP WORD PTR [THISDFL],NULL_PTR ;AN014;
1174 RestoreReg <ES> ;AN014;
1175 JNE XO_110 ;AN014;
1176 OR CS:IFSPROC_FLAGS,IsSeq ;AN014;
1177 CMP CS:[fAssign],ZERO
1178 JNE XO_200
1179 ADD SP,2
1180 MOV AX,72
1181 JMP XO_120 ;AN014;
1182XO_110: ;AN014;
1183 invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000;
1184 ; ES:BX -> IFSRH ;AN000;
1185 ; IFSR_DEVICE_CB@ ;AN000;
1186 ; ds - IFSSEG ;AN000;
1187 JNC XO_200 ;AN000;
1188;;;;;;;;TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; new open also pushes ax ;AD014;
1189;;;;;;;;JZ XO_120 ; dfl error ;AD014;
1190 ADD SP,2 ; get saved ax off stack if old ;AN000;
1191;XO_120: ;AD014;
1192 MOV AX,error_invalid_function ; set error info and quit ;AN000;
1193XO_120: ;AN014;
1194 invoke SET_EXTERR_INFO ;AN000;
1195 JMP FA_980 ; ret up in FA to preserve DS ;AN000;
1196 ;AN000;
1197XO_200: ; (welcome seq open/create) ;AN000;
1198 Context DS ; get addressability to dosgroup ;AN000;
1199 invoke SFT_TO_SFF ; SFT: sets IFSR_OPEN_CB@ ;AN000;
1200 ; ES:BX -> IFSRH ;AN000;
1201 ; ds - IFSSEG ;AN000;
1202 MOV ES:[BX.IFSR_LENGTH],LENGTH_OPENFILE ; prep IFRH ;AN000;
1203 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
1204 MOV ES:[BX.IFSR_APIFUNC],IFSOPENFILE ;AN000;
1205 POP AX ; restore input AX ;AN000;
1206 TEST IFSPROC_FLAGS,ISOLDOPEN ; check for old open/create ;AN000;
1207 JZ XO_220 ;AN000;
1208;;;;;; OR AX,OLDOPEN_MODE ; why did I do this???? scrap ;AD006;
1209
1210 SaveReg <DS,SI> ; old redirector does this ;AN013;
1211 Context DS ;AN013;
1212 LDS SI,[THISSFT] ;AN013;
1213 TEST DS:[SI.SF_MODE],sf_isFCB ;AN013;
1214 RestoreReg <SI,DS> ;AN013;
1215 JZ XO_210 ;AN013;
1216 MOV AL,-1 ;AN013;
1217XO_210: ;AN013;
1218
1219 MOV ES:[BX.IFSR_MODE],AX ;AN000;
1220 MOV ES:[BX.IFSR_FLAG],OLDOPEN_FLAG ;AN000;
1221 XOR AH,AH ;AN000;
1222 JMP SHORT XO_240 ;AN000;
1223XO_220: ;AN000;
1224 TEST IFSPROC_FLAGS,ISOLDCREATE ;AN000;
1225 JZ XO_260 ;AN000;
1226 MOV ES:[BX.IFSR_MODE],OLDCREATE_MODE ; old create ;AC006;AC010;
1227 MOV ES:[BX.IFSR_FLAG],OLDCREATE_FLAG ;AN000;
1228 OR AH,AH ; is this create new?? ;AN000;
1229 JZ XO_230 ;AN000;
1230 MOV ES:[BX.IFSR_FLAG],OLDCREATENEW_FLAG ;AN000;
1231XO_230: ;AN000;
1232 XCHG AH,AL ;AN000;
1233XO_240: ;AN000;
1234 PUSH SS ; get ds = dosgroup so can access ;AN000;
1235 POP DS ; wfp_start ;AN000;
1236ASSUME DS:DOSGROUP ;AN000;
1237 MOV AL,[SATTRIB] ;AN000;
1238 MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000;
1239 JMP SHORT XO_280 ; go call FS ;AN000;
1240 ;AN000;
1241XO_260: ; -------extended open/create------------;AN000;
1242 Context DS ; set ds-dosgroup ;AN000;
1243;;;;;;;;PUSH [SAVE_DX] ;AD012;
1244;;;;;;;;POP ES:[BX.IFSR_FLAG] ; input dx - flag ;AD012;
1245 SaveReg <AX> ; check if create, if so set flag ;AN012;
1246 MOV AX,[SAVE_DX] ;AN012;
1247 MOV ES:[BX.IFSR_FLAG],AX
1248 MOV AH,AL ;AN012;
1249 AND AX,0FF0H ;AN012;
1250 CMP AL,NOTEXIST_ACT_CREATE*16 ;AN012;
1251 RestoreReg <AX> ;AN012;
1252 JNE XO_270 ;AN012;
1253 OR IFSPROC_FLAGS,IsCreate ;AN012;
1254XO_270: ;AN012;
1255
1256 PUSH [SAVE_BX] ;AN000;
1257 POP ES:[BX.IFSR_MODE] ; input bx - mode ;AN000;
1258 XCHG AH,AL ; attr ;AN000;
1259 MOV AL,[SATTRIB] ;AN000;
1260 MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000;
1261; MOV DI,[SAVE_DI] ; parm list ;AD011;
1262; CMP DI,NULL_PTR ; if offset -1, then no parm list ;AD011;
1263; JE XO_280 ; | ;AD011;
1264; MOV ES:WORD PTR[BX.IFSR_PARMS@],DI ; | ;AD011;
1265; PUSH [SAVE_ES] ; | ;AD011;
1266; POP ES:WORD PTR[BX.IFSR_PARMS@+2] ; | ;AD011;
1267
1268XO_280: ;AN000;
1269 MOV SI,[WFP_START] ;AN000;
1270 invoke STRIP_WFP_START ;AN000;
1271 MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000;
1272 MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000;
1273 PUSH CS ;AN000;
1274 POP DS ;AN000;
1275ASSUME DS:IFSSEG ;AN000;
1276 ;AN000;
1277;****************************************************************************** ;AN000;
1278 invoke CALL_IFS ; call fs with open/create request ;AN000;
1279;****************************************************************************** ;AN000;
1280 ;AN000;
1281 JNC XO_300 ;AN000;
1282 TEST IFSPROC_FLAGS,ISCDS ; request FAILED - ;AN000;
1283 JNZ XO_290 ;AN000;
1284 JMP FA_980 ; go up, set carry & return ;AN000;
1285XO_290: ;AN000;
1286 RestoreReg <SI,DS> ; if cds, restore stack first ;AN000;
1287 JMP FA_980 ;AN000;
1288 ;AN000;
1289XO_300: ; request SUCCEEDED - ;AN000;
1290 TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; check for old open/create ;AN007; BAF
1291 JNZ XO_310 ;AN007; BAF
1292 SaveReg <DS,SI> ;AN007; BAF
1293 CallInstall Get_User_Stack,multDOS,24 ; Set action take back into CX ;AN007; BAF ;AN000;
1294ASSUME DS:DOSGROUP ;AN007; BAF
1295 MOV AX,ES:[BX.IFSR_ACTION] ; action take only if Ext Open ;AN007; BAF
1296 MOV DS:[SI].USER_CX,AX ;AN007; BAF
1297 RestoreReg <SI,DS> ;AN007; BAF
1298ASSUME DS:IFSSEG ;AN007; BAF
1299XO_310: ; request SUCCEEDED - ;AN007; BAF
1300 MOV AX,ES:[BX.IFSR_MATCHATTR] ;AN000;
1301 ;AN000;
1302 invoke SFF_TO_SFT ; update sft ;AN000;
1303 TEST IFSPROC_FLAGS,ISCDS ;AN000;
1304 JZ XO_320 ;AN000;
1305 RestoreReg <DI,ES> ; cds-restore cds ptr into es:di ;AN000;
1306 invoke CD_TO_CDS ; update cds ;AN000;
1307 JMP XO_360 ;AN000;
1308XO_320: ;AN000;
1309 TEST IFSPROC_FLAGS,ISSEQ ;AN000;
1310 JZ XO_340 ;AN000;
1311 MOV DI,NULL_PTR ; set seq devptr to null ;AN000;
1312 SaveReg <DI> ; this for sf_devptr ;AN000;
1313 RestoreReg <ES> ;AN000;
1314 JMP SHORT XO_360 ;AN000;
1315 ;AN000;
1316XO_340: ;AN000;
1317 invoke DF_TO_DFL ; update dfl ;AN000;
1318 LES DI,[THISDFL] ; this for sf_devptr ;AN000;
1319 XOR AX,AX ; attr 0 for devices ;AN000;
1320 ;AN000;
1321XO_360: ;AN000;
1322 Context DS ;AN000;
1323 LDS SI,[THISSFT] ; set some fields in sft ;AN000;
1324 MOV DS:[SI.sf_attr],AL ;AN000;
1325;;;;;;;;MOV DS:[SI.sf_attr_hi],AH ;AD015;
1326 MOV WORD PTR DS:[SI.sf_devptr],DI ;AN000;
1327 MOV WORD PTR DS:[SI.sf_devptr+2],ES ;AN000;
1328 TEST CS:IFSPROC_FLAGS,IsCDS + IsSeq ; let deviceless attach stuff thru here ;AC014;
1329 JZ XO_380 ;AN000;
1330 MOV AL,CS:[IFSDRV] ; drive ;AN000;
1331 AND AX,devid_file_mask_drive ; Drive in correct bits ;AN000;
1332 OR AX,sf_isnet + devid_file_clean ;AN000;
1333 MOV DS:[SI.sf_flags],AX ;AN000;
1334 ; now set sf_name to filename in form: ;AN000;
1335 ; filename ext (8 char fn spaced out - ;AN000;
1336 ; 3 char ext spaced out) ;AN000;
1337 SaveReg <CX,DS,SI,DS> ; save dssi->sf for later pop & action ;AN000;
1338 RestoreReg <ES> ;AN000;
1339 MOV DI,SI ; esdi->sft ;AN000;
1340 ;AN000;
1341 ADD DI,sf_name ; blank out sf_name ;AN000;
1342 SaveReg <DI> ; | ;AN000;
1343 MOV AX,2020H ; | ;AN000;
1344 MOV CX,5 ; | ;AN000;
1345 CLD ; | ;AN000;
1346 REP STOSW ; | ;AN000;
1347 STOSB ; | ;AN000;
1348 RestoreReg <DI> ; | ;AN000;
1349 ;AN000;
1350 Context DS ;AN000;
1351 MOV SI,[WFP_START] ; dssi->wfp_start ;AN000;
1352 CallInstall DStrlen,multDOS,37 ; get length of full path name (in cx) ;AN000;
1353 ADD SI,CX ; mov si to end of name ;AN000;
1354 DEC SI ; si now on null ;AN000;
1355XO_362: ;AN000;
1356 DEC SI ; mov back one ;AN000;
1357 CMP BYTE PTR DS:[SI],"\" ; looking for \ just before fn ;AN000;
1358 JNE XO_362 ;AN000;
1359 ;AN000;
1360 INC SI ; si now pointing to 1st char fn ;AN000;
1361 MOV CX,8 ; esdi -> sf_name ;AN000;
1362XO_364: ;AN000;
1363 LODSB ;AN000;
1364 STOSB ;AN000;
1365 DEC CX ;AN000;
1366 CMP AL,"." ;AN000;
1367 JE XO_368 ;AN000;
1368 OR AL,AL ;AN000;
1369 JZ XO_366 ;AN000;
1370 JCXZ XO_369 ;AN000;
1371 JMP SHORT XO_364 ;AN000;
1372 ;AN000;
1373XO_366: ;AN000;
1374 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1375 JMP SHORT XO_378 ;AN000;
1376 ;AN000;
1377XO_368: ;AN000;
1378 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1379 ADD DI,CX ;AN000;
1380XO_369: ;AN000;
1381 MOV CX,3 ;AN000;
1382XO_370: ;AN000;
1383 LODSB ;AN000;
1384 STOSB ;AN000;
1385 DEC CX ;AN000;
1386 OR AL,AL ;AN000;
1387 JZ XO_372 ;AN000;
1388 JCXZ XO_378 ;AN000;
1389 JMP SHORT XO_370 ;AN000;
1390XO_372: ;AN000;
1391 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1392 ;AN000;
1393XO_378: ;AN000;
1394 RestoreReg <SI,DS,CX> ; dssi -> sft, cx=action code ;AN000;
1395 JMP SHORT XO_500 ;AN000;
1396 ;AN000;
1397XO_380: ;AN000;
1398;;;;;;;;TEST CS:IFSPROC_FLAGS,ISSEQ ;AD014;
1399;;;;;;;;JNZ XO_500 ;AD014;
1400 MOV DS:[SI.sf_flags],sf_isnet+devid_file_clean+sf_net_spool+devid_device ;AN000;
1401 SaveReg <CX,DS,SI> ; sft ptr, action ;AN003;
1402 invoke XCHGP ; dssi -> dfl, esdi -> sft ;AN000;
1403 ADD DI,sf_name ;AN000;
1404 ADD SI,DFL_DEV_NAME ; Skip over path sep, now pointing to name ;AN000;
1405 MOV CX,4 ;AN000;
1406 REP MOVSW ;AN000;
1407 MOV AX,2020H ;AN000;
1408 STOSW ;AN000;
1409 STOSB ;AN000;
1410 RestoreReg <SI,DS,CX> ; sft ptr, action ;AN003/AC005;
1411
1412XO_500: ;AN000;
1413 MOV AX,WORD PTR CS:[THISIFS] ; set sf_ifs_hdr ;AN003;
1414 MOV WORD PTR DS:[SI.SF_IFS_HDR],AX ;AN003;
1415 MOV AX,WORD PTR CS:[THISIFS+2] ;AN003;
1416 MOV WORD PTR DS:[SI.SF_IFS_HDR+2],AX ;AN003;
1417
1418 MOV AX,CS:[SFT_SERIAL_NUMBER] ; give new sft serial number for ;AN004;
1419 MOV DS:[SI.SF_FIRCLUS],AX ; fcb processing ;AN004;
1420 INC CS:[SFT_SERIAL_NUMBER] ;AN004;
1421
1422 MOV WORD PTR DS:[SI.SF_POSITION],0 ;AN012;
1423 MOV WORD PTR DS:[SI.SF_POSITION+2],0 ;AN012;
1424
1425 TEST CS:IFSPROC_FLAGS,IsCreate ; if create, set sf time/date ;AN012;
1426 JZ XO_520 ;AN012;
1427 push ds ;AN017: SAVE DS **RPS
1428 CallInstall DATE16,MultDOS,13 ;AN012;
1429 pop ds ;AN017: SAVE DS **RPS
1430 MOV DS:[SI.SF_TIME],DX ;AN012;
1431 MOV DS:[SI.SF_DATE],AX ;AN012;
1432 MOV WORD PTR DS:[SI.SF_SIZE],0 ;AN012;
1433 MOV WORD PTR DS:[SI.SF_SIZE+2],0 ;AN012;
1434XO_520: ;AN012;
1435
1436 PUSH SS ; Preserve input DS ;AN000;
1437 POP DS ;AN000;
1438 MOV AX,(multDOS SHL 8) OR 12 ;AN000;
1439 INT 2FH ;AN000;
1440 ;AN000;
1441 return ;AN000;
1442 ;AN000;
1443EndProc IFS_XOPEN ;AN000;
1444 ;AN000;
1445BREAK <IFS_SEQ_SEARCH> ;AN000;
1446 ;AN000;
1447;************************************************************************************ ;AN000;
1448; ;AN000;
1449; IFS_SEQ_SEARCH ;AN000;
1450; ;AN000;
1451; Inputs: ;AN000;
1452; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000;
1453; terminated) ;AN000;
1454; [SATTRIB] Is attribute of search, determines what files can be found ;AN000;
1455; [DMAADD] Points to 53 byte buffer ;AN000;
1456; Function: ;AN000;
1457; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000;
1458; Outputs: ;AN000;
1459; CARRY SET ;AN000;
1460; AX = error_path_not_found ;AN000;
1461; DS preserved, others destroyed ;AN000;
1462; ;AN000;
1463;************************************************************************************ ;AN000;
1464 ;AN000;
1465 procedure IFS_SEQ_SEARCH_FIRST,NEAR ;AN000;
1466ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1467 ;AN000;
1468 MOV AX,error_path_not_found ;AN000;
1469 STC ;AN000;
1470 return ;AN000;
1471 ;AN000;
1472EndProc IFS_SEQ_SEARCH_FIRST ;AN000;
1473 ;AN000;
1474;************************************************************************************ ;AN000;
1475; ;AN000;
1476; IFS_SEQ_SEARCH_NEXT ;AN000;
1477; ;AN000;
1478; Inputs: ;AN000;
1479; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000;
1480; (only first 21 bytes must have valid information) ;AN000;
1481; Function: ;AN000;
1482; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000;
1483; Outputs: ;AN000;
1484; CARRY SET ;AN000;
1485; AX = error_no_more_files ;AN000;
1486; DS preserved, others destroyed ;AN000;
1487; ;AN000;
1488;************************************************************************************ ;AN000;
1489 ;AN000;
1490 procedure IFS_SEQ_SEARCH_NEXT,NEAR ;AN000;
1491ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1492 ;AN000;
1493 JMP IFS_SEQ_SEARCH_FIRST ;AN000;
1494 ;AN000;
1495EndProc IFS_SEQ_SEARCH_NEXT ;AN000;
1496 ;AN000;
1497 ;AN000;
1498BREAK <IFS_SEARCH_FIRST Search for first entry> ;AN000;
1499 ;AN000;
1500;************************************************************************************
1501;
1502; IFS_SEARCH_FIRST
1503;
1504; Inputs:
1505; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL
1506; terminated)
1507; [THISCDS] Points to CDS being used may not be NUL
1508; [SATTRIB] Is attribute of search, determines what files can be found
1509; [DMAADD] Points to 53 byte buffer
1510; DS - dosgroup
1511;
1512; Function:
1513; Prep IFSRH:
1514; * IFSR_LENGTH DW 50 ; Request length
1515; * IFSR_FUNCTION DB 4 ; Execute API function
1516; + IFSR_RETCODE DW ?
1517; + IFSR_RETCLASS DB ?
1518; IFSR_RESV1 DB 16 DUP(0)
1519; * IFSR_APIFUNC DB 8 ; Search file
1520; + IFSR_ERROR_CLASS DB ?
1521; + IFSR_ERROR_ACTION DB ?
1522; + IFSR_ERROR_LOCUS DB ?
1523; + IFSR_ALLOWED DB ?
1524; + IFSR_I24_RETRY DB ?
1525; + IFSR_I24_RESP DB ?
1526; IFSR_RESV2 DB ?
1527; *+ IFSR_DEVICE_CB@ DD ? ; CD
1528; IFSR_OPEN_CB@ DD ? ; null
1529; * IFSR_SUBFUNC DB subfunction ; 1=first, 2=next
1530; ; 4=last (CP/DOS only)
1531; * IFSR_RESV3 DB ? ; DOS Reserved
1532; *+ IFSR_CONTINFO@ DD continuation info address (always set):
1533; * DB 8 DUP(?) ; SEARCH FILE NAME
1534; * DB 3 DUP(?) ; SEARCH FILE EXTENSION
1535; * DB ? ; SEARCH ATTRIBUTE
1536; DB 8 DUP(?) ; FSDA
1537; DIRECTORY ENTRY
1538; + DB 8 DUP(?) ; FOUND FILE NAME
1539; + DB 3 DUP(?) ; FOUND FILE EXTENSION
1540; + DB ? ; FOUND ATTRIBUTE LOW ??? DB/DD
1541; + DW ? ; FILE CODE PAGE (OR 0)
1542; + DW ? ; RESERVED
1543; + DB ? ; FOUND ATTRIBUTE HIGH
1544; + DB 5 DUP(?) ; RESERVED
1545; + DW ? ; FILE TIME
1546; + DW ? ; FILE DATE
1547; + DW ? ; MEANING FILE SYSTEM SPECIFIC
1548; ; (STARTING CLUSTER IN FAT)
1549; + DD ? ; FILE SIZE
1550; following on search first only
1551; * IFSR_MATCHATTR DW ; search attribute ; format 0000000re0advshr
1552; * IFSR_NAME@ DD ; asciiz name to process
1553;
1554; IF search first THEN
1555; DO
1556; IFSR_SUBFUNC = 1
1557; Get CDS from [THISCDS]
1558; Call CDS_TO_CD
1559; ENDDO
1560; ELSE DO
1561; IFSR_SUBFUNC = 2
1562; Get CDS from drive byte in DMAADD
1563; Call CDS_TO_CD
1564; ENDDO
1565; ENDIF
1566; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR
1567; IF IFSR_RETCODE = 0 THEN
1568; DO
1569; Call CD_TO_CDS
1570; DMAADD = IFSR_CONTINFO
1571; Clear carry
1572; ENDDO
1573; ELSE DO {error}
1574; AX = error code
1575; Set carry
1576; ENDDO
1577; ENDIF
1578;
1579; Outputs:
1580; CARRY CLEAR
1581; The 53 bytes ot DMAADD are filled in as follows:
1582;
1583; Drive Byte (A=1, B=2, ...) High bit = 1 --|
1584; 11 byte search name with Meta chars in it | From
1585; Search Attribute Byte, attribute of search | Server
1586; WORD LastEnt value |
1587; WORD DirStart ------------------------------|
1588; DWORD Local CDS
1589; 32 bytes of the directory entry found
1590; CARRY SET
1591; AX = error code
1592; error_no_more_files
1593; No match for this file
1594; error_access_denied
1595; Device name given
1596; error_path_not_found
1597; Bad path
1598; DS preserved, others destroyed
1599;
1600;************************************************************************************
1601 ;AN000;
1602 procedure IFS_SEARCH_FIRST,NEAR ;AN000;
1603 ;AN000;
1604 ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000;
1605 ifsr_api_def SEARCHFILE ;AN000;
1606 ;AN000;
1607 MOV CS:IFSPROC_FLAGS,ZERO ;AN000;
1608 invoke PREP_IFSR ; zero ifsr ;AN000;
1609 ;AN000;
1610ASSUME DS:DOSGROUP ;AN000;
1611 LES DI,[DMAADD] ; esdi -> dmaadd ;AN001;
1612 LDS SI,[THISCDS] ; dssi -> cds ;AN000;
1613
1614 invoke DRIVE_FROM_CDS ; set ifsdrv (0-based) ;AN001;
1615 MOV AL,CS:[IFSDRV] ; put 1-based drive # in dmaadd ;AN001;
1616 INC AL ;AN001;
1617 OR AL,80H ; turn on ifs indicator ;AN001;
1618 STOSB ;AN001;
1619
1620 SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000;
1621 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
1622 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
1623 ; ES:BX -> IFSRH ;AN000;
1624 ; IFSR_DEVICE_CB@ ;AN000;
1625 ; ds - IFSSEG ;AN000;
1626 PUSH DS ; save ds-ifsseg ;AN000;
1627 Context DS ; ds-dosgroup ;AN000;
1628 ;AN000;
1629 MOV SI,[WFP_START] ;AN000;
1630 invoke STRIP_WFP_START ; remove leading d:\ if present ;AN000;
1631 MOV ES:WORD PTR[BX.IFSR_NAME@],SI ;AN000;
1632 MOV ES:WORD PTR[BX.IFSR_NAME@+2],DS ;AN000;
1633 MOV AL,[SATTRIB] ;AN000;
1634 XOR AH,AH ;AN000;
1635 MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000;
1636 ;AN000;
1637 POP DS ;AN000;
1638ASSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1639 ;AN000;
1640 MOV AL,IFSSEARCH_FIRST ;AN000;
1641 JMP SHORT SN_60 ; rest of processing is in ;AN000;
1642 ; search_next routine ;AN000;
1643 ;AN000;
1644EndProc IFS_SEARCH_FIRST ;AN000;
1645 ;AN000;
1646BREAK <IFS_SEARCH_NEXT Search for next> ;AN000;
1647 ;AN000;
1648;************************************************************************************ ;AN000;
1649; ;AN000;
1650; IFS_SEARCH_NEXT ;AN000;
1651; ;AN000;
1652; Inputs: ;AN000;
1653; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000;
1654; (only first 21 bytes must have valid information) ;AN000;
1655; Function: ;AN000;
1656; Look for subsequent matches ;AN000;
1657; Outputs: ;AN000;
1658; CARRY CLEAR ;AN000;
1659; The 53 bytes at DMAADD are updated for next call ;AN000;
1660; (see NET_SEARCH_FIRST) ;AN000;
1661; CARRY SET ;AN000;
1662; AX = error code ;AN000;
1663; error_no_more_files ;AN000;
1664; No more files to find ;AN000;
1665; DS preserved, others destroyed ;AN000;
1666; ;AN000;
1667;************************************************************************************ ;AN000;
1668 ;AN000;
1669 procedure IFS_SEARCH_NEXT,NEAR ;AN000;
1670ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1671 ;AN000;
1672 ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000;
1673 ifsr_api_def SEARCHFILE ;AN000;
1674 ;AN000;
1675 MOV CS:IFSPROC_FLAGS,ZERO ; clear processing flags ;AN000;
1676 invoke PREP_IFSR ; zero out ifsr ;AN000;
1677 ;AN000;
1678SN_20: ;AN000;
1679 LDS SI,[DMAADD] ;AN000;
1680 LODSB ;AN000;
1681 AND AL,NOT 80H ; turn off ifs indicator ;AN000;
1682 DEC AL ; make 0-based ;AN000;
1683 MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN000;
1684 CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000;
1685ASSUME DS:NOTHING ;AN000;
1686 JNC SN_40 ;AN000;
1687 MOV AX,error_invalid_drive ; no cds, set error & ;AN000;
1688 invoke SET_EXTERR_INFO ;AN000;
1689 JMP FA_1000 ; ret up in FA to preserve DS ;AN000;
1690SN_40: ; (welcome lock) ;AN000;
1691 SaveReg <DS,SI> ; save cds ptr ;AN000;
1692 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
1693 ; ES:BX -> IFSRH ;AN000;
1694 ; IFSR_DEVICE_CB@ ;AN000;
1695 ; ds - IFSSEG ;AN000;
1696 MOV AL,IFSSEARCH_NEXT ; start with subfunc=search next ;AN000;
1697; TEST IFSPROC_FLAGS,ISADD ;AD011;
1698; JZ SN_60 ;AD011;
1699; INC AL ; inc subfunc to search same ;AD011;
1700SN_60: ;AN000;
1701 MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
1702 MOV ES:[BX.IFSR_LENGTH],LENGTH_SEARCHFILE ;AN000;
1703 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
1704 MOV ES:[BX.IFSR_APIFUNC],IFSSEARCHFILE ;AN000;
1705 ;AN000;
1706 PUSH DS ;AN000;
1707 Context DS ;AN000;
1708 MOV AX,WORD PTR [DMAADD] ;AN000;
1709 INC AX ;AN000;
1710 MOV ES:WORD PTR[BX.IFSR_CONTINFO@],AX ;AN000;
1711 MOV AX,WORD PTR [DMAADD+2] ;AN000;
1712 MOV ES:WORD PTR[BX.IFSR_CONTINFO@+2],AX ;AN000;
1713 ;AN000;
1714 POP DS ;AN000;
1715ASSUME DS:IFSSEG ;AN000;
1716 invoke CALL_IFS ; call FS ;AN000;
1717 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
1718 JC SN_1000 ;AN000;
1719 invoke CD_TO_CDS ;AN000;
1720 CLC ;AN000;
1721 ;AN000;
1722SN_1000: ;AN000;
1723 JMP FA_1000 ; go up & preserve ds, ret ;AN000;
1724 ;AN000;
1725EndProc IFS_SEARCH_NEXT ;AN000;
1726 ;AN000;
1727 ;AN000;
1728BREAK <OPEN_CHECK_DEVICE - check that device to be opened is real> ;AN000;
1729 ;AN000;
1730;************************************************************************************ ;AN000;
1731; ;AN000;
1732; CHECK_OPEN_DEVICE ;AN000;
1733; ;AN000;
1734; Inputs: ;AN000;
1735; [WFP_START] ;AN000;
1736; ;AN000;
1737; Function: ;AN000;
1738; ;AN000;
1739; Outputs: ;AN000;
1740; ;AN000;
1741; ;AN000;
1742; ;AN000;
1743;************************************************************************************ ;AN000;
1744 ;AN000;
1745 procedure OPEN_CHECK_DEVICE,NEAR ;AN000;
1746ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1747 ;AN000;
1748 MOV SI,[WFP_START] ; dssi -> path to open ;AN000;
1749; invoke PARSE_DEVICE_PATH ; dssi -> device name (asciiz) ;AN000;
1750 ;AN000;
1751 PUSH SS ; Now check if this device is real ;AN000;
1752 POP ES ;AN000;
1753 MOV DI,OFFSET DOSGROUP:NAME1 ;AN000;
1754 MOV CX,4 ;AN000;
1755 REP MOVSW ; Transfer name to NAME1 ;AN000;
1756 MOV AX,2020H ;AN000;
1757 STOSW ;AN000;
1758 STOSB ;AN000;
1759 ;AN000;
1760 PUSH ES ;AN000;
1761 POP DS ;AN000;
1762ASSUME DS:DOSGROUP ;AN000;
1763 MOV [ATTRIB],attr_hidden + attr_system + attr_directory ;AN000;
1764 ; Must set this to something interesting ;AN000;
1765 ; to call DEVNAME. ;AN000;
1766 CallInstall DEVNAME,multDOS,35 ;AN000;
1767 JNC OCD_120 ;AN000;
1768 MOV AX,error_file_not_found ;AN000;
1769 transfer ifs_980 ;AN000;
1770 ;AN000;
1771OCD_120: ;AN000;
1772 transfer ifs_990 ;AN000;
1773 ;AN000;
1774EndProc OPEN_CHECK_DEVICE ;AN000;
1775 ;AN000;
1776 ;AN000;
1777IFSSEG ENDS ;AN000;
1778 END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM
new file mode 100644
index 0000000..7649951
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM
@@ -0,0 +1,202 @@
1 PAGE ,132 ; 
2; SCCSID = @(#)ifsflink.asm 1.0 87/05/11
3TITLE IFSFUNC LINK FIX ROUTINES - Routines to resolve ifsfunc externals
4NAME IFSFLINK
5
6.xlist
7.xcref
8INCLUDE DOSSYM.INC
9INCLUDE DEVSYM.INC
10.cref
11.list
12
13CODE SEGMENT BYTE PUBLIC 'CODE'
14code ENDS
15
16include dosseg.asm
17
18code SEGMENT BYTE PUBLIC 'code'
19 ASSUME CS:dosgroup
20
21 procedure OUTT,FAR
22 entry $DUP
23 entry MSG_RETRIEVAL
24 entry $ECS_CALL
25 entry $EXTENDED_OPEN
26 entry FASTINIT
27 entry $IFS_IOCTL
28 entry IFS_DOSCALL
29 entry $QUERY_DOS_VALUE
30 entry $STD_AUX_INPUT,FAR
31 entry LCRITDEVICE,FAR
32 entry $ABORT,FAR
33 entry $SET_TIME,FAR
34 entry $ALLOC,FAR
35 entry SETMEM,FAR
36 entry SKIPONE,FAR
37 entry $SET_DMA,FAR
38 entry $PARSE_FILE_DESCRIPTOR,FAR
39 entry $CREATETEMPFILE,FAR
40 entry $SLEAZEFUNCDL,FAR
41 entry $CHDIR,FAR
42 entry TWOESC,FAR
43 entry $GET_INTERRUPT_VECTOR,FAR
44 entry $FCB_SEQ_WRITE,FAR
45 entry DEVNAME,FAR
46 entry $GET_DEFAULT_DRIVE,FAR
47 entry $STD_CON_STRING_INPUT,FAR
48 entry $CLOSE,FAR
49 entry $RAW_CON_IO,FAR
50 entry $INTERNATIONAL,FAR
51 entry IDLE,FAR
52 entry $STD_CON_INPUT_NO_ECHO,FAR
53 entry $ASSIGNOPER,FAR
54 entry $LOCKOPER,FAR
55 entry $FCB_CLOSE,FAR
56 entry $STD_CON_STRING_OUTPUT,FAR
57 entry $DUP_PDB,FAR
58 entry GETCH,FAR
59 entry STRLEN,FAR
60 entry INITCDS,FAR
61 entry COPYONE,FAR
62 entry PJFNFROMHANDLE,FAR
63 entry $GET_VERIFY_ON_WRITE,FAR
64 entry $KEEP_PROCESS,FAR
65 entry STRCMP,FAR
66 entry $SET_INTERRUPT_VECTOR,FAR
67 entry $FCB_DELETE,FAR
68 entry $RAW_CON_INPUT,FAR
69 entry $RENAME,FAR
70 entry $FIND_FIRST,FAR
71 entry $FCB_RANDOM_WRITE,FAR
72 entry $SET_DEFAULT_DRIVE,FAR
73 entry $SETDPB,FAR
74 entry $STD_PRINTER_OUTPUT,FAR
75 entry $MKDIR,FAR
76 entry $DUP2,FAR
77 entry SET_SFT_MODE,FAR
78 entry $GET_DATE,FAR
79 entry $FCB_RENAME,FAR
80 entry $CREATE_PROCESS_DATA_BLOCK,FAR
81 entry $CREAT,FAR
82 entry ECRITDISK,FAR
83 entry PLACEBUF,FAR
84 entry $IOCTL,FAR
85 entry $READ,FAR
86 entry PATHCHRCMP,FAR
87 entry $GET_VERSION,FAR
88 entry COPYLIN,FAR
89 entry LCRITDISK,FAR
90 entry $LSEEK,FAR
91 entry STRCPY,FAR
92 entry $FILE_TIMES,FAR
93 entry BACKSP,FAR
94 entry $SET_VERIFY_ON_WRITE,FAR
95 entry SETYEAR,FAR
96 entry FASTRET,FAR
97 entry $RMDIR,FAR
98 entry DIVOV,FAR
99 entry $GET_FCB_POSITION,FAR
100 entry $DISK_RESET,FAR
101 entry $DIR_SEARCH_FIRST,FAR
102 entry $WAIT,FAR
103 entry FASTOPENCOM,FAR
104 entry STAY_RESIDENT,FAR
105 entry $ALLOCOPER,FAR
106 entry $GET_DEFAULT_DPB,FAR
107 entry DSTRLEN,FAR
108 entry CTRLZ,FAR
109 entry $USEROPER,FAR
110 entry $SET_DATE,FAR
111 entry $FCB_RANDOM_WRITE_BLOCK,FAR
112 entry EXITINS,FAR
113 entry $GET_IN_VARS,FAR
114 entry GETDEVLIST,FAR
115 entry DATE16,FAR
116 entry POINTCOMP,FAR
117 entry SFFROMSFN,FAR
118 entry SKIPSTR,FAR
119 entry FREE_SFT,FAR
120 entry SHARE_ERROR,FAR
121 entry NLS_IOCTL,FAR
122 entry $CURRENT_DIR,FAR
123 entry $FCB_CREATE,FAR
124 entry $WRITE,FAR
125 entry $GET_INDOS_FLAG,FAR
126 entry RECSET,FAR
127 entry $CREATENEWFILE,FAR
128 entry $STD_CON_INPUT_STATUS,FAR
129 entry REEDIT,FAR
130 entry GETTHISDRV,FAR
131 entry DSUM,FAR
132 entry $GETEXTENDEDERROR,FAR
133 entry $EXTHANDLE,FAR
134 entry $NAMETRANS,FAR
135 entry NLS_LSEEK,FAR
136 entry SCANPLACE,FAR
137 entry GETCDSFROMDRV,FAR
138 entry DSLIDE,FAR
139 entry UCASE,FAR
140 entry $STD_CON_OUTPUT,FAR
141 entry $FCB_RANDOM_READ_BLOCK,FAR
142 entry CHECKFLUSH,FAR
143 entry COPYSTR,FAR
144 entry $GETSETCDPG,FAR
145 entry $DIR_SEARCH_NEXT,FAR
146 entry $OPEN,FAR
147 entry SKIPVISIT,FAR
148 entry $EXEC,FAR
149 entry $DEALLOC,FAR
150 entry DOS_CLOSE,FAR
151 entry $STD_CON_INPUT,FAR
152 entry NLS_GETEXT,FAR
153 entry BUFWRITE,FAR
154 entry $GET_TIME,FAR
155 entry $SLEAZEFUNC,FAR
156 entry $CHAR_OPER,FAR
157 entry NET_I24_ENTRY,FAR
158 entry $COMMIT,FAR
159 entry $SETBLOCK,FAR
160 entry $FCB_OPEN,FAR
161 entry NLS_OPEN,FAR
162 entry $GET_DMA,FAR
163 entry $UNLINK,FAR
164 entry $FCB_SEQ_READ,FAR
165 entry $STD_CON_INPUT_FLUSH,FAR
166 entry $GET_DRIVE_FREESPACE,FAR
167 entry DRIVEFROMTEXT,FAR
168 entry $GETEXTCNTRY,FAR
169 entry SETVISIT,FAR
170 entry $EXIT,FAR
171 entry $STD_AUX_OUTPUT,FAR
172 entry KILNEW,FAR
173 entry $CHMOD,FAR
174 entry $FCB_RANDOM_READ,FAR
175 entry SHARE_VIOLATION,FAR
176 entry ECRITDEVICE,FAR
177 entry $GET_DPB,FAR
178 entry $FIND_NEXT,FAR
179 entry $GET_FCB_FILE_LENGTH,FAR
180 entry ENTERINS,FAR
181 entry DEVIOCALL2,FAR
182 entry $SERVERCALL,FAR
183 entry $GSETMEDIAID,FAR
184 entry FETCHI_CHECK,FAR
185 entry TABLEDISPATCH,FAR
186 entry DSKSTATCHK,FAR
187 entry SET_RQ_SC_PARMS,FAR
188 entry SAVE_MAP,FAR
189 entry RESTORE_MAP,FAR
190 entry DSKREAD,FAR
191 entry FAST_DISPATCH,FAR
192 entry DSKWRITE,FAR
193 entry INTCNE0,FAR
194 entry SHARE_INSTALL,FAR ;P3568
195 entry FAKE_VERSION,FAR ;D503
196 NOP
197EndProc OUTT
198
199 code ENDS
200 END
201
202
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC
new file mode 100644
index 0000000..70a0a65
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC
@@ -0,0 +1,162 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsfsym.inc 1.0 87/05/11 ;AN000;
3
4;************************************************************************************
5;
6; IFSFUNC Symbols
7;
8; Modification history:
9; Created: MAY 11 1987
10;
11; LOD = 80 (IFS added)
12; REVISION HISTORY:
13; A000 Original version 4.00 May 1987
14; A001 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA
15; A002 PTM ??? - 80H bit on Lock functions ignorred 10/27 FEIGENBAUM
16; A003 PTM 2270- filesys/network attach problem 11/27 RGAZZIA
17; A004 DCR 285 - remove Extended Attribute/Lock support 1/88 RGAZZIA
18; A005 PTM 2827- error msg problems 1/88 RMG
19; A006 PTM 3334- new ifsresetenv call 2/88 RMG
20; A007 PTM 3657- don't want val code page in flag 2/88 RGazzia
21; A008 PTM 3692- net use xxx /d error msg wrong 3/88 RGazzia
22; A009 PTM 3673- filesys problems again, undo a003 3/14/88 RMG
23; A010 PTM 3968- time/date stamping problems 3/25/88 RMG
24; A011 PTM 4140- INT 2F 5 interface change 4/12/88 RMG
25; A012 PTM 5006- need save original device ptr - new dfl field 6/02/88 RMG
26;
27;************************************************************************************
28; ;AN000;
29; Old Redirector Stuff ;AN000;
30; ;AN000;
31TRUE EQU 0FFFFh ;AN000;
32FALSE EQU 0 ;AN000;
33 ;AN000;
34PATHGEN = TRUE ;AN000;
35DEBUG = FALSE ;AN000;
36REDIRECTOR = TRUE ;AN000;
37Installed = TRUE ;AN000;
38 ;AN000;
39MSNET_TIMING = FALSE ;AN000;
40 ;AN000;
41 ;AN000;
42IF1 ;AN000;
43 IF MSNET_TIMING ;AN000;
44 %out MSNET_TIMING version ;AN000;
45 ENDIF ;AN000;
46 IF DEBUG ;AN000;
47 %out DEBUGGING version ;AN000;
48 ENDIF ;AN000;
49 %out INSTALLED version ;AN000;
50ENDIF ;AN000;
51; Structures and equates for the network support ;AN000;
52 ;AN000;
53;Net call interrupt - used to generate critical sections ;AN000;
54NET_CALL_INT EQU 2AH ;AN000;
55 ;AN000;
56;Max size of PRINT_PRE_STRING ;AN000;
57MAX_PRE_STRING EQU 64 ;AN000;
58 ;AN000;
59 ;AN000;
60;AH function code for $GET_IN_VARS INT 21 function ;AN000;
61GET_IN_VAR EQU 52H ;AN000;
62 ;AN000;
63 ;AN000;
64; The following EQUates control the replacement of the FCB SFT cache by ;AN000;
65; IFSFUNC. If the current FCB Cache Size,Keepcount is DefNumFCB,DefKeepVal ;AN000;
66; then IFSFUNC will set up a new cache of NewNumFCB,NewKeepVal. ;AN000;
67DefNumFCB EQU 4 ;AN000;
68DefKeepVal EQU 0 ;AN000;
69 ;AN000;
70NewNumFCB EQU 16 ;AN000;
71NewKeepVal EQU 8 ;AN000;
72 ;AN000;
73SUBTTL IFSFUNC Data ;AN000;
74PAGE ;AN000;
75; miscellaneous IFS equates ;AN000;
76MINUS_ONE EQU -1 ;AN000;
77NULL_PTR EQU -1 ;AN000;
78ERROR_INFO_NOT_SET EQU -1 ;AN000;
79CHECK_REMOVABLE EQU 4408H ;AN000;
80ICOLON EQU ":" ;AN000;
81ZERO EQU 0 ;AN000;
82OLDOPEN_MODE EQU 2180H ;AN000;
83OLDOPEN_FLAG EQU 0101H ;AN000;
84OLDCREATE_MODE EQU 0002H ;AC007;
85OLDCREATE_FLAG EQU 0112H ;AC007;
86OLDCREATENEW_FLAG EQU 10H ;AN000;
87;INT21AL_LOCK_READ EQU 4 ;AD004;
88;INT21AL_WRITE_UNLOCK EQU 5 ;AD004;
89IFSFINSTALLED EQU 0FFH ;AN000;
90GET_TRUNCATE_FLAG EQU 7 ;AN000;
91SET_TRUNCATE_FLAG EQU 8 ;AN000;
92;;;alias COMPLEX EQU 4 ;AN000;
93PARSE_ERR_1 EQU 1 ;AN000;
94PARSE_ERR_5 EQU 5 ;AN000;
95PARSE_ERR_6 EQU 6 ;AN000;
96PARSE_ERR_10 EQU 10 ;AN000;
97COMMON_ERR_2 EQU 2 ;AN000;
98COMMON_ERR_3 EQU 3 ;AN000;
99UTIL_ERR_4 EQU 4 ;AN000;
100RETRY EQU 1 ;AN000;
101I2F5_MsgRet EQU 2 ;AN011;
102 ;AN000;
103; ifsproc flags ;AN000;
104IsCDS EQU 80H ;AN000;
105IsSFT EQU 40H ;AN000;
106IsSEQ EQU 20H ;AN000;
107IsGet EQU 10H ; vs. set ;AN000;
108IsOldOpen EQU 10H ;AN000;
109IsOldCreate EQU 08H ;AN000;
110IsCreate EQU 8000H ; used in IFS_OPEN in setting sf date/time ;AN010;
111IsClose EQU 10H ; vs. commit ;AN000;
112IsRen EQU 10H ; vs. delete ;AN000;
113;IsLockRead EQU 10H ;AD005;
114;IsWriteUnlock EQU 08H ;AD005;
115;IsAdd EQU 04H ;AD005;
116THISIFS_SET EQU 02H ;AN000;
117IsShare EQU 80H ; used by auto-attach ;AN000;
118IsCTLFCN EQU 01H ; used by IFS_UPDATE_CB@ ;AN000;
119IsCritIFS EQU 02H ; indicates ifs cs ;AN000;
120Print_On EQU 80H ; sess ;AN000;
121SetDeviceCB EQU 0100H ; indicates to sft_to_sff to set ifs_device_cb@ ;AN000;
122IsDummyCDS EQU 0200H ; used to indicate dummy cds (AttStrt/CDS-CD) ;AN000;
123IsNetwork EQU 0400H ; indicates types 3 or 4 attach ;AN001;
124SetBP EQU 0800H ; set if return lsn ;AN001;
125Filesys_Status EQU 1000H ; indicates new style get ifsfunc item ;AN001;
126;Filesys_Network_Attach EQU 1000H ; flag used to determine if move ptr direct to parms ;AN003;;AD009;
127;IsWOLock EQU 2000H ; write operation only lock - flag moved RMG ;AD004;
128IsInit EQU 2000H ; this set in AutoAttach for CI-error area ;AN005;
129IsResetEnvirn EQU 4000H ; used in sess - diff abort from reset environment ;AN006;
130IsMsgRet EQU 8000H ; used in ifserror - int2f5 to distinguish msg ret ;AN011;
131 ; from command.com ;AN011;
132; ifsfunc flags ;AN000;
133UNC_INSTALLED EQU 80H ; unc file system installed ;AN000;
134NO_IFS_DRIVERS EQU 40H ; no ifs drivers installed ;AN000;
135
136; ifs semaphores IFSSEM equates ;AN011;
137MR_ERRMSG_SEM EQU 80H ; used by ifserror INT2F AH=5 as gate for msgret entry ;AN011;
138; ;AN000;
139; DFL - This structure stores IFS/NETUSE/ALIAS Device information ;AN000;
140; to IFS driver. ;AN000;
141
142DFLL_LIST STRUC ;AN000;
143DFLL_FLAGS DB ? ; Flags ;AN000;
144DFLL_TYPE DB ? ; 1=IFS, 3=NETUSE, 0=ALIAS ;AN000;
145DFLL_DEV_NAME DB 8 DUP (?) ; Device name ;AN000;
146DFLL_USER_WORD DW ? ; attach user word ;AN001;
147DFLL_ALIAS_INDEX DW ? ; Byte index into alias names list (resv) ;AN000;
148DFLL_IFS_HDR DD ? ; Pointer to IFSHDR ;AN000;
149DFLL_FSDA DB 8 DUP (?) ; File System Dependent Data Area ;AN000;
150DFLL_DEVPTR DD ? ; sft_devptr ;AN012;
151DFLL_LIST ENDS ;AN000;
152 ;AN000;
153; dfl flags ;AN000;
154DFL_INPROG EQU 80H ; in progress ;AN000;
155DFL_INUSE EQU 40H ; in use ;AN000;
156DFL_PAUSED EQU 20H ; device is paused ;AN000;
157DFL_DEV_REAL EQU 10H ; device is real ;AN000;
158 ;AN000;
159; error codes ;AN000;
160device_not_attached equ 0FH ; ;AC008;
161fs_driver_not_found equ 67 ; ;AN000;
162error_out_of_structs equ 56 ; ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK
new file mode 100644
index 0000000..f7b9623
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK
@@ -0,0 +1,12 @@
1IFSSESS.OBJ IFSDIR.OBJ IFSFILE.OBJ IFSHAND.OBJ +
2IFSDEV.OBJ IFSUTIL.OBJ IFSERROR.OBJ IFSFDOS.OBJ IFSINIT.OBJ +
3..\..\inc\NIBDOS.OBJ+
4..\..\inc\CONST2.OBJ+
5..\..\inc\msDATA.OBJ+
6..\..\inc\msTABLE.OBJ+
7..\..\dos\msDISP.OBJ +
8..\..\dos\msCODE.OBJ +
9..\..\inc\msDOSME.OBJ+
10IFSFLINK.OBJ
11IFSFUNC.EXE,IFSFUNC.MAP /EX;
12 \ No newline at end of file
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL
new file mode 100644
index 0000000..4188c7f
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL
@@ -0,0 +1,49 @@
1:util IFSFUNC ;AN000;
2:class 1 ;Extended Error messages ;AN007;
3:use EXTEND50 ; file system extended error msg #s ;AN007;
4:use EXTEND51 ;AN007;
5:use EXTEND52 ;AN007;
6:use EXTEND53 ;AN007;
7:use EXTEND54 ;AN007;
8:use EXTEND55 ;AN007;
9:use EXTEND56 ;AN007;
10:use EXTEND57 ;AN007;
11:use EXTEND58 ;AN007;
12:use EXTEND59 ;AN007;
13:use EXTEND60 ;AN007;
14:use EXTEND61 ;AN007;
15:use EXTEND62 ;AN007;
16:use EXTEND63 ;AN007;
17:use EXTEND64 ;AN007;
18:use EXTEND65 ;AN007;
19:use EXTEND66 ;AN007;
20:use EXTEND67 ;AN007;
21:use EXTEND68 ;AN007;
22:use EXTEND69 ;AN007;
23:use EXTEND70 ;AN007;
24:use EXTEND71 ;AN007;
25:use EXTEND72 ;AN007;
26:use EXTEND73 ;AN007;
27:use EXTEND74 ;AN007;
28:use EXTEND80 ;AN007;
29:use EXTEND82 ;AN007;
30:use EXTEND83 ;AN007;
31:use EXTEND84 ;AN007;
32:use EXTEND85 ;AN007;
33:use EXTEND86 ;AN007;
34:use EXTEND87 ;AN007;
35:use EXTEND88 ;AN007;
36:use EXTEND89 ;AN007;
37:class 2 ;parse errors: ;AN000;
38:use PARSE1 ;Too many parameters ;AN000;
39:use PARSE4 ;Invalid keyword ;AN000;
40:use PARSE6 ;Parameter value not in allowed range ;AN002;
41:use PARSE7 ;Parameter value not allowed ;AN002;
42:use PARSE9 ;Parameter format not correct ;AN002;
43:use PARSE10 ;Invalid parameter ;AN000;
44:class A ;AN000;
45:use 1 COMMON1 ;Incorrect DOS version ;AN000;
46:use 2 COMMON2 ;%1 already installed ;AN000;
47:use 3 COMMON10 ;%1 not installed ;AN000;
48:def 4 "Invalid configuration",CR,LF ;AN00?;
49:end ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM
new file mode 100644
index 0000000..19a997f
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM
@@ -0,0 +1,903 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifshand.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC HANDLE ROUTINES - Routines for FS dispatch ;AN000;
4NAME IFSHANDLE ;AN000;
5;******************************************************************************
6;
7; HANDLE (SFT) related FS calls
8;
9;
10; IFS_CLOSE
11; IFS_COMMIT
12; IFS_LSEEK
13; IFS_READ
14; IFS_WRITE
15; IFS_LOCK
16; IFS_XATTR
17;
18; REVISION HISTORY:
19; A000 Original version 4.00 May 1987
20; A001 P635 - Correct Read problem - restore es:di -> sft
21; RG Sept 1,1987
22; A002 P659 - Copy cmd problems (xattr)
23; RG Sept 1,1987
24; A003 P868 - Lock problems R.G
25; A004 P849 - Printer problems R.G
26; A005 P1601- lock/xattr problems R.G
27; A006 P????- Write Only Lock support in Lock Read/Write 10/27 FEIGENBAUM
28; A007 P2339- Not getting count back to user in xattr call 11/09 RG
29; A008 P2433- redir copy problem (Xattr) 11/17 RG
30; A009 P2566- xattrs not propagated across network 12/3 RG
31; (due to size check on set that does not offer size)
32; A010 D285 - Remove Extended Attributes/Lock 1/88 RG
33; A011 P2994- double close problem 1/88 RG
34; A012 P3149- basica file redirection - seek problem 1/88 RMG
35; A013 P3185- get ea cx check 1/88 RMG
36; A014 P3249- lock problem 1/88 RMG
37; A015 P3432- copy to remote ptr problem - write 2/88 RMG
38; A016 P3513- return cx on xattr wrong 2/88 RMG
39; A017 P3968- set sf time/date on close 3/25/88 RMG
40; A018 P4839- fcb open/ren/term problem on abort close 5/13/88 RMG
41; A019 P4791- don't overwrite ax on error 5/19/88 RMG
42; A020 P5003- LSEEK hang using Austin Test tool 6/01/88 RPS
43;
44; LOC - 251
45; Programming note: In the prologues to the routines, the input/output are
46; accurate. The pseudocode, however, is outdated and does
47; not reflect the code.
48;
49;******************************************************************************
50 ;AN000;
51.xlist ;AN000;
52.xcref ;AN000;
53INCLUDE IFSSYM.INC ;AN000;
54INCLUDE IFSFSYM.INC ;AN000;
55INCLUDE DOSSYM.INC ;AN000;
56INCLUDE DEVSYM.INC ;AN000;
57 ;AN000;
58.cref ;AN000;
59.list ;AN000;
60 ;AN000;
61AsmVars <IBM, Installed, DEBUG> ;AN000;
62 ;AN000;
63; define the base code segment of the network support first ;AN000;
64 ;AN000;
65IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
66IFSSEG ENDS ;AN000;
67 ;AN000;
68; include THE REST of the segment definitions for normal MSDOS ;AN000;
69 ;AN000;
70include dosseg.asm ;AN000;
71 ;AN000;
72DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
73 ;DOSGROUP Data ;AN000;
74 Extrn THISSFT:DWORD ;AN000;
75 Extrn DMAADD:DWORD ;AN000;
76 Extrn CurrentPDB:WORD ;AN000;
77 Extrn SAVE_BX:WORD
78 Extrn SAVE_CX:WORD
79 Extrn SAVE_DS:WORD
80 Extrn SAVE_SI:WORD
81 Extrn SAVE_ES:WORD
82 Extrn SAVE_DI:WORD
83DATA ENDS ;AN000;
84 ;AN000;
85 ;AN000;
86; define our own code segment ;AN000;
87 ;AN000;
88IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
89 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
90 ;AN000;
91 ;IFS Data ;AN000;
92 Extrn THISDFL:DWORD ;AN000;
93 Extrn THISIFS:DWORD ;AN000;
94 Extrn IFSPROC_FLAGS:WORD ;AN000;
95 Extrn IFSR:WORD ;AN000;
96 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
97 ;AN000;
98BREAK <IFS_CLOSE Close a FS SFT> ;AN000;
99 ;AN000;
100;****************************************************************************** ;AN000;
101; ;AN000;
102; IFS_CLOSE - see IFS_COMMIT for details ;AN000;
103; ;AN000;
104;****************************************************************************** ;AN000;
105 ;AN000;
106 procedure IFS_CLOSE,NEAR ;AN000;
107ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
108 ;AN000;
109 ifsr_fcn_def EXECAPI ; define ifsr for close ;AN000;
110 ifsr_api_def CLOSEFILE ;AN000;
111 ;AN000;
112 TEST ES:[DI.SF_FLAGS],devid_file_clean + sf_close_nodate ;AN017;
113 JNZ C_05 ;AN017;
114 CallInstall DATE16,MultDOS,13 ; set sf date/time on close ;AN017;
115 MOV ES:[DI.SF_DATE],AX ;AN017;
116 MOV ES:[DI.SF_TIME],DX ;AN017;
117C_05: ;AN017;
118
119 SaveReg <ES,DI> ; save SFT ptr ;AN000;
120 CallInstall FREE_SFT,MultDOS,8 ; set SFT busy ;AN000;
121 PUSH AX ; save old ref count ;AN000;
122 ;AN000;
123 TEST ES:[DI.SF_MODE],SF_ISFCB ; always close fcb ;AN011;
124 JNZ C_10 ; only do real close when ;AN011;
125 CMP AX,1 ; sft being freed ;AN011;
126 JE C_10 ;AN011;
127 JMP C_80 ;AN011;
128C_10: ;AN011;
129 MOV CS:IFSPROC_FLAGS,ISCLOSE + SETDEVICECB ;AN000;
130 ; 2nd flag causes sft_to_sff to ;AN000;
131 ; set device cb@ ;AN000;
132 JMP C_20 ; cont. in ifs_commit ;AN000;
133 ;AN000;
134EndProc IFS_CLOSE ;AN000;
135 ;AN000;
136BREAK <IFS_COMMIT Commit a FS SFT> ;AN000;
137 ;AN000;
138;****************************************************************************** ;AN000;
139; ;AN000;
140; IFS_COMMIT ;AN000;
141; ;AN000;
142; Called by: IFSFUNC dispatcher ;AN000;
143; ;AN000;
144; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
145; SFT_TO_SFF ;AN000;
146; SFF_TO_SFT ;AN000;
147; ;AN000;
148; Inputs: ;AN000;
149; [THISSFT] set to the SFT for the file being used ;AN000;
150; ES:DI = [THISSFT] (date time are NOT correct) ;AN000;
151; SFT must never be for an FCB on commit (error not detected) ;AN000;
152; ;AN000;
153; Function: ;AN000;
154; Prep IFSRH: ;AN000;
155; * IFSR_LENGTH DW 40 ; Total length of request ;AN000;
156; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
157; + IFSR_RETCODE DW ? ;AN000;
158; + IFSR_RETCLASS DB ? ;AN000;
159; IFSR_RESV1 DB 16 DUP(0) ;AN000;
160; * IFSR_APIFUNC DB 14 ; Close/commit file ;AN000;
161; + IFSR_ERROR_CLASS DB ? ;AN000;
162; + IFSR_ERROR_ACTION DB ? ;AN000;
163; + IFSR_ERROR_LOCUS DB ? ;AN000;
164; + IFSR_ALLOWED DB ? ;AN000;
165; + IFSR_I24_RETRY DB ? ;AN000;
166; + IFSR_I24_RESP DB ? ;AN000;
167; IFSR_RESV2 DB ? ;AN000;
168; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
169; *+ IFSR_OPEN_CB@ DD ? ; SF ;AN000;
170; * IFSR_FUNC DB ? ; 0=CLOSE, 1=COMMIT ;AN000;
171; IFSR_RESV2 DB 0 ;AN000;
172; ;AN000;
173; IF close THEN ;AN000;
174; IFSR_FUNC = 0 ;AN000;
175; ELSE IFSR_FUNC = 1 ;AN000;
176; CALL routine, CALL_IFS, with pointer to SF_IFS_HDR ;AN000;
177; IF IFSR_RETCODE = 0 THEN ;AN000;
178; DO ;AN000;
179; Call SFF_TO_SFT ;AN000;
180; Decrement SF_REF_COUNT if close ;AN000;
181; Clear carry ;AN000;
182; ENDDO ;AN000;
183; ELSE DO {error} ;AN000;
184; AX = IFSR_RETCODE ;AN000;
185; Set carry ;AN000;
186; ENDDO ;AN000;
187; ENDIF ;AN000;
188; ;AN000;
189; Outputs: ;AN000;
190; sf_ref_count decremented on close unless FAIL ;AN000;
191; (AX has old value for COMMIT) ;AN000;
192; ES:DI point to SFT ;AN000;
193; Carry set if error (file deleted or disk changed) ;AN000;
194; ;AN000;
195; DS preserved, others destroyed ;AN000;
196; ;AN000;
197;****************************************************************************** ;AN000;
198 ;AN000;
199 procedure IFS_COMMIT,NEAR ;AN000;
200ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
201 ;AN000;
202 ifsr_fcn_def EXECAPI ;AN000;
203 ifsr_api_def CLOSEFILE ;AN000;
204 ;AN000;
205 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; set ifsproc_flags ;AN000;
206C_20: ; (welcome ifs_close) ;AN000;
207 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
208 invoke PREP_IFSR ; clear ifsrh ;AN000;
209 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
210 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
211 ; ES:BX -> IFSRH ;AN000;
212 ; IFSR_OPEN_CB@ ;AN000;
213 ; ds - IFSSEG ;AN000;
214 ;AN000;
215 MOV ES:[BX.IFSR_LENGTH],LENGTH_CLOSEFILE ; prep IFSRH ;AN000;
216 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
217 MOV ES:[BX.IFSR_APIFUNC],IFSCLOSEFILE ;AN000;
218 XOR AL,AL ;AN000;
219 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
220 JNZ C_40 ;AN000;
221 INC AL ;AN000;
222C_40: ;AN000;
223 MOV ES:[BX.IFSR_FUNC],AL ;AN000;
224 ;AN000;
225 invoke CALL_IFS ; *** call fs with close request ;AN000;
226 ;AN000;
227 JNC C_60 ;AN000;
228 TEST IFSPROC_FLAGS,ISCLOSE ; ifs error ;AN000;
229 JZ C_980 ; return w/carry, if close ;AN000;
230;;;;;;;;ADD SP,6 ; restore stack first ;AD018;
231 RestoreReg <CX,DI,ES> ; old ref count & sft ;AN018;;AC019;
232 CMP CX,1 ;AN018;;AC019;
233 JNE C_980 ;AN018;
234 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN018;
235 JMP C_980 ;AN000;
236C_60: ;AN000;
237 invoke SFF_TO_SFT ;AN000;
238 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
239 JZ C_990 ; finished w/commit ;AN000;
240C_80: ;AN011;
241 RestoreReg <AX,DI,ES> ; old ref count & sft ;AN000;
242 CMP AX,1 ;AN000;
243 JNE C_990 ;AN000;
244 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN000;
245 JMP C_990 ; busy mark ;AN000;
246 ;AN000;
247 ;AN000;
248C_980: ; Return area ;AN000;
249 STC ;AN000;
250 JMP C_1000 ;AN000;
251C_990: ;AN000;
252 CLC ;AN000;
253C_1000: ; preserve ds - dosgroup ;AN000;
254 PUSH SS ;AN000;
255 POP DS ;AN000;
256 return ;AN000;
257 ;AN000;
258EndProc IFS_COMMIT ;AN000;
259 ;AN000;
260BREAK <IFS_LSEEK Seek on a NET SFT> ;AN000;
261 ;AN000;
262;****************************************************************************** ;AN000;
263; ;AN000;
264; IFS_LSEEK ;AN000;
265; ;AN000;
266; Inputs: ;AN000;
267; ES:DI -> SFT ;AN000;
268; CX:DX = Input CX:DX to $Lseek (offset) ;AN000;
269; NOTE: THIS LSEEK IS ALWAYS ASSUMED TO BE A TYPE 2 (relative to EOF) ;AN000;
270; Function: ;AN000;
271; Prep IFSRH: ;AN000;
272; * IFSR_LENGTH DW 44 ; Request length ;AN000;
273; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
274; + IFSR_RETCODE DW ? ;AN000;
275; + IFSR_RETCLASS DB ? ;AN000;
276; IFSR_RESV1 DB 16 DUP(0) ;AN000;
277; * IFSR_APIFUNC DB 10 ; Lseek file ;AN000;
278; + IFSR_ERROR_CLASS DB ? ;AN000;
279; + IFSR_ERROR_ACTION DB ? ;AN000;
280; + IFSR_ERROR_LOCUS DB ? ;AN000;
281; + IFSR_ALLOWED DB ? ;AN000;
282; + IFSR_I24_RETRY DB ? ;AN000;
283; + IFSR_I24_RESP DB ? ;AN000;
284; IFSR_RESV2 DB ? ;AN000;
285; IFSR_DEVICE_CB@ DD ? ;AN000;
286; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
287; ; and set this as pointer to it. ;AN000;
288; * IFSR_MODE DB 2 ; Position mode: - BL ;AN000;
289; ; 2 = ptr moved eof + offset ;AN000;
290; IFSR_RESV2 DB 0 ;AN000;
291; * IFSR_POSITION DD ? ; displacement of LSEEK - CX:DX ;AN000;
292; ;AN000;
293; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
294; IF IFSR_RETCODE = 0 THEN ;AN000;
295; DO ;AN000;
296; Call SFF_TO_SFT ;AN000;
297; Set DX:AX = IFSR_POSITION ;AN000;
298; Clear carry ;AN000;
299; ENDDO ;AN000;
300; ELSE DO {error} ;AN000;
301; AX = IFSR_RETCODE ;AN000;
302; Set carry ;AN000;
303; ENDDO ;AN000;
304; ENDIF ;AN000;
305; Returns: ;AN000;
306; ES:DI -> SFT ;AN000;
307; Carry clear ;AN000;
308; DX:AX return as with local $Lseek ;AN000;
309; Carry Set ;AN000;
310; AX is error code ;AN000;
311; All destroyed ;AN000;
312; ;AN000;
313;****************************************************************************** ;AN000;
314 ;AN000;
315 procedure IFS_LSEEK,NEAR ;AN000;
316ASSUME DS:Nothing,ES:NOTHING ; Initially DS is unknown ;AN020;
317 ;AN000;
318 ifsr_fcn_def EXECAPI ; define ifsr for lseek ;AN000;
319 ifsr_api_def LSEEKFILE ;AN000;
320 ;AN000;
321 PUSH SS ; Set DS to DOSGROUP ;AN020;
322 POP DS ; ;AN020;
323ASSUME DS:DOSGROUP ; ;AN020;
324
325 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000;
326 MOV WORD PTR [THISSFT],DI ;AN020;
327 MOV WORD PTR [THISSFT+2],ES ;AN020;
328 SaveReg <ES,DI> ; save for later restore before leave ;AN012;;AN020;
329
330 invoke PREP_IFSR ;AN000;
331 ;AN000;
332 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
333 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
334 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
335 ; ES:BX -> IFSRH ;AN000;
336 ; IFSR_OPEN_CB@ ;AN000;
337 ; ds - IFSSEG ;AN000;
338 ;AN000;
339 MOV ES:[BX.IFSR_LENGTH],LENGTH_LSEEKFILE ; prep IFSRH ;AN000;
340 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
341 MOV ES:[BX.IFSR_APIFUNC],IFSLSEEKFILE ;AN000;
342 MOV ES:[BX.IFSR_MODE],MODE2 ;AN000;
343 MOV WORD PTR ES:[BX.IFSR_POSITION],DX ;AN000;
344 MOV WORD PTR ES:[BX.IFSR_POSITION+2],CX ;AN000;
345 ;AN000;
346 invoke CALL_IFS ; call fs with lseek request ;AN000;
347 ;AN000;
348 JC LS_1000 ;AN000;
349 MOV AX,WORD PTR ES:[BX.IFSR_POSITION] ;AN000;
350 MOV DX,WORD PTR ES:[BX.IFSR_POSITION+2] ;AN000;
351 invoke SFF_TO_SFT ;AN000;
352 ;AN000;
353 CLC ;AN000;
354LS_1000: ;AN000;
355 RestoreReg <DI,ES> ; restore sft ptr for ibmdos ;AN012;
356 return ;AN000;
357 ;AN000;
358EndProc IFS_LSEEK ;AN000;
359 ;AN000;
360BREAK <IFS_READ Read from a NET SFT> ;AN000;
361 ;AN000;
362;****************************************************************************** ;AN000;
363; ;AN000;
364; IFS_READ ;AN000;
365; ;AN000;
366; Called by: IFSFUNC dispatcher ;AN000;
367; ;AN000;
368; Routines called: CALL_IFS ;AN000;
369; SFT_TO_SFF ;AN000;
370; SFF_TO_SFT ;AN000;
371; ;AN000;
372; Inputs: ;AN000;
373; Outputs of SETUP: ;AN000;
374; CX = byte count ;AN000;
375; ES:DI Points to SFT ;AN000;
376; [DMAADD] = transfer addr ;AN000;
377; SFT checked for access mode ;AN000;
378; Function: ;AN000;
379; Prep IFSRH: ;AN000;
380; * IFSR_LENGTH DW 46 ; Total length of request ;AN000;
381; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
382; + IFSR_RETCODE DW ? ;AN000;
383; + IFSR_RETCLASS DB ? ;AN000;
384; IFSR_RESV1 DB 16 DUP(0) ;AN000;
385; * IFSR_APIFUNC DB 11 ; Read Byte Block ;AN000;
386; + IFSR_ERROR_CLASS DB ? ;AN000;
387; + IFSR_ERROR_ACTION DB ? ;AN000;
388; + IFSR_ERROR_LOCUS DB ? ;AN000;
389; + IFSR_ALLOWED DB ? ;AN000;
390; + IFSR_I24_RETRY DB ? ;AN000;
391; + IFSR_I24_RESP DB ? ;AN000;
392; IFSR_RESV2 DB ? ;AN000;
393; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF - specified in SF_DEVPTR ;AN000;
394; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
395; ; and set this as pointer to it. ;AN000;
396; IFSR_RESV3 DW 0 ;AN000;
397; IFSR_COUNT DW 0 ;AN000;
398; *+ IFSR_BUFFER@ DD ? ; [DMAADD] ;AN000;
399; ;AN000;
400; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
401; IF IFSR_RETCODE = 0 THEN ;AN000;
402; DO ;AN000;
403; Call SFF_TO_SFT ;AN000;
404; CX = IFSR_COUNT ;AN000;
405; ES:DI -> SFT ;AN000;
406; ENDDO ;AN000;
407; ELSE DO {error} ;AN000;
408; AX = IFSR_RETCODE ;AN000;
409; CX = 0 ;AN000;
410; ES:DI -> SFT ;AN000;
411; Set carry ;AN000;
412; ENDDO ;AN000;
413; ENDIF ;AN000;
414; Outputs: ;AN000;
415; Carry clear ;AN000;
416; SFT Position updated ;AN000;
417; CX = No. of bytes read ;AN000;
418; ES:DI point to SFT ;AN000;
419; [DMAADD] filled with info read ;AN000;
420; Carry set ;AN000;
421; AX is error code ;AN000;
422; CX = 0 ;AN000;
423; ES:DI point to SFT ;AN000;
424; DS preserved, all other registers destroyed ;AN000;
425; ;AN000;
426;****************************************************************************** ;AN000;
427 ;AN000;
428 procedure IFS_READ,NEAR ;AN000;
429ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
430 ;AN000;
431 ifsr_fcn_def EXECAPI ; define ifsr for read ;AN000;
432 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AN000;
433 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
434 MOV WORD PTR [THISSFT+2],ES ;AN000;
435 ;AN000;
436R_20: ; (welcome lock/read) ;AN000;
437 ifsr_api_def READFILE ;AN000;
438 invoke PREP_IFSR ; zero out ifsr, es:bx -> ifsr ;AN000;
439 MOV ES:[BX.IFSR_LENGTH],LENGTH_READFILE ; prep IFSRH ;AN000;
440 MOV ES:[BX.IFSR_APIFUNC],IFSREADFILE ;AN000;
441; XOR AL,AL ; for now, set mode = read (0) ;AD010;
442; TEST CS:IFSPROC_FLAGS,ISLOCKREAD ;AD010;
443; JZ W_80 ;AD010;
444; INC AL ; inc mode to mode_lock_read ;AD010;
445 JMP W_80 ; cont. read/write common code ;AN000;
446 ; in ifs_write below ;AN000;
447 ;AN000;
448EndProc IFS_READ ;AN000;
449 ;AN000;
450BREAK <IFS_WRITE Write to a NET SFT> ;AN000;
451 ;AN000;
452;****************************************************************************** ;AN000;
453; ;AN000;
454; IFS_WRITE ;AN000;
455; ;AN000;
456; Called by: IFSFUNC dispatcher ;AN000;
457; ;AN000;
458; Routines called: CALL_IFS ;AN000;
459; SFT_TO_SFF ;AN000;
460; SFF_TO_SFT ;AN000;
461; ;AN000;
462; Inputs: ;AN000;
463; Outputs of SETUP: ;AN000;
464; CX = byte count ;AN000;
465; ES:DI Points to SFT ;AN000;
466; [DMAADD] = transfer addr ;AN000;
467; SFT checked for access mode ;AN000;
468; Function: ;AN000;
469; Prep IFSRH: ;AN000;
470; * IFSR_LENGTH DW 46 ; Length of request ;AN000;
471; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
472; + IFSR_RETCODE DW ? ;AN000;
473; + IFSR_RETCLASS DB ? ;AN000;
474; IFSR_RESV1 DB 16 DUP(0) ;AN000;
475; * IFSR_APIFUNC DB 12 ; Write Byte Block ;AN000;
476; + IFSR_ERROR_CLASS DB ? ;AN000;
477; + IFSR_ERROR_ACTION DB ? ;AN000;
478; + IFSR_ERROR_LOCUS DB ? ;AN000;
479; + IFSR_ALLOWED DB ? ;AN000;
480; + IFSR_I24_RETRY DB ? ;AN000;
481; + IFSR_I24_RESP DB ? ;AN000;
482; IFSR_RESV2 DB ? ;AN000;
483; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
484; *+ IFSR_OPEN_CB@ DD ? ; call SFT_TO_SFF & set this as ptr ;AN000;
485; IFSR_RESV3 DW 0 ;AN000;
486; * IFSR_COUNT DW ? ; # bytes to write - CX ;AN000;
487; * IFSR_BUFFER@ DD ? ; Data buffer - [DMAADD] ;AN000;
488; ;AN000;
489; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
490; IF IFSR_RETCODE = 0 THEN ;AN000;
491; DO ;AN000;
492; Call SFF_TO_SFT ;AN000;
493; CX = IFSR_COUNT ;AN000;
494; ES:DI -> SFT ;AN000;
495; Clear carry ;AN000;
496; ENDDO ;AN000;
497; ELSE DO {error} ;AN000;
498; AX = IFSR_RETCODE ;AN000;
499; CX = 0 ;AN000;
500; ES:DI -> SFT ;AN000;
501; Set carry ;AN000;
502; ENDDO ;AN000;
503; ENDIF ;AN000;
504; Outputs: ;AN000;
505; Carry clear ;AN000;
506; SFT Position updated ;AN000;
507; CX = No. of bytes written ;AN000;
508; ES:DI point to SFT ;AN000;
509; Carry set ;AN000;
510; AX is error code ;AN000;
511; CX = 0 ;AN000;
512; ES:DI point to SFT ;AN000;
513; DS preserved, all other registers destroyed ;AN000;
514; ;AN000;
515;****************************************************************************** ;AN000;
516 ;AN000;
517 procedure IFS_WRITE,NEAR ;AN000;
518ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
519 ;AN000;
520 ifsr_fcn_def EXECAPI ; define ifsr for write ;AN000;
521 MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
522 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
523 MOV WORD PTR [THISSFT+2],ES ;AN000;
524 ;AN000;
525W_20: ; (welcome write/unlock) ;AN000;
526 ifsr_api_def WRITEFILE ;AN000;
527 invoke PREP_IFSR ;AN000;
528 MOV ES:[BX.IFSR_LENGTH],LENGTH_WRITEFILE ; prep IFSRH ;AN000;
529 MOV ES:[BX.IFSR_APIFUNC],IFSWRITEFILE ;AN000;
530; XOR AL,AL ; for now set mode to write (bit0=0) ;AD010;
531; TEST CS:IFSPROC_FLAGS,ISWRITEUNLOCK ;AD010;
532; JZ W_40 ;AD010;
533; INC AL ; set mode to write/unlock (bit0=1) ;AD010;
534;W_40: ;AD010;
535; TEST CS:IFSPROC_FLAGS,ISADD ;AD010;
536; JZ W_80 ;AD010;
537; OR AL,MODE_ADD_MASK ; set mode to add (bit 1) ;AD010;
538;W_80: ; (welcome read) ;AD010;
539; TEST CS:IFSPROC_FLAGS,ISWOLOCK ;AD010; BAF
540; JZ W_90 ;AD010; BAF
541; OR AL,MODE_WO_MASK ; set mode to Write Only Lock ;AD010; BAF
542;W_90: ;AD010; BAF
543; MOV ES:[BX.IFSR_MODE],AL ;AD010;
544W_80: ; (welcome read) ;AN010;
545 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC015;
546 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
547 MOV ES:[BX.IFSR_COUNT],CX ;AN000;
548 ;AN000;
549 MOV AX,WORD PTR [DMAADD] ; to access dmaadd ;AN000;
550 MOV WORD PTR ES:[BX.IFSR_BUFFER@],AX ;AN000;
551 MOV AX,WORD PTR [DMAADD+2] ;AN000;
552 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],AX ;AN000;
553 ;AN000;
554 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
555 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
556 ; ES:BX -> IFSRH ;AN000;
557 ; IFSR_OPEN_CB@ ;AN000;
558 ; ds - IFSSEG ;AN000;
559 ;AN000;
560 invoke CALL_IFS ; *** call fs with read/write request ;AN000;
561 ;AN000;
562 JNC W_100 ;AN000;
563 Context DS ; restore ds-dosgroup ;AN001;
564 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
565 transfer ifs_1000 ; transfer to general ret as carry set ;AC001;
566W_100: ;AN000;
567 MOV CX,ES:[BX.IFSR_COUNT] ; prep reg output ;AN000;
568 invoke SFF_TO_SFT ;AN000;
569
570 Context DS ; restore ds-dosgroup ;AN001;
571 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
572 transfer ifs_990 ; transfer to general good ret in util ;AN001;
573 ;AN000;
574EndProc IFS_WRITE ;AN000;
575 ;AN000;
576BREAK <IFS_XLOCK Lock a FS SFT> ;AN000;
577 ;AN000;
578;****************************************************************************** ;AN000;
579; ;AN000;
580; IFS_XLOCK ;AN000;
581; ;AN000;
582; Called by: IFSFUNC dispatcher ;AN000;
583; ;AN000;
584; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
585; SFT_TO_SFF ;AN000;
586; SFF_TO_SFT ;AN000;
587; ;AN000;
588; Inputs: ;AN000;
589; BL = 80H bit: 0 lock all operations ;AN000;
590; 1 lock write operations only ;AN000;
591; 0 Lock
592; 1 Unlock
593; 2 lock multiple range ;AN000;
594; 3 unlock multiple range ;AN000;
595; 4 lock/read ;AN000;
596; 5 write/unlock ;AN000;
597; 6 add (lseek eof/lock/write/unlock) ;AN000;
598; ES:DI -> SFT ;AN000;
599; CX = count/size Number of ranges/block size ;AN000;
600; DS:DX -> BUFFER LABEL DWORD ;AN000;
601; DD POSITION ; lock range, repeats CX times ;AN000;
602; DD LENGTH ; ;AN000;
603; ;AN000;
604; ;AN000;
605; Function: ;AN000;
606; Prep IFSRH: ;AN000;
607; * IFSR_LENGTH DW 46+ ; Length of request ;AN000;
608; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609; + IFSR_RETCODE DW ? ;AN000;
610; + IFSR_RETCLASS DB ? ;AN000;
611; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612; * IFSR_APIFUNC DB 13 ; Lock Function ;AN000;
613; + IFSR_ERROR_CLASS DB ? ;AN000;
614; + IFSR_ERROR_ACTION DB ? ;AN000;
615; + IFSR_ERROR_LOCUS DB ? ;AN000;
616; + IFSR_ALLOWED DB ? ;AN000;
617; + IFSR_I24_RETRY DB ? ;AN000;
618; + IFSR_I24_RESP DB ? ;AN000;
619; IFSR_RESV2 DB ? ;AN000;
620; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
621; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SFF ;AN000;
622; ; and set this as pointer to it. ;AN000;
623; * IFSR_FUNC DB subfunction ; 0=LOCK, 1=UNLOCK ;AN000;
624; IFSR_RESV3 DB DOS reserved ;AN000;
625; * IFSR_POSITION DD range start ; single range ;AN000;
626; * IFSR_LENGTH DD range length ;AN000;
627; ;AN000;
628; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
629; IF IFSR_RETCODE = 0 THEN ;AN000;
630; DO ;AN000;
631; Call SFF_TO_SFT ;AN000;
632; Clear carry ;AN000;
633; ENDDO ;AN000;
634; ELSE DO {error} ;AN000;
635; AX = IFSR_RETCODE ;AN000;
636; Set carry ;AN000;
637; ENDDO ;AN000;
638; ENDIF ;AN000;
639; ;AN000;
640; Outputs: ;AN000;
641; AX set on error: Lock conflict ;AN000;
642; Too many locks ;AN000;
643; ;AN000;
644;****************************************************************************** ;AN000;
645 ;AN000;
646 procedure IFS_XLOCK,NEAR ;AN000;
647 ;AN000;
648 ifsr_fcn_def EXECAPI ;AN000;
649 ifsr_api_def LOCKFILE ;AN000;
650 ;AN000;
651 SaveReg <BX> ; save input bl ;AN014;
652 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AC002;
653;;;;;;;;TEST BL,80H ;AN006;AD010;
654; JZ L_10 ;AN006;AD010;
655; OR CS:IFSPROC_FLAGS,IsWOLock ; This is Write Only lock ;AN006;AD010;
656;L_10: ;AN006;AD010;
657; SaveReg <BX> ; save function (int 21h al value) ;AD010;
658; AND BL,07FH ; ditch 80h bit for now ;AD010;
659; CMP BL,INT21AL_LOCK_READ ; Check for special case locks ;AD010;
660; JB L_60 ; these generate different ;AD010;
661; JNE L_20 ; ifsrh's. ;AD010;
662; OR CS:IFSPROC_FLAGS,IsLockRead ; This is lock/read request ;AD010;
663; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
664; Context DS ;AD010;
665; JMP R_20 ; let ifs_read above handle this ;AD010;
666;L_20: ;AD010;
667; CMP BL,INT21AL_WRITE_UNLOCK ;AD010;
668; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
669; JNE L_40 ;AD010;
670; OR CS:IFSPROC_FLAGS,IsWriteUnlock ; This is write/unlock request ;AD010;
671; JMP SHORT L_50 ; cont. ifs_write above ;AD010;
672;L_40: ;AD010;
673; OR IFSPROC_FLAGS,IsAdd ;AD010;
674;L_50: ;AD010;
675; Context DS ;AD010;
676;;;;;;;;JMP W_20 ; cont. in ifs_write above ;AD010;
677 ;AN000;
678L_60: ;AN000;
679 SaveReg <DS> ; save input ds (buffer ptr) ;AN000;
680 Context DS ; ds-dosgroup to access thissft ;AN000;
681 MOV WORD PTR [THISSFT],DI ; set [THISSFT] ;AN000;
682 MOV WORD PTR [THISSFT+2],ES ;AN000;
683 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
684 invoke PREP_IFSR ; clear ifsrh ;AM003;
685 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
686 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
687 ; ES:BX -> IFSRH ;AN000;
688 ; IFSR_OPEN_CB@ ;AN000;
689 ; ds - IFSSEG ;AN000;
690 MOV ES:[BX.IFSR_LENGTH],LENGTH_LOCKFILE ; prep IFSRH ;AN000;
691 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
692 MOV ES:[BX.IFSR_APIFUNC],IFSLOCKFILE ;AN000;
693;;;;;;;;MOV ES:[BX.IFSR_COUNT],CX ;AN003;AD010;
694 RestoreReg <DS> ; range segment, mode (input bl) ;AC003;AC010;
695;;;;;;;;MOV AL,CL ;AN003;AD010;
696; AND AL,07FH ; mask off hi 80 bit ;AN003;AD010;
697; CMP AL,2 ;AN003;AD010;
698; JGE L_70 ;AN003;AD010;
699; ADD CL,2 ;AN003;AD010;
700;L_70: ;AN003;AD010;
701; MOV ES:[BX.IFSR_MODE],CL ;AN000;AD010;
702; AND ES:[BX.IFSR_MODE],80H ; ditch input bl in low nibble ;AN005;AD010;
703; AND CL,07FH ;AN003;AD010;
704;;;;;;;;SUB CL,2 ; set func (0-lock,1-unlock) ;AC003;AD010;
705 RestoreReg <AX> ; restore input bl into al ;AN014;
706 MOV ES:[BX.IFSR_FUNC],AL ;AC003;AC010;
707;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@],DX ;AD010;
708;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@+2],DS ;AD010;
709 SaveReg <SI,DX> ;AN010;
710 RestoreReg <SI> ;AN010;
711 MOV AX,WORD PTR DS:[SI] ;AN010;
712 MOV WORD PTR ES:[BX.IFSR_LK_POSITION],AX ;AN010;
713 MOV AX,WORD PTR DS:[SI+2] ;AN010;
714 MOV WORD PTR ES:[BX.IFSR_LK_POSITION+2],AX ;AN010;
715 MOV AX,WORD PTR DS:[SI+4] ;AN010;
716 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH],AX ;AN010;
717 MOV AX,WORD PTR DS:[SI+6] ;AN010;
718 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH+2],AX ;AN010;
719 RestoreReg <SI>
720 SaveReg <CS> ; set ds=ifsseg for ifs call ;AN003;
721 RestoreReg <DS> ;AN003;
722
723 invoke CALL_IFS ; *** call fs with lock request ;AN000;
724 ;AN000;
725 JNC L_100 ;AN000;
726 transfer ifs_1000 ; go to general return (util) ;AN000;
727L_100: ;AN000;
728 invoke SFF_TO_SFT ;AN000;
729 transfer ifs_990 ; go to general good ret (util) ;AN000;
730 ;AN000;
731 ;AN000;
732EndProc IFS_XLOCK ;AN000;
733 ;AN000;
734BREAK <IFS_FILE_XATTRIBUTES Get/Set File Extended Attributes by handle> ;AN000;
735
736;******************************************************************************
737;
738; IFS_FILE_XATTRIBUTES
739;
740; Called by: IFSFUNC dispatcher
741;
742; Routines called: CALL_IFS DRIVE_FROM_SFT
743; SFT_TO_SFF
744; SFF_TO_SFT
745;
746; Inputs:
747; [THISSFT] Points to SFT being used
748; [SAVE_ES:DI] -> Buffer for EA or EA names list
749; [SAVE_DS:SI] -> Query List (BL=2)
750; [SAVE_CX] = buffer size (BL=2,3)
751; BL = function - 2=Get EA
752; 3=Get EA Names
753; 4=Set EA
754;
755; Function:
756; This call is driven by the new INT 21H call 57H. *** REMOVED
757; Prep IFSRH:
758; * IFSR_LENGTH DW 50 ; Total length of request
759; * IFSR_FUNCTION DB 4 ; Execute API function
760; + IFSR_RETCODE DW ?
761; + IFSR_RETCLASS DB ?
762; IFSR_RESV1 DB 16 DUP(0)
763; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name
764; + IFSR_ERROR_CLASS DB ?
765; + IFSR_ERROR_ACTION DB ?
766; + IFSR_ERROR_LOCUS DB ?
767; + IFSR_ALLOWED DB ?
768; + IFSR_I24_RETRY DB ?
769; + IFSR_I24_RESP DB ?
770; IFSR_RESV2 DB ?
771; IFSR_DEVICE_CB@ DD ?
772; *+ IFSR_OPEN_CB@ DD ?
773; * IFSR_FUNC DB ? ; 0-get 1-set
774; * IFSR_SUBFUNC DB ? ; 2-EA 3-EA names
775; *+ IFSR_BUFFER1@ DD ? ; Query List
776; *+ IFSR_BUFFER2@ DD ? ; EA List
777; *+ IFSR_COUNT DW ? ; count
778;
779; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR
780; IF IFSR_RETCODE = 0 THEN
781; DO
782; Call SFF_TO_SFT
783; Clear carry
784; ENDDO
785; ELSE DO
786; AX = IFSR_RETCODE
787; Set carry
788; ENDDO
789; ENDIF
790; ENDDO
791;
792; Outputs:
793; Carry clear: On Get:
794; QUERY LIST or LIST filled in.
795; On Set:
796; Extended attributes set. All SFTs are updated.
797; CARRY SET
798; Carry set: AX is error code
799; error_file_not_found
800; Last element of path not found
801; error_path_not_found
802; Bad path (not in curr dir part if present)
803; error_access_denied
804; Attempt to set an attribute which cannot be set
805; (attr_directory, attr_volume_ID)
806; error_sharing_violation
807; Sharing mode of file did not allow the change
808; (this request requires exclusive write/read access)
809; (INT 24H generated)
810; DS preserved, others destroyed
811;
812;******************************************************************************
813 ;AN000;
814 procedure IFS_FILE_XATTRIBUTES,NEAR ;AN000;
815 ;AN000;
816;;;;;;;;ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000;
817; ifsr_api_def FILEATTR ;AN000;
818; ;AN000;
819; MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
820; SaveReg <BX> ; save input function (2,3,4) ;AN000;
821; ;AN000;
822; invoke PREP_IFSR ; init ifsr ;AN000;
823; Context DS ; ds - dosgroup ;AN000;
824; ;AN000;
825; invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
826; MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
827; MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; prep IFSRH ;AN000;
828; MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
829; MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000;
830; MOV AL,FUNC_GET_BY_HANDLE ; start ifsr_func with get ;AN000;
831;;;;;;;;RestoreReg <CX> ; get original BX - func ;AN000;
832
833 CMP BL,4 ; ;AC010;
834 JNE XFA_40 ; ;AC010;
835 JMP C_990 ; just ret success if set ;AC010;
836XFA_40: ;AN000;
837
838;;;;;;;;MOV ES:[BX.IFSR_FUNC],AL ;AN000;
839; MOV AL,SUBFUNC_EA ; start ifsr_subfunc w/ea list ;AN000;
840; CMP CL,3 ; (input get ea names) ;AN000;
841; JNE XFA_80 ;AN000;
842; INC AL ; inc ifsr_subfunc to ea names ;AN000;
843;FA_80: ;AN000;
844; MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
845; CMP CL,4 ; no size offered on set so don't check ;AN009;
846; JE XFA_82 ;AN009;
847;
848;FA_82: ;AN009;
849; MOV AX,[SAVE_DI] ;AN000;
850; MOV WORD PTR ES:[BX.IFSR_BUFFER2@],AX ; get list ptr into buffer2@ ;AC002;
851; MOV AX,[SAVE_ES] ;AN000;
852; MOV WORD PTR ES:[BX.IFSR_BUFFER2@+2],AX ; get list ptr into buffer2@ ;AC002;
853;FA_85: ;AN008;
854; CMP CL,2 ; get ea list with qlist ;AN000;
855; JNE XFA_90 ;AN000;
856; MOV AX,[SAVE_SI] ;AN000;
857; CMP AX,NULL_PTR ; if null, don't set buffer1 ;AN005;
858; JE XFA_90 ;AN005;
859; MOV WORD PTR ES:[BX.IFSR_BUFFER1@],AX ; get list ptr into buffer2@ ;AC002;
860; MOV AX,[SAVE_DS] ;AN000;
861; MOV WORD PTR ES:[BX.IFSR_BUFFER1@+2],AX ; get list ptr into buffer2@ ;AC002;
862;FA_90: ;AN000;
863; PUSH [SAVE_CX] ; buffer size ;AN000;
864; POP ES:[BX.IFSR_COUNT] ;AN000;
865; invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
866; ; ES:BX -> IFSRH ;AN000;
867; ; IFSR_OPEN_CB@ ;AN000;
868; ; ds - IFSSEG ;AN000;
869;************************************************
870; invoke CALL_IFS ; *** call fs with fileattr request ;AN000;
871;************************************************
872; JNC XFA_100 ;AN000;
873; JMP C_1000 ;AN000;
874;FA_100: ;AN000;
875;;;;;;;;invoke SFF_TO_SFT ;AN000;
876
877
878 Context DS ; on get - set size to 2 and count=0 ;AN010;
879 MOV AX,[SAVE_CX] ; if count < 2 than no buffer2 ;AN008;;AC013;
880 CMP AX,2 ;AN008;;AC013;
881 JGE XFA_120 ;AN008;;AC013;
882 XOR AX,AX
883 JMP SHORT XFA_140
884XFA_120: ;AN013;
885 PUSH [SAVE_ES] ;AN010;
886 POP ES ;AN010;
887 MOV DI,[SAVE_DI] ;AN010;
888 XOR AX,AX ;AN010;
889 STOSW ; count in buffer ;AN010;
890 MOV AX,2 ;AN007;AC010;
891XFA_140: ;AN013;
892 SaveReg <AX> ; preserve future cx ;AN016;
893 CallInstall Get_User_Stack,multDOS,24 ; put size in user cx ;AN007;
894 RestoreReg <AX> ; restore future cx ;AN016;
895 MOV DS:[SI.USER_CX],AX ;AN007;
896 JMP C_990 ; go ret in close to get ds-dosgroup ;AN000;
897 ;AN000;
898 ;AN000;
899EndProc IFS_FILE_XATTRIBUTES ;AN000;
900 ;AN000;
901 ;AN000;
902IFSSEG ENDS ;AN000;
903 END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM
new file mode 100644
index 0000000..96fb591
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM
@@ -0,0 +1,1373 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsinit.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC INITIALIZATION ROUTINES - Routines for ifs ;AN000;
4NAME IFSINIT ;AN000;
5;*********************************************************************************** ;AN000;
6; ;AN000;
7; IFS Initialization Routines ;AN000;
8; ;AN000;
9; IFSINIT ;AN000;
10; ;AN000;
11; REVISION HISTORY: ;AN000;
12; A000 - Original version 4.00 MAY 1987 ;AN000;
13; A001 - PTM 331 Entry point for device ioctl
14; A002 - PTM 430 Renumber parse errors
15; A003 - DCR 96 Transfer IFS DOS callbacks to IFSFUNC
16; A004 - PTM 696 IFSFUNC hang w/no drivers
17; A005 - PTM 541 Parse problem
18; A006 - PTM 1227 DOS Version Check problem
19; A007 - PTM 842 Error messages in ifsfunc
20; A008 - PTM 1950 Autoattach when 2 ifs drivers loaded & 1st fails attach
21; A009 - PTM 2249 Autoattach must set isifs bit in cds
22; A010 - PTM 2827 Error proc problems 1/88 RMG
23; A011 - PTM 3334 put back reset environment call 2/88 rmg
24; A012 - PTM 4140 dos ext error msg enhancement - semaphore processing 4/19/88 RMG
25; A013 - DCR 526 New INT 2FH Share interface not to trigger logic install 4/19/88 RMG
26;
27; LOC -
28;
29;***********************************************************************************
30 ;AN000;
31.xlist ;AN000;
32.xcref ;AN000;
33INCLUDE IFSFSYM.INC ;AN000;
34INCLUDE IFSSYM.INC ;AN000;
35INCLUDE DOSSYM.INC ;AN000;
36INCLUDE DEVSYM.INC ;AN000;
37include sysmsg.inc ;AN000;
38msg_utilname <IFSFUNC> ; resident msgret stuff ;AN000;
39.cref ;AN000;
40.list ;AN000;
41.sall ;AN000;
42 ;AN000;
43AsmVars <IBM, INSTALLED, DEBUG, PATHGEN> ;AN000;
44 ;AN000;
45IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
46IFSSEG ENDS ;AN000;
47 ;AN000;
48include dosseg.asm ;AN000;
49 ;AN000;
50DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
51 ; DOSGROUP data ;AN000;
52 extrn DataVersion:WORD ; version number of DOS data. ;AN000;
53 extrn SFTFCB:DWORD ; FCB SFT cache ;AN000;
54 extrn KeepCount:WORD ; FCB SFT cache ;AN000;
55 Extrn CDSAddr:DWORD ;AN000;
56 Extrn CDSCount:BYTE ;AN000;
57 Extrn DummyCDS:BYTE ;AN000;
58 Extrn CritPatch:WORD ;AN000;
59DATA ENDS ;AN000;
60 ;AN000;
61IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
62 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
63 ;AN000;
64 ;IFS Data ;AN000;
65 ;AN000;
66 Extrn CDSAlt:DWORD ;AN000;
67 Extrn DFLAddr:DWORD ;AN000;
68 Extrn DFLCount:BYTE ;AN000;
69;;;aliasExtrn NLAddr:DWORD ;AN000;
70;;;aliasExtrn NLSIZE:WORD ;AN000;
71 Extrn INT_2F_5:BYTE ;AN000;
72 Extrn NEXT_2F_5:DWORD ;AN000;
73 Extrn IFSR:WORD ;AN000;
74 Extrn CD1:WORD ;AN000;
75 Extrn DF1:WORD ;AN000;
76 Extrn SFF1:WORD ;AN000;
77 Extrn THISIFS:DWORD ;AN000;
78 Extrn IFSPROC_FLAGS:WORD ;AN000;
79 Extrn IFSFUNC_FLAGS:WORD ;AN000;
80 Extrn UNC_FS_HDR:DWORD ;AN000;
81 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
82 Extrn IFS_ATTRS:WORD
83 Extrn RODS_LABEL:BYTE ;AN000;
84 Extrn IFSSEM:BYTE
85 ;AN000;
86 PUBLIC CODESIZE ;AN000;
87CODESIZE DB 'RMG' ;AN000;
88 DB 30H ;AN000;
89 DB 30H ;AN000;
90 DB 30H ;AN000;
91 DB 30H ;AN000;
92 DB 30H ;AN000;
93 DB 20H ;AN000;
94 PUBLIC TOTSIZE ;AN000;
95TOTSIZE DB 30H ;AN000;
96 DB 30H ;AN000;
97 DB 30H ;AN000;
98 DB 30H ;AN000;
99 DB 30H ;AN000;
100 DB 20H ;AN000;
101 ;AN000;
102 ;AN000;
103 ;AN000;
104Break <INT 2F handler> ;AN000;
105 ;AN000;
106IF DEBUG ;AN000;
107Procedure NetPointers,NEAR ;AN000;
108 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
109 LDS SI,[DFLAddr] ;AN000;
110;;;aliasLES DI,[NLAddr] ;AN000;
111 return ;AN000;
112EndProc NetPointers ;AN000;
113 ;AN000;
114Procedure NetPointers2,NEAR ;AN000;
115 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
116 PUSH CS ;AN000;
117 POP DS ;AN000;
118ASSUME DS:IFSSEG ;AN000;
119 MOV CX,[DFLCount] ;AN000;
120;;;aliasMOV DX,[NLSIZE] ;AN000;
121 return ;AN000;
122EndProc NetPointers2 ;AN000;
123ENDIF ;AN000;
124 ;AN000;
125IF PATHGEN ;AN000;
126Procedure GetIFSFCSinES,NEAR ;AN000;
127 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
128 PUSH CS ;AN000;
129 POP ES ;AN000;
130 return ;AN000;
131EndProc GetIFSFCSinES ;AN000;
132ENDIF ;AN000;
133 ;AN000;
134Procedure UnusedFunc,NEAR ;AN000;
135 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
136 fmt <>,<>,<"Unused IFSFUNC function issued\n"> ;AN000;
137 MOV AX,error_invalid_function ;AN000;
138 STC ;AN000;
139 return ;AN000;
140EndProc UnusedFunc ;AN000;
141 ;AN000;
142; the following multiplex functions are implemented: ;AN000;
143 ;AN000;
144retn1 DD ? ;AN000;
145DMY DW ? ;AN000;
146CONT DD ? ;AN000;
147FOO DW Leave2F ;AN000;
148 ;AN000;
149INT2F PROC FAR ;AN000;
150 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000;
151 CMP AH,multIFS ;AN000;
152 JZ IDispatch ;AN000;
153 JMP CONT ;AN000;
154Leave2F: ;AN000;
155 RET ;AN000;
156INT2F ENDP ;AN000;
157 ;AN000;
158Procedure IDispatch,NEAR ;AN000;
159 POP WORD PTR retn1 ; remove long return ;AN000;
160 POP WORD PTR retn1+2 ;AN000;
161 POP DMY ; remove flags ;AN000;
162 XCHG AX,BX ; save bx/move index to index reg ;AN000;
163 SHL BL,1 ; convert byte to word index ;AN000;
164 XOR BH,BH ; convert to word index ;AN000;
165 POP DMY ; save fictitious AX ;AN000;
166 PUSH DMY ; restore spot on stack ;AN000;
167 PUSH WORD PTR retn1+2 ; restore long return ;AN000;
168 PUSH WORD PTR retn1 ;AN000;
169 PUSH FOO ; place near address of far return ;AN000;
170 PUSH CS:IFStable[BX] ; place destination routine ;AN000;
171 XCHG AX,BX ; restore BX ;AN000;
172 MOV AX,DMY ; restore AX ;AN000;
173 STI ; let Mani see Clock ticks ;AN000;
174ShortReturn: ;AN000;
175 return ; go to routine (dispatch for Aaron) ;AN000;
176 ;AN000;
177EDW MACRO name ;AN000;
178 extrn name:near ;AN000;
179 DW name ;AN000;
180ENDM ;AN000;
181 ;AN000;
182IFSTable LABEL WORD ;AN000;
183 DW IFSInstall ;AN000;
184 EDW IFS_RMDIR ; 1 IFS_RMDIR ;AN000;
185 EDW IFS_SEQ_RMDIR ; 2 IFS_SEQ_RMDIR ;AN000;
186 EDW IFS_MKDIR ; 3 IFS_MKDIR ;AN000;
187 EDW IFS_SEQ_MKDIR ; 4 IFS_SEQ_MKDIR ;AN000;
188 EDW IFS_CHDIR ; 5 IFS_CHDIR ;AN000;
189 EDW IFS_CLOSE ; 6 IFS_CLOSE ;AN000;
190 EDW IFS_COMMIT ; 7 IFS_COMMIT ;AN000;
191 EDW IFS_READ ; 8 IFS_READ ;AN000;
192 EDW IFS_WRITE ; 9 IFS_WRITE ;AN000;
193 EDW IFS_XLOCK ; 10 IFS_XLOCK ;AN000;
194 DW UnusedFunc ; 11 ;AN000;
195 EDW IFS_DISK_INFO ; 12 IFS_DISK_INFO ;AN000;
196 EDW IFS_SET_FILE_ATTRIBUTE ; 13 IFS_SET_FILE_ATTRIBUTE ;AN000;
197 EDW IFS_SEQ_SET_FILE_ATTRIBUTE ; 14 IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000;
198 EDW IFS_GET_FILE_INFO ; 15 IFS_GET_FILE_INFO ;AN000;
199 EDW IFS_SEQ_GET_FILE_INFO ; 16 IFS_SEQ_GET_FILE_INFO ;AN000;
200 EDW IFS_RENAME ; 17 IFS_RENAME ;AN000;
201 EDW IFS_SEQ_RENAME ; 18 IFS_SEQ_RENAME ;AN000;
202 EDW IFS_DELETE ; 19 IFS_DELETE ;AN000;
203 EDW IFS_SEQ_DELETE ; 20 IFS_SEQ_DELETE ;AN000;
204 EDW IFS_OPEN ; 21 IFS_OPEN ;AN000;
205 EDW IFS_SEQ_OPEN ; 22 IFS_SEQ_OPEN ;AN000;
206 EDW IFS_CREATE ; 23 IFS_CREATE ;AN000;
207 EDW IFS_SEQ_CREATE ; 24 IFS_SEQ_CREATE ;AN000;
208 EDW IFS_SEQ_SEARCH_FIRST ; 25 IFS_SEQ_SEARCH_FIRST ;AN000;
209 EDW IFS_SEQ_SEARCH_NEXT ; 26 IFS_SEQ_SEARCH_NEXT ;AN000;
210 EDW IFS_SEARCH_FIRST ; 27 IFS_SEARCH_FIRST ;AN000;
211 EDW IFS_SEARCH_NEXT ; 28 IFS_SEARCH_NEXT ;AN000;
212 EDW IFS_ABORT ; 29 IFS_ABORT ;AN000;
213 EDW IFS_ASSOPER ; 30 IFS_ASSOPER ;AN000;
214 EDW Printer_GETSET_STRING ; 31 Printer_GETSET_STRING ;AN000;
215 EDW IFSFlushBuf ; 32 IFS_Flush_Buf ;AN000;
216 EDW IFS_LSEEK ; 33 IFS_LSEEK ;AN000;
217 EDW IFS_RESET_ENVIRONMENT ; 34 IFS_RESET_ENVIRONMENT ;AN000;
218 EDW IFS_DEVICE_CHECK ; 35 IFSDeviceCheck ;AN000;
219 EDW IFS_DEVICE_CLOSE ; 36 IFSDeviceClose ;AN000;
220 EDW IFS_DEVICE_OPER ; 37 IFSDeviceOper ;AN000;
221 EDW IFS_SPOOL_ECHO_CHECK ; 38 IFSSpoolEchoCheck ;AN000;
222 DW UnusedFunc ; 39 ;AN000;
223 DW UnusedFunc ; 40 ;AN000;
224 DW UnusedFunc ; 41 ;AN000;
225 EDW SERVER_DOSCALL_CLOSEFILES_FOR_UID ; 42 util ;AN000;
226 EDW DEVICE_IOCTL ; 43 dev ;AN001;
227 EDW IFS_UPDATE_CB ; 44 UPDATECB util ;AN000;
228 EDW IFS_FILE_XATTRIBUTES ; 45 hand ;AN000;
229 EDW IFS_XOPEN ; 46 XOPEN file ;AN000;
230 EDW IFS_DEPENDENT_IOCTL ; 47 util ;AN000;
231 ;AN000;
232 IF DEBUG ;AN000;
233 DW NetPointers ; 47 NetPointers ;AN000;
234 DW NetPointers2 ; 48 NetPointers2 ;AN000;
235 ENDIF ;AN000;
236 ;AN000;
237 IF PATHGEN ;AN000;
238 DW GetIFSFCSinES ; 49 (if debug) GetRedirCSinES ;AN000;
239 ; 47 (if NOT debug) GetRedirCSinES ;AN000;
240 ENDIF ;AN000;
241 ;AN000;
242IFSInstall: ;AN000;
243 MOV AL,0FFh ;AN000;
244 MOV BX,IFS_ATTRS
245 return ;AN000;
246EndProc IDispatch ;AN000;
247 ;AN000;
248Procedure EcritNet,NEAR ;AN000;
249 ASSUME SS:NOTHING ;AN000;
250 PUSHF ;AN000;
251 CLI ;AN000;
252 PUSH AX ;AN000;
253 MOV AX,8000h+CritNet ;AN000;
254 INT int_ibm ;AN000;
255 POP AX ;AN000;
256IF DEBUG ;AN000;
257 JNC NoCarry ;AN000;
258 fmt <>,<>,<"$p: ECritNet overflowed semaphore\n"> ;AN000;
259NoCarry: ;AN000;
260ENDIF ;AN000;
261 STI ;AN000;
262 POPF ;AN000;
263 return ;AN000;
264EndProc EcritNet ;AN000;
265 ;AN000;
266; ;AN000;
267; Leave critical section for network. Note that the first instruction (PUSH ;AN000;
268; AX) here is used as the patch byte to enable the DOS critical section ;AN000;
269; routines... ;AN000;
270; ;AN000;
271; NOTE!!! On a 286, this instruction issues POPF!!! ;AN000;
272; ;AN000;
273Procedure LcritNet,NEAR ;AN000;
274 PUSH AX ;AN000;
275 PUSHF ;AN000;
276 CLI ;AN000;
277IF DEBUG ;AN000;
278 JGE NoWrap ;AN000;
279 fmt <>,<>,<"$p: LCritNet decrementing semaphore through zero\n"> ;AN000;
280NoWrap: ;AN000;
281ENDIF ;AN000;
282 ;AN000;
283 MOV AX,8100h+critNet ;AN000;
284 INT int_ibm ;AN000;
285 STI ;AN000;
286 POPF ; NOTE that this restores entry ;AN000;
287 POP AX ;AN000;
288 return ;AN000;
289EndProc LcritNet ;AN000;
290 ;AN000;
291 ;AN000;
292Procedure EcritIFS,NEAR ;AN000;
293 ASSUME SS:NOTHING ;AN000;
294 PUSHF ;AN000;
295 CLI ;AN000;
296 PUSH AX ;AN000;
297 MOV AX,8000h+CritIFS ;AN000;
298 INT int_ibm ;AN000;
299 POP AX ;AN000;
300 STI ;AN000;
301 POPF ;AN000;
302 return ;AN000;
303EndProc EcritIFS ;AN000;
304 ;AN000;
305Procedure LcritIFS,NEAR ;AN000;
306 PUSH AX ;AN000;
307 PUSHF ;AN000;
308 CLI ;AN000;
309 MOV AX,8100h+critIFS ;AN000;
310 INT int_ibm ;AN000;
311 STI ;AN000;
312 POPF ; NOTE that this restores entry ;AN000;
313 POP AX ;AN000;
314 return ;AN000;
315EndProc LcritIFS ;AN000;
316 ;AN000;
317 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000;
318 ;AN000;
319INTERR: ;AN000;
320INTERRL:jmp INTERRL ; hang here - we're sick ;AN000;
321 ;AN000;
322 ;AN000;
323 PUBLIC TEMPBUF ;AN000;
324TEMPBUF LABEL BYTE ;AN000;
325; THE SPACE FROM HERE TO NETEND CONSTITUTES THE TEMP AREA OF IFSFUNC. ;AN000;
326; WARNING DANGER!!!!!!!!! ;AN000;
327; DO NOT reduce the size of this area without first checking ;AN000;
328; all users of it. It is OK to make it BIGGER without checking. ;AN000;
329; Current size: ?? ;AN000;
330 ;AN000;
331Break <General IFSFUNC INIT> ;AN000;
332;************************************************************************************ ;AN000;
333; ;AN000;
334; map: Resident: ;AN000;
335; IF_40 - (contifsinit) 2nd half of ifsfinit procedure = tempbuf area ;AN000;
336; allocate: DFL_LIST, altcds, sftfcb, ;AN000;
337; set TOTALSIZE ;AN000;
338; IFSFUNCINIT start ;AN000;
339; I_700 - INIT: 2nd half of IFSFUNCINIT ;AN000;
340; INT 23,24 stuff ;AN000;
341; call IFSFINIT ;AN000;
342; close std handles ;AN000;
343; enable critical section ;AN000;
344; terms & stays ;AN000;
345; tempbuf ends ;AN000;
346; Transient: ;AN000;
347; IFSFINIT procedure ;AN000;
348; Set interrupt vectors - 2F ;AN000;
349; Call AUTO_ATTACH ;AN000;
350; allocate stuff (write over code) ;AN000;
351; jumps up to 2nd half ;AN000;
352; IFSFUNCINIT init code ;AN000;
353; version checks ;AN000;
354; error msg processing ;AN000;
355; free environment ;AN000;
356; parsing ;AN000;
357; move stack ;AN000;
358; check size for everything ;AN000;
359; ifsfunc code size calculation ;AN000;
360; ifsfunc total size calculation ;AN000;
361; jmps to I_700 ;AN000;
362; AutoAttach ;AN000;
363; CheckUNCpresence ;AN000;
364; ;AN000;
365;************************************************************************************ ;AN000;
366 ;AN000;
367; This Code must be protected from overwrite when the structures are ;AN000;
368; initialized ;AN000;
369 ;AN000;
370 ;AN000;
371IF_40: ; CONTIFSINIT ;AN000;
372ASSUME DS:IFSSEG,ES:NOTHING,SS:NOTHING ;AN000;
373 ;AN000;
374; ;AN000;
375; Allocate and init DFL_LIST ;AN000;
376; ;AN000;
377 MOV WORD PTR DFLAddr,DI ;AN000;
378 MOV WORD PTR DFLAddr+2,ES ;AN000;
379 MOV AL,DFLCount ;AN000;
380 XOR AH,AH ;AN000;
381 MOV BX,SIZE DFLL_LIST ;AN000;
382 MUL BX ;AN000;
383 MOV CX,AX ;AN000;
384 XOR AX,AX ;AN000;
385 REP STOSB ;AN000;
386 ;AN000;
387;;;aliasMOV WORD PTR NLAddr,DI ;AN000;
388;;; MOV WORD PTR NLAddr+2,ES ;AN000;
389;;; MOV AX,NLSIZE ;AN000;
390;;; STOSW ;AN000;
391;;; XOR AX,AX ;AN000;
392;;; STOSW ;AN000;
393;;;aliasADD DI,NLSIZE-4 ;AN000;
394; ;AN000;
395; Allocate alt CDSs area ;AN000;
396; ;AN000;
397 TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000;
398 JZ IF_50 ;AN000;
399 MOV WORD PTR CDSAlt,DI ;AN000;
400 MOV WORD PTR CDSAlt+2,ES ;AN000;
401 PUSH DS ;AN000;
402 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
403 INT 2FH ;AN000;
404ASSUME DS:DOSGROUP ;AN000;
405 MOV AL,CDSCount ; Alt = Alloc ((sizeof(CDS)+1)*CDSCount); ;AN000;
406 XOR AH,AH ;AN000;
407 INC AX ;AN000;
408 MOV BX,SIZE curdir_list ;AN000;
409 MUL BX ;AN000;
410 ADD DI,AX ;AN000;
411 JMP SHORT IF_55 ;AN000;
412IF_50: ;AN000;
413 PUSH DS ;AN000;
414 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
415 INT 2FH ;AN000;
416ASSUME DS:DOSGROUP ;AN000;
417; ;AN000;
418; Allocate new FCB cache if appropriate ;AN000;
419; ;AN000;
420IF_55: ;AN000;
421 CMP BYTE PTR CS:NEWFCBCACHE,0 ; Damn forward reference ;AN000;
422 JZ IF_80 ; JZ NO_FCB_CACHE ;AN000;
423; ;AN000;
424; We need to allocate (NewNumFCB * size of SF_entry) + size of sfTable. ;AN000;
425; ;AN000;
426 CLI ; Diddling a DOS table, make sure ;AN000;
427; ;AN000;
428; Make dos point to new table ;AN000;
429; ;AN000;
430 MOV WORD PTR SFTFCB,DI ;AN000;
431 MOV WORD PTR SFTFCB+2,ES ;AN000;
432; ;AN000;
433; Initialize table parts, next link and size ;AN000;
434; ;AN000;
435 MOV WORD PTR ES:[DI.sfLink],-1 ;AN000;
436 MOV WORD PTR ES:[DI.sfLink+2],-1 ;AN000;
437 MOV CX,NewNumFCB ;AN000;
438 MOV ES:[DI.sfcount],CX ;AN000;
439; ;AN000;
440; Set up keepcount ;AN000;
441; ;AN000;
442 MOV KeepCount,NewKeepVal ;AN000;
443; ;AN000;
444; Clean out the new FCB Cache ;AN000;
445; ;AN000;
446 LEA DI,[DI].SFTable ; Point to the FCB SFTs ;AN000;
447IF_60: ; CleanScan: ;AN000;
448 MOV ES:[DI.sf_ref_count],0 ;AN000;
449 MOV WORD PTR ES:[DI.sf_position],0 ;AN000;
450 MOV WORD PTR ES:[DI.sf_position+2],0 ;AN000;
451 ADD DI,SIZE sf_entry ;AN000;
452 LOOP IF_60 ;AN000;
453 STI ;AN000;
454IF_80: ; NO_FCB_CACHE: ;AN000;
455 POP DS ;AN000;
456ASSUME DS:IFSSEG ;AN000;
457 ;AN000;
458 MOV [TOTALSIZE],DI ; Offset of 1st free byte ;AN000;
459 POP AX ;AN000;
460 POP BX ;AN000;
461 POP CX ;AN000;
462 POP DX ;AN000;
463 POP DI ;AN000;
464 POP SI ;AN000;
465 POP ES ;AN000;
466 POP DS ;AN000;
467 return ;AN000;
468 ;AN000;
469 ;AN000;
470 ;AN000;
471 ASSUME CS:IFSSEG,DS:IFSSEG,ES:NOTHING,SS:STACK ;AN000;
472 ;AN000;
473.xlist ;AN000;
474.xcref ;AN000;
475 msg_services <MSGDATA> ;AN007;
476 PUBLIC SYSGETMSG
477 msg_services <GETmsg>
478.cref ;AN000;
479.list ;AN000;
480 ;AN000;
481Break <Installable Network INIT> ;AN000;
482 ;AN000;
483Totalsize DW ? ;AN000;
484 ;AN000;
485NEWFCBCACHE DB 0 ;AN000;
486 ;AN000;
487INT_24: ; INT 24 handler used during INIT. ;AN000;
488 MOV AL,3 ; FAIL any INT 24s ;AN000;
489INT_23: ; ^C handler used during INIT. ;AN000;
490 IRET ; ignores any ^C. ;AN000;
491 ;AN000;
492I_700: ; Init ;AN000;
493 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
494; ;AN000;
495; We are now going to set lots of INT vectors and other stuff. We need ;AN000;
496; to make ourselves immune to INT 24 and ^C ;AN000;
497; ;AN000;
498 PUSH CS ;AN000;
499 POP DS ;AN000;
500 MOV DX,OFFSET INT_23 ;AN000;
501 MOV AX,(Set_Interrupt_Vector SHL 8) + 23H ;AN000;
502 INT 21H ;AN000;
503 MOV DX,OFFSET INT_24 ;AN000;
504 MOV AX,(Set_Interrupt_Vector SHL 8) + 24H ;AN000;
505 INT 21H ;AN000;
506 invoke IFSFINIT ; Do general INIT ;AN000;
507 ;AN000;
508 XOR BX,BX ;AN000;
509 MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN ;AN000;
510I_720: ; Close STD handles before ;AN000;
511 ; keep process ;AN000;
512 MOV AH,CLOSE ;AN000;
513 INT 21H ;AN000;
514 INC BX ;AN000;
515 LOOP I_720 ;AN000;
516 ;AN000;
517; ;AN000;
518; Enable the critical section code. This consists of replacing the RETs at ;AN000;
519; the beginning of each critical section routine with a PUSH AX ;AN000;
520; ;AN000;
521 PUSH CS ;AN000;
522 POP DS ; ds - ifsseg ;AN000;
523 ;AN000;
524 TEST IFSFUNC_FLAGS,UNC_INSTALLED ; 1st check if unc fs loaded ;AN000;
525 JZ I_800 ; only do this for unc ;AN000;
526 MOV AH,Get_In_Vars ; do crit patch ;AN000;
527 INT 21h ;AN000;
528 cld ;AN000;
529 ASSUME ES:DOSGroup ;AN000;
530 MOV AL,BYTE PTR LCritNet ;AN000;
531 MOV BX,OFFSET DOSGROUP:CritPatch ;AN000;
532 CLI ;AN000;
533I_760: ; Scan ;AN000;
534 MOV DI,ES:[BX] ;AN000;
535 ADD BX,2 ;AN000;
536 OR DI,DI ;AN000;
537 JZ I_780 ;AN000;
538 stosb ;AN000;
539 JMP I_760 ;AN000;
540I_780: ;AN000;
541 STI ;AN000;
542I_800: ;AC012;moved
543 MOV CS:IFSSEM,0 ; initialize ifs semaphores ;AN012;
544; ;AN000;
545; Compute total size for residency. ;AN000;
546; ;AN000;
547 MOV DX,TotalSize ; size of code and structs ;AN000;
548 ADD DX,100H+0Fh ; Add size of header ;AN000;
549 RCR DX,1 ;AN000;
550 MOV CL,3 ;AN000;
551 SHR DX,CL ;AN000;
552 MOV AX,(Keep_Process SHL 8) + 0 ;AN000;
553 INT 21h ;AN000;
554 MOV AX,(EXIT SHL 8) + 1 ;AN000;
555 INT 21h ;AN000;
556 ;AN000;
557 ;AN000;
558; %%%% CODE/DATA BELOW IS OVERLAYED WHEN STRUCTURES ARE SET UP ;AN000;
559 ;AN000;
560NETEND LABEL BYTE ;AN000;
561 ;AN000;
562 procedure IFSFINIT,NEAR ;AN000;
563ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
564 ;AN000;
565; Perform initialization at DOSINIT time ;AN000;
566 ;AN000;
567 PUSH DS ;AN000;
568 PUSH ES ;AN000;
569 PUSH SI ;AN000;
570 PUSH DI ;AN000;
571 PUSH DX ;AN000;
572 PUSH CX ;AN000;
573 PUSH BX ;AN000;
574 PUSH AX ;AN000;
575 PUSH CS ;AN000;
576 POP DS ;AN000;
577 ;AN000;
578ASSUME DS:IFSSEG ;AN000;
579 ;AN000;
580; SET INTERRUPT VECTORS ;AN000;
581 ;AN000;
582 MOV AL,2FH ;AN000;
583 PUSH AX ;AN000;
584 MOV AX,(multDOS SHL 8) OR 2 ;AN000;
585 INT 2FH ;AN000;
586 POP AX ; no know contents ;AN000;
587 ;AN000;
588 PUSH ES ;AN000;
589 PUSH BX ;AN000;
590 LES BX,DWORD PTR ES:[BX] ; setting int 2f mult 5 ;AN000;
591 MOV WORD PTR [NEXT_2F_5],BX ;AN000;
592 MOV WORD PTR [NEXT_2F_5+2],ES ;AN000;
593 POP BX ;AN000;
594 POP ES ;AN000;
595 ;AN000;
596 MOV DX,OFFSET INT_2F_5 ;AN000;
597 MOV ES:[BX],DX ;AN000;
598 MOV ES:[BX+2],DS ;AN000;
599 ;AN000;
600 MOV AX,(Get_Interrupt_Vector SHL 8) + 2Fh ;AN000;
601 INT 21h ;AN000;
602 MOV WORD PTR CONT,BX ;AN000;
603 MOV WORD PTR CONT+2,ES ;AN000;
604 MOV AX,(Set_Interrupt_Vector SHL 8) + 2Fh ;AN000;
605 MOV DX,OFFSET INT2F ; multIFS handler ;AN000;
606 INT 21h ;AN000;
607; ;AN000;
608; auto - attach ;AN000;
609; ;AN000;
610 CALL AUTO_ATTACH ;AN000;
611; ;AN000;
612; call swap setup ;AN000;
613; ;AN000;
614 PUSH DS ;AN000;
615 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
616 INT 2FH ;AN000;
617ASSUME DS:DOSGROUP ;AN000;
618 invoke SERVER_IFSFUNC_DATA_AREA ;AN000;
619 POP DS ;AN000;
620 invoke SET_IFS_DOSCALL@ ;AN003;
621 ;AN000;
622 PUSH CS ;AN000;
623 POP ES ;AN000;
624; ;AN007;
625; Prep error messages ;AN007;
626; ;AN007;
627 LEA DI,Rods_label ;AN007;
628 SaveReg <CS> ;AN007;
629 RestoreReg <ES> ;AN007;
630 MOV AX,DOS_GET_EXT_PARSE_ADD ;AN007;
631 MOV DL,7 ; set msg addr ;AN007;
632 INT 2FH ;AN007;
633; ;AN000;
634; Now start clobbering code ;AN000;
635; ;AN000;
636 MOV DI,OFFSET NETEND ; Start strucs here ;AN000;
637 TEST DI,1 ; Word aligned? ;AN000;
638 JZ IF_20 ; Yes, ok ;AN000;
639 INC DI ; Bump to word align ;AN000;
640IF_20: ; NOADJ1 ;AN000;
641 JMP IF_40 ; jmp CONTIFSINIT ;AN000;
642 ;AN000;
643EndProc IFSFINIT ;AN000;
644 ;AN000;
645;************* ifsfuncinit transient portion ****************************** ;AN000;
646 AA_PARMS_BUF DB 6 DUP(0) ; temp storage used by auto-attach ;AN000;
647 S_SIZE1 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000;
648 DB 0 ; Reserved ;AN000;
649 DD SUB_IFSFUNC ; Ptr to substituted string ;AN000;
650 DB 1 ; n of %n ;AN000;
651 DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000;
652 DB 7 ; Maximum field width ;AN000;
653 DB 5 ; Minimum field width ;AN000;
654 DB " " ; Character for Pad field ;AN000;
655 S_SIZE2 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000;
656 DB 0 ; Reserved ;AN000;
657 DD SUB_SHARE ; Ptr to substituted string ;AN000;
658 DB 1 ; n of %n ;AN000;
659 DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000;
660 DB 7 ; Maximum field width ;AN000;
661 DB 5 ; Minimum field width ;AN000;
662 DB " " ; Character for Pad field ;AN000;
663 ;AN000;
664SUB_IFSFUNC DB "IFSFUNC",0 ;AN000;
665SUB_SHARE DB "SHARE",0 ;AN000;
666 ;AN000;
667DEFAULT_DFLCount DB 4 ;AN000;
668;;;alias DEFAULT_NLSize DW 172 ; 4 * 43 ;AN000;
669 ;AN000;
670 ASSUME CS:IFSSEG,DS:NOTHING ;AN000;
671.xlist ;AN000;
672.xcref ;AN000;
673 INCLUDE IFSPARSE.INC ;AN000;
674 msg_services <DISPLAYmsg,CHARmsg,LOADmsg> ;AN000;
675 msg_services <ifsfunc.cla,ifsfunc.cl2> ; parse/install msgs ;AN000;
676.cref ;AN000;
677.list ;AN000;
678 ;AN000;
679;****************************************************************************** ;AN000;
680; !!!!!!! IFSFUNC starts here !!!!!!! (see END statement) ;AN000;
681;****************************************************************************** ;AN000;
682 ;AN000;
683IFSFUNCINIT: ;AN000;
684 ;AN000;
685 CALL SYSLOADMSG ;AN000;
686 JNC I_20 ;AN000;
687 SaveReg <CS> ;AN006;
688 RestoreReg <DS> ;AN006;
689 CALL SYSDISPMSG ;AN000;
690 ;AN000;
691Badver_msg proc far ;AN000;
692 MOV AL,0FFh ;AN000;
693 SaveReg <CS> ;AN000;
694 RestoreReg <DS> ;AN000;
695 MOV AH,EXIT ;AN000;
696 INT 21h ;AN000;
697 PUSH ES ;AN000;
698 XOR AX,AX ;AN000;
699 PUSH AX ;AN000;
700 RET ;AN000;
701badver_msg ENDP ;AN000;
702 ;AN000;
703Badmes proc far ;AN000;
704 ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000;
705 MOV BX,STDERR ;AN000;
706 XOR DL,DL ;AN000;
707 CALL SYSDISPMSG ;AN000;
708 MOV AX,(EXIT SHL 8) + 0FFH ;AN000;
709 INT 21h ;AN000;
710badmes ENDP ;AN000;
711 ;AN000;
712 ;AN000;
713I_20: ; Version OK ;AN000;
714 MOV AX,(multIFS SHL 8)+0 ; Check if IFSFUNC already installed ;AN000;
715 INT 2Fh ;AN000;
716 CMP AL,0 ;AN000;
717 JE I_40 ;AN000;
718 MOV AX,COMMON_ERR_2 ; yes - already installed - error 2 ;AN000;
719 PUSH CS ;AN000;
720 POP DS ;AN000;
721 MOV SI,OFFSET S_SIZE1 ; prep for sysdispmsg call ;AN000;
722 MOV CX,1 ;AN000;
723 MOV DH,UTILITY_MSG_CLASS ;AN000;
724I_30: ;AN005;
725 PUSH CS ;AN000;
726 POP DS ;AN000;
727 JMP BADMES ;AN000;
728 ; no error on install check, ;AN000;
729I_40: ; free environment - no longer needed ;AN000;
730 MOV AX,DS:[PDB_ENVIRON] ;AN000;
731 OR AX,AX ;AN000;
732 JZ I_60 ;AN000;
733 PUSH ES ;AN000;
734 MOV ES,AX ;AN000;
735 MOV AH,DEALLOC ;AN000;
736 INT 21H ;AN000;
737 POP ES ;AN000;
738I_60: ;AN000;
739;************************************************************************************ ;AN000;
740; Parse IFSFUNC parameter : ;AN000;
741; NAMES = n ;;;alias[n | (n {m})] ;AN000;
742;************************************************************************************ ;AN000;
743 ; Set default n and m ;AN000;
744 MOV AL,DEFAULT_DFLCount ;AN000;
745 MOV [DFLCount],AL ; 4 (n) ;AN000;
746;;;aliasMOV AX,DEFAULT_NLSize ;AN000;
747;;;aliasMOV NLSize,AX ; 4 * 43 (m) ;AN000;
748 ;AN000;
749 MOV SI,81h ; ds:si -> cmd parameter ;AN000;
750 XOR CX,CX ; no operands parsed yet ;AN000;
751 PUSH CS ;AN000;
752 POP ES ;AN000;
753ASSUME ES:IFSSEG ;AN000;
754 MOV DI,OFFSET IFSF_PARMS ; es:di -> parse control blocks ;AN000;
755 XOR DX,DX ; reserved ;AN000;
756 ;AN000;
757 CALL SYSPARSE ; call parser ;AN000;
758 ;AN000;
759 CMP AX,-1 ; End of cmd? ;AN000;
760 JNE I_70 ;AN000;
761 JMP I_160 ; if so continue w/init ;AN000;
762I_70: ;AN000;
763 CMP AX,0 ; Error? ;AN000;
764 JNE I_140 ; yes - go display parse error ;AN000;
765 ;AN000;
766;;;aliasCMP IFSF_RESULT,COMPLEX ; complex? ;AN000;
767;;;aliasJE I_80 ;AN000;
768 CMP IFSF_TAG,"N" ; no - n only ;AN000;
769 MOV AX,PARSE_ERR_6 ;AN002;
770 JNE I_140 ;AN000;
771 ;AN000;
772 MOV AL,IFSF_NM ;AN000;
773 MOV [DFLCount],AL ;AN000;
774 ;AN000;
775 CALL SYSPARSE ;AN000;
776 CMP AX,-1 ;AN000;
777 JE I_160 ;AN000;
778 MOV AX,PARSE_ERR_1 ;AN000;
779;;;aliasJMP I_140 ; go display parse error ;AN000;
780;;; ;AN000;
781;;;aliasI_80: ; process complex (n,m) ;AN000;
782;;; XOR CX,CX ; prep for new parse call ;AN000;
783;;; XOR DX,DX ;AN000;
784;;; CALL SYSPARSE ;AN000;
785;;; CMP AX,-1 ; End of cmd? ;AN000;
786;;; JE I_160 ; if so continue w/init ;AN000;
787;;; CMP AX,0 ; Error? ;AN000;
788;;; JNE I_140 ; if so go display error ;AN000;
789;;; CMP IFSF_TAG,"N" ; check if n or m parm ;AN000;
790;;; JNE I_100 ;AN000;
791;;; MOV AL,IFSF_NM ; n parm ;AN000;
792;;; MOV DFLCount,AL ;AN000;
793;;; CALL SYSPARSE ; go back for m ;AN000;
794;;; CMP AX,-1 ; End of cmd? ;AN000;
795;;; JE I_160 ; if so continue w/init ;AN000;
796;;; CMP AX,0 ; Error? ;AN000;
797;;; JNE I_140 ; if so go display error ;AN000;
798;;; ;AN000;
799;;;00: ;AN000;
800;;; CMP IFSF_TAG,"M" ; check if m parm ;AN000;
801;;; JE I_120 ;AN000;
802;;; MOV AX,PARSE_ERR_7 ; not m - error ;AN002;
803;;; JMP I_140 ;AN000;
804;;;20: ;AN000;
805;;; MOV AX,WORD PTR IFSF_NM ; m parm ;AN000;
806;;; MOV NLSize,AX ;AN000;
807;;; ;AN000;
808;;; CALL SYSPARSE ; call parser again to check for ;AN000;
809;;; CMP AX,-1 ; possible garbage ;AN000;
810;;; JE I_160 ;AN000;
811;;; MOV AX,PARSE_ERR_1 ;AN000;
812;;;alias ;AN000;
813I_140: ; display parse error ;AN000;
814 MOV DH,PARSE_ERR_CLASS ; then continue w/defaults ;AN000;
815 XOR CX,CX ;AN000;
816;;; MOV BX,STDERR ;AD005;
817;;; XOR DL,DL ;AD005;
818;;; CALL SYSDISPMSG ;AD005;
819 JMP I_30 ;AN005;
820 ;AN000;
821I_160: ;AN000;
822 ; doinit ;AN000;
823 MOV AX,DS ; Move the stack so it doesn't ;AN000;
824 ; get blasted by structure init ;AN000;
825 MOV SS,AX ; Set stack in the PSP overlaying ;AN000;
826 MOV SP,100H ; parms just processed ;AN000;
827; ;AN000;
828; We must now do some computation. We have to check if there is enough room ;AN000;
829; for everything. We must do this here BEFORE we start overlaying this ;AN000;
830; code ;AN000;
831; ;AN000;
832 PUSH CS ;AN000;
833 POP DS ;AN000;
834ASSUME DS:IFSSEG ;AN000;
835 ;AN000;
836 MOV DI,OFFSET NETEND ; We have this much code ;AN000;
837 TEST DI,1 ; Word aligned? ;AN000;
838 JZ I_180 ; Yes, OK. ;AN000;
839 INC DI ; Make word aligned ;AN000;
840I_180: ; no adjust 5 label ;AN000;
841 ;AN000;
842; This code is added to make it easy to determine the code size ;AN000;
843; of IFSFUNC for debug purposes. It is overlayed, so does not use extra ;AN000;
844; storage. ;AN000;
845 PUSH DI ; ;AN000;
846 PUSH SI ; ;AN000;
847 LEA SI,CODESIZE+3 ; ;AN000;
848I_200: ; TENT ;AN000;
849 SUB DI,10000 ; ;AN000;
850 JC I_220 ; ;AN000;
851 INC BYTE PTR [SI] ; ;AN000;
852 JMP I_200 ; ;AN000;
853I_220: ; NEG1 ;AN000;
854 ADD DI,10000 ; ;AN000;
855 INC SI ; ;AN000;
856I_240: ; THOU ;AN000;
857 SUB DI,1000 ; ;AN000;
858 JC I_260 ; ;AN000;
859 INC BYTE PTR [SI] ; ;AN000;
860 JMP I_240 ; ;AN000;
861I_260: ; NEG2 ;AN000;
862 ADD DI,1000 ; ;AN000;
863 INC SI ; ;AN000;
864I_280: ; HUND ;AN000;
865 SUB DI,100 ; ;AN000;
866 JC I_300 ; ;AN000;
867 INC BYTE PTR [SI] ; ;AN000;
868 JMP I_280 ; ;AN000;
869I_300: ; NEG3 ;AN000;
870 ADD DI,100 ; ;AN000;
871 INC SI ; ;AN000;
872I_320: ; TENS ;AN000;
873 SUB DI,10 ; ;AN000;
874 JC I_340 ; ;AN000;
875 INC BYTE PTR [SI] ; ;AN000;
876 JMP I_320 ; ;AN000;
877I_340: ; NEG4 ;AN000;
878 ADD DI,10 ; ;AN000;
879 INC SI ; ;AN000;
880I_360: ; ONES ;AN000;
881 SUB DI,1 ; ;AN000;
882 JC I_380 ; ;AN000;
883 INC BYTE PTR [SI] ; ;AN000;
884 JMP I_360 ; ;AN000;
885I_380: ; DONE ;AN000;
886 POP SI ; ;AN000;
887 POP DI ; ;AN000;
888; ;AN000;
889; Allocate the DFL ;AN000;
890; ;AN000;
891 MOV AL,DFLCount ;AN000;
892 XOR AH,AH ;AN000;
893 MOV CX,SIZE DFLL_LIST ;AN000;
894 MUL CX ;AN000;
895 OR DX,DX ;AN000;
896 JZ I_402 ;AN000;
897 JMP I_640 ; out of memp ;AN000;
898I_402: ;AN000;
899 ADD DI,AX ;AN000;
900 JNC I_403 ;AN000;
901 JMP I_640 ; out of memp ;AN000;
902I_403: ;AN000;
903;;;aliasADD DI,NLSIZE ;AN000;
904;;;aliasJNC I_404 ;AN000;
905;;;aliasJMP I_640 ; out of memp ;AN000;
906I_404: ;AN000;
907 CALL CHECK_UNC_PRESENCE ; check if unc present, if not, ;AN000;
908 TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000;
909 JZ I_415 ; no need to allocate altcds ;AN000;
910; ;AN000;
911; Allocate the TEMP CDS area ;AN000;
912; ;AN000;
913 PUSH DS ;AN000;
914 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
915 INT 2FH ;AN000;
916ASSUME DS:DOSGROUP ;AN000;
917 MOV CL,CDSCount ;AN000;
918 XOR CH,CH ;AN000;
919 INC CX ;AN000;
920 MOV AX,SIZE curdir_list ;AN000;
921 MUL CX ;AN000;
922 OR DX,DX ;AN000;
923 JZ I_410 ;AN000;
924 JMP I_640 ;AN000;
925I_410: ;AN000;
926 ADD DI,AX ; Temp CDS area ;AN000;
927 JNC I_417 ;AN000;
928 JMP I_640 ;AN000;
929I_415: ;AN000;
930; ;AN000;
931; Determine if need new FCB cache and Allocate it if appropriate ;AN000;
932; ;AN000;
933 PUSH DS ; get addressability to DOSGROUP ;AN000;
934 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
935 INT 2FH ;AN000;
936ASSUME DS:DOSGROUP ;AN000;
937I_417: ;AN000;
938 CMP KeepCount,DefKeepVal ;AN000;
939 JNZ I_420 ;AN000;
940 LDS SI,SFTFCB ;AN000;
941ASSUME DS:NOTHING ;AN000;
942 CMP [SI].sfCount,DefNumFCB ;AN000;
943 JNZ I_420 ;AN000;
944 INC NEWFCBCACHE ; Flag ourselves ;AN000;
945 ADD DI,((SIZE sf_entry) * NewNumFCB)+((SIZE sf)-2) ; New cache ;AN000;
946 JC I_640 ; out of memp ;AN000;
947I_420: ; no fcb ;AN000;
948 POP DS ;AN000;
949ASSUME DS:IFSSEG ;AN000;
950 ;AN000;
951; This code is added to make it easy to determine the total size @A1A ;AN000;
952; of IFSFUNC. It is overlayed, so does not use extra storage. @A1A ;AN000;
953 ; @A1A ;AN000;
954 PUSH DI ; @A1A ;AN000;
955 PUSH SI ; @A1A ;AN000;
956 LEA SI,TOTSIZE ; @A1A ;AN000;
957I_440: ; TENT2 @A1A ;AN000;
958 SUB DI,10000 ; @A1A ;AN000;
959 JC I_460 ; @A1A ;AN000;
960 INC BYTE PTR [SI] ; @A1A ;AN000;
961 JMP I_440 ; @A1A ;AN000;
962I_460: ; NEG5 @A1A ;AN000;
963 ADD DI,10000 ; @A1A ;AN000;
964 INC SI ; @A1A ;AN000;
965I_480: ; THOU2 @A1A ;AN000;
966 SUB DI,1000 ; @A1A ;AN000;
967 JC I_500 ; @A1A ;AN000;
968 INC BYTE PTR [SI] ; @A1A ;AN000;
969 JMP I_480 ; @A1A ;AN000;
970I_500: ; NEG6 @A1A ;AN000;
971 ADD DI,1000 ; @A1A ;AN000;
972 INC SI ; @A1A ;AN000;
973I_520: ; HUND2 @A1A ;AN000;
974 SUB DI,100 ; @A1A ;AN000;
975 JC I_540 ; @A1A ;AN000;
976 INC BYTE PTR [SI] ; @A1A ;AN000;
977 JMP I_520 ; @A1A ;AN000;
978I_540: ; NEG7 @A1A ;AN000;
979 ADD DI,100 ; @A1A ;AN000;
980 INC SI ; @A1A ;AN000;
981I_560: ; TENS2 @A1A ;AN000;
982 SUB DI,10 ; @A1A ;AN000;
983 JC I_580 ; @A1A ;AN000;
984 INC BYTE PTR [SI] ; @A1A ;AN000;
985 JMP I_560 ; @A1A ;AN000;
986I_580: ; NEG8 @A1A ;AN000;
987 ADD DI,10 ; @A1A ;AN000;
988 INC SI ; @A1A ;AN000;
989I_600: ; ONES2 @A1A ;AN000;
990 SUB DI,1 ; @A1A ;AN000;
991 JC I_620 ; @A1A ;AN000;
992 INC BYTE PTR [SI] ; @A1A ;AN000;
993 JMP I_600 ; @A1A ;AN000;
994I_620: ; DONE2 @A1A ;AN000;
995 POP SI ; @A1A ;AN000;
996 POP DI ; @A1A ;AN000;
997 ;AN000;
998 ;AN000;
999 JMP I_700 ;AN000;
1000 ;AN000;
1001I_640: ; OUT_OF_MEMP ;AN000;
1002 POP DS ;AN000;
1003I_660: ; OUT_OF_MEM ;AN000;
1004 MOV AX,PARSE_ERR_10 ;AN000;
1005 XOR CX,CX ;AN000;
1006 JMP BADMES ;AN000;
1007 ;AN000;
1008ASSUME DS:NOTHING ;AN000;
1009 ;AN000;
1010 ;AN000;
1011BREAK <AUTO_ATTACH -- Attempt attaches of non-FAT physical drives> ;AN000;
1012 ;AN000;
1013;************************************************************************************ ;AN000;
1014; ;AN000;
1015; AUTO_ATTACH ;AN000;
1016; ;AN000;
1017; Called by: init ;AN000;
1018; ;AN000;
1019; Routines called: CALL_IFS ;AN000;
1020; CDS_TO_CD ;AN000;
1021; CD_TO_CDS ;AN000;
1022; FIND_IFS_DRIVER ;AN000;
1023; Inputs: ;AN000;
1024; None ;AN000;
1025; ;AN000;
1026; Function: ;AN000;
1027; Get addressability to CDS structure (SYSVARS - IBMDOS/BIO) ;AN000;
1028; FOR I = 1 to # CDS ;AN000;
1029; DO ;AN000;
1030; ³ Drive = I - 1 (0-A,1-B,...) ;AN000;
1031; ³ IF (curdir_inuse == 0 & curdir_devptr .NOT. 0) THEN ;AN000;
1032; ³ DO ;AN000;
1033; ³ ³ Get pointer to 1st IFS header ;AN000;
1034; ³ ³ WHILE pointer .NOT. 0FFFFH ;AN000;
1035; ³ ³ DO ;AN000;
1036; ³ ³ START ATTACH ;AN000;
1037; ³ ³ (IFSR_TYPE = 2 ;AN000;
1038; ³ ³ IFSR_PARMS@ -> IFS name, 0 parms) ;AN000;
1039; ³ ³ IF Attach successful THEN ;AN000;
1040; ³ ³ DO ;AN000;
1041; ³ ³ IF IFSUSESHARE set THEN ;AN000;
1042; ³ ³ Set share flag ;AN000;
1043; ³ ³ ENDIF ;AN000;
1044; ³ ³ LEAVE While ;AN000;
1045; ³ ³ ENDDO ;AN000;
1046; ³ ³ ELSE ;AN000;
1047; ³ ³ Get pointer to next IFS header ;AN000;
1048; ³ ³ ENDIF ;AN000;
1049; ³ ³ ENDDO ;AN000;
1050; ³ ³ ENDWHILE ;AN000;
1051; ³ ENDDO ;AN000;
1052; ³ ENDIF ;AN000;
1053; ENDDO ;AN000;
1054; IF Share flag set THEN ;AN000;
1055; DO ;AN000;
1056; IF SHARE .NOT. loaded THEN ;AN000;
1057; issue warning msg: "SHARE not loaded" using msg retriever ;AN000;
1058; END ;AN000;
1059; ENDIF ;AN000;
1060; ;AN000;
1061; Outputs: Successful auto-attachments in effect ;AN000;
1062; ;AN000;
1063;************************************************************************************ ;AN000;
1064 ;AN000;
1065 Procedure AUTO_ATTACH,NEAR ;AN000;
1066ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1067 ;AN000;
1068 TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000;
1069 JZ AA_05 ;AN000;
1070 JMP AA_1000 ;AN000;
1071 ;AN000;
1072AA_05: ;AN000;
1073 SaveReg <DS,ES,DI> ; preserve ds - psp,es di storage ;AN000;
1074 ifsr_fcn_def ATTSTART ;AN000;
1075 MOV CS:IFSPROC_FLAGS,THISIFS_SET+IsInit ; set this so that cds_to_cd doesn't ;AC010;
1076 ; set thisifs ;AN000;
1077 ;AN000;
1078 MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000;
1079 INT 21h ; es:bx -> sysinitvars ;AN000;
1080 LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000;
1081 ;AN000;
1082 MOV AX,(multDOS SHL 8) OR 3 ; get addressability to dosgroup ;AN000;
1083 INT 2FH ;AN000;
1084ASSUME DS:DOSGROUP ;AN000;
1085 ;AN000;
1086 MOV CL,[CDSCount] ; prep cds loop ;AN000;
1087 XOR CH,CH ;AN000;
1088 MOV DX,SIZE CURDIR_LIST ;AN000;
1089 LDS SI,[CDSAddr] ; ds:si -> CDS list ;AN000;
1090ASSUME DS:NOTHING ;AN000;
1091 ;AN000;
1092AA_10: ; ** Loop here on cds entries ;AN000;
1093
1094 TEST DS:[SI.CURDIR_FLAGS],CURDIR_INUSE ; check for ifs-able drive ;AN000;
1095 JZ AA_13 ;AN000;
1096 JMP AA_120 ; cds already inuse, try next cds ;AN000;
1097AA_13: ;AN000;
1098 CMP WORD PTR DS:[SI.CURDIR_DEVPTR],0 ;AN000;
1099 JNZ AA_16 ;AN000;
1100 CMP WORD PTR DS:[SI.CURDIR_DEVPTR+2],0 ;AN000;
1101 JNZ AA_16 ;AN000;
1102 JMP AA_120 ; cds not real, try next cds ;AN000;
1103AA_16: ;AN000;
1104 MOV AX,SI ; attempt ;AN000;
1105 SaveReg <DS,AX> ; cds seg, offset ;AN000;
1106 MOV AX,(multDOS SHL 8) OR 3 ; get dosgroup in ds to access cdsaddr ;AN000;
1107 INT 2FH ;AN000;
1108ASSUME DS:DOSGROUP ;AN000;
1109 RestoreReg <AX> ; cds offset ;AN000;
1110 SUB AX,WORD PTR [CDSADDR] ; get drive # (0-based) in al ;AN000;
1111 MOV BL,SIZE CurDir_list ;AN000;
1112 DIV BL ;AN000;
1113 RestoreReg <DS> ; cds segment ;AN000;
1114 SaveReg <AX> ; drive # (0-based 0=A) ;AN000;
1115 MOV BL,AL ;AN000;
1116 INC BL ; change to 1-based (1=A) ;AN000;
1117 MOV AX,CHECK_REMOVABLE ; 4408H (device ioctl) ;AN000;
1118 INT 21H ;AN000;
1119 OR AX,AX ; ax 0 - drive removable ;AN000;
1120 RestoreReg <AX> ; drive # (0-based) ;AN000;
1121 JNZ AA_19 ;AN000;
1122 JMP AA_120 ; drive removable, don't auto-attach ;AN000;
1123 ;AN000;
1124AA_19: ; cds ok, proceed with autoattach ;AN000;
1125 CBW ; convert al to word (ax) ;AN000;
1126 MOV BL,10 ;AN000;
1127 DIV BL ; convert number (ex.14) to char ;AN000;
1128 ADD AX,3030H ; (3134) (ah-remain,al-quot) ;AN000;
1129 ;AN000;
1130 SaveReg <ES,DI> ; Save 1st ifs driver ;AN000;
1131 MOV CS:WORD PTR [THISIFS],DI ; Send attach start request ;AN000;
1132 MOV CS:WORD PTR [THISIFS+2],ES ; to all fs drivers. Stop when ;AN000;
1133 ; one clicks. ;AN000;
1134AA_20: ;AN000;
1135 SaveReg <ES,DI,CX,DX,DS,SI> ; ifs ptr, cds count-size-ptr ;AN000;
1136 ;AN000;
1137 SaveReg <AX,DS> ; get ES -> dosgroup (save char drv#) ;AN000;
1138 MOV AX,(multDOS SHL 8) OR 3 ;AN000;
1139 INT 2FH ;AN000;
1140 SaveReg <DS> ;AN000;
1141 RestoreReg <ES> ;AN000;
1142ASSUME DS:DOSGROUP,ES:DOSGROUP ;AN000;
1143 ; do attach w/dummy cds so as not ;AN000;
1144 MOV DI,OFFSET DOSGROUP:DummyCDS ; to ruin valid cds ;AN000;
1145 RestoreReg <DS> ;AN000;
1146ASSUME DS:NOTHING ;AN000;
1147 PUSH DI ;AN000;
1148 MOV CX,SIZE curdir_list ;AN000;
1149 REP MOVSB ;AN000;
1150 PUSH ES ;AN000;
1151 POP DS ;AN000;
1152 POP SI ; DS:SI -> dummy CDS ;AN000;
1153 MOV [SI.curdir_flags],curdir_isifs + curdir_inuse ;AN000;
1154 MOV [SI.curdir_type],type_drive ;AN000;
1155 MOV AX,WORD PTR CS:[THISIFS] ;AN000;
1156 MOV WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000;
1157 MOV AX,WORD PTR CS:[THISIFS+2] ;AN000;
1158 MOV WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000;
1159 RestoreReg <AX> ; char drive # ;AN000;
1160 SaveReg <DS,SI> ; dummy cds ptr ;AN000;
1161 ;AN000;
1162 invoke PREP_IFSR ; sets es:bx -> ifsr, 0s fields, ;AN000;
1163 ; ds - ifsseg ;AN000;
1164 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
1165 invoke CDS_TO_CD ; sets ifsr_device_cb@ ;AN000;
1166 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000;
1167 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000;
1168 MOV ES:[BX.IFSR_TYPE],TYPE_DRIVE ;AN000;
1169 ;AN000;
1170 MOV SI,OFFSET AA_PARMS_BUF ; set up attach parameter buffer ;AN000;
1171 MOV WORD PTR DS:[SI],1 ; in tempbuf = dw 1 ;AN000;
1172 MOV WORD PTR DS:[SI+2],AX ; db 3134,0 ;AN000;
1173 XOR AL,AL ;AN000;
1174 MOV BYTE PTR DS:[SI+4],AL ; asciiz ;AN000;
1175 MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000;
1176 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000;
1177 ;AN000;
1178AA_40: ; ** Loop here on ifs drivers ;AN000;
1179 invoke CALL_IFS ; call ifs driver w/attach start req ;AN000;
1180 ;AN000;
1181 JC AA_60 ; jmp on no click ;AN000;
1182 ; click: ;AN000;
1183 RestoreReg <DI,ES> ; restore cds ptr to es:di ;AN000;
1184 invoke CD_TO_CDS ; update cds entry ;AN000;
1185 SaveReg <ES> ; move dummy cds ptr back to ds:si ;AN000;
1186 RestoreReg <DS> ;AN000;
1187 MOV SI,DI ; ds:si -> dummy cds ;AN000;
1188 RestoreReg <DI,ES> ; es:di -> real cds ;AN000;
1189 MOV CX,SIZE CURDIR_LIST ; copy dummy into real - ok to ;AN000;
1190 SaveReg <DI> ;AN000;
1191 OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; set this cds as ifs ;AN009;
1192 REP MOVSB ; clobber now ;AN000;
1193 RestoreReg <SI> ; move real cds ptr back to ds:si ;AN000;
1194 SaveReg <ES> ;AN000;
1195 RestoreReg <DS> ;AN000;
1196 RestoreReg <DX,CX,DI,ES> ; restore cds size, count, ;AN000;
1197 ; ifs ptr ;AN000;
1198 TEST CS:IFSPROC_FLAGS,ISSHARE ; check if share checked ;AN000;
1199 JNZ AA_100 ; go process next cds ;AN000;
1200 TEST ES:[DI.IFS_ATTRIBUTE],IFSUSESHARE ;AN000;
1201 JZ AA_100 ; ifs driver needs share ;AN000;
1202;; D526 CallInstall SHAREInstall,multSHARE,0 ; check that share loaded ;AN000;
1203 CallInstall SHAREInstall,multSHARE,40H ; check that share loaded ;AN013;
1204 CMP AL,INSTALLED ; if not generate warning ;AN000;
1205 JE AA_50 ;AN000;
1206 SaveReg <DS,SI,CX,DX> ;AN000;
1207 MOV AX,COMMON_ERR_3 ; "SHARE not installed" ;AN000;
1208 PUSH CS ;AN000;
1209 POP DS ;AN000;
1210 MOV SI,OFFSET S_SIZE2 ;AN000;
1211 MOV CX,1 ;AN000;
1212 MOV DH,UTILITY_MSG_CLASS ;AN000;
1213 MOV BX,STDERR ;AN000;
1214 XOR DL,DL ;AN000;
1215 CALL SYSDISPMSG ;AN000;
1216 RestoreReg <DX,CX,SI,DS> ;AN000;
1217 ;AN000;
1218AA_50: ;AN000;
1219 OR CS:IFSPROC_FLAGS,ISSHARE ; set this so won't check share again ;AN000;
1220 JMP AA_100 ;AN000;
1221 ;AN000;
1222AA_60: ; ** Next driver ;AN000;
1223 RestoreReg <AX,BX> ; dummy cds ptr ;AN000;
1224 RestoreReg <SI,DS,DX,CX,DI,ES> ; restore: ifs and cds ptrs, ;AN000;
1225 ; cds count and size ;AN000;
1226 LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000;
1227 CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000;
1228 JNE AA_80 ;AN000;
1229 PUSH AX ; dummy cds offset ;AN000;
1230 MOV AX,ES ;AN000;
1231 CMP AX,NULL_PTR ;AN000;
1232 POP AX ; dummy cds offset ;AN000;
1233 JE AA_100 ; go process next cds if no more ifs ;AN000;
1234AA_80: ;AN000;
1235 MOV CS:WORD PTR [THISIFS],DI ; prep next ifs driver ;AN000;
1236 MOV CS:WORD PTR [THISIFS+2],ES ;AN000;
1237 SaveReg <ES,DI,CX,DX,DS,SI> ; Save regs ;AN000;
1238 SaveReg <AX,BX> ; dummy cds ptr ;AN000;
1239 SaveReg <CS,CS> ; get esdi back to ifsrh ;AN008;
1240 RestoreReg <ES,DS> ; and ds-ifsseg ;AN008;
1241 MOV BX,OFFSET IFSR ;AN008;
1242 XOR AX,AX ;AN008;
1243 MOV ES:[BX.IFSR_RETCODE],AX ; restore error fields ;AN008;
1244 MOV ES:[BX.IFSR_RETCLASS],AL ;AN008;
1245 JMP AA_40 ; go process next ifs driver ;AN000;
1246 ;AN000;
1247AA_100: ;AN000;
1248 RestoreReg <DI,ES> ; restore 1st ifs driver ;AN000;
1249AA_120: ;AN000;
1250 ADD SI,DX ; ** Next CDS ;AN000;
1251 DEC CX ;AN000;
1252 JZ AA_990 ;AC004;
1253 JMP AA_10 ;AN000;
1254 ;AN000;
1255 ;AN000;
1256AA_990: ;AC004;
1257 RestoreReg <DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000;
1258AA_1000: ;AN004;
1259 AND CS:IFSPROC_FLAGS,NOT IsInit ; reset isinit ;AN010;
1260 return ;AN000;
1261 ;AN000;
1262EndProc AUTO_ATTACH ;AN000;
1263 ;AN000;
1264 ;AN000;
1265BREAK <CHECK_UNC_PRESENCE -- check if UNC file system driver ifs'ed> ;AN000;
1266 ;AN000;
1267;************************************************************************************ ;AN000;
1268; ;AN000;
1269; CHECK_UNC_PRESENCE ;AN000;
1270; ;AN000;
1271; Called by: init - general ;AN000;
1272; ;AN000;
1273; Routines called: SYSDISPMSG ;AN000;
1274; ;AN000;
1275; Inputs: ;AN000;
1276; None ;AN000;
1277; ;AN000;
1278; Function: ;AN000;
1279; Get pointer to 1st IFS header ;AN000;
1280; IF no file systems THEN ;AN000;
1281; Display warning ;AN000;
1282; ELSE DO ;AN000;
1283; BX=0
1284; WHILE pointer .NOT. 0FFFFH ;AN000;
1285; DO ;AN000;
1286; OR BX,IFS_ATTRIBUTES
1287; IF file system driver has unc bit set THEN ;AN000;
1288; DO ;AN000;
1289; Set unc_installed flag in IFSFUNC_FLAGS ;AN000;
1290; Set UNC_FS_HDR = unc file system driver header ;AN000;
1291; Set unc_found ;AN000;
1292; ENDDO ;AN000;
1293; ENDDO ;AN000;
1294; ENDWHILE ;AN000;
1295; IF unc not found THEN ;AN000;
1296; Set UNC_FS_HDR = null ptr ;AN000;
1297; ENDIF ;AN000;
1298; IFS_ATTRS=BX
1299; ENDDO ;AN000;
1300; ENDIF ;AN000;
1301; ;AN000;
1302; Outputs: unc_installed flag set in ifsfunc_flags in unc present ;AN000;
1303; IFS_ATTRS set
1304; ;AN000;
1305;************************************************************************************ ;AN000;
1306 ;AN000;
1307 Procedure CHECK_UNC_PRESENCE,NEAR ;AN000;
1308ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1309 ;AN000;
1310 SaveReg <DS,ES,DI,BX> ; preserve ds - psp,es di storage ;AN000;
1311 MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000;
1312 INT 21h ; es:bx -> sysinitvars ;AN000;
1313 LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000;
1314 XOR BX,BX ;AN000;
1315 CMP DI,NULL_PTR ; if 1st null, then no drivers ;AN000;
1316 JNE CUP_20 ; must display no driver msg ;AN000;
1317 MOV AX,ES ;AN000;
1318 CMP AX,NULL_PTR ;AN000;
1319 JNE CUP_20 ;AN000;
1320 ;AN000;
1321 MOV AX,UTIL_ERR_4 ; def 4 "No IFS drivers found",CR,LF ;AN000;
1322 MOV BX,STDERR ;AN000;
1323 XOR CX,CX ;AN000;
1324 MOV DL,NO_INPUT ;AN000;
1325 MOV DH,UTILITY_MSG_CLASS ;AN000;
1326 PUSH CS ;AN000;
1327 POP DS ;AN000;
1328 CALL SYSDISPMSG ;AN000;
1329 MOV CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000;
1330 ;AN000;
1331 JMP SHORT CUP_1000 ;AN000;
1332 ;AN000;
1333CUP_20: ;AN000;
1334 OR BX,ES:[DI.IFS_ATTRIBUTE]
1335 TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ; now set UNC_FS_HDR ;AN000;
1336 JNZ CUP_40 ;AN000;
1337CUP_30:
1338 LES DI,ES:[DI.IFS_NEXT] ;AN000;
1339 CMP DI,NULL_PTR ;AN000;
1340 JNE CUP_20 ;AN000;
1341 MOV AX,ES ;AN000;
1342 CMP AX,NULL_PTR ;AN000;
1343 JNE CUP_20 ;AN000;
1344 TEST IFSFUNC_FLAGS,UNC_INSTALLED
1345 JNZ CUP_1000
1346 MOV WORD PTR [UNC_FS_HDR],NULL_PTR ; no unc - set unc ptr null ;AN000;
1347 MOV WORD PTR [UNC_FS_HDR+2],NULL_PTR ;AN000;
1348 JMP SHORT CUP_1000 ;AN000;
1349 ;AN000;
1350CUP_40: ; found unc - set unc ptr ;AN000;
1351 MOV WORD PTR [UNC_FS_HDR],DI ; and unc flag ;AN000;
1352 MOV WORD PTR [UNC_FS_HDR+2],ES ;AN000;
1353 OR IFSFUNC_FLAGS,UNC_INSTALLED ;AN000;
1354 JMP SHORT CUP_30 ;AN000;
1355 ;AN000;
1356 ;AN000;
1357CUP_1000: ;AN000;
1358 RestoreReg <BX,DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000;
1359 return ;AN000;
1360
1361include msgdcl.inc
1362 ;AN000;
1363EndProc CHECK_UNC_PRESENCE ;AN000;
1364 ;AN000;
1365 ;AN000;
1366IFSSEG ENDS ;AN000;
1367 ;AN000;
1368STACK SEGMENT STACK ;AN000;
1369DB 278 + 128 DUP (?) ; 278 == IBM's ROM requirements ;AN000;
1370STACK ENDS ;AN000;
1371 ;AN000;
1372END IFSFUNCinit ;AN000;
1373END ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC
new file mode 100644
index 0000000..d986ca9
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC
@@ -0,0 +1,92 @@
1;****************************************************************************** ;AN000;
2; IFSFUNC Parse Symbol File ;AN000;
3; ;AN000;
4; Parsing: NAMES = n ;;;alias[n | (n {m})] ;AN000;
5; ;AN000;
6; Modification history: ;AN000;
7; Created: May 30 1987 ;AN000;
8; ;AN000;
9; LOD - 35 ;AN000;
10; ;AN000;
11;****************************************************************************** ;AN000;
12 ;AN000;
13IFSF_PARMS LABEL WORD ; IFSFUNC parms input block ;AN000;
14 DW IFSF_PARMSX ; offset of ifsfunc parms extension block ;AN000;
15 DB 0 ; No extra delimeters or eol chars ;AN000;
16 ;AN000;
17IFSF_PARMSX LABEL BYTE ; IFSFUNC parm extension block ;AN000;
18 DB 0,0,0 ; 0 positionals, 0 switches ;AN000;
19 DB 1 ; 1 keyword (NAMES=) ;AN000;
20 DW IFSF_K1 ;AN000;
21 ;AN000;
22IFSF_K1 LABEL WORD ; IFSFUNC 1 keyword ;AN000;
23 DW 8001h ; Numeric/optional(NAMES= ok) ;AN000;
24 DW 0 ; no function ;AN000;
25 DW IFSF_RESULT ; Result buffer ;AN000;
26 DW IFSF_K1_VAL ; value list ;AN000;
27 DB 1 ; 1 keyword ;AN000;
28 DB "NAMES=",0 ;AN000;
29 ;AN000;
30IFSF_K1_VAL LABEL BYTE ; value definition ;AN000;
31 DB 1 ; # value defns: get one: n or (n,m) ;AN000;
32 DB 1 ; # ranges ;AN000;
33 DB "N" ; value to return if n in range ;AN000;
34 DD 0,255 ; range ;AN000;
35 ;AN000;
36 ;AN000;
37;;;alias Complex control blocks ;AN000;
38; ;AN000;
39; IFSF_COMPLEX_PARMS LABEL WORD ;AN000;
40; DW IFSF_COMPLEX_PARMSX ;AN000;
41; DB 0 ; No extra delimeters or eol chars ;AN000;
42; ;AN000;
43; IFSF_COMPLEX_PARMSX LABEL BYTE ; ;AN000;
44; DB 1,2 ; Min 1, Max 2 positionals ;AN000;
45; DW IFSF_COMPLEX_POS1 ;AN000;
46; DW IFSF_COMPLEX_POS2 ;AN000;
47; DB 0,0 ; 0 switches, 0 keywords ;AN000;
48; ;AN000;
49; IFSF_COMPLEX_POS1 LABEL WORD ; ;AN000;
50; DW 8001h ; N - optional ;AN000;
51; DW 0 ; no function ;AN000;
52; DW IFSF_RESULT ; Result buffer ;AN000;
53; DW IFSF_POS_VAL ; value list ;AN000;
54; DB 0 ; no switches/keywords ;AN000;
55; ;AN000;
56; IFSF_COMPLEX_POS2 LABEL WORD ; ;AN000;
57; DW 8001H ; Numeric value, optional ;AN000;
58; DW 0 ; no function ;AN000;
59; DW IFSF_RESULT ; Result value buffer ;AN000;
60; DW IFSF_POS_VAL ; value list ;AN000;
61;;;alias DB 0 ; no switches/keywords ;AN000;
62; ;AN000;
63;FSF_POS_VAL LABEL BYTE ; value definition ;AN000;
64; DB 2 ; N and M ;AN000;
65; DB 2 ; 2 ranges ;AN000;
66; DB "N" ; item tag for N ;AN000;
67; DD 0,255 ; range of N ;AN000;
68; DB "M" ; item tag for M ;AN000;
69;;;aliasDD 0,8160 ; range of M ;AN000;
70 ;AN000;
71IFSF_RESULT LABEL BYTE ;AN000;
72 DB ? ; type - 1=number, 4=complex ;AN000;
73IFSF_TAG DB ? ; item tag returned: N,M or FF ;AN000;
74 DW ? ;AN000;
75IFSF_NM DB ? ; actual n or m value ;AN000;
76 DB ? ;AN000;
77 DB ? ;AN000;
78 DB ? ;AN000;
79 ;AN000;
80 ;AN000;
81; parser assemble switches ;AN000;
82DateSW equ 0 ;AN000;
83TimeSW equ 0 ;AN000;
84FileSW equ 0 ;AN000;
85CAPSW equ 0 ;AN000;
86DrvSW equ 0 ;AN000;
87QusSW equ 0 ;AN000;
88SwSW equ 0 ;AN000;
89Val3SW equ 0 ;AN000;
90 ;AN000;
91 ;AN000;
92 include PARSE.ASM ;together with PSDATA.INC ;AN000;
diff --git a/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM
new file mode 100644
index 0000000..8eba357
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM
@@ -0,0 +1,2187 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC SESSION ROUTINES - IFS Attach Routines ;AN000;
4NAME IFSSESS ;AN000;
5;************************************************************************************
6;
7; IFSSESS
8;
9; Session related IFS calls (Session = attachment)
10;
11; IFS_ASSOPER
12; RETURN_ASSIGN_MODE
13; SET_ASSIGN_MODE
14; GET_IFSFUNC_ITEM
15; ATTACH_START
16; ATTACH_END
17; IFS_RESET_ENVIRONMENT
18; IFS_ABORT
19; GET_IFS_DRIVER_NAME
20; FIND_IFS_DRIVER
21; AssignOn/AssignOff
22; PrintOn/PrintOff
23; GET_UNC_ITEM_INFO
24;
25; REVISION HISTORY:
26; A000 Original version 4.00 May 1987
27; A001 DCR 158 - merge unc info in attach start/status requests 8/87 RGAZZIA
28; A002 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA
29; A003 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA
30; A004 PTM 764 - Printer attach problems 8/87 RGAZZIA
31; A005 DCR 213 - SFT Serial Number 9/87 RGazzia
32; A006 PTM 849 - Printer open problems 9/87 RGazzia
33; A007 P242 - IFSFUNC hangs on 2nd install. 8/87 rg
34; A008 P1244- Net Print problems 8/87 rg
35; A009 P1411- Net Use erroneous pause 10/87 rg
36; A010 P2270- Filesys network drive problems 11/87 RG
37; A011 P2312- Allow Net Use status to show FILESYSed network devices 11/87 RG
38; Do this via user word: 0001 without password
39; 8001 with password
40; A012 P2307- Critical error problems 11/87 RG
41; A013 P2379- Filesys status fails without network installed 11/87 RGazzia
42; A014 P2952- dfl problem 1/88 RG
43; A015 P3251- net trans problem (library.exe) 1/88 RG
44; A016 P3334- new abort subfunc - reset environment 2/88 RMG
45; A017 P3673- Filesys problems again. A010 not fixed right....3/14/88 RMG
46; A018 Austin deviceless attach problems 3/29/88 RMG
47; A019 P4188- names=0 problems 4/08/88 RMG
48; A020 Austin garbage attach problem 4/11/88 RMG
49; A021 P4140 dos ext err msgs enhancement 4/19/88 RMG
50; A022 P4249 filesys problems related to gii bx ret on user stack 4/21/88 RMG
51; A023 P4540 fAssign,fPrint out of swappable area 4/28/88 RMG
52; A024 P4731 find ifs driver must check for none 5/4/88 RMG
53; A025 P4839 ctrl ptrsc problems 5/13/88 RMG
54; A026 P4789 message problems w/no ifs drivers loaded 5/18/88 RMG
55; A027 P4791 Don't overwrite ax on error 5/19/88 RMG
56; A028 Error code problems w/no ifs drivers 5/20/88 RMG
57; A029 GII error path fixup 5/24/88 RMG
58; A030 P5005 Print stream problems 6/1/88 RMG
59;
60; LOC - 871
61; LOD - 63
62;
63;************************************************************************************
64 ;AN000;
65.xlist ;AN000;
66.xcref ;AN000;
67INCLUDE IFSSYM.INC ;AN000;
68INCLUDE IFSFSYM.INC ;AN000;
69INCLUDE DOSSYM.INC ;AN000;
70INCLUDE DEVSYM.INC ;AN000;
71.cref ;AN000;
72.list ;AN000;
73 ;AN000;
74AsmVars <IBM, Installed, DEBUG> ;AN000;
75 ;AN000;
76; define the base code segment of the network support first ;AN000;
77 ;AN000;
78IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
79IFSSEG ENDS ;AN000;
80 ;AN000;
81; ;AN000;
82; NOTE: We cannot include DOSSEG here because the START seg is not declared ;AN000;
83; as PARA aligned in DOSSEG. ;AN000;
84; ;AN000;
85 ;AN000;
86START SEGMENT PARA PUBLIC 'START' ;AN000;
87START ENDS ;AN000;
88 ;AN000;
89CONSTANTS SEGMENT WORD PUBLIC 'CONST' ;AN000;
90CONSTANTS ENDS ;AN000;
91 ;AN000;
92DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
93DATA ENDS ;AN000;
94 ;AN000;
95TABLE SEGMENT BYTE PUBLIC 'TABLE' ;AN000;
96TABLE ENDS ;AN000;
97 ;AN000;
98CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
99CODE ENDS ;AN000;
100 ;AN000;
101LAST SEGMENT PARA PUBLIC 'LAST' ;AN000;
102LAST ENDS ;AN000;
103 ;AN000;
104DOSGROUP GROUP START,CONSTANTS,DATA,TABLE,CODE,LAST ;AN000;
105 ;AN000;
106 ;AN000;
107DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
108 ;DOSGROUP Data ;AN000;
109 Extrn CurrentPDB:WORD ;AN000;
110 Extrn THISCDS:DWORD ;AN000;
111 Extrn CDSAddr:DWORD ;AN000;
112 Extrn CDSCount:BYTE ;AN000;
113 Extrn MYNAME:BYTE ;AN000;
114 Extrn DummyCDS:BYTE ;AN000;
115 Extrn sftFCB:DWORD ;AN000;
116 Extrn THISSFT:DWORD ;AN000;
117 Extrn SysInitTable:BYTE ;AN000;
118 Extrn EXIT_TYPE:BYTE ;AN000;
119 Extrn IFS_HEADER:DWORD ;AN000;
120if debug ;AN000;
121 Extrn BugLev:WORD ;AN000;
122 Extrn BugTyp:WORD ;AN000;
123 include bugtyp.asm ;AN000;
124endif ;AN000;
125DATA ENDS ;AN000;
126 ;AN000;
127 ;AN000;
128; define our own code segment ;AN000;
129 ;AN000;
130IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
131 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
132 ;AN000;
133 ;IFS Data - external ;AN000;
134 Extrn TEMPBUF:BYTE ;AN000;
135 ;AN000;
136 ;IFS Data - public - *** IFSFUNC SWAPPABLE DATA AREA *** ;AN000;
137 ;AN000;
138PUBLIC IFSF_SWAP_START ;AN000;
139IFSF_SWAP_START LABEL BYTE ;AN000;
140 ;AN000;
141 PUBLIC THISIFS ;AN000;
142THISIFS DD -1 ;AN000;
143
144 PUBLIC THISDFL ;AN000;
145THISDFL DD -1 ;AN000;
146
147 PUBLIC IFSR ;AN000;
148IFSR DB 72 DUP (0) ;AN000;
149
150 PUBLIC SFF1 ;AN000;
151SFF1 DB 62 DUP (0) ;AN000;
152
153 PUBLIC CD1 ;AN000;
154CD1 DW 84 DUP (0) ;AN000;
155
156 PUBLIC DF1 ;AN000;
157DF1 DW 18 DUP (0) ;AN000;
158
159 PUBLIC IFSPROC_FLAGS ;AN000;
160IFSPROC_FLAGS DW 0 ;AN000;
161
162; Number of net drive (0=A) for use on net I 24 ;AN000;
163 PUBLIC IFSDRV ;AN000;
164IFSDRV DB -1 ;AN000;
165
166 PUBLIC DEVICE_CB@_OFFSET ;AN000;
167; This used to set offset of ifsr_device_cb@ in common routine cds_to_cd ;AN000;
168; in ifsutil. If not used, offset always 1EH since that's what it is at ;AN000;
169; ifsutil assembly time. This not good for control fcns (attstart,attstat). ;AN000;
170DEVICE_CB@_OFFSET DW 0 ; offset in ifsrh of device cb@ ;AN000;
171
172 PUBLIC SAVE_CB@ ;AN000;
173; This used by SFT_TO_SFF and SFF_TO_SFT routines in IFSUTIL to save cds ptr. ;AN000;
174SAVE_CB@ DD -1 ;AN000;
175
176 PUBLIC IFSSEM ;AN021;
177; This used as byte of semaphores. ;AN021;
178IFSSEM DB 0 ;AN021;
179
180IFSF_SWAP_END LABEL BYTE ;AN000;
181PUBLIC IFSF_SWAP_END ;AN000;
182 ;AN000;
183 ;IFS Data - public ;AN000;
184 ;AN000;
185 PUBLIC DFLAddr ;AN000;
186DFLAddr DD -1 ;AN000;
187
188 PUBLIC DFLCount ;AN000;
189DFLCount DB 0 ;AN000;
190
191;;;aliasPUBLIC NLAddr ;AN000;
192;;;aliasNLAddr DD -1 ;AN000;
193
194;;;aliasPUBLIC NLSIZE ;AN000;
195;;;aliasNLSIZE DW 0 ;AN000;
196
197 PUBLIC CDSAlt ;AN000;
198CDSAlt DD -1 ;AN000;
199
200 PUBLIC UNC_FS_HDR ;AN000;
201UNC_FS_HDR DD -1 ;AN000;
202
203 PUBLIC IFSFUNC_FLAGS ;AN000;
204IFSFUNC_FLAGS DW 0 ;AN000;
205
206 PUBLIC IFS_ATTRS ;AN000;
207IFS_ATTRS DW 0 ; all ifs_attribute words from ifs ;AN000;
208 ; headers or'ed together (ifsinit) ;AN000;
209 PUBLIC DOSCALL@ ;AN000;
210DOSCALL@ DD 0 ; IFS_DOSCALL@ set by ibmbio ;AN000;
211
212 PUBLIC SFT_SERIAL_NUMBER ;AN005;
213SFT_SERIAL_NUMBER DW 0 ; to get sfts unique for fcb reasons ;AN005;
214
215 PUBLIC fAssign ;AC023;
216fAssign DB -1 ;AC023;
217
218 PUBLIC fPrint ;AC023;
219fPrint DB -1 ;AC023;
220
221 PUBLIC TRUNCATE_FLAG ;AC030;moved out of swap
222TRUNCATE_FLAG DB 0 ;AC030; " "
223
224
225 ;IFS Data - local ;AN000;
226 ;AN000;
227;SetBP DB 0 ; flag indicates whether to return ;AD003;
228 ; LSN on getuncitem call (GII) ;AN000;
229;ERROR_STATUS DW 1 ; Status returned on error return ;AD029;
230ERROR_STATUS DB "ERROR",0 ; from fs (GII) ;AC029;
231 ;AN000;
232 ;AN000;
233BREAK <IFS_ASSOPER -- Do the $Assignoper call> ;AN000;
234 ;AN000;
235copyright db " IFSFUNC.EXE " ;AN000;
236INCLUDE copyrigh.inc
237
238;************************************************************************************ ;AN000;
239; ;AN000;
240; IFS_ASSOPER ;AN000;
241; ;AN000;
242; Called by: IFSFUNC dispatcher ;AN000;
243; ;AN000;
244; Routines called: ;AN000;
245; RETURN_ASSIGN_MODE ;AN000;
246; SET_ASSIGN_MODE ;AN000;
247; GET_IFSFUNC_ITEM ;AN000;
248; ATTACH_START ;AN000;
249; ATTACH_END ;AN000;
250; ;AN000;
251; Inputs: ;AN000;
252; AL = 00 get / 01 set - redir assign mode (Return/Set Mode) ;AN000;
253; AL = 02 get attach list entry (Get ifsfunc item) ;AN000;
254; AL = 03 Define Macro (attach start) ;AN000;
255; AL = 04 Cancel Attach (attach end) ;AN000;
256; AL = 05 Revised get assign list entry (Getifsfuncitem2) ;AN000;
257; AL = 06 Get IFSFUNC Item (Getifsfuncitem3) ;AN003;
258; Function: ;AN000;
259; IF AL=0 call RETURN_ASSIGN_MODE ;AN000;
260; ELSE IF AL=1 call SET_ASSIGN_MODE ;AN000;
261; ELSE IF AL=2 call GET_IFSFUNC_ITEM ;AN000;
262; ELSE IF AL=3 call ATTACH_START ;AN000;
263; ELSE IF AL=4 call ATTACH_END ;AN000;
264; ;AN000;
265; Outputs: ;AN000;
266; see subroutines ;AN000;
267; ;AN000;
268;************************************************************************************ ;AN000;
269 ;AN000;
270AO_TABLE LABEL WORD ;AN000;
271 DW RETURN_ASSIGN_MODE ;AN000;
272 DW SET_ASSIGN_MODE ;AN000;
273 DW GET_IFSFUNC_ITEM ;AN000;
274 DW ATTACH_START ;AN000;
275 DW ATTACH_END ;AN000;
276 DW GET_IFSFUNC_ITEM2 ;AN000;
277 DW GET_IFSFUNC_ITEM3 ;AN003;
278 ;AN000;
279 Procedure IFS_ASSOPER,NEAR ;AN000;
280ASSUME DS:NOTHING,ES:NOTHING ;AN000;
281 ;AN000;
282 TEST CS:IFSFUNC_FLAGS,no_ifs_drivers
283 JZ AO_20
284AO_10:
285 MOV AX,error_not_supported
286 transfer ifs_980
287AO_20:
288 CMP AL,0
289 JNE AO_40
290 CMP AL,1
291 JNE AO_40
292 TEST CS:IFSFUNC_FLAGS,unc_installed
293 JZ AO_10
294AO_40:
295 MOV CS:IFSPROC_FLAGS,ZERO ;AN000;
296 PUSH BX ; save macro type ;AN000;
297 XOR AH,AH ;AN000;
298 SHL AL,1 ; AL x 2 ;AN000;
299 MOV BX,AX ;AN000;
300 JMP CS:AO_TABLE[BX] ;AN000;
301 ;AN000;
302EndProc IFS_ASSOPER ;AN000;
303 ;AN000;
304BREAK <RETURN_ASSIGN_MODE -- Return Assign Mode> ;AN000;
305 ;AN000;
306;************************************************************************************ ;AN000;
307; ;AN000;
308; RETURN_ASSIGN_MODE ;AN000;
309; ;AN000;
310; Called by: IFS_ASSOPER ;AN000;
311; ;AN000;
312; Routines called: DOS: Get_User_Stack ;AN000;
313; ;AN000;
314; Inputs: ;AN000;
315; BL = macro type ;AN000;
316; Function: ;AN000;
317; If macro type = 3 (network printer) THEN ;AN000;
318; BX = fPrint .AND. 1 ;AN000;
319; Elseif macro type = 4 (network disk) THEN ;AN000;
320; BX = fAssign .AND. 1 ;AN000;
321; Else set error_invalid_function ;AN000;
322; ;AN000;
323; Output: ;AN000;
324; IF AL==0 BX value on user stack ;AN000;
325; ;AN000;
326; Notes: This routine is used only for UNC file system. This is the ;AN000;
327; only FS that supports pause. ;AN000;
328; ;AN000;
329;************************************************************************************ ;AN000;
330 ;AN000;
331 Procedure RETURN_ASSIGN_MODE,NEAR ;AN000;
332ASSUME DS:NOTHING,ES:NOTHING ;AN000;
333 ;AN000;
334 POP BX ; macro type ;AN000;
335 CMP BL,3 ; if (type == drive) ;AN000;
336 JZ GAM_20 ;AN000;
337 CMP BL,4 ;AN000;
338 JNZ GAM_60 ;AN000;
339 MOV BH,fAssign ; t = fAssign; ;AN000;
340 JMP Short GAM_40 ; else ;AN000;
341 ;AN000;
342GAM_20: ; if (type == print) ;AN000;
343 MOV BH,fPrint ; t = fPrint; ;AN000;
344GAM_40: ;AN000;
345 AND BH,1 ; return t&1; ;AN000;
346 CallInstall Get_User_Stack,multDOS,24 ;AN000;
347 MOV [SI].User_BX,BX ;AN000;
348 transfer ifs_990 ; go to general good ret in util ;AN000;
349 ;AN000;
350GAM_60: ;AN000;
351 MOV AL,error_invalid_function ;AN000;
352 transfer ifs_980 ; go to general bad ret in util ;AN000;
353 ;AN000;
354 ;AN000;
355EndProc RETURN_ASSIGN_MODE ;AN000;
356 ;AN000;
357BREAK <SET_ASSIGN_MODE -- set assign mode> ;AN000;
358 ;AN000;
359;************************************************************************************ ;AN000;
360; ;AN000;
361; SET_ASSIGN_MODE ;AN000;
362; ;AN000;
363; Called by: IFS_ASSOPER ;AN000;
364; ;AN000;
365; Routines called: ;AN000;
366; ;AN000;
367; Inputs: ;AN000;
368; BL = macro type ;AN000;
369; BH = assign mode (0 = off - pause, 1 = on - no pause) ;AN000;
370; ;AN000;
371; Function: ;AN000;
372; ;AN000;
373; Output: ;AN000;
374; ;AN000;
375;************************************************************************************ ;AN000;
376 ;AN000;
377 Procedure SET_ASSIGN_MODE,NEAR ;AN000;
378ASSUME DS:NOTHING,ES:NOTHING ;AN000;
379 ;AN000;
380 POP BX ; restore macro type (3 or 4) ;AN000;
381 ;AN000;
382 CMP BL,3 ; check if printer or drive ;AN000;
383 JNZ SAM_40 ; ;AN000;
384 OR BH,BH ; printer - check mode ;AN000;
385 JZ SAM_20 ; off - go pause ;AN000;
386 CMP BH,1 ;AN000;
387 JNZ SAM_80 ; jump on parm error ;AN000;
388 CALL PrintOn ; turn print on ;AN000;
389 transfer ifs_990 ; go to general good ret in util ;AN000;
390 ;AN000;
391SAM_20: ; print off - pause ;AN000;
392 CALL PrintOff ;AN000;
393 transfer ifs_990 ; go to general good ret in util ;AN000;
394 ;AN000;
395SAM_40: ; Drive ;AN000;
396 CMP BL,4 ;AN000;
397 JNZ SAM_80 ; jump on parm error ;AN000;
398 OR BH,BH ;AN000;
399 JZ SAM_60 ;AN000;
400 CMP BH,1 ;AN000;
401 JNZ SAM_80 ; jump on parm error ;AN000;
402 CALL AssignOn ; drive on ;AN000;
403 transfer ifs_990 ; go to general good ret in util ;AN000;
404 ;AN000;
405SAM_60: ; drive off ;AN000;
406 invoke AssignOff ; turn drives off (pause) ;AN000;
407 transfer ifs_990 ; go to general good ret in util ;AN000;
408 ;AN000;
409 ;AN000;
410SAM_80: ;AN000;
411 MOV AX,error_invalid_parameter ;AN000;
412 invoke SET_EXTERR_INFO ;AN000;
413 transfer ifs_980 ; go to general bad ret in util ;AN000;
414 ;AN000;
415 ;AN000;
416EndProc SET_ASSIGN_MODE ;AN000;
417 ;AN000;
418BREAK <GET_IFSFUNC_ITEM -- for get attach list > ;AN000;
419 ;AN000;
420;************************************************************************************ ;AN000;
421; ;AN000;
422; GET_IFSFUNC_ITEM ;AN000;
423; ;AN000;
424; Called by: IFS_ASSOPER ;AN000;
425; ;AN000;
426; Routines called: ;AN000;
427; GET_IFS_DRIVER_NAME DOS: STRCPY ;AN000;
428; CDS_TO_CD GET_USER_STACK ;AN000;
429; DFL_TO_DF ;AN000;
430; CALL_IFS ;AN000;
431; ;AN000;
432; Inputs: ;AN000;
433; BL = redirection index ;AN000;
434; DS:SI -> Device name buffer ;AN000;
435; ES:DI -> Target buffer: old - net path string ;AN000;
436; new - dw file system driver name
437; dw # parms
438; db parms
439; Function: ;AN000;
440; STRUCTURE = 1st CDS ;AN000;
441; INDEX = 0 ;AN000;
442; WHILE CDS structures ;AN000;
443; DO ;AN000;
444; IF curdir_isIFS TRUE THEN ;AN000;
445; DO ;AN000;
446; IF INDEX = BL THEN ;AN000;
447; DO ;AN000;
448; DS:SI = Letter version of Index (0=A:, 1=B:, ...) ;AN000;
449; IF IFS .NOT. UNC THEN ;AN000;
450; DO ;AN000;
451; ES:[DI] = IFS name (retrieved from CURDIR_IFSR_HDR) ;AN000;
452; Send ATTACH_STAT request to IFS for parms ;AN000;
453; ES:DI+2 = IFS parms ;AN000;
454; FOUND = true ;AN000;
455; TYPE = 2 ;AN000;
456; LEAVE WHILE ;AN000;
457; ENDDO ;AN000;
458; ELSE DO ;AN000;
459; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000;
460; Move parms into one buffer and point with ES:DI ;AN000;
461; FOUND = true ;AN000;
462; TYPE = 4 ;AN000;
463; LEAVE WHILE ;AN000;
464; ENDDO ;AN000;
465; ELSE DO ;AN000;
466; IF IFS UNC THEN ;AN000;
467; DO ;AN000;
468; INDEX=INDEX+1 ;AN000;
469; IF INDEX = BL THEN ;AN000;
470; DO ;AN000;
471; DS:SI = Letter version of Index (0=A:, 1=B:, ;AN000;
472; ES:DI = "REDIR" ;AN000;
473; FOUND = true ;AN000;
474; TYPE = 2 ;AN000;
475; LEAVE WHILE ;AN000;
476; ENDDO ;AN000;
477; ENDIF ;AN000;
478; ENDDO ;AN000;
479; ENDIF ;AN000;
480; ENDDO ;AN000;
481; ENDIF ;AN000;
482; ENDDO ;AN000;
483; ENDIF ;AN000;
484; Get next CDS structure ;AN000;
485; ENDDO ;AN000;
486; ENDWHILE ;AN000;
487; IF FOUND = false THEN ;AN000;
488; DO ;AN000;
489; STRUCTURE = 1st DFL ;AN000;
490; WHILE DFL structures ;AN000;
491; DO ;AN000;
492; IF INDEX = BL THEN ;AN000;
493; DO ;AN000;
494; DS:SI = name pointed to by DFLL_NAME_PTR ;AN000;
495; IF IFS .NOT. UNC THEN ;AN000;
496; DO ;AN000;
497; ES:[DI] = IFS name (retrieved from DFLL_IFSR_HDR) ;AN000;
498; Send ATTACH_STAT request to IFS for parms ;AN000;
499; ES:DI+2 = IFS parms ;AN000;
500; FOUND = true ;AN000;
501; TYPE = 1 ;AN000;
502; LEAVE WHILE ;AN000;
503; ENDDO ;AN000;
504; ELSE DO ;AN000;
505; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000;
506; Move parms into one buffer and point with ES:DI ;AN000;
507; FOUND = true ;AN000;
508; TYPE = 3 ;AN000;
509; LEAVE WHILE ;AN000;
510; ENDDO ;AN000;
511; ELSE DO ;AN000;
512; IF IFS UNC THEN ;AN000;
513; DO ;AN000;
514; INDEX=INDEX+1 ;AN000;
515; IF INDEX = BL THEN ;AN000;
516; DO ;AN000;
517; ES:DI = "REDIR" ;AN000;
518; FOUND = true ;AN000;
519; TYPE = 3 ;AN000;
520; LEAVE WHILE ;AN000;
521; ENDDO ;AN000;
522; ENDIF ;AN000;
523; ENDDO ;AN000;
524; ENDIF ;AN000;
525; ENDDO ;AN000;
526; ENDIF ;AN000;
527; Get next DFL structure ;AN000;
528; ENDWHILE ;AN000;
529; ENDDO ;AN000;
530; ENDIF ;AN000;
531; IF FOUND = FALSE THEN ;AN000;
532; DO ;AN000;
533; Set carry ;AN000;
534; AX = 18 ;AN000;
535; ENDDO ;AN000;
536; ELSE Clear carry ;AN000;
537; ENDIF ;AN000;
538;
539; IFSRH for Attach Start:
540; * IFSR_LENGTH DW 32 ; Request length
541; * IFSR_FUNCTION DB 3 ; Attach Start
542; + IFSR_RETCODE DW 0
543; + IFSR_RETCLASS DB ?
544; IFSR_RESV1 DB 16 DUP(0)
545; + IFSR_TYPE DB ? ; BL (1,2,3,or 4)
546; IFSR_RESV2 DB ?
547; *+ IFSR_PARMS@ DD PARMS ; See below
548; *+ IFSR_DEVICE_CB@ DD ? ; CD or DF (See below)
549; + IFSR_USER_WORD DW ?
550; + IFSR_MAX_XMITT_SIZE DW ?
551; + IFSR_NET_NAME_ID DW ?
552; + IFSR_LSN DW ?
553; + IFSR_DEVICE_STATUS DB ?
554; IFSR_RESV3 DB ?
555;
556;
557;
558; *+ PARMS LABEL WORD
559; DW PARMCOUNT ; Number of parms. (only for new style)
560; DB ASCIIZ,...; Parms
561;
562; ;AN000;
563; Outputs: ;AN000;
564; No Carry - BH = device status flag ;AN000;
565; bit 0=0 is device valid ;AN000;
566; 1 if device invalid ;AN000;
567; BL = device type ;AN000;
568; DS:SI = ASCIIZ local device name ;AN000;
569; ES:DI = ASCIIZ network name ;AN000;
570; For old style call:
571; CX = user word ;AN000;
572; DX = max xmitt size
573; BP = Low 8 bits has LSN from NCB_LIST if input AL ^=0
574; AX = Net name ID
575;
576; Carry - AX = Error code ;AN000;
577; 18 - end of list ;AN000;
578; Regs: ;AN000;
579; ;AN000;
580;************************************************************************************ ;AN000;
581 USER_WORD DW 0 ; i give in - temp storage
582 ;AN000;
583 Procedure GET_IFSFUNC_ITEM ;AC003;
584ASSUME DS:NOTHING,ES:NOTHING ;AC003;
585 ; get_ifsfunc_item and get_ifsfunc_item2 ;AC003;
586 MOV CS:IFSPROC_FLAGS,ZERO ; are old style - types 3,4 only ;AC003;
587 JMP SHORT GII_20 ;AC003;
588 ;AC003;
589 entry GET_IFSFUNC_ITEM2 ;AC003;
590 MOV CS:IFSPROC_FLAGS,SetBP ; set this to get lsn ;AC003;
591 JMP SHORT GII_20 ;AC003;
592 ;AC003;
593 entry GET_IFSFUNC_ITEM3 ; new style get ifsfunc item ;AC003;
594 MOV CS:IFSPROC_FLAGS,Filesys_Status ; gets types 1,2,3,4 ;AC003;
595 ;AC003;
596;----------------------------------------------------------------------------------------;AC003;
597; drive loop ;AC003;
598;----------------------------------------------------------------------------------------;AC003;
599 ;AC003;
600GII_20: ;AC003;
601 ifsr_fcn_def ATTSTAT ; define ifsr for attach status ;AC003;
602 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN006;
603 ;AC003;
604 POP BX ; index ;AC003;
605 XOR AX,AX ; ax will be counter through CDSs ;AC003;
606 SaveReg <DS,SI> ; save device/drive name buffer ;AC003;
607GII_40: ;AC003;
608 CMP AL,SS:[CDSCount] ; if run out of CDSs, ;AC003;
609 JB GII_60 ; go to devices ;AC003;
610 XOR AL,AL ; reset for dfl count ;AC003;
611 JMP GII_400 ;AC003;
612GII_60: ;AC003;
613 SaveReg <BX,AX> ; save ax-cds count, bx-index ;AC003;
614 ;AC003;
615 LDS SI,[CDSAddr] ; Point ds:si to correct CDS entry ;AC003;
616 CMP [fAssign],ZERO ; if pause in effect, must use ;AC003;
617 JNZ GII_80 ; alternate cds list ;AC003;
618 LDS SI,[CDSAlt] ;AC003;
619 ;AC003;
620GII_80: ;AC003;
621 MOV BL,SIZE CurDir_list ; size in convenient spot ;AC003;
622 MUL BL ; get net offset ;AC003;
623 ADD SI,AX ; convert to true pointer ;AC003;
624 RestoreReg <AX,BX> ;AC003;
625 TEST [SI].curdir_flags,curdir_isnet ; make sure ifs drive ;AC003;
626 JNZ GII_100 ;AC003;
627 JMP GII_280 ; next drive ;AC003;
628GII_100: ;AC003;
629 SUB BX,1 ; jae jumps if CF=0, CF=1 when ;AC003;
630 ; index hit ;AC003;
631 JB GII_120 ;AC003;
632 JMP GII_280 ; next drive ;AC003;
633GII_120: ;AC003;
634 TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003;
635 JNZ GII_140 ;AC003;
636 CMP [SI.CURDIR_TYPE],TYPE_NET_DRIVE ; old style: check for type 4 ;AC003;
637 JE GII_140 ;AC003;
638 JMP GII_280 ; not type 4, go get next one ;AC003;
639GII_140: ;AC003;
640 RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003;
641 SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003;
642 SaveReg <ES,DI> ; while preserving es:di - target ;AC003;
643 MOV ES,CX ;AC003;
644 MOV DI,DX ;AC003;
645 ADD AL,'A' ; storing d:0 in devname buffer ;AC003;
646 STOSB ;AC003;
647 MOV AX,(0 SHL 8) + ':' ;AC003;
648 STOSW ;AC003;
649 RestoreReg <DI,ES> ; restore target ptr ;AC003;
650 ;AC003;
651 MOV BL,[SI.CURDIR_TYPE] ; set bx=type (1,2,3,4) ;AC003;
652 XOR BH,BH ;AC003;
653 TEST CS:IFSPROC_FLAGS,Filesys_status ; target different for new style ;AC003;
654 JNZ GII_150 ;AC003;
655 PUSH [SI.CURDIR_USER_WORD] ;AC003;
656 POP CS:[USER_WORD] ;AC003;
657 JMP GII_160 ;AC003;
658GII_150: ;AC003;
659 PUSH DI ; ifs drive; save target offset ;AC003;
660 MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003;
661 OR IFSPROC_FLAGS,ISCDS ; get ifs driver name into target ;AC003;
662 CALL GET_IFS_DRIVER_NAME ;AC003;
663 ;AC003;
664 POP DI ; retrieve target offset from stack ;AC003;
665 PUSH DI ;AC003;
666 INC DI ; es:di -> parm buffer ;AC003;
667 INC DI ;AC003;
668 ;AC003;
669GII_160: ;AC003;
670 SaveReg <ES,BX> ; save target segment, type ;AC003;
671 ; go to IFS to fill in rest of tgt ;AC003;
672 invoke PREP_IFSR ; init ifsr ;AC003;
673 ;AC003;
674 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC003;
675 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AC003;
676 ; ES:BX -> IFSRH ;AC003;
677 ; IFSR_DEVICE_CB@ ;AC003;
678 ; ds - IFSSEG ;AC003;
679 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003;
680 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003;
681 POP AX ; type (BX) ;AC003;
682 MOV ES:[BX.IFSR_TYPE],AL ;AC003;
683 POP DX ; target segment (ES) ;AC003;
684 ;AC003;
685 TEST IFSPROC_FLAGS,Filesys_status ;AC003;
686 JNZ GII_180 ;AC003;
687 PUSH CS ;AC003;
688 POP DS ;AC003;
689ASSUME DS:IFSSEG ;AC003;
690 MOV SI,OFFSET TEMPBUF ;AC003;
691 MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003;
692 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003;
693 PUSH DI ; push tgt offset here for later pop ;AC003;
694 JMP GII_200 ;AC003;
695GII_180: ;AC003;
696 MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003;
697 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003;
698GII_200: ;AC003;
699 PUSH AX ; push type back (BX) ;AC003;
700 ;AC003;
701;***********************************************************************************************
702 invoke CALL_IFS ; call fs with attach status request ;AC003;
703;***********************************************************************************************
704 ;AC003;
705 JNC GII_220 ;AC003;
706 ; attach status error: ;AC003;
707 RestoreReg <BX,DI> ; type,target offset ;AC003;
708 MOV ES,DX ;AC003;
709 SaveReg <DI> ; put "ERROR" in parms display ;AC003;
710 TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029;
711 JZ GII_210 ;AN029;
712 ADD DI,2 ;AC003;
713 MOV AX,1 ;AC003;
714 STOSW ;AC003;
715GII_210: ;AN029;
716 PUSH CS ;AC003;
717 POP DS ;AC003;
718ASSUME DS:IFSSEG ;AC003;
719 MOV SI,OFFSET ERROR_STATUS ;AC003;
720 MOV CX,4 ;AC003;
721 REP MOVSW ;AC003;
722 RestoreReg <DI,SI,DS> ;AC003;;AC029;
723 transfer ifs_1000 ; go to general ret in util ;AC003;
724 ;AC003;
725GII_220: ;AC003;
726 RestoreReg <AX,DI> ; device type, target offset ;AC003;
727 TEST IFSPROC_FLAGS,Filesys_status ;AC003;
728 JZ GII_240 ;AC003;
729;;;;;;;;RestoreReg <SI,DS> ; IFS drive - devname ptr ;AC003;;AD022;
730; MOV ES,DX ; target ;AC003;;AD022;
731; MOV BX,AX ;AC003;;AD022;
732;;;;;;;;transfer ifs_1000 ;AC003;;AD022;
733 JMP GII_630 ; want user bx set ;AN022;
734 ;AC003;
735GII_240: ; NET drive: ;AC003;
736 JMP GII_640 ; go down to net device processing- ;AC003;
737 ; does the same thing ;AC003;
738GII_280: ;AC003;
739 INC AX ; next drive ;AC003;
740 JMP GII_40 ;AC003;
741 ;AC003;
742;----------------------------------------------------------------------------------------;AC003;
743; device loop ;AC003;
744;----------------------------------------------------------------------------------------;AC003;
745 ;AC003;
746GII_400: ; Device loop ;AC003;
747 CMP AL,CS:[DFLCount] ; if run out of devices ;AC003;
748 JB GII_460 ;AC003;
749 JMP GII_800 ; go set no_more error ;AC003;
750GII_460: ;AC003;
751 SaveReg <BX,AX> ; save ax-dfl count, bx-index ;AC003;
752 LDS SI,CS:[DFLAddr] ; Point ds:si to correct DFL entry ;AC003;
753 MOV BL,SIZE DFLL_list ; size in convenient spot ;AC003;
754 MUL BL ; get net offset ;AC003;
755 ADD SI,AX ; convert to true pointer ;AC003;
756 RestoreReg <AX,BX> ;AC003;
757 TEST [SI.DFLL_FLAGS],DFL_INUSE ; is dfl active??? ;AC003;
758 JNZ GII_480 ;AC003;
759 JMP GII_680 ;AC003;
760GII_480: ;AC003;
761 TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003;
762 JNZ GII_520 ;AC003;
763 CMP [SI.DFLL_TYPE],TYPE_NET_DEVICE ; old style: check for type 3 ;AC003;
764 JE GII_520 ;AC003;
765 JMP GII_680 ; not type 4, go get next one ;AC003;
766GII_520: ;AC003;
767 SUB BX,1 ;AC003;
768 JB GII_540 ;AC003;
769 JMP GII_680 ; next device ;AC003;
770GII_540: ;AC003;
771 MOV WORD PTR CS:[THISDFL],SI ; set thisdfl = dssi ;AN014;
772 PUSH DS ;AN014;
773 POP WORD PTR CS:[THISDFL+2] ;AN014;
774 RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003;
775 SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003;
776 SaveReg <ES,DI> ; while preserving es:di - target ;AC003;
777 MOV ES,CX ;AC003;
778 MOV DI,DX ;AC003;
779 PUSH SI ; save DFL offset ;AC003;
780 ADD SI,DFLL_DEV_NAME ;AC003;
781 MOV CX,8 ;AC003;
782GII_545: ; store device name in asciiz format ;AC003;
783 LODSB ;AC003;
784 CMP AL," " ;AC003;
785 JE GII_550 ;AC003;
786 STOSB ;AC003;
787 LOOP GII_545 ;AC003;
788GII_550: ;AC003;
789 XOR AL,AL ;AC003;
790 STOSB ;AC003;
791 RestoreReg <SI,DI,ES> ; restore target ptr & DFL offset ;AC003;
792 ;AC003;
793 MOV BL,[SI.DFLL_TYPE] ;AC003;
794 XOR BH,BH ;AC003;
795 TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003;
796 JNZ GII_555 ;AC003;
797 PUSH [SI.DFLL_USER_WORD] ;AC003;
798 POP [USER_WORD] ;AC003;
799 JMP GII_560 ;AC003;
800GII_555: ;AC003;
801 PUSH DI ; ifs device; save target offset ;AC003;
802 MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003;
803 invoke GET_IFS_DRIVER_NAME ;AC003;
804 ;AC003;
805 POP DI ; retrieve target offset from stack ;AC003;
806 PUSH DI ;AC003;
807 INC DI ; es:di -> parm buffer ;AC003;
808 INC DI ;AC003;
809 ;AC003;
810GII_560: ;AC003;
811 SaveReg <ES,BX> ; save target segment, type ;AC003;
812 ; now go to IFS to fill in rest of target;AC003;
813 invoke PREP_IFSR ; init ifsr ;AC003;
814 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AC003;
815 ; ES:BX -> IFSRH ;AC003;
816 ; IFSR_DEVICE_CB@ ;AC003;
817 ; ds - IFSSEG ;AC003;
818 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003;
819 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003;
820 POP AX ; type (BX) ;AC003;
821 MOV ES:[BX.IFSR_TYPE],AL ;AC003;
822 POP DX ; target segment (ES) ;AC003;
823 ;AC003;
824 TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003;
825 JNZ GII_580 ;AC003;
826 PUSH CS ;AC003;
827 POP DS ;AC003;
828ASSUME DS:IFSSEG ;AC003;
829 MOV SI,OFFSET TEMPBUF ;AC003;
830 MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003;
831 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003;
832 PUSH DI ; push tgt offset here for later pop ;AC003;
833 JMP GII_600 ;AC003;
834GII_580: ;AC003;
835 MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003;
836 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003;
837GII_600: ;AC003;
838 PUSH AX ; push type back (BX) ;AC003;
839 ;AC003;
840;***********************************************************************************************
841 invoke CALL_IFS ; call fs with attach status request ;AC003;
842;***********************************************************************************************
843 ;AC003;
844 JNC GII_620 ;AC003;
845 RestoreReg <BX,DI> ; type,target offset,devname ptr ;AC003;
846 MOV ES,DX ; target ;AC003;
847 SaveReg <DI> ; put "ERROR" in parms display ;AC003;
848 TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029;
849 JZ GII_610 ;AN029;
850 ADD DI,2 ;AC003;
851 MOV AX,1 ;AC003;
852 STOSW ;AC003;
853GII_610: ;AN029;
854 PUSH CS ;AC003;
855 POP DS ;AC003;
856ASSUME DS:IFSSEG ;AC003;
857 MOV SI,OFFSET ERROR_STATUS ;AC003;
858 MOV CX,4 ;AC003;
859 REP MOVSW ;AC003;
860 RestoreReg <DI,SI,DS> ;AC003;;AC027;
861 transfer ifs_1000 ; go to general ret in util ;AC003;
862 ;AC003;
863GII_620: ;AC003;
864 RestoreReg <AX,DI> ; device type, target offset ;AC003;
865 TEST IFSPROC_FLAGS,Filesys_Status ;AC003;
866 JZ GII_640 ; IFS device: ;AC003;
867GII_630: ;AN022;
868 CallInstall Get_User_Stack,MULTdos,24,<AX>,<AX> ;AN022;
869 MOV AH,ES:[BX.IFSR_DEVICE_STATUS] ;AN022;
870 MOV [SI].USER_BX,AX ;AN022;
871 RestoreReg <SI,DS> ; target offset,devname ptr ;AC003;
872 MOV ES,DX ; target ;AC003;
873;;;;;;;;MOV BX,AX ;AC003;;AD022;
874 transfer ifs_1000 ;AC003;
875 ;AC003;
876GII_640: ; NET device: ;AC003;
877 CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003;
878 PUSH CS:[USER_WORD] ;AC003;
879 POP [SI].User_CX ; User Word ;AC003;
880 PUSH ES:[BX.IFSR_MAX_XMITT_SIZE] ;AC003;
881 POP [SI].User_DX ; Max Xmitt size ;AC003;
882 PUSH ES:[BX.IFSR_NET_NAME_ID] ;AC003/AC008/AC009
883 PUSH ES:[BX.IFSR_NET_NAME_ID] ; leave this on stack for later pop into ax ;AC009;
884 POP [SI].User_AX ; Net name ID ;AC003/AC008;
885;;;;;;;;PUSH AX ;AN008/AD009;
886
887 MOV CH,ES:[BX.IFSR_DEVICE_STATUS] ;AC003;
888 MOV CL,AL ;AC003;
889 MOV [SI].User_BX,CX ; Bits and macro type ;AC003;
890 TEST CS:IFSPROC_FLAGS,SetBP ;AC003;
891 JZ GII_660 ;AC003;
892 PUSH ES:[BX.IFSR_LSN] ;AC003;
893 POP [SI].User_BP ; LSN ;AC003;
894GII_660: ;AC003;
895 MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AC003;
896 MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AC003;
897 INC SI ; ds:si -> parms returned by redir ;AC003;
898 INC SI ;AC003;
899 MOV ES,DX ; es:di -> input target buffer ;AC003;
900 SaveReg <DI> ; save offset ;AC003;
901 CallInstall StrCpy,MultDOS,17 ;AC003;
902 RestoreReg <DI,AX,SI,DS> ; tgt offset,netpath id,devname ptr ;AC003/AC008;
903 transfer ifs_990 ;AC003;
904 ;AC003;
905GII_680: ;AC003;
906 INC AX ; next drive ;AC003;
907 JMP GII_400 ;AC003;
908 ;AC003;
909 ;AC003;
910GII_800: ; end of CDSs & devices ;AC003;
911 ; now check deviceless attaches ;AC003;
912;----------------------------------------------------------------------------------------;AC003;
913; deviceless loop ;AC003;
914;----------------------------------------------------------------------------------------;AC003;
915 ;AC003;
916 CALL GET_UNC_ITEM_INFO ;AC003;
917 JC GII_820 ;AC003;
918 RestoreReg <SI,DS> ; set dev ptr null ;AC003;
919 MOV BYTE PTR DS:[SI],ZERO ;AC003;
920 transfer ifs_990 ;AC003;
921GII_820: ;AC003;
922 MOV AX,error_no_more_files ;AC003;
923 RestoreReg <SI,DI> ; restore regs ;AC003;
924 ;AC003;
925 return ;AC003;
926 ;AC003;
927EndProc GET_IFSFUNC_ITEM ;AC003;
928 ;AN000;
929 ;AN000;
930BREAK <ATTACH_START -- Attach drive/device to IFS> ;AN000;
931 ;AN000;
932;************************************************************************************ ;AN000;
933; ;AN000;
934; ATTACH_START ;AN000;
935; ;AN000;
936; Called by: IFS_ASSOPER ;AN000;
937; ;AN000;
938; Routines called: CALL_IFS DOS: GetCDSFromDrv ;AN000;
939; CDS_TO_CD ;AN000;
940; CD_TO_CDS ;AN000;
941; CREATE_DFL_ENTRY ;AN000;
942; DELETE_DFL_ENTRY ;AN000;
943; DFL_MATCH ;AN000;
944; DFL_TO_DF ;AN000;
945; DF_TO_DFL ;AN000;
946; CALL_IFS ;AN000;
947; FIND_IFS_DRIVER ;AN000;
948;;; alias PROCESS_ALIAS ;AN000;
949; ;AN000;
950; Inputs: ;AN000;
951; BL = Macro type ;AN000;
952;;; alias = 0 alias ;AN000;
953; = 1 device/file ;AN000;
954; = 2 drive ;AN000;
955; = 3 Char device -> network ;AN000;
956; = 4 File device -> network ;AN000;
957; DS:SI -> ASCIIZ source name ;AN000;
958; ES:DI -> Target driver to attach to and parms. ;AN000;
959; DW ASCIIZ - asciiz name of driver ;AN000;
960; DW n - number of parms ;AN000;
961; DW ASCIIZ,... parms ;AN000;
962; ;AN000;
963; CX is reserved (user word for REDIR) ;AN000;
964; ;AN000;
965; Function: ;AN000;
966; IF BL > 0 THEN ;AN000;
967; DO ;AN000;
968; Check that IFS driver exists ;AN000;
969; IF found, set IFS header to that found ;AN000;
970; ELSE set error_file_system_not_found ;AN000;
971; ENDDO ;AN000;
972; IF (BL=2 .OR. BL=4) & no error THEN ;AN000;
973; DO ;AN000;
974; Find CDS for this drive ;AN000;
975; IF none exists, then set error_invalid_parameter ;AN000;
976; ELSE Call CDS_TO_CD ;AN000;
977; END ;AN000;
978; ELSE DO ;AN000;
979; IF source name not in DFL THEN ;AN000;
980; Call CREATE_DFL_ENTRY ;AN000;
981; ELSE Set error_device_already_attached ;AN000;
982; ENDIF ;AN000;
983; ENDDO ;AN000;
984; IF no error THEN ;AN000;
985; DO ;AN000;
986; Prep IFSRH for Attach Start: ;AN000;
987; * IFSR_LENGTH DW 34 ; Request length ;AN000;
988; * IFSR_FUNCTION DB 2 ; Attach Start ;AN000;
989; IFSR_RETCODE DW 0 ;AN000;
990; IFSR_RETCLASS DB ? ;AN000;
991; IFSR_RESV1 DB 16 DUP(0) ;AN000;
992; * IFSR_TYPE DB ? ; BL (0,1,2,3,or 4) ;AN000;
993; IFSR_RESV2 DB ? ;
994; * IFSR_PARMS@ DD PARMS ; See below ;AN000;
995; * IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) ;AN000;
996; * IFSR_USER_WORD DW ? ; for deviceless attach ;AN000;
997; ;AN000;
998; * PARMS LABEL WORD ;AN000;
999; DW PARMCOUNT ; Number of parms. May be 0. ;AN000;
1000; DB ASCIIZ,...; Parms ;AN000;
1001; ENDDO ;AN000;
1002; IF no error THEN ;AN000;
1003; DO ;AN000;
1004; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
1005; IF IFSR_RETCODE = 0 THEN ;AN000;
1006; DO ;AN000;
1007; IF DFL flag set THEN ;AN000;
1008; DO ;AN000;
1009; Call DF_TO_DFL ;AN000;
1010; Set DFLL_PTR to IFS header ;AN000;
1011; ENDDO ;AN000;
1012; ELSE DO ;AN000;
1013; Call CD_TO_CDS ;AN000;
1014; Set CDS_IFSR_PTR to IFS header ;AN000;
1015; ENDDO ;AN000;
1016; ENDIF ;AN000;
1017; Clear carry ;AN000;
1018; ENDDO ;AN000;
1019; ELSE DO ;AN000;
1020; IF DFL flag set THEN ;AN000;
1021; Call DELETE_DFL_ENTRY ;AN000;
1022; Set carry ;AN000;
1023; ENDDO ;AN000;
1024; ENDIF ;AN000;
1025; ENDDO ;AN000;
1026; ELSE Set carry ;AN000;
1027; ENDIF ;AN000;
1028; ;AN000;
1029;************************************************************************************ ;AN000;
1030 ;AN000;
1031 Procedure ATTACH_START,NEAR ;AN000;
1032ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1033 ;AN000;
1034 ifsr_fcn_def ATTSTART ;AN000;
1035 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
1036 ;AN000;
1037 POP BX ;AN000;
1038 XOR BH,BH ; not interested in bh, but should ;AN000;
1039 ; be 0 since later move type as word ;AN000;
1040AS_10: ;AN000;
1041 CMP BL,TYPE_DRIVE ; check ifs vs. network ;AN000;
1042 JLE AS_20 ;AN000;
1043 CMP BL,TYPE_NET_DRIVE ;AN000;
1044 JLE AS_30 ;AN000;
1045 ;AN000;
1046AS_15: ;AN000;
1047 MOV AX,error_invalid_function ; invalid fcn type ;AN000;
1048 transfer ifs_980 ; go ret w/carry ;AN000;
1049 ;AN000;
1050AS_20: ; IFS device/drive ;AN000;
1051 SaveReg <ES,DI> ; save target ptr for parms@ ;AN000;
1052 MOV DI,ES:[DI] ; set ES:DI -> driver name ;AN000;
1053 invoke FIND_IFS_DRIVER ; sets [THISIFS] ;AN000;
1054 JC AS_25 ;AN000;
1055 SaveReg <CX> ; save cx since next destroys ;AN000;
1056 invoke SET_CATEGORY ; do this to determine unc or not ;AN000;
1057 OR CL,CL ; cl=1 unc else ifs ;AN000;
1058 RestoreReg <CX> ; restore before branch - zf preserved ;AN000;
1059 JZ AS_50 ; jmp if not unc ;AN000;
1060 ADD BL,2 ; change type from 1/2 to 3/4 ;AN000;
1061 RestoreReg <DI,ES> ; retrieve orig target ptr ;AN010;
1062;;;;;;;;OR CS:IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017;
1063 CMP WORD PTR ES:[DI+2],2 ; if # parms=2 then have password ;AN011;
1064 JE AS_22 ;AN011;
1065 MOV CX,0001H ; User word without password ;AN011;
1066 JMP SHORT AS_23 ; go process as unc ;AN011;;AC017;
1067AS_22: ;AN011;
1068 MOV CX,8001H ; User word with password ;AN011;
1069AS_23: ;AN017;
1070 ADD DI,4 ; skip over ifs name offset & #parms ;AN017;
1071 JMP SHORT AS_33 ; go process as unc ;AN000;
1072
1073AS_25: ; ifs driver not found ;AN000;
1074 POP DI ; error, restore stack and return ;AN000;
1075 POP ES ;AN000;
1076 transfer ifs_1000 ;AN000;
1077 ;AN000;
1078AS_30: ; NETWORK device/drive ;AN000;
1079 TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; check that unc installed ;AN000;
1080 JZ AS_15 ;AN000;
1081AS_33: ; this label for unc already checked ;AN000;
1082 OR IFSPROC_FLAGS,IsNetwork ; set network bit ;AN000;
1083 CMP BL,TYPE_NET_DRIVE ; check pause status ;AN000;
1084 JNE AS_35 ;AN000;
1085 CMP CS:fAssign,-1 ;AN000;
1086 JMP SHORT AS_37 ;AN000;
1087AS_35: ;AN000;
1088 CMP CS:fPrint,-1 ;AN000;
1089AS_37: ;AN000;
1090 JE AS_40 ; bad pause status ;AN000;
1091 MOV AX,72 ; set error and ret w/carry ;AN000;
1092AS_38: ;AN020;
1093 PUSH CS ;AN000;
1094 POP DS ;AN000;
1095ASSUME DS:IFSSEG ;AN000;
1096 invoke SET_EXTERR_INFO ;AN000;
1097 transfer ifs_980 ;AN000;
1098 ;AN000;
1099AS_40: ;AN000;
1100 invoke SET_THISIFS_UNC ;AN000;
1101 SaveReg <CX> ;AN004;;AC015;
1102 invoke NET_TRANS ;AN000;
1103 RestoreReg <CX> ;AN004;;AC015;
1104 JNC SHORT AS_55 ;AC020;
1105 MOV AX,error_path_not_found ; net trans failure = path not found ;AN020;
1106 JMP AS_38 ;AN020;
1107 ;AN000;
1108AS_50: ;AN000;
1109 RestoreReg <DI,ES> ; restore target parm ptr ;AN000;
1110AS_55: ;AN000;
1111 OR CS:IFSPROC_FLAGS,THISIFS_SET ; do this so wont do in CDS_TO_CD ;AN000;
1112 ; or DFL_TO_DF ;AN000;
1113 CMP BL,TYPE_DEVICE ;AN000;
1114 JNE AS_55_0 ;AN000;
1115 JMP AS_200 ;AN000;
1116AS_55_0: ;AN000;
1117 CMP BL,TYPE_NET_DEVICE ;AN000;
1118 JNE AS_55_1 ;AN000;
1119 JMP AS_200 ;AN000;
1120AS_55_1: ;AN000;
1121 CMP BL,TYPE_NET_DRIVE ; deviceless attach check ;AN000;
1122 JNE AS_56 ; jmp if no ;AN000;
1123 CMP BYTE PTR [SI],0 ; DEVICELESS ATTACH ;AN000;
1124 JNZ AS_56 ; Set dummy CDS and flag ;AN000;
1125 Context DS ;AN000;
1126 MOV SI,OFFSET DOSGROUP:DummyCDS ;AN000;
1127 MOV WORD PTR [THISCDS+2],DS ;AN000;
1128 MOV WORD PTR [THISCDS],SI ;AN000;
1129 OR IFSPROC_FLAGS,ISDUMMYCDS ;AN000;
1130 JMP SHORT AS_100 ;AN000;
1131 ;AN000;
1132AS_56: ; DRIVE ATTACH ;AN000;
1133 CMP WORD PTR [SI+1],ICOLON ; if 2nd char not ":" - error ;AN000;
1134 JE AS_60 ; else - find CDS ;AN000;
1135AS_57: ;AN000;
1136 MOV AX,error_invalid_drive ;AN000;
1137 transfer ifs_980 ;AN000;
1138 ;AN000;
1139AS_60: ;AN000;
1140 LODSB ;AN000;
1141 Context DS ; get addressability to DOSGROUP ;AN000;
1142 OR AL,20H ;AN000;
1143 SUB AL,"a" ; 0=A,1=B,... ;AN000;
1144 CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000;
1145ASSUME DS:NOTHING ;AN000;
1146 JC AS_57 ; no cds - error ;AN000;
1147 TEST [SI.curdir_flags],curdir_inuse ; DS:SI -> CDS ;AN000;
1148 JZ AS_100 ;AN000;
1149 TEST [SI.curdir_flags],curdir_isnet + curdir_splice + curdir_local ;AN000;
1150 JZ AS_100 ;AN000;
1151 MOV AX,error_already_assigned ; error - CDS already assigned ;AN000;
1152 transfer ifs_980 ; go return with carry ;AN000;
1153 ;AN000;
1154AS_100: ;AN000;
1155 SaveReg <DS,SI,ES,DI> ; save real cds and target parm ptr ;AN000;
1156 ; If all goes OK this will be the "REAL" CDS ;AN000;
1157 Context ES ;AN000;
1158 MOV DI,OFFSET DOSGROUP:DummyCDS ;AN000;
1159 SaveReg <DI,CX> ; dummy cds offset, input user word ;AC001;
1160 MOV CX,SIZE curdir_list ;AN000;
1161 REP MOVSB ;AN000;
1162 RestoreReg <CX> ; input user word ;AN001;
1163 PUSH ES ;AN000;
1164 POP DS ;AN000;
1165 POP SI ; DS:SI -> dummy CDS ;AN000;
1166 MOV [SI.curdir_flags],curdir_isnet + curdir_inuse ;AN000;
1167 ;AN000;
1168 MOV AX,WORD PTR [THISIFS] ; set ifs ptr in cds ;AN000;
1169 MOV DS:WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000;
1170 MOV AX,WORD PTR [THISIFS+2] ;AN000;
1171 MOV DS:WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000;
1172 ;AN000;
1173 MOV DS:[SI.CURDIR_TYPE],BL ; set CDS type ;AN000;
1174 MOV DS:[SI.CURDIR_USER_WORD],CX ; set CDS user word ;AN001;
1175 MOV AX,CX
1176 ;AN000;
1177 RestoreReg <DX,CX> ; get target parm ptr off stack ;AN000;
1178 SaveReg <DS,SI,BX> ; save type and dummy cds ptr ;AN000;
1179 invoke PREP_IFSR ; clear ifsrh ;AN000;
1180 invoke CDS_TO_CD ; CDS: sets ES:BX -> IFSRH ;AN000;
1181 ; IFSR_DEVICE_CB@ ;AN000;
1182 ; ds - IFSSEG ;AN000;
1183 OR IFSPROC_FLAGS,ISCDS ;AN000;
1184 TEST IFSPROC_FLAGS,ISDUMMYCDS
1185 JZ AS_120
1186 MOV ES:[BX.IFSR_USER_WORD],AX
1187AS_120:
1188 POP AX ; restore type in AL ;AN000;
1189 MOV ES:[BX.IFSR_TYPE],AL ;AC002;
1190 SaveReg <CX,DX> ; put target parm ptr back on stack ;AN000;
1191 JMP SHORT AS_400 ; go prep IFSRH ;AN000;
1192 ;AN000;
1193AS_200: ; DEVICE ATTACH: ;AN000;
1194 invoke DFL_MATCH ; check if device already assigned ;AN000;
1195 JC AS_220 ; cf-0 match, cf-set no match ;AN000;
1196 MOV AX,error_already_assigned ;AN000;
1197 transfer ifs_980 ; go return with carry ;AN000;
1198 ;AN000;
1199AS_220: ;AN000;
1200 SaveReg <ES,DI,BX> ; save target parm ptr & type ;AN000;
1201 invoke CREATE_DFL_ENTRY ; DFL: sets ES:BX -> IFSRH ;AN000;
1202 ; IFSR_DEVICE_CB@ ;AN000;
1203 ; ds - IFSSEG ;AN000;
1204 JNC AS_240 ;AN000;
1205 RestoreReg <BX,DI,ES> ; restore stack ;AC019;
1206 invoke CONSIST_SFT ;AN000;
1207 transfer ifs_980 ; error ret ;AC019;
1208AS_240: ;AN000;
1209 POP AX ; restore type in AL ;AN000;moved ;AM019;
1210 MOV ES:[BX.IFSR_TYPE],AL ;AC002;
1211 ;AN000;
1212 ;AN000;
1213AS_400: ; prep IFSRH ;AN000;
1214 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000;
1215 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000;
1216 POP AX ; old target DI ;AN000;
1217;;;;;;;;TEST IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017;
1218; JZ AS_405 ;AN010;;AD017;
1219; ADD AX,4 ; filesys-net skip name offset ;AN010;;AD017;
1220;;;;;;;;JMP SHORT AS_410 ; and # parms - just want net path;AN010;;AD017;
1221;AS_405: ;AN010;;AD017;
1222 TEST IFSPROC_FLAGS,IsNetwork ;AN000;
1223 JNZ AS_410 ;AN000;
1224 INC AX ;AN000;
1225 INC AX ;AN000;
1226AS_410:
1227 MOV ES:WORD PTR [BX.IFSR_PARMS@],AX ;AN000;
1228 POP AX ; old target ES ;AN000;
1229 MOV ES:WORD PTR [BX.IFSR_PARMS@+2],AX ;AN000;
1230
1231;***********************************************************************************************
1232 invoke CALL_IFS ;AN000;
1233;***********************************************************************************************
1234
1235 JNC AS_440 ;AN000;
1236 ;AN000;
1237 ;AN000;
1238 TEST IFSPROC_FLAGS,ISCDS ; ifs error: ;AN000;
1239 JZ AS_420 ;AN000;
1240 RestoreReg <DS,SI,DS,SI> ; pop dummy & real cds ;AN000;
1241 transfer ifs_980 ;AN000;
1242AS_420: ;AN000;
1243 SaveReg <AX> ; preserve error code ;AN027;
1244 invoke DELETE_DFL_ENTRY ;AN000;
1245 invoke CONSIST_SFT ;AN025;
1246 RestoreReg <AX> ;AN027;
1247 transfer ifs_980 ;AN000;
1248 ;AN000;
1249AS_440: ; successful attach ;AN000;
1250 TEST IFSPROC_FLAGS,ISCDS ;AN000;
1251 JZ AS_460 ;AN000;
1252 RestoreReg <DI,ES> ; restore ES:DI -> dummy cds ;AN000;
1253 invoke CD_TO_CDS ;AN000;
1254 RestoreReg <SI,DS> ; ds:si - real cds ;AN000;
1255 invoke XCHGP ;AN000;
1256 MOV CX,SIZE CURDIR_LIST ;AN000;
1257 OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; make sure this flag set ;AN000;
1258 REP MOVSB ;AN000;
1259 transfer ifs_990 ;AN000;
1260 ;AN000;
1261AS_460: ;AN000;
1262 invoke DF_TO_DFL ;AN000;
1263 invoke CONSIST_SFT ;AN025;
1264 transfer ifs_990 ;AN000;
1265 ;AN000;
1266 ;AN000;
1267EndProc ATTACH_START ;AN000;
1268 ;AN000;
1269 ;AN000;
1270BREAK <ATTACH_END -- break attachment> ;AN000;
1271 ;AN000;
1272;************************************************************************************ ;AN000;
1273; ;AN000;
1274; ATTACH_END ;AN000;
1275; ;AN000;
1276; Called by: IFS_ASSOPER ;AN000;
1277; ;AN000;
1278; Routines called: DFL_MATCH DOS: StrCpy ;AN000;
1279; DFL_TO_DF DriveFromText ;AN000;
1280; DF_TO_DFL GetThisDrv ;AN000;
1281; CDS_TO_CD InitCDS ;AN000;
1282; CD_TO_CDS ;AN000;
1283; SET_EXTERR_INFO ;AN000;
1284; CALL_IFS ;AN000;
1285; DELETE_DFL_ENTRY ;AN000;
1286; ;AN000;
1287; Inputs: ;AN000;
1288; DS:SI -> ASCIZ source name ;AN000;
1289; Function: ;AN000;
1290; Prep IFSRH: ;AN000;
1291; * IFSR_LENGTH DW 30 ; Request length ;AN000;
1292; * IFSR_FUNCTION DB 4 ; End Attach ;AN000;
1293; IFSR_RETCODE DW ? ;AN000;
1294; IFSR_RETCLASS DB ? ;AN000;
1295; IFSR_RESV1 DB 16 DUP(0) ;AN000;
1296; * IFSR_DEVICE_CB@ DD ? ; CD or DF ;AN000;
1297; * IFSR_NAME@ DD ? ; for deviceless detach (unc) ;AN000;
1298; ;AN000;
1299; ;AN000;
1300;************************************************************************************ ;AN000;
1301 ;AN000;
1302 Procedure ATTACH_END,NEAR ;AN000;
1303ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1304 ;AN000;
1305 ifsr_fcn_def ATTEND ;AN000;
1306 ;AN000;
1307 POP BX ;AN000;
1308 ;AN000;
1309 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
1310 MOV CS:IFSPROC_FLAGS,0 ;AN000;
1311 invoke PREP_IFSR ;AN000;
1312 ;AN000;
1313 PUSH DS ;AN000;
1314 POP ES ;AN000;
1315 MOV DI,SI ; ES:DI=DS:SI=source name ;AN000;
1316 PUSH SI ; Save SI ;AN000;
1317 CallInstall StrCpy,multDOS,17 ; "Beautify" input string ;AN000;
1318 ; (converts to uppercase & ;AN000;
1319 ; / to \) ;AN000;
1320 POP SI ; Recover string pointer ;AN000;
1321 CMP WORD PTR [SI],"\\" ; Special Case - ;AN000;
1322 JZ AE_300 ; deviceless detach ;AN000;
1323 CMP WORD PTR [SI+1],":" ; check for drive ;AN000;
1324 JNZ AE_200 ; no, go to device check ;AN000;
1325 CMP fAssign,-1 ; BREAK DRIVE ATTACH ;AN000;
1326 JZ AE_20 ;AN000;
1327AE_10: ;AN000;
1328 MOV AX,72 ; pause error ;AN000;
1329 PUSH CS ;AN000;
1330 POP DS ;AN000;
1331ASSUME DS:IFSSEG ;AN000;
1332 invoke SET_EXTERR_INFO ;AN000;
1333 transfer ifs_980 ;AN000;
1334AE_20: ;AN000;
1335 CallInstall DriveFromText,multDOS,26 ; AL = drive # (0-not drive ;AN000;
1336 context DS ; -1=a,1=b,2=c,...) ;AN000;
1337 CallInstall GetThisDrv,multDOS,25,AX,BX ; ES:DI->CDS ;AN000;
1338 JNC AE_40 ;AN000;
1339 MOV AX,error_invalid_drive ;AN000;
1340 transfer ifs_1000 ;AN000;
1341AE_40: ;AN000;
1342 LES DI,[THISCDS] ;AN000;
1343 TEST ES:[DI.curdir_flags],curdir_isnet ;AN000;
1344 JNZ AE_60 ;AN000;
1345 MOV AX,error_invalid_drive ; not redirected ;AN000;
1346 transfer ifs_980 ;AN000;
1347AE_60: ;AN000;
1348 PUSH AX ; drive # ;AN000;
1349 PUSH ES ;AN000;
1350 POP DS ;AN000;
1351 MOV SI,DI ; move cds ptr to ds:si ;AN000;
1352 invoke CDS_TO_CD ;AN000;
1353 OR IFSPROC_FLAGS,ISCDS ;AN000;
1354 JMP SHORT AE_400 ;AN000;
1355 ;AN000;
1356AE_200: ; BREAK DEVICE ATTACH ;AN000;
1357 CMP fPrint,-1 ; check for pause error ;AN000;
1358 JZ AE_210 ;AN000;
1359 JMP AE_10 ;AN000;
1360AE_210: ;AN000;
1361 CALL DFL_MATCH ;AN000;
1362 JNC AE_220 ;AN000;
1363 MOV AX,device_not_attached ;AN000;
1364 transfer ifs_1000 ;AN000;
1365AE_220: ;AN000;
1366 MOV SI,WORD PTR [THISDFL] ;AN000;
1367 MOV DS,WORD PTR [THISDFL+2] ;AN000;
1368 ;AN000;
1369 TEST DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000;
1370; ???????????? check with baf on what reverting to ... ;AN000;
1371 ;AN000;
1372 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
1373 ; ES:BX -> IFSRH ;AN000;
1374 ; IFSR_DEVICE_CB@ ;AN000;
1375 ; ds - IFSSEG ;AN000;
1376 JMP SHORT AE_400 ;AN000;
1377 ;AN000;
1378AE_300: ; deviceless detach ;AN000;
1379 SaveReg <CS> ; restore es to ifsr & set seq flag ;AN018;
1380 RestoreReg <ES> ;AN018;
1381 OR CS:IFSPROC_FLAGS,IsSeq ;AN018;
1382 CMP fAssign,-1 ;AN000;
1383 JZ AE_320 ;AN000;
1384 JMP AE_10 ; jump to pause error ;AN000;
1385AE_320: ;AN000;
1386 SaveReg <ES,BX,DS> ; ifsr ptr ;AC004;
1387 RestoreReg <ES> ; set esdi = dssi = net path ;AC004;
1388ASSUME ES:NOTHING ;AC004;
1389 MOV DI,SI ;AC004;
1390 invoke NET_TRANS ;AC004;
1391 SaveReg <ES> ;AC004;
1392 RestoreReg <AX> ; name string segment ;AC004;
1393 MOV SI,DI ; name string offset ;AC004;
1394 RestoreReg <BX,ES> ; ifsr pointer ;AC004;
1395ASSUME ES:IFSSEG ;AC004;
1396 MOV WORD PTR ES:[BX.IFSR_NAME@],DI ;AC004;
1397 MOV WORD PTR ES:[BX.IFSR_NAME@+2],AX ;AC004;
1398 SaveReg <CS> ;AC004;
1399 RestoreReg <DS> ;AN000;
1400ASSUME DS:IFSSEG ;AN000;
1401 ;AN000;
1402AE_400: ; call ifs ;AN000;
1403 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTEND ;AN000;
1404 MOV ES:[BX.IFSR_FUNCTION],IFSATTEND ;AN000;
1405 ;AN000;
1406;***********************************************************************************************
1407 invoke CALL_IFS ;AN000;
1408;***********************************************************************************************
1409 ;AN000;
1410 JNC AE_410 ;AN000;
1411 TEST IFSPROC_FLAGS,ISCDS ; att end error: ;AN000;
1412 JZ AE_405 ;AN000;
1413 ADD SP,2 ; clear ax (drive #) off stack ;AN000;
1414AE_405: ;AN000;
1415 transfer ifs_980 ;AN000;
1416AE_410: ;AN000;
1417 TEST CS:IFSPROC_FLAGS,ISCDS ;AN000;
1418 JZ AE_420 ;AN000;
1419 ;AN000;
1420 POP AX ; drive ;AN000;
1421 ADD AL,'A' ;AN000;
1422 CallInstall InitCDS,multDOS,31,AX,AX ;AN000;
1423 transfer ifs_990 ;AN000;
1424AE_420: ;AN000;
1425 TEST CS:IFSPROC_FLAGS,IsSeq ;AN018;
1426 JNZ AE_440 ;AN018;
1427 CALL DELETE_DFL_ENTRY ;AN000;
1428AE_440: ;AN018;
1429 transfer ifs_990 ;AN000;
1430 ;AN000;
1431 ;AN000;
1432EndProc ATTACH_END ;AN000;
1433 ;AN000;
1434
1435BREAK <IFS_RESET_ENVIRONMENT -- reset IFS environment> ;AN016;
1436
1437;***********************************************************************************
1438;
1439; IFS_RESET_ENVIRONMENT
1440;
1441; Called by: IFSFUNC Dispatcher
1442;
1443; Routines called:
1444; jumps into ifs_abort
1445;
1446; Inputs:
1447; [CurrentPDB] set to PID of process aborting
1448;
1449; Function:
1450; Get address of IFS driver chain.
1451; FOR I = 1 to last IFS driver
1452; Send request below to IFS driver
1453;
1454; IFSRH:
1455; * IFSR_LENGTH DW 42 ; Request length
1456; * IFSR_FUNCTION DB 4 ; Execute API function
1457; IFSR_RETCODE DW ?
1458; IFSR_RETCLASS DB ?
1459; IFSR_RESV1 DB 16 DUP(0)
1460; * IFSR_APIFUNC DB 18 ; End of Process
1461; IFSR_ERROR_CLASS DB ?
1462; IFSR_ERROR_ACTION DB ?
1463; IFSR_ERROR_LOCUS DB ?
1464; IFSR_ALLOWED DB ?
1465; IFSR_I24_RETRY DB ?
1466; IFSR_I24_RESP DB ?
1467; IFSR_RESV2 DB ?
1468; IFSR_DEVICE_CB@ DD ? ; CD
1469; IFSR_OPEN_CB@ DD ?
1470; * IFSR_PID DW ? ; process ID
1471; * IFSR_SUBFUNC DB 2 ; 0=normal exit 1=abort exit
1472; ; 2=reset environment
1473; IFSR_RESV3 DB ?
1474;
1475; Call all IFSs with this info.
1476; Scan through SFTFCB
1477; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN
1478; Call SF_IFS_HDR with close request
1479; ENDIF
1480;
1481; Outputs: None
1482; DS Preserved, All others destroyed
1483;
1484;************************************************************************************
1485
1486 procedure IFS_RESET_ENVIRONMENT,NEAR ;AN016;
1487ASSUME DS:DOSGROUP,ES:NOTHING ;AN016;
1488
1489 ifsr_fcn_def EXECAPI ;AN016;
1490 ifsr_api_def EOP ;AN016;
1491
1492 MOV CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016;
1493 Context DS ; make sure ds=ss=dosgroup ;AN016;
1494 JMP IA_70 ;AN016;
1495
1496EndProc IFS_RESET_ENVIRONMENT ;AN016;
1497
1498
1499BREAK <IFS_ABORT -- Send CLOSE all files for process> ;AN016;
1500 ;AN016;
1501;************************************************************************************
1502;
1503; IFS_ABORT
1504;
1505; Called by: IFSFUNC Dispatcher
1506;
1507; Routines called:
1508; CALL_IFS
1509; IFS_CLOSE
1510;
1511; Inputs:
1512; [CurrentPDB] set to PID of process aborting
1513;
1514; Function:
1515; Get address of IFS driver chain.
1516; FOR I = 1 to last IFS driver
1517; Send request below to IFS driver
1518;
1519; IFSRH:
1520; * IFSR_LENGTH DW 42 ; Request length
1521; * IFSR_FUNCTION DB 4 ; Execute API function
1522; IFSR_RETCODE DW ?
1523; IFSR_RETCLASS DB ?
1524; IFSR_RESV1 DB 16 DUP(0)
1525; * IFSR_APIFUNC DB 18 ; End of Process
1526; IFSR_ERROR_CLASS DB ?
1527; IFSR_ERROR_ACTION DB ?
1528; IFSR_ERROR_LOCUS DB ?
1529; IFSR_ALLOWED DB ?
1530; IFSR_I24_RETRY DB ?
1531; IFSR_I24_RESP DB ?
1532; IFSR_RESV2 DB ?
1533; IFSR_DEVICE_CB@ DD ? ; CD
1534; IFSR_OPEN_CB@ DD ?
1535; * IFSR_PID DW ? ; process ID
1536; * IFSR_SUBFUNC DB ? ; 0=normal exit 1=abort exit
1537; ; 2=reset environment
1538; IFSR_RESV3 DB ?
1539;
1540; Call all IFSs with this info.
1541; Scan through SFTFCB
1542; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN
1543; Call SF_IFS_HDR with close request
1544; ENDIF
1545;
1546; Outputs: None
1547; DS Preserved, All others destroyed
1548;
1549;************************************************************************************
1550
1551 procedure IFS_ABORT,NEAR ;AN000;
1552ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1553 ;AN000;
1554 ifsr_fcn_def EXECAPI ;AN000;
1555 ifsr_api_def EOP ;AN000;
1556
1557 MOV CS:IFSPROC_FLAGS,ZERO
1558 ;AN000;
1559; Scan the FCB Cache and close any NET FCBs ;AN000;
1560; belonging to this process. The reason we must do this is that ;AN000;
1561; NET FCBs are well behaved and must be closed on EXIT. ;AN000;
1562 ;AN000;
1563 LES DI,[SFTFCB] ;AN000;
1564 MOV CX,ES:[DI].sfCount ;AN000;
1565 LEA DI,[DI].sfTable ;AN000;
1566 JCXZ IA_70 ;AN000;
1567IA_20: ; Loop through sftfcb's ;AN000;
1568 CMP ES:[DI].sf_ref_count,0 ;AN000;
1569 JZ IA_60 ; Ignore Free ones ;AN000;
1570 CMP ES:[DI].sf_ref_count,sf_busy ;AN000;
1571 JZ IA_60 ; Ignore busy ones ;AN000;
1572 TEST ES:[DI].sf_flags,sf_isnet ;AN000;
1573 JZ IA_60 ; Ignore non NET ones ;AN000;
1574 MOV AX,[CurrentPDB] ;AN000;
1575 CMP AX,ES:[DI].sf_PID ;AN000;
1576 JNZ IA_60 ; Ignore FCBs not for this proc ;AN000;
1577 MOV WORD PTR [THISSFT],DI ;AN000;
1578 MOV WORD PTR [THISSFT+2],ES ;AN000;
1579 PUSH CX ;AN000;
1580IA_40: ; CLOSE ;AN000;
1581 invoke IFS_CLOSE ; IGNORE ANY ERRORS ON THIS. ;AN000;
1582 CMP ES:[DI].sf_ref_count,0 ; Make sure it gets closed ;AN000;
1583 JNE IA_40 ; Loop until closed ;AN000;
1584 POP CX ;AN000;
1585IA_60: ;AN000;
1586 ADD DI,size sf_entry ;AN000;
1587 LOOP IA_20 ;AN000;
1588; ;AN000;
1589; Now loop through all ifs drivers with end of process request ;AN000;
1590; ;AN000;
1591IA_70: ;AN000;
1592 LDS SI,IFS_HEADER ;AN000;
1593ASSUME DS:NOTHING ;AN000;
1594 JMP SHORT IA_100 ; go check if null ;AN007;
1595 ;AN000;
1596IA_80: ;AN000;
1597 MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000;
1598 MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000;
1599 invoke PREP_IFSR ; sets esbx -> ifsrh ;AN000;
1600 MOV ES:[BX.IFSR_LENGTH],LENGTH_EOP ;AN000;
1601 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
1602 MOV ES:[BX.IFSR_APIFUNC],IFSEOP ;AN000;
1603 MOV AX,[CurrentPDB] ;AN000;
1604 MOV ES:[BX.IFSR_PID],AX ; ????? ;AN000;
1605 MOV AL,[EXIT_TYPE] ;AN000;
1606 MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
1607 TEST CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016;
1608 JZ IA_90 ;AN016;
1609 MOV ES:[BX.IFSR_SUBFUNC],RESET_ENVIRONMENT ;AN016;
1610IA_90: ;AN016;
1611 SaveReg <DS,SI,CS> ; dssi - ifs driver ;AC012;
1612 RestoreReg <DS> ; ds - ifsseg ;AN000;
1613 ;AN000;
1614;***********************************************************************************************
1615 invoke CALL_IFS ;AN000;
1616;***********************************************************************************************
1617 ;AN000;
1618 RestoreReg <SI,DS> ; dssi - ifs driver ;AC012;
1619 LDS SI,[SI.IFS_NEXT] ; check next fs driver ;AN000;
1620IA_100: ;AN007;
1621 CMP SI,NULL_PTR ; if ptr null, no more ;AN000;
1622 JNE IA_80 ;AN000;
1623 PUSH DS ;AN000;
1624 POP AX ;AN000;
1625 CMP AX,NULL_PTR ;AN000;
1626 JNE IA_80 ;AN000;
1627 ;AN000;
1628 ;AN000;
1629IA_1000: ;AN000;
1630 SaveReg <SS> ; dosgroup ;AN000;
1631 RestoreReg <DS> ;AN000;
1632 return ;????????? may need redir ioctl to ;AN000;
1633 ; consist_refs ;AN000;
1634 ;AN000;
1635EndProc IFS_ABORT ;AN000;
1636 ;AN000;
1637 ;AN000;
1638BREAK <GET_IFS_DRIVER_NAME -- get IFS driver name> ;AN000;
1639 ;AN000;
1640;************************************************************************************ ;AN000;
1641; ;AN000;
1642; GET_IFS_DRIVER_NAME ;AN000;
1643; ;AN000;
1644; Called by: GET_IFSFUNC_ITEM ;AN000;
1645; ;AN000;
1646; Routines called: ;AN000;
1647; ;AN000;
1648; Inputs: ;AN000;
1649; DS:SI -> CDS/DFL ;AN000;
1650; ES:DI = buffer to place name ;AN000;
1651; Function: ;AN000;
1652; Find FS name in IFS header pointed to by CDS or DFL ;AN000;
1653; Place name in buffer pointed to by ES:DI ;AN000;
1654; Output: ;AN000;
1655; buffer filled, hopefully with ifs name ;AN000;
1656; pointer not checked for valid ifs driver hdr ptr ;AN000;
1657; Regs: all preserved ;AN000;
1658; ;AN000;
1659;************************************************************************************ ;AN000;
1660 ;AN000;
1661 Procedure GET_IFS_DRIVER_NAME,NEAR ;AN000;
1662ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1663 ;AN000;
1664 SaveReg <DS,SI,CX,DI> ; preserve cds/dfl ptr, cx, buffer ;AN000;
1665 ; offset ;AN000;
1666 TEST CS:IFSPROC_FLAGS,ISCDS ; get ifs hdr ptr from ;AN000;
1667 JZ GIDN_20 ;AN000;
1668 LDS SI,[SI.CURDIR_IFS_HDR] ; cds ;AN000;
1669 JMP GIDN_40 ;AN000;
1670GIDN_20: ;AN000;
1671 LDS SI,[SI.DFLL_IFS_HDR] ; dfl ;AN000;
1672GIDN_40: ;AN000;
1673 invoke MOVE_DRIVER_NAME ; move ifs driver name into buffer ;AN000;
1674 ;AN000;
1675 RestoreReg <DI,CX,SI,DS> ; restore cds/dfl ptr, cx, buffer ;AN000;
1676 ; offset ;AN000;
1677 return ;AN000;
1678 ;AN000;
1679EndProc GET_IFS_DRIVER_NAME ;AN000;
1680 ;AN000;
1681BREAK <FIND_IFS_DRIVER -- get IFS driver> ;AN000;
1682 ;AN000;
1683;************************************************************************************
1684;
1685; FIND_IFS_DRIVER
1686;
1687; Called by: ATTACH_START
1688;
1689; Routines called: CHECK_END_SPACE
1690;
1691; Inputs:
1692; ES:DI -> IFS driver name
1693; Function:
1694; Loop through IFS driver chain until name match.
1695; If match found - set [THISIFS] and clear carry
1696; Else set carry.
1697; Output:
1698; carry clear - match found,[THISIFS] set
1699; carry set - no match found
1700;
1701; Regs: all but ax preserved
1702;
1703;************************************************************************************
1704 ;AN000;
1705 Procedure FIND_IFS_DRIVER ;AN000;
1706ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1707 ;AN000;
1708 SaveReg <DS,SI,BX,ES,DI> ; save registers (except ax for error) ;AC026;
1709 ;AN000;
1710 TEST CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ; check for no drivers first ;AN024;
1711 JZ FID_10 ;AN024;
1712 JMP FID_30 ;AN024;
1713FID_10: ;AN024;
1714
1715 SaveReg <SS> ; get addressability to dosgroup ;AN000;
1716 RestoreReg <DS> ; to get ifs driver chain ;AN000;
1717 LDS SI,IFS_HEADER ;AN000;
1718ASSUME DS:NOTHING ; ds:si -> 1st ifs driver ;AN000;
1719 ;AN000;
1720FID_20: ;AN000;
1721 SaveReg <DS,SI,ES,DI,CS> ; save ds,si,es,di ;AN000;
1722 RestoreReg <ES> ; set es=cs ;AN000;
1723ASSUME ES:IFSSEG ;AN000;
1724 MOV DI,OFFSET TEMPBUF ; move ifs driver name into tempbuf ;AN000;
1725 SaveReg <SI,DI> ; so that can be asciiz form before ;AN000;
1726 invoke MOVE_DRIVER_NAME ; strcmp ;AN000;
1727 RestoreReg <SI,DI> ; dssi -> tempbuf (ifs driver asciiz ;AN000;
1728 SaveReg <ES> ; name) ;AN000;
1729 RestoreReg <DS,DI,ES> ; esdi -> ifs driver name (input) ;AN000;
1730 CALL CHECK_END_SPACE ; make sure ^ has no blanks ;AN000;
1731
1732 CallInstall StrCmp,multDOS,30 ; check for match (regs preserved) ;AN000;
1733 RestoreReg <SI,DS> ; (ifs driver) ;AN000;
1734 JZ FID_40 ; if match, go set thisifs & return ;AN000;
1735 LDS SI,[SI.IFS_NEXT] ; else check next fs driver ;AN000;
1736 CMP SI,MINUS_ONE ; if ptr null, no more = error ;AN000;
1737 JNE FID_20 ;AN000;
1738 PUSH DS ;AN000;
1739 POP AX ;AN000;
1740 CMP AX,MINUS_ONE ;AN000;
1741 JNE FID_20 ;AN000;
1742FID_30: ;AN024;
1743 MOV AX,fs_driver_not_found ;AN000;
1744 JMP SHORT FID_980 ;AN000;
1745FID_40: ;AN000;
1746 MOV WORD PTR CS:[THISIFS],SI ; match. Set [THISIFS] to this ;AN000;
1747 MOV WORD PTR CS:[THISIFS+2],DS ; driver ;AN000;
1748 JMP FID_990 ;AN000;
1749 ;AN000;
1750 ;AN000;
1751FID_980: ; Return area ;AN000;
1752 STC ;AN000;
1753 JMP SHORT FID_1000 ;AN000;
1754FID_990: ;AN000;
1755 CLC ;AN000;
1756FID_1000: ;AN000;
1757 RestoreReg <DI,ES,BX,SI,DS> ; restore registers ;AC026;
1758 return ;AN000;
1759 ;AN000;
1760EndProc FIND_IFS_DRIVER ;AN000;
1761 ;AN000;
1762 ;AN000;
1763BREAK <ASSIGN_MODE_FUNCTIONS -- drive/print on/off> ;AN000;
1764 ;AN000;
1765;************************************************************************************ ;AN000;
1766; ;AN000;
1767; AssignOn/AssignOff ;AN000;
1768; ;AN000;
1769; Called by: SET_ASSIGN_MODE ;AN000;
1770; ;AN000;
1771; AssignOn and AssignOFF copied from Network Redirector code ;AN000;
1772; PrintOn and PrintOff IFSFUNC new code ;AN000;
1773; ;AN000;
1774; Inputs: ;AN000;
1775; ;AN000;
1776; Function: ;AN000;
1777; ;AN000;
1778; Output: ;AN000;
1779; ;AN000;
1780; Regs: none preserved ;AN000;
1781; ;AN000;
1782;************************************************************************************ ;AN000;
1783 ;AN000;
1784Procedure AssignOn,Near ;AN000;
1785ASSUME ES:NOTHING, DS:NOTHING ;AN000;
1786 EnterCrit CritNet ;AN000;
1787 CMP fAssign,-1 ; if (fAssign) ;AN000;
1788 JZ CrLvA ; return; ;AN000;
1789 MOV fAssign,-1 ; fAssign = TRUE; ;AN000;
1790 LDS SI,CDSAlt ; s = CDSAlt; ;AN000;
1791 LES DI,CDSAddr ; d = CDSAddr; ;AN000;
1792 MOV AL,CDSCount ;AN000;
1793 MOV DX,SIZE curdir_list ;AN000;
1794OnLoop: ;AN000;
1795 TEST [SI].curdir_flags,curdir_isnet ;AN000;
1796 JNZ RestCDS ; Restore this NET guy ;AN000;
1797 ADD SI,DX ; Skip to next CDS ;AN000;
1798 ADD DI,DX ;AN000;
1799NextCDS: ;AN000;
1800 DEC AL ;AN000;
1801 JNZ OnLoop ;AN000;
1802CrLvA: ;AN000;
1803 LeaveCrit CritNet ;AN000;
1804 return ;AN000;
1805 ;AN000;
1806RestCDS: ;AN000;
1807 MOV CX,DX ;AN000;
1808 REP MOVSB ; strcpy (d, s); ;AN000;
1809 JMP NextCDS ;AN000;
1810EndProc AssignOn ;AN000;
1811 ;AN000;
1812Procedure AssignOff,Near ;AN000;
1813 ASSUME ES:NOTHING, DS:NOTHING ;AN000;
1814 EnterCrit CritNet ;AN000;
1815 CMP fAssign,0 ; if (!fAssign) ;AN000;
1816 JZ CrLvB ; return; ;AN000;
1817 LES DI,CDSAlt ; d = CDSAlt; ;AN000;
1818 LDS SI,CDSAddr ; s = CDSAddr; ;AN000;
1819 MOV AL,CDSCount ;AN000;
1820 CBW ; always less or = 26 ;AN000;
1821 MOV CX,SIZE curdir_list ;AN000;
1822 MUL CX ;AN000;
1823 MOV CX,AX ;AN000;
1824 REP MOVSB ; Save current CDS state ;AN000;
1825 XOR AL,AL ;AN000;
1826OffLoop: ; for (i=0; p1=getcds(i); i++) ;AN000;
1827 CallInstall GetCDSFromDrv,multDOS,23,AX,AX ; Set THISCDS for possible ;AN000;
1828 ; call to InitCDS ;AN000;
1829 JC OffDone ; ;AN000;
1830 TEST [SI].curdir_flags,curdir_isnet ;AN000;
1831 JZ OffInc ;AN000;
1832 SaveReg <AX> ;AN000;
1833 ADD AX,'A' ;AN000;
1834 CallInstall InitCDS,multDOS,31,AX,AX ; initcds (p1); ;AN000;
1835 RestoreReg <AX> ;AN000;
1836OffInc: INC AL ;AN000;
1837 JMP OffLoop ;AN000;
1838 ;AN000;
1839OffDone: ;AN000;
1840 MOV fAssign,0 ; fAssign = FALSE; ;AN000;
1841CrLvB: ;AN000;
1842 LeaveCrit CritNet ;AN000;
1843 return ;AN000;
1844EndProc AssignOff ;AN000;
1845 ;AN000;
1846;****************************************************************************** ;AN000;
1847; ;AN000;
1848; PrintOn/PrintOff ;AN000;
1849; ;AN000;
1850; Called by: SET_ASSIGN_MODE ;AN000;
1851; ;AN000;
1852; Routines called: CALL_IFS ;AN000;
1853; ;AN000;
1854; Inputs: ;AN000;
1855; ;AN000;
1856; Function: ;AN000;
1857; Print on - loop through dfl entries resetting pause flag to zero ;AN000;
1858; Print off- loop through dfl entries, set pause flag if unc ;AN000;
1859; ;AN000;
1860; Prep IFSRH: ;AN000;
1861; * IFSR_LENGTH DW 48 ; Request length ;AN000;
1862; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
1863; IFSR_RETCODE DB ? ;AN000;
1864; IFSR_RETCLASS DB ? ;AN000;
1865; IFSR_RESV1 DB 17 DUP(0) ;AN000;
1866; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
1867; IFSR_ERROR_CLASS DB ? ;AN000;
1868; IFSR_ERROR_ACTION DB ? ;AN000;
1869; IFSR_ERROR_LOCUS DB ? ;AN000;
1870; IFSR_ALLOWED DB ? ;AN000;
1871; IFSR_I24_RETRY DB ? ;AN000;
1872; IFSR_I24_RESP DB ? ;AN000;
1873; IFSR_RESV2 DB ? ;AN000;
1874; IFSR_DEVICE_CB@ DD ? ;AN000;
1875; IFSR_OPEN_CB@ DD ? ;AN000;
1876; * IFSR_FUNC DB 0 ; 0 generic ioctl ;AN000;
1877; IFSR_RESV2 DB 0 ;AN000;
1878; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000;
1879; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000;
1880; * IFSR_CATEGORY DB 1 ; 1 for UNC ;AN000;
1881; * IFSR_CTLFUNC DB ? ; x - print on, y - print off ;AN000;
1882; ;AN000;
1883; ;AN000;
1884; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
1885; ;AN000;
1886; Outputs: none ;AN000;
1887; ;AN000;
1888; Regs: nothing preserved ;AN000;
1889; ;AN000;
1890;****************************************************************************** ;AN000;
1891 ;AN000;
1892Procedure PrintOn,Near ;AN000;
1893 ASSUME DS:NOTHING, ES:NOTHING ;AN000;
1894 ;AN000;
1895 EnterCrit CritNet ;AN000;
1896 CMP fPrint,-1 ; if (fPrint) ;AN000;
1897 JNE PON_20 ;AN000;
1898 JMP POF_1000 ; return; ;AN000;
1899PON_20: ;AN000;
1900 MOV fPrint,-1 ; fPrint = TRUE; ;AN000;
1901 MOV CS:IFSPROC_FLAGS,PRINT_ON ;AN000;
1902 JMP POF_20 ; finish in printoff routine ;AN000;
1903 ;AN000;
1904 ;AN000;
1905EndProc PrintOn ;AN000;
1906 ;AN000;
1907Procedure PrintOff,NEAR ;AN000;
1908 ASSUME DS:NOTHING, ES:NOTHING ;AN000;
1909 ;AN000;
1910 EnterCrit CritNet ;AN000;
1911 CMP fPrint,0 ; quit if already off ;AN000;
1912 JZ POF_1000 ; return ;AN000;
1913 MOV fPrint,0 ; set off ;AN000;
1914 MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000;
1915 ;AN000;
1916POF_20: ; (welcome print on) ;AN000;
1917 PUSH CS ; get addressability to IFSSEG ;AN000;
1918 POP DS ;AN000;
1919ASSUME DS:IFSSEG,ES:NOTHING ;AN000;
1920 ;AN000;
1921 MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000;
1922 XOR CH,CH ; For all unc devices, set pause ;AN000;
1923 XOR DH,DH ; flag ;AN000;
1924 MOV DL,SIZE DFLL_LIST ;AN000;
1925 LDS SI,[DFLAddr] ;AN000;
1926POF_40: ; *** loop on setting pause flag ;AN000;
1927 TEST IFSPROC_FLAGS,PRINT_ON ; on print on, just reset all ;AN000;
1928 JNZ POF_50 ;AN000;
1929 LES DI,DS:[SI.DFLL_IFS_HDR] ; only set pause on unc devices ;AN000;
1930 OR DI,DI ; make sure this dfl taken ;AN000;
1931 JNZ POF_45 ;AN000;
1932 SaveReg <AX,ES> ;AN000;
1933 RestoreReg <AX> ;AN000;
1934 OR AX,AX ;AN000;
1935 RestoreReg <AX> ;AN000;
1936 JZ POF_60 ;AN000;
1937POF_45: ;AN000;
1938 TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ;AN000;
1939 JZ POF_60 ;AN000;
1940 OR DS:[SI.DFLL_FLAGS],DFL_PAUSED ;AN000;
1941 JMP SHORT POF_60 ;AN000;
1942POF_50: ;AN000;
1943 AND DS:[SI.DFLL_FLAGS],NOT DFL_PAUSED ;AN000;
1944POF_60: ;AN000;
1945 ADD SI,DX ; prep for next dfl ;AN000;
1946 LOOP POF_40 ; go process next dfl ;AN000;
1947 ; now go tell unc, device pause ;AN000;
1948 ; is in effect ;AN000;
1949 invoke PREP_IFSR ; init ifsr ;AN000;
1950 ;AN000;
1951 ifsr_fcn_def EXECAPI ; define ifsr for dep ioctl ;AN000;
1952 ifsr_api_def DEPIOCTL ;AN000;
1953 ;AN000;
1954 invoke SET_DEPIOCTL_IFSR ;AN000;
1955 TEST IFSPROC_FLAGS,PRINT_ON ;AN000;
1956 JZ POF_80 ;AN000;
1957 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_ON ;AN000;
1958 JMP SHORT POF_100 ;AN000;
1959POF_80: ;AN000;
1960 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_OFF ;AN000;
1961POF_100: ;AN000;
1962 MOV ES:[BX.IFSR_CATEGORY],1 ;AN000;
1963 invoke SET_THISIFS_UNC ;AN000;
1964
1965;***********************************************************************************************
1966 invoke CALL_IFS ; call ifs driver w/request ;AN000;
1967;***********************************************************************************************
1968
1969 invoke CONSIST_SFT ;AN000;
1970 ;AN000;
1971POF_1000: ;AN000;
1972 LeaveCrit CritNet ;AN000;
1973 return ;AN000;
1974 ;AN000;
1975EndProc PrintOff ;AN000;
1976 ;AN000;
1977 ;AN000;
1978BREAK <GET_UNC_ITEM_INFO -- resv bits, net name id, user word, max xmitt sz> ;AC000;
1979
1980;******************************************************************************
1981;
1982; GET_UNC_ITEM_INFO
1983;
1984; Called by: GET_IFSFUNC_ITEM
1985;
1986; Routines called: CALL_IFS
1987;
1988; Inputs:
1989; BL = redirection index
1990; ES:DI -> Target buffer: old - net path string ;AN00
1991; new - dw file system driver name
1992; dw # parms
1993; db parms
1994;
1995; Function:
1996;
1997; Prep IFSRH:
1998; * IFSR_LENGTH DW 48 ; Request length
1999; * IFSR_FUNCTION DB 4 ; Execute API function
2000; IFSR_RETCODE DB ?
2001; IFSR_RETCLASS DB ?
2002; IFSR_RESV1 DB 17 DUP(0)
2003; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL
2004; IFSR_ERROR_CLASS DB ?
2005; IFSR_ERROR_ACTION DB ?
2006; IFSR_ERROR_LOCUS DB ?
2007; IFSR_ALLOWED DB ?
2008; IFSR_I24_RETRY DB ?
2009; IFSR_I24_RESP DB ?
2010; IFSR_RESV2 DB ?
2011; IFSR_DEVICE_CB@ DD ?
2012; IFSR_OPEN_CB@ DD ?
2013; * IFSR_FUNC DB 0 ; 0 generic ioctl
2014; IFSR_RESV2 DB 0
2015; * IFSR_BUFFER@ DD ? ; unc item info buffer
2016; IFSR_BUFSIZE DW 10
2017; * IFSR_CATEGORY DB 1 ; 1 for UNC
2018; * IFSR_CTLFUNC DB ? ; 4 - get unc item
2019;
2020; buffer: dw index (bx)
2021; dw user word
2022; dw max xmitt size
2023; dw net name ID
2024; dw lower 8 bits lsn from ncb_list
2025; db redir reserved bits
2026; db net path...(asciiz)
2027;
2028;
2029; CALL routine, CALL_IFS, with pointer to IFS header
2030;
2031; Outputs: user stack contains info
2032; cx - user word
2033; bx - bits and macro type
2034; dx - max xmitt size
2035; ax - net name id
2036; bp - lsn (if specified)
2037;
2038; Regs: nothing preserved
2039;
2040;******************************************************************************
2041 ;AC003;
2042 Procedure GET_UNC_ITEM_INFO,NEAR ;AC003;
2043 ;AC003;
2044 TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ;AN013;
2045 JNZ GUI_05 ;AN013;
2046 transfer ifs_980 ;AN013;
2047
2048GUI_05: ;AN013;
2049 SaveReg <ES,DI,BX> ; target ptr and index ;AC003;
2050 ;AC003;
2051 invoke PREP_IFSR ; init ifsr ;AC003;
2052 SaveReg <CS> ; prep ds for call ifs call ;AC003;
2053 RestoreReg <DS> ;AC003;
2054ASSUME DS:IFSSEG ;AC003;
2055 ;AC003;
2056 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AC003;
2057 invoke SET_THISIFS_UNC ; prep IFSRH ;AC003;
2058 MOV ES:[BX.IFSR_CATEGORY],1 ;AC003;
2059 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_GET_UNC_ITEM ;AC003;
2060 ;AC003;
2061 MOV SI,OFFSET TEMPBUF ;AC003;
2062 MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ;AC003;
2063 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ;AC003;
2064 RestoreReg <AX> ; index ;AN003;
2065 MOV WORD PTR DS:[SI],AX ;AN003;
2066
2067;***********************************************************************************************
2068 invoke CALL_IFS ; call redir w/get unc item request ;AC003;
2069;***********************************************************************************************
2070
2071 ;AC003;
2072 JNC GUI_10 ;AC003;
2073 RestoreReg <DI,ES> ;AC003;
2074 return ;AC003;
2075GUI_10: ;AC003;
2076 MOV SI,WORD PTR ES:[BX.IFSR_BUFFER@] ;AC003;
2077 MOV DS,WORD PTR ES:[BX.IFSR_BUFFER@+2] ;AC003;
2078 SaveReg <SI>
2079 ADD SI,2 ; space to user word (skip index) ;AN018;
2080 LODSW ; user word ;AC003;
2081 MOV CX,AX ;AC003;
2082 LODSW ; max xmitt size ;AC003;
2083 MOV DX,AX ;AC003;
2084 LODSW ; net name id ;AC003;
2085 PUSH AX ;AC003;
2086 LODSW ; lsn ;AC003;
2087 MOV BP,AX ;AC003;
2088 LODSB ; redir bits ;AC003;
2089 MOV BH,AL ;AC003;
2090 MOV BL,4 ;AC003;
2091 POP AX ; net name id ;AC003;
2092 SaveReg <DS,SI> ;AC003;
2093 CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003;
2094 MOV [SI].User_CX,CX ; User Word ;AC003;
2095 MOV [SI].User_BX,BX ; Bits and macro type ;AC003;
2096 MOV [SI].User_DX,DX ; Max Xmitt size ;AC003;
2097 MOV [SI].User_AX,AX ; Net name ID ;AC003;
2098 TEST CS:IFSPROC_FLAGS,SetBP ;AC003;
2099 JZ GUI_15 ;AC003;
2100 MOV [SI].User_BP,BP ; LSN ;AC003;
2101GUI_15: ;AN003;
2102 RestoreReg <SI,DS>
2103 TEST IFSPROC_FLAGS,Filesys_status ;AC003;
2104 JNZ GUI_20 ;AC003;
2105 ADD SP,2 ; old si
2106 RestoreReg <DI,ES> ; buffer/target ptr (dssi - 18) ;AC003;;AC018;
2107 SaveReg <AX,DI> ;AC003;;AC008;
2108 JMP SHORT GUI_40 ;AC003;
2109 ;AC003;
2110GUI_20: ; new style ;AC003;
2111 RestoreReg <SI> ; offset path
2112 ADD SI,11 ;AC003;
2113 RestoreReg <DI,ES> ; target - dw fsname ;AC003;
2114 ; dw # parms ;AC003;
2115 ; db asciiz,... ;AC003;
2116 SaveReg <DI> ;AC003;
2117 MOV DI,ES:[DI] ;AC003;
2118 invoke GET_UNC_FS_NAME ;AC003;
2119 RestoreReg <DI> ;AC003;
2120 SaveReg <AX,DI> ;AC003;
2121 INC DI ;AC003;
2122 INC DI ;AC003;
2123 MOV WORD PTR ES:[DI],1 ;AC003;
2124 INC DI ;AC003;
2125 INC DI ;AC003;
2126 ;AC003;
2127GUI_40: ;AC003;
2128 CallInstall StrCpy,MultDOS,17 ;AC003;
2129 RestoreReg <DI> ;AC003;
2130;;;;;;;;TEST CS:IFSPROC_FLAGS,FILESYS_STATUS ;AN008;;AD018;
2131;;;;;;;;JZ GUI_1000 ;AN008;;AD018;
2132 RestoreReg <AX> ;AN008;
2133
2134GUI_1000:
2135 return ;AC003;
2136 ;AC003;
2137 ;AC003;
2138EndProc GET_UNC_ITEM_INFO ;AC003;
2139 ;AN000;
2140
2141BREAK <CHECK_END_SPACE -- check esdi string for blanks> ;AN000;
2142 ;AN000;
2143;************************************************************************************ ;AN000;
2144; ;AN000;
2145; CHECK_END_SPACE ;AN000;
2146; ;AN000;
2147; Called by: FIND_IFS_DRIVER ;AN000;
2148; ;AN000;
2149; Routines called:
2150; ;AN000;
2151; Inputs: ;AN000;
2152; ES:DI -> IFS driver name ;AN000;
2153; Function: ;AN000;
2154; Replace any blanks in asciiz ifs driver name with 0's. ;AN000;
2155; Output: ;AN000;
2156; none
2157; ;AN000;
2158; Regs: all preserved ;AN000;
2159; ;AN000;
2160;************************************************************************************ ;AN000;
2161 ;AN000;
2162 Procedure CHECK_END_SPACE ;AN000;
2163ASSUME DS:NOTHING,ES:NOTHING ;AN000;
2164 ;AN000;
2165 SaveReg <AX,DS,SI,ES> ; save registers ;AN000;
2166 RestoreReg <DS> ; set dssi -> asciiz ifs name ;AN000;
2167 MOV SI,DI ;AN000;
2168 CLD ; clear dir flag to count forward ;AN000;
2169CES_20: ; search LOOP ;AN000;
2170 LODSB ; put char in al ;AN000;
2171 OR AL,AL ; check for end of string ;AN000;
2172 JZ CES_1000 ; if so go quit ;AN000;
2173 CMP AL," " ; check for blank ;AN000;
2174 JNE CES_20 ; cont loop if not ;AN000;
2175 MOV BYTE PTR DS:[SI-1],0 ; replace blank with zero ;AN000;
2176 ;AN000;
2177 ;AN000;
2178CES_1000: ;AN000;
2179 RestoreReg <SI,DS,AX> ; restore registers ;AN000;
2180 return ;AN000;
2181 ;AN000;
2182EndProc CHECK_END_SPACE ;AN000;
2183
2184 ;AN000;
2185 ;AN000;
2186IFSSEG ENDS ;AN000;
2187 END ;AN000;
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;
diff --git a/v4.0/src/CMD/IFSFUNC/MAKEFILE b/v4.0/src/CMD/IFSFUNC/MAKEFILE
new file mode 100644
index 0000000..3925be3
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/MAKEFILE
@@ -0,0 +1,127 @@
1#************************** makefile for cmd\... ***************************
2
3msg =..\..\messages
4dos =..\..\dos
5inc =..\..\inc
6hinc =..\..\h
7here =..\cmd\ifsfunc
8make =nmake -i
9
10#
11####################### dependencies begin here. #########################
12#
13
14all: ifsfunc.exe
15
16msdos.cl1: $(dos)\msdos.skl \
17 $(msg)\$(COUNTRY).msg \
18 $(dos)\makefile
19 copy $(dos)\msdos.skl
20 nosrvbld msdos.skl $(msg)\$(COUNTRY).msg
21
22ifsfunc.ctl: ifsfunc.skl $(msg)\$(COUNTRY).msg makefile
23
24$(inc)\dossym.inc: $(inc)\versiona.inc $(inc)\dosmac.inc \
25 $(inc)\bpb.inc $(inc)\buffer.inc $(inc)\sysvar.inc \
26 $(inc)\vector.inc $(inc)\mult.inc $(inc)\dirent.inc \
27 $(inc)\dpb.inc $(inc)\curdir.inc $(inc)\cpmfcb.inc \
28 $(inc)\find.inc $(inc)\pdb.inc $(inc)\exe.inc \
29 $(inc)\sf.inc $(inc)\arena.inc $(inc)\intnat.inc \
30 $(inc)\mi.inc $(inc)\filemode.inc $(inc)\error.inc \
31 $(inc)\syscall.inc \
32 makefile
33 echo " touch $(inc)\dossym.inc "
34
35ifssess.obj: ifssess.asm $(inc)\ifssym.inc ifsfsym.inc \
36 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
37 makefile
38
39ifsdir.obj: ifsdir.asm $(inc)\ifssym.inc ifsfsym.inc \
40 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
41 makefile
42
43ifsfile.obj: ifsfile.asm $(inc)\ifssym.inc ifsfsym.inc \
44 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
45 makefile $(inc)\doscntry.inc
46
47ifshand.obj: ifshand.asm $(inc)\ifssym.inc ifsfsym.inc \
48 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
49 makefile
50
51ifsdev.obj: ifsdev.asm $(inc)\ifssym.inc ifsfsym.inc \
52 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
53 makefile
54
55ifsutil.obj: ifsutil.asm $(inc)\ifssym.inc ifsfsym.inc \
56 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
57 $(inc)\bugtyp.asm \
58 makefile
59
60ifserror.obj: ifserror.asm $(inc)\ifssym.inc ifsfsym.inc \
61 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
62 ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \
63 makefile
64
65ifsfdos.obj: ifsfdos.asm $(inc)\ifssym.inc ifsfsym.inc \
66 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
67 $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \
68 $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \
69 $(inc)\parse.asm \
70 makefile
71
72ifsinit.obj: ifsinit.asm $(inc)\ifssym.inc ifsfsym.inc \
73 $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \
74 $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \
75 $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \
76 $(inc)\parse.asm \
77 ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \
78 makefile
79
80$(inc)\nibdos.obj:
81 cd $(inc)
82 $(make)
83 cd $(here)
84
85$(inc)\const2.obj:
86 cd $(inc)
87 $(make)
88 cd $(here)
89
90$(inc)\msdata.obj:
91 cd $(inc)
92 $(make)
93 cd $(here)
94
95$(inc)\mstable.obj:
96 cd $(inc)
97 $(make)
98 cd $(here)
99
100$(inc)\msdosme.obj:
101 cd $(inc)
102 $(make)
103 cd $(here)
104
105$(dos)\msdisp.obj:
106 cd $(dos)
107 $(make)
108 cd $(here)
109
110$(dos)\mscode.obj:
111 cd $(dos)
112 $(make)
113 cd $(here)
114
115ifsflink.obj: ifsflink.asm \
116 $(inc)\dossym.inc \
117 makefile
118
119ifsfunc.exe: ifssess.obj ifsdir.obj ifsfile.obj ifshand.obj \
120 ifsdev.obj ifsutil.obj ifserror.obj ifsfdos.obj \
121 ifsinit.obj \
122 $(inc)\nibdos.obj $(inc)\const2.obj $(inc)\msdata.obj \
123 $(inc)\mstable.obj $(dos)\msdisp.obj \
124 $(dos)\mscode.obj $(inc)\msdosme.obj \
125 ifsflink.obj makefile ifsfunc.lnk
126 link @ifsfunc.lnk
127