summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM
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/IFSFILE.ASM
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/IFSFILE.ASM')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSFILE.ASM1778
1 files changed, 1778 insertions, 0 deletions
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;