1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsfile.asm 1.0 87/05/11 ;AN000;
3 TITLE IFS
FILE ROUTINES
- Routines for IFS dispatch
;AN000;
5 ;************************************************************************************
7 ; FILE (WFP_START) related Network calls
10 ; IFS_SEQ_SET_FILE_ATTRIBUTE
11 ; IFS_SET_FILE_ATTRIBUTE
12 ; IFS_SEQ_GET_FILE_INFO
24 ; IFS_SEQ_SEARCH_FIRST
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.
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
58 ;************************************************************************************
62 INCLUDE IFSSYM
.INC ;AN000;
63 INCLUDE IFSFSYM
.INC ;AN000;
64 INCLUDE DOSSYM
.INC ;AN000;
65 INCLUDE DEVSYM
.INC ;AN000;
70 AsmVars
<IBM
, Installed
, DEBUG
> ;AN000;
72 ; then define the base code segment of the ifsfunc support first ;AN000;
74 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
77 ; include the rest of the segment definitions for normal MSDOS ;AN000;
79 include dosseg
.asm
;AN000;
81 DATA 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;
101 Extrn COUNTRY_CDPG
:BYTE
103 Extrn BugLev
:WORD ;AN000;
104 Extrn BugTyp
:WORD ;AN000;
105 include bugtyp
.asm
;AN000;
110 ; define our own code segment ;AN000;
112 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
113 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;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;
126 BREAK <IFS_DISK_INFO Get disk Info
> ;AN000;
128 ;************************************************************************************ ;AN000;
130 ; IFS_DISK_INFO ;AN000;
133 ; ES:DI -> CDS (not NULL) ;AN000;
134 ; DS -> DOSGROUP ;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;
160 ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
161 ; IF IFSR_RETCODE = 0 THEN ;AN000;
163 ; Call CD_TO_CDS to update CDS ;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;
173 ; Put error code in AX ;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;
186 ; Regs: Segs and DI preserved, others destroyed ;AN000;
188 ;************************************************************************************ ;AN000;
190 procedure IFS_DISK_INFO
,NEAR ;AN000;
191 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
193 MOV AX,DI ; set ifsDrv for possible I24 ;AN000;
194 invoke IFSDrvFromCDS
;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;
200 PUSH ES ; set ds:si -> cds ;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;
215 invoke CALL_IFS
; call fs with diskattr request ;AN000;
218 RestoreReg
<DI,ES> ; error - restore stack ;AN000;
219 JMP FA_1000
; go return ;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;
229 JMP FA_1000
; go ret in file attr routine ;AN000;
230 ; since it restores ds-dosgroup ;AN000;
232 EndProc IFS_DISK_INFO
;AN000;
235 BREAK <IFS_SEQ_SET_FILE_ATTRIBUTE
- Seq Set
File Attributes
> ;AN000;
237 ;************************************************************************************ ;AN000;
239 ; IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000;
241 ; see IFS_GET_FILE_INFO for details ;AN000;
243 ;************************************************************************************ ;AN000;
245 procedure IFS_SEQ_SET_FILE_ATTRIBUTE
,NEAR ;AN000;
247 ifsr_fcn_def EXECAPI
;AN000;
248 ifsr_api_def FILEATTR
;AN000;
250 PUSH AX ; save file attrs ;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;
255 PUSH CS ; get addressability to IFSSEG ;AN000;
256 POP DS ; prep ifsflags for set ;AN000;
257 ASSUME
DS:IFSSEG
;AN000;
258 MOV IFSPROC_FLAGS
,ZERO
;AN000;
259 JMP SHORT SFA_20
; cont. in ifs_seq_get_fa ;AN000;
261 EndProc IFS_SEQ_SET_FILE_ATTRIBUTE
;AN000;
263 BREAK <IFS_SET_FILE_ATTRIBUTE
- Set
File Attributes
> ;AN000;
265 ;************************************************************************************ ;AN000;
267 ; IFS_SET_FILE_ATTRIBUTE ;AN000;
269 ; see IFS_GET_FILE_INFO for details ;AN000;
271 ;************************************************************************************ ;AN000;
273 procedure IFS_SET_FILE_ATTRIBUTE
,NEAR ;AN000;
275 ifsr_fcn_def EXECAPI
;AN000;
276 ifsr_api_def FILEATTR
;AN000;
278 PUSH AX ; save file attrs ;AN000;
280 MOV CS:IFSPROC_FLAGS
,0 ; prep ifsflags ;AN000;
281 JMP SHORT FA_20
; cont. in ifs_get_file_info ;AN000;
283 EndProc IFS_SET_FILE_ATTRIBUTE
;AN000;
285 BREAK <IFS_SEQ_GET_FILE_INFO
- Seq Get
File Attributes
> ;AN000;
287 ;************************************************************************************ ;AN000;
289 ; IFS_SEQ_GET_FILE_ATTRIBUTE ;AN000;
291 ; see IFS_GET_FILE_INFO for details ;AN000;
293 ;************************************************************************************ ;AN000;
295 procedure IFS_SEQ_GET_FILE_INFO
,NEAR ;AN000;
297 ifsr_fcn_def EXECAPI
;AN000;
298 ifsr_api_def FILEATTR
;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;
303 PUSH CS ; prep ifsflags for get & seq ;AN000;
305 ASSUME
DS:IFSSEG
;AN000;
306 MOV IFSPROC_FLAGS
,ISGET
;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;
314 EndProc IFS_SEQ_GET_FILE_INFO
;AN000;
316 BREAK <IFS_GET_FILE_INFO
- Get
File Attributes
> ;AN000;
318 ;************************************************************************************ ;AN000;
320 ; GET_FILE_INFO ;AN000;
322 ; Routines called: DFL_SINGLE_FILE_CHECK ;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;
333 ; IF seq call THEN ;AN000;
335 ; Set IFS Header pointer to UNC IFS ;AN000;
336 ; Set IFSR_DEVICE_CB@ = null ;AN000;
339 ; IF [THISCDS] .NOT. NULL THEN ;AN000;
340 ; CALL CDS_TO_CD ;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;
350 ; IF no error THEN ;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;
370 ; * IFSR_SUBFUNC DB 0 ; in-line parms ;AN000;
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;
384 ; IF set THEN ;AN000;
386 ; IFSR_FUNC = 3 ;AN000;
387 ; IFSR_ATTR = AX ;AN000;
389 ; ELSE IFSR_FUNC = 2 ;AN000;
391 ; CALL routine, CALL_IFS, with pointer to IFS Header ;AN000;
392 ; IF IFSR_RETCODE = 0 THEN ;AN000;
394 ; IF cds THEN Call CD_TO_CDS ;AN000;
395 ; IF dfl THEN Call DF_TO_DFL ;AN000;
396 ; IF get THEN ;AN000;
398 ; AX = IFSR_ATTR ;AN000;
399 ; CX = IFSR_TIME ;AN000;
400 ; DX = IFSR_DATE ;AN000;
401 ; BX:DI = IFSR_SIZE ;AN000;
403 ; Clear carry ;AN000;
406 ; AX = IFSR_RETCODE ;AN000;
411 ; ELSE Set carry ;AN000;
414 ; CARRY CLEAR ;AN000;
418 ; BX:DI = SIZE ;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;
433 ; Regs: DS preserved, others destroyed ;AN000;
435 ;************************************************************************************ ;AN000;
437 procedure IFS_GET_FILE_INFO
,NEAR ;AN000;
439 ifsr_fcn_def EXECAPI
; define ifsr for fileattr ;AN000;
440 ifsr_api_def FILEATTR
;AN000;
443 MOV CS:IFSPROC_FLAGS
,ISGET
; set for get ;AN000;
446 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
447 CMP WORD PTR [THISCDS
],NULL_PTR
; determine CDS or DFL ;AN000;
449 LDS SI,[THISCDS
] ;AN000;
450 ASSUME
DS:NOTHING
;AN000;
451 TEST CS:IFSPROC_FLAGS
,ISGET
;AN000;
453 SaveReg
<DS,SI> ; preserve ds:si -> cds ;AN000;
454 JMP SHORT FA_60
;AN000;
456 RestoreReg
<AX> ; want attr on stack to stay on top ;AN000;
457 SaveReg
<DS,SI,AX> ; stack - ax,si,ds ;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;
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;
480 invoke DRIVE_FROM_CDS
; set IFSDrv for possible I24 ;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;
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;
491 MOV ES:[BX.IFSR_FUNC
],FUNC_GET_BY_NAME
; get file info ;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;
497 ASSUME
DS:DOSGROUP
;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;
505 MOV ES:[BX.IFSR_MATCHATTR
],AX ; ifsr_matchattr ;AN000;
507 POP DS ; restore ds=IFSSEG ;AN000;
508 ASSUME
DS:IFSSEG
;AN000;
510 ;************************************************
511 invoke CALL_IFS
; call ifs with file attr request ;AN000;
512 ;************************************************
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;
520 FA_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;
529 TEST IFSPROC_FLAGS
,ISCDS
; if cds - update cds w/cd ;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;
535 TEST IFSPROC_FLAGS
,ISSEQ
;AN000;
537 invoke DF_TO_DFL
; update dfl w/df ;AN000;
538 JMP SHORT FA_990
;AN000;
542 JMP SHORT FA_1000
;AN000;
546 PUSH SS ; restore original ds (dosgroup) ;AN000;
547 POP DS ; since this routine preserves ds ;AN000;
551 EndProc IFS_GET_FILE_INFO
;AN000;
553 BREAK <IFS_SEQ_RENAME Rename
> ;AN000;
554 ;************************************************************************************ ;AN000;
556 ; IFS_SEQ_RENAME ;AN000;
558 ; see ifs_rename for details ;AN000;
560 ;************************************************************************************ ;AN000;
561 procedure IFS_SEQ_RENAME
,NEAR ;AN000;
563 ifsr_fcn_def EXECAPI
;AN000;
564 ifsr_api_def RENFILE
;AN000;
566 MOV CS:IFSPROC_FLAGS
,ISREN
; set for rename and cont. ;AN000;
567 JMP SHORT SD_10
; in ifs_seq_delete ;AN000;
570 EndProc IFS_SEQ_RENAME
;AN000;
573 BREAK <IFS_RENAME Rename
> ;AN000;
575 ;************************************************************************************ ;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;
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;
594 ; CARRY CLEAR ;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;
614 ;************************************************************************************ ;AN000;
616 procedure IFS_RENAME
,NEAR ;AN000;
618 ifsr_fcn_def EXECAPI
;AN000;
619 ifsr_api_def RENFILE
;AN000;
621 MOV CS:IFSPROC_FLAGS
,ISREN
; set for rename ;AN000;
622 JMP SHORT D_20
; processing continues in ifs_delete ;AN000;
624 EndProc IFS_RENAME
;AN000;
627 BREAK <IFS_SEQ_DELETE Delete
> ;AN000;
629 ;************************************************************************************ ;AN000;
631 ; IFS_SEQ_DELETE ;AN000;
633 ; see ifs_delete for details ;AN000;
635 ;************************************************************************************ ;AN000;
636 procedure IFS_SEQ_DELETE
,NEAR ;AN000;
638 ifsr_fcn_def EXECAPI
;AN000;
639 ifsr_api_def DELFILE
;AN000;
641 MOV IFSPROC_FLAGS
,0 ; Clear IFS processing flags ;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;
646 SD_20: ; welcome ifs_seq_rename code ;AN000;
649 ASSUME
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;
654 EndProc IFS_SEQ_DELETE
;AN000;
657 BREAK <IFS_DELETE Delete
> ;AN000;
659 ;************************************************************************************ ;AN000;
663 ; Called by: IFSFUNC Dispatcher ;AN000;
665 ; Routines called: CDS_TO_CD ;AN000;
666 ; CD_TO_CDS CALL_IFS ;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;
674 ; IF INT 2FH call .NOT. SEQ version THEN ;AN000;
676 ; IF [THISCDS] .NOT. NULL THEN ;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;
683 ; Set AX = invalid function ;AN000;
684 ; Set extended error info ;AN000;
689 ; Set IFS_DEVICE_CB@ to NULL ;AN000;
690 ; Set IFS_HDR_PTR = [UNC_FS_HDR] ;AN000;
693 ; IF no error THEN ;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;
714 ; Call routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000;
715 ; IF IFSR_RETCODE = 0 THEN ;AN000;
717 ; Call CD_TO_CDS or DF_TO_DFL ;AN000;
718 ; Clear carry ;AN000;
721 ; AX = IFSR_RETCODE ;AN000;
726 ; ELSE set carry ;AN000;
730 ; CARRY CLEAR ;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;
738 ; error_access_denied ;AN000;
739 ; Attempt to delete device or directory ;AN000;
740 ; DS preserved, others destroyed ;AN000;
742 ;************************************************************************************ ;AN000;
744 procedure IFS_DELETE
,NEAR ;AN000;
746 ifsr_fcn_def EXECAPI
;AN000;
747 ifsr_api_def DELFILE
;AN000;
749 MOV CS:IFSPROC_FLAGS
,ZERO
; Clear IFS processing flags ;AN000;
751 D_20: ; (Welcome ifs_ren) ;AN000;
752 ASSUME
DS:DOSGROUP
;AN000;
753 invoke DRIVE_FROM_CDS
; ds - dosgroup ;AN000;
754 CMP WORD PTR [THISCDS
],NULL_PTR
; CDS must not be null ;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;
759 D_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;
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;
777 D_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;
783 MOV AL,[SATTRIB
] ;AN000;
785 MOV ES:[BX.IFSR_MATCHATTR
],AX ; ifsr_matchattr ;AN000;
786 MOV ES:[BX.IFSR_FUNCTION
],IFSEXECAPI
; ifsr_function ;AN000;
788 TEST CS:IFSPROC_FLAGS
,ISSEQ
; if unc, don't do cds stuff ;AN000;
790 LDS SI,[THISCDS
] ;AN000;
791 ASSUME
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;
800 invoke CALL_IFS
; call ifs w/request ;AN000;
803 TEST IFSPROC_FLAGS
,ISSEQ
; fs error - restore stack ;AN000;
804 JZ D_75
; if not unc - go ret ;AN000;
811 TEST IFSPROC_FLAGS
,ISSEQ
; fs successful ;AN000;
812 JZ D_90
; if seq, just ret ;AN000;
814 D_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;
820 EndProc IFS_DELETE
;AN000;
822 BREAK <IFS_SEQ_OPEN Open
> ;AN000;
823 ;************************************************************************************ ;AN000;
824 ; see IFS_OPEN for details ;AN000;
825 ;************************************************************************************ ;AN000;
827 procedure IFS_SEQ_OPEN
,NEAR ;AN000;
829 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
830 ifsr_api_def OPENFILE
;AN000;
832 PUSH AX ; save access/share byte ;AN000;
834 MOV CS:IFSPROC_FLAGS
,ISOLDOPEN
; remember this is old open ;AN000;
835 JMP SHORT SXO_10
; cont. in ifs_seq_xopen ;AN000;
837 EndProc IFS_SEQ_OPEN
;AN000;
839 BREAK <IFS_OPEN Open
> ;AN000;
841 ;************************************************************************************ ;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;
865 ; For FCB SFTs AL should = -1 ;AN000;
866 ; (not checked) ;AN000;
868 ; see IFS_XOPEN ;AN000;
870 ; sf_ref_count is NOT altered ;AN000;
871 ; CARRY CLEAR ;AN000;
872 ; THISSFT filled in. ;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;
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;
887 ;************************************************************************************ ;AN000;
889 procedure IFS_OPEN
,NEAR ;AN000;
891 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
892 ifsr_api_def OPENFILE
;AN000;
894 PUSH AX ; save access/share mode ;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;
899 EndProc IFS_Open
;AN000;
901 BREAK <IFS_SEQ_CREATE Open
> ;AN000;
903 ;************************************************************************************ ;AN000;
905 ; IFS_SEQ_CREATE ;AN000;
907 ; see IFS_CREATE for details ;AN000;
909 ;************************************************************************************ ;AN000;
911 procedure IFS_SEQ_CREATE
,NEAR ;AN000;
913 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
914 ifsr_api_def OPENFILE
;AN000;
916 PUSH AX ; save attribute ;AN000;
918 MOV CS:IFSPROC_FLAGS
,IsOldCreate
+ IsCreate
; remember is old create ;AN012;
919 JMP SHORT SXO_10
; cont. in ifs_seq_xopen ;AN000;
921 EndProc IFS_SEQ_CREATE
;AN000;
923 BREAK <IFS_CREATE Create
> ;AN000;
925 ;************************************************************************************ ;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;
943 ; See IFS_XOPEN for details ;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;
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;
961 ;************************************************************************************ ;AN000;
963 procedure IFS_CREATE
,NEAR ;AN000;
965 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
966 ifsr_api_def OPENFILE
;AN000;
968 PUSH AX ; save attribute ;AN000;
970 MOV CS:IFSPROC_FLAGS
,ISOLDCREATE
; remember is old create ;AN000;
971 JMP SHORT XO_20
; cont. in ifs_xopen ;AN000;
973 EndProc IFS_Create
;AN000;
976 BREAK <IFS_SEQ_XOPEN Open
> ;AN000;
978 ;************************************************************************************ ;AN000;
980 ; IFS_SEQ_XOPEN ;AN000;
982 ; see IFS_XOPEN for details ;AN000;
984 ;************************************************************************************ ;AN000;
986 procedure IFS_SEQ_XOPEN
,NEAR ;AN000;
988 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
989 ifsr_api_def OPENFILE
;AN000;
991 MOV IFSPROC_FLAGS
,0 ; Clear IFS processing flags ;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;
997 PUSH CS ; ds-ifsseg ;AN000;
999 ASSUME
DS:IFSSEG
;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;
1006 EndProc IFS_SEQ_XOPEN
;AN000;
1009 BREAK <IFS_XOPEN Open
> ;AN000;
1011 ;************************************************************************************
1015 ; Called by: IFSFUNC dispatcher
1017 ; Routines called: CALL_IFS DFL_MATCH
1018 ; CD_TO_CDS DFL_TO_DF
1019 ; CDS_TO_CD DF_TO_DFL
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,
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
1050 ; IF [THISCDS] .NOT. NULL THEN
1053 ; Set IFSR_DEVICE_CB@ as pointer to CD
1054 ; Set IFS pointer to CURDIR_IFSR_HDR
1059 ; Set IFSR_DEVICE_CB@ as pointer to DF
1060 ; Set IFS pointer to DFL_IFSR_HDR
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 ?
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
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
1095 ; CALL routine, CALL_IFS, with IFS pointer
1096 ; IF IFSR_RETCODE = 0 THEN
1098 ; IF DFL_FLAG = 0 THEN
1100 ; ELSE Call DF_TO_DFL
1104 ; ELSE DO /* error */
1111 ; CX=ACTION TAKEN CODE
1113 ; 2 = FILE CREATED/OPENED
1114 ; 3 = FILE REPLACED/OPENED
1115 ; sf_ref_count is NOT altered
1116 ; THISSFT filled in or updated
1118 ; error_file_not_found
1119 ; Last element of path not found
1120 ; error_path_not_found
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
1130 ;************************************************************************************
1132 procedure IFS_XOPEN
,NEAR ;AN000;
1134 ifsr_fcn_def EXECAPI
; define ifsr for open/create ;AN000;
1135 ifsr_api_def OPENFILE
;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
1141 XO_20: ; (welcome all old open/create calls) ;AN000;
1142 ASSUME
DS:DOSGROUP
;AN000;
1143 MOV [SAVE_DI
],-1 ; set no parms list on old calls ;AN008; BAF
1145 invoke PREP_IFSR
; zero out ifsr ;AN000;
1146 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;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;
1154 CMP WORD PTR [THISCDS
],NULL_PTR
; determine CDS or DFL ;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;
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;
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;
1176 OR CS:IFSPROC_FLAGS
,IsSeq
;AN014;
1177 CMP CS:[fAssign
],ZERO
1183 invoke DFL_SINGLE_FILE_CHECK
; DFL: sets [THISIFS] ;AN000;
1184 ; ES:BX -> IFSRH ;AN000;
1185 ; IFSR_DEVICE_CB@ ;AN000;
1186 ; ds - IFSSEG ;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;
1192 MOV AX,error_invalid_function
; set error info and quit ;AN000;
1194 invoke SET_EXTERR_INFO
;AN000;
1195 JMP FA_980
; ret up in FA to preserve DS ;AN000;
1197 XO_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;
1208 ;;;;;; OR AX,OLDOPEN_MODE ; why did I do this???? scrap ;AD006;
1210 SaveReg
<DS,SI> ; old redirector does this ;AN013;
1212 LDS SI,[THISSFT
] ;AN013;
1213 TEST DS:[SI.SF_MODE
],sf_isFCB
;AN013;
1214 RestoreReg
<SI,DS> ;AN013;
1219 MOV ES:[BX.IFSR_MODE
],AX ;AN000;
1220 MOV ES:[BX.IFSR_FLAG
],OLDOPEN_FLAG
;AN000;
1222 JMP SHORT XO_240
;AN000;
1224 TEST IFSPROC_FLAGS
,ISOLDCREATE
;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;
1230 MOV ES:[BX.IFSR_FLAG
],OLDCREATENEW_FLAG
;AN000;
1234 PUSH SS ; get ds = dosgroup so can access ;AN000;
1235 POP DS ; wfp_start ;AN000;
1236 ASSUME
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;
1241 XO_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
1249 AND AX,0FF0H ;AN012;
1250 CMP AL,NOTEXIST_ACT_CREATE
*16 ;AN012;
1251 RestoreReg
<AX> ;AN012;
1253 OR IFSPROC_FLAGS
,IsCreate
;AN012;
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;
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;
1275 ASSUME
DS:IFSSEG
;AN000;
1277 ;****************************************************************************** ;AN000;
1278 invoke CALL_IFS
; call fs with open/create request ;AN000;
1279 ;****************************************************************************** ;AN000;
1282 TEST IFSPROC_FLAGS
,ISCDS
; request FAILED - ;AN000;
1284 JMP FA_980
; go up, set carry & return ;AN000;
1286 RestoreReg
<SI,DS> ; if cds, restore stack first ;AN000;
1289 XO_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;
1294 ASSUME
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
1298 ASSUME
DS:IFSSEG
;AN007; BAF
1299 XO_310: ; request SUCCEEDED - ;AN007; BAF
1300 MOV AX,ES:[BX.IFSR_MATCHATTR
] ;AN000;
1302 invoke SFF_TO_SFT
; update sft ;AN000;
1303 TEST IFSPROC_FLAGS
,ISCDS
;AN000;
1305 RestoreReg
<DI,ES> ; cds-restore cds ptr into es:di ;AN000;
1306 invoke CD_TO_CDS
; update cds ;AN000;
1309 TEST IFSPROC_FLAGS
,ISSEQ
;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;
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;
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;
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;
1341 ADD DI,sf_name
; blank out sf_name ;AN000;
1342 SaveReg
<DI> ; | ;AN000;
1343 MOV AX,2020H
; | ;AN000;
1344 MOV CX,5 ; | ;AN000;
1346 REP STOSW ; | ;AN000;
1348 RestoreReg
<DI> ; | ;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;
1356 DEC SI ; mov back one ;AN000;
1357 CMP BYTE PTR DS:[SI],"\" ; looking for \ just before fn ;AN000;
1360 INC SI ; si now pointing to 1st char fn ;AN000;
1361 MOV CX,8 ; esdi -> sf_name ;AN000;
1371 JMP SHORT XO_364 ;AN000;
1374 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1375 JMP SHORT XO_378 ;AN000;
1378 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1389 JMP SHORT XO_370 ;AN000;
1391 MOV BYTE PTR ES:[DI-1]," " ;AN000;
1394 RestoreReg <SI,DS,CX> ; dssi -> sft, cx=action code ;AN000;
1395 JMP SHORT XO_500 ;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;
1407 MOV AX,2020H ;AN000;
1410 RestoreReg <SI,DS,CX> ; sft ptr, action ;AN003/AC005;
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;
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;
1422 MOV WORD PTR DS:[SI.SF_POSITION],0 ;AN012;
1423 MOV WORD PTR DS:[SI.SF_POSITION+2],0 ;AN012;
1425 TEST CS:IFSPROC_FLAGS,IsCreate ; if create, set sf time/date ;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;
1436 PUSH SS ; Preserve input DS ;AN000;
1438 MOV AX,(multDOS SHL 8) OR 12 ;AN000;
1443 EndProc IFS_XOPEN ;AN000;
1445 BREAK <IFS_SEQ_SEARCH> ;AN000;
1447 ;************************************************************************************ ;AN000;
1449 ; IFS_SEQ_SEARCH ;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;
1457 ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000;
1460 ; AX = error_path_not_found ;AN000;
1461 ; DS preserved, others destroyed ;AN000;
1463 ;************************************************************************************ ;AN000;
1465 procedure IFS_SEQ_SEARCH_FIRST,NEAR ;AN000;
1466 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1468 MOV AX,error_path_not_found ;AN000;
1472 EndProc IFS_SEQ_SEARCH_FIRST ;AN000;
1474 ;************************************************************************************ ;AN000;
1476 ; IFS_SEQ_SEARCH_NEXT ;AN000;
1479 ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000;
1480 ; (only first 21 bytes must have valid information) ;AN000;
1482 ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000;
1485 ; AX = error_no_more_files ;AN000;
1486 ; DS preserved, others destroyed ;AN000;
1488 ;************************************************************************************ ;AN000;
1490 procedure IFS_SEQ_SEARCH_NEXT,NEAR ;AN000;
1491 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1493 JMP IFS_SEQ_SEARCH_FIRST ;AN000;
1495 EndProc IFS_SEQ_SEARCH_NEXT ;AN000;
1498 BREAK <IFS_SEARCH_FIRST Search for first entry> ;AN000;
1500 ;************************************************************************************
1505 ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL
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
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 ?
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
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)
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
1554 ; IF search first THEN
1557 ; Get CDS from [THISCDS]
1562 ; Get CDS from drive byte in DMAADD
1566 ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR
1567 ; IF IFSR_RETCODE = 0 THEN
1570 ; DMAADD = IFSR_CONTINFO
1581 ; The 53 bytes ot DMAADD are filled in as follows:
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 ------------------------------|
1589 ; 32 bytes of the directory entry found
1592 ; error_no_more_files
1593 ; No match for this file
1594 ; error_access_denied
1596 ; error_path_not_found
1598 ; DS preserved, others destroyed
1600 ;************************************************************************************
1602 procedure IFS_SEARCH_FIRST,NEAR ;AN000;
1604 ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000;
1605 ifsr_api_def SEARCHFILE ;AN000;
1607 MOV CS:IFSPROC_FLAGS,ZERO ;AN000;
1608 invoke PREP_IFSR ; zero ifsr ;AN000;
1610 ASSUME DS:DOSGROUP ;AN000;
1611 LES DI,[DMAADD] ; esdi -> dmaadd ;AN001;
1612 LDS SI,[THISCDS] ; dssi -> cds ;AN000;
1614 invoke DRIVE_FROM_CDS ; set ifsdrv (0-based) ;AN001;
1615 MOV AL,CS:[IFSDRV] ; put 1-based drive # in dmaadd ;AN001;
1617 OR AL,80H ; turn on ifs indicator ;AN001;
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;
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;
1635 MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000;
1638 ASSUME DS:IFSSEG,ES:IFSSEG ;AN000;
1640 MOV AL,IFSSEARCH_FIRST ;AN000;
1641 JMP SHORT SN_60 ; rest of processing is in ;AN000;
1642 ; search_next routine ;AN000;
1644 EndProc IFS_SEARCH_FIRST ;AN000;
1646 BREAK <IFS_SEARCH_NEXT Search for next> ;AN000;
1648 ;************************************************************************************ ;AN000;
1650 ; IFS_SEARCH_NEXT ;AN000;
1653 ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000;
1654 ; (only first 21 bytes must have valid information) ;AN000;
1656 ; Look for subsequent matches ;AN000;
1658 ; CARRY CLEAR ;AN000;
1659 ; The 53 bytes at DMAADD are updated for next call ;AN000;
1660 ; (see NET_SEARCH_FIRST) ;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;
1667 ;************************************************************************************ ;AN000;
1669 procedure IFS_SEARCH_NEXT,NEAR ;AN000;
1670 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1672 ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000;
1673 ifsr_api_def SEARCHFILE ;AN000;
1675 MOV CS:IFSPROC_FLAGS,ZERO ; clear processing flags ;AN000;
1676 invoke PREP_IFSR ; zero out ifsr ;AN000;
1679 LDS SI,[DMAADD] ;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;
1685 ASSUME DS:NOTHING ;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;
1690 SN_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;
1699 ; INC AL ; inc subfunc to search same ;AD011;
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;
1708 MOV AX,WORD PTR [DMAADD] ;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;
1715 ASSUME DS:IFSSEG ;AN000;
1716 invoke CALL_IFS ; call FS ;AN000;
1717 RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000;
1719 invoke CD_TO_CDS ;AN000;
1723 JMP FA_1000 ; go up & preserve ds, ret ;AN000;
1725 EndProc IFS_SEARCH_NEXT ;AN000;
1728 BREAK <OPEN_CHECK_DEVICE - check that device to be opened is real> ;AN000;
1730 ;************************************************************************************ ;AN000;
1732 ; CHECK_OPEN_DEVICE ;AN000;
1735 ; [WFP_START] ;AN000;
1743 ;************************************************************************************ ;AN000;
1745 procedure OPEN_CHECK_DEVICE,NEAR ;AN000;
1746 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
1748 MOV SI,[WFP_START] ; dssi -> path to open ;AN000;
1749 ; invoke PARSE_DEVICE_PATH ; dssi -> device name (asciiz) ;AN000;
1751 PUSH SS ; Now check if this device is real ;AN000;
1753 MOV DI,OFFSET DOSGROUP:NAME1 ;AN000;
1755 REP MOVSW ; Transfer name to NAME1 ;AN000;
1756 MOV AX,2020H ;AN000;
1762 ASSUME 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;
1768 MOV AX,error_file_not_found ;AN000;
1769 transfer ifs_980 ;AN000;
1772 transfer ifs_990 ;AN000;
1774 EndProc OPEN_CHECK_DEVICE ;AN000;