1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifshand.asm 1.0 87/05/11 ;AN000;
3 TITLE IFSFUNC HANDLE ROUTINES
- Routines for
FS dispatch
;AN000;
5 ;******************************************************************************
7 ; HANDLE (SFT) related FS calls
19 ; A000 Original version 4.00 May 1987
20 ; A001 P635 - Correct Read problem - restore es:di -> sft
22 ; A002 P659 - Copy cmd problems (xattr)
24 ; A003 P868 - Lock problems R.G
25 ; A004 P849 - Printer problems R.G
26 ; A005 P1601- lock/xattr problems R.G
27 ; A006 P????- Write Only Lock support in Lock Read/Write 10/27 FEIGENBAUM
28 ; A007 P2339- Not getting count back to user in xattr call 11/09 RG
29 ; A008 P2433- redir copy problem (Xattr) 11/17 RG
30 ; A009 P2566- xattrs not propagated across network 12/3 RG
31 ; (due to size check on set that does not offer size)
32 ; A010 D285 - Remove Extended Attributes/Lock 1/88 RG
33 ; A011 P2994- double close problem 1/88 RG
34 ; A012 P3149- basica file redirection - seek problem 1/88 RMG
35 ; A013 P3185- get ea cx check 1/88 RMG
36 ; A014 P3249- lock problem 1/88 RMG
37 ; A015 P3432- copy to remote ptr problem - write 2/88 RMG
38 ; A016 P3513- return cx on xattr wrong 2/88 RMG
39 ; A017 P3968- set sf time/date on close 3/25/88 RMG
40 ; A018 P4839- fcb open/ren/term problem on abort close 5/13/88 RMG
41 ; A019 P4791- don't overwrite ax on error 5/19/88 RMG
42 ; A020 P5003- LSEEK hang using Austin Test tool 6/01/88 RPS
45 ; Programming note: In the prologues to the routines, the input/output are
46 ; accurate. The pseudocode, however, is outdated and does
47 ; not reflect the code.
49 ;******************************************************************************
53 INCLUDE IFSSYM
.INC ;AN000;
54 INCLUDE IFSFSYM
.INC ;AN000;
55 INCLUDE DOSSYM
.INC ;AN000;
56 INCLUDE DEVSYM
.INC ;AN000;
61 AsmVars
<IBM
, Installed
, DEBUG
> ;AN000;
63 ; define the base code segment of the network support first ;AN000;
65 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
68 ; include THE REST of the segment definitions for normal MSDOS ;AN000;
70 include dosseg
.asm
;AN000;
72 DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
73 ;DOSGROUP Data ;AN000;
74 Extrn THISSFT
:DWORD ;AN000;
75 Extrn DMAADD
:DWORD ;AN000;
76 Extrn CurrentPDB
:WORD ;AN000;
86 ; define our own code segment ;AN000;
88 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
89 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;AN000;
92 Extrn THISDFL
:DWORD ;AN000;
93 Extrn THISIFS
:DWORD ;AN000;
94 Extrn IFSPROC_FLAGS
:WORD ;AN000;
95 Extrn IFSR
:WORD ;AN000;
96 Extrn DEVICE_CB@_OFFSET
:WORD ;AN000;
98 BREAK <IFS_CLOSE Close a
FS SFT
> ;AN000;
100 ;****************************************************************************** ;AN000;
102 ; IFS_CLOSE - see IFS_COMMIT for details ;AN000;
104 ;****************************************************************************** ;AN000;
106 procedure IFS_CLOSE
,NEAR ;AN000;
107 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
109 ifsr_fcn_def EXECAPI
; define ifsr for close ;AN000;
110 ifsr_api_def CLOSEFILE
;AN000;
112 TEST ES:[DI.SF_FLAGS
],devid_file_clean
+ sf_close_nodate
;AN017;
114 CallInstall DATE16
,MultDOS
,13 ; set sf date/time on close ;AN017;
115 MOV ES:[DI.SF_DATE
],AX ;AN017;
116 MOV ES:[DI.SF_TIME
],DX ;AN017;
119 SaveReg
<ES,DI> ; save SFT ptr ;AN000;
120 CallInstall FREE_SFT
,MultDOS
,8 ; set SFT busy ;AN000;
121 PUSH AX ; save old ref count ;AN000;
123 TEST ES:[DI.SF_MODE
],SF_ISFCB
; always close fcb ;AN011;
124 JNZ C_10
; only do real close when ;AN011;
125 CMP AX,1 ; sft being freed ;AN011;
129 MOV CS:IFSPROC_FLAGS
,ISCLOSE
+ SETDEVICECB
;AN000;
130 ; 2nd flag causes sft_to_sff to ;AN000;
131 ; set device cb@ ;AN000;
132 JMP C_20
; cont. in ifs_commit ;AN000;
134 EndProc IFS_CLOSE
;AN000;
136 BREAK <IFS_COMMIT Commit a
FS SFT
> ;AN000;
138 ;****************************************************************************** ;AN000;
142 ; Called by: IFSFUNC dispatcher ;AN000;
144 ; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
149 ; [THISSFT] set to the SFT for the file being used ;AN000;
150 ; ES:DI = [THISSFT] (date time are NOT correct) ;AN000;
151 ; SFT must never be for an FCB on commit (error not detected) ;AN000;
154 ; Prep IFSRH: ;AN000;
155 ; * IFSR_LENGTH DW 40 ; Total length of request ;AN000;
156 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
157 ; + IFSR_RETCODE DW ? ;AN000;
158 ; + IFSR_RETCLASS DB ? ;AN000;
159 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
160 ; * IFSR_APIFUNC DB 14 ; Close/commit file ;AN000;
161 ; + IFSR_ERROR_CLASS DB ? ;AN000;
162 ; + IFSR_ERROR_ACTION DB ? ;AN000;
163 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
164 ; + IFSR_ALLOWED DB ? ;AN000;
165 ; + IFSR_I24_RETRY DB ? ;AN000;
166 ; + IFSR_I24_RESP DB ? ;AN000;
167 ; IFSR_RESV2 DB ? ;AN000;
168 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
169 ; *+ IFSR_OPEN_CB@ DD ? ; SF ;AN000;
170 ; * IFSR_FUNC DB ? ; 0=CLOSE, 1=COMMIT ;AN000;
171 ; IFSR_RESV2 DB 0 ;AN000;
173 ; IF close THEN ;AN000;
174 ; IFSR_FUNC = 0 ;AN000;
175 ; ELSE IFSR_FUNC = 1 ;AN000;
176 ; CALL routine, CALL_IFS, with pointer to SF_IFS_HDR ;AN000;
177 ; IF IFSR_RETCODE = 0 THEN ;AN000;
179 ; Call SFF_TO_SFT ;AN000;
180 ; Decrement SF_REF_COUNT if close ;AN000;
181 ; Clear carry ;AN000;
183 ; ELSE DO {error} ;AN000;
184 ; AX = IFSR_RETCODE ;AN000;
190 ; sf_ref_count decremented on close unless FAIL ;AN000;
191 ; (AX has old value for COMMIT) ;AN000;
192 ; ES:DI point to SFT ;AN000;
193 ; Carry set if error (file deleted or disk changed) ;AN000;
195 ; DS preserved, others destroyed ;AN000;
197 ;****************************************************************************** ;AN000;
199 procedure IFS_COMMIT
,NEAR ;AN000;
200 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
202 ifsr_fcn_def EXECAPI
;AN000;
203 ifsr_api_def CLOSEFILE
;AN000;
205 MOV CS:IFSPROC_FLAGS
,SETDEVICECB
; set ifsproc_flags ;AN000;
206 C_20: ; (welcome ifs_close) ;AN000;
207 invoke DRIVE_FROM_SFT
; set IFSDRV for possible criter ;AN000;
208 invoke PREP_IFSR
; clear ifsrh ;AN000;
209 MOV DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
210 invoke SFT_TO_SFF
; sets: [THISIFS] ;AN000;
211 ; ES:BX -> IFSRH ;AN000;
212 ; IFSR_OPEN_CB@ ;AN000;
213 ; ds - IFSSEG ;AN000;
215 MOV ES:[BX.IFSR_LENGTH
],LENGTH_CLOSEFILE
; prep IFSRH ;AN000;
216 MOV ES:[BX.IFSR_FUNCTION
],IFSEXECAPI
;AN000;
217 MOV ES:[BX.IFSR_APIFUNC
],IFSCLOSEFILE
;AN000;
219 TEST IFSPROC_FLAGS
,ISCLOSE
;AN000;
223 MOV ES:[BX.IFSR_FUNC
],AL ;AN000;
225 invoke CALL_IFS
; *** call fs with close request ;AN000;
228 TEST IFSPROC_FLAGS
,ISCLOSE
; ifs error ;AN000;
229 JZ C_980
; return w/carry, if close ;AN000;
230 ;;;;;;;;ADD SP,6 ; restore stack first ;AD018;
231 RestoreReg
<CX,DI,ES> ; old ref count & sft ;AN018;;AC019;
232 CMP CX,1 ;AN018;;AC019;
234 MOV ES:[DI.sf_ref_count
],0 ; If freeing, need to zap ;AN018;
237 invoke SFF_TO_SFT
;AN000;
238 TEST IFSPROC_FLAGS
,ISCLOSE
;AN000;
239 JZ C_990
; finished w/commit ;AN000;
241 RestoreReg
<AX,DI,ES> ; old ref count & sft ;AN000;
244 MOV ES:[DI.sf_ref_count
],0 ; If freeing, need to zap ;AN000;
245 JMP C_990
; busy mark ;AN000;
248 C_980: ; Return area ;AN000;
253 C_1000: ; preserve ds - dosgroup ;AN000;
258 EndProc IFS_COMMIT
;AN000;
260 BREAK <IFS_LSEEK Seek
on a NET SFT
> ;AN000;
262 ;****************************************************************************** ;AN000;
267 ; ES:DI -> SFT ;AN000;
268 ; CX:DX = Input CX:DX to $Lseek (offset) ;AN000;
269 ; NOTE: THIS LSEEK IS ALWAYS ASSUMED TO BE A TYPE 2 (relative to EOF) ;AN000;
271 ; Prep IFSRH: ;AN000;
272 ; * IFSR_LENGTH DW 44 ; Request length ;AN000;
273 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
274 ; + IFSR_RETCODE DW ? ;AN000;
275 ; + IFSR_RETCLASS DB ? ;AN000;
276 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
277 ; * IFSR_APIFUNC DB 10 ; Lseek file ;AN000;
278 ; + IFSR_ERROR_CLASS DB ? ;AN000;
279 ; + IFSR_ERROR_ACTION DB ? ;AN000;
280 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
281 ; + IFSR_ALLOWED DB ? ;AN000;
282 ; + IFSR_I24_RETRY DB ? ;AN000;
283 ; + IFSR_I24_RESP DB ? ;AN000;
284 ; IFSR_RESV2 DB ? ;AN000;
285 ; IFSR_DEVICE_CB@ DD ? ;AN000;
286 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
287 ; ; and set this as pointer to it. ;AN000;
288 ; * IFSR_MODE DB 2 ; Position mode: - BL ;AN000;
289 ; ; 2 = ptr moved eof + offset ;AN000;
290 ; IFSR_RESV2 DB 0 ;AN000;
291 ; * IFSR_POSITION DD ? ; displacement of LSEEK - CX:DX ;AN000;
293 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
294 ; IF IFSR_RETCODE = 0 THEN ;AN000;
296 ; Call SFF_TO_SFT ;AN000;
297 ; Set DX:AX = IFSR_POSITION ;AN000;
298 ; Clear carry ;AN000;
300 ; ELSE DO {error} ;AN000;
301 ; AX = IFSR_RETCODE ;AN000;
306 ; ES:DI -> SFT ;AN000;
307 ; Carry clear ;AN000;
308 ; DX:AX return as with local $Lseek ;AN000;
310 ; AX is error code ;AN000;
311 ; All destroyed ;AN000;
313 ;****************************************************************************** ;AN000;
315 procedure IFS_LSEEK
,NEAR ;AN000;
316 ASSUME
DS:Nothing
,ES:NOTHING
; Initially DS is unknown ;AN020;
318 ifsr_fcn_def EXECAPI
; define ifsr for lseek ;AN000;
319 ifsr_api_def LSEEKFILE
;AN000;
321 PUSH SS ; Set DS to DOSGROUP ;AN020;
323 ASSUME
DS:DOSGROUP
; ;AN020;
325 MOV CS:IFSPROC_FLAGS
,SETDEVICECB
; init processing flags ;AN000;
326 MOV WORD PTR [THISSFT
],DI ;AN020;
327 MOV WORD PTR [THISSFT
+2],ES ;AN020;
328 SaveReg
<ES,DI> ; save for later restore before leave ;AN012;;AN020;
330 invoke PREP_IFSR
;AN000;
332 invoke DRIVE_FROM_SFT
; set IFSDRV for possible criter ;AN000;
333 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
334 invoke SFT_TO_SFF
; sets: [THISIFS] ;AN000;
335 ; ES:BX -> IFSRH ;AN000;
336 ; IFSR_OPEN_CB@ ;AN000;
337 ; ds - IFSSEG ;AN000;
339 MOV ES:[BX.IFSR_LENGTH
],LENGTH_LSEEKFILE
; prep IFSRH ;AN000;
340 MOV ES:[BX.IFSR_FUNCTION
],IFSEXECAPI
;AN000;
341 MOV ES:[BX.IFSR_APIFUNC
],IFSLSEEKFILE
;AN000;
342 MOV ES:[BX.IFSR_MODE
],MODE2
;AN000;
343 MOV WORD PTR ES:[BX.IFSR_POSITION
],DX ;AN000;
344 MOV WORD PTR ES:[BX.IFSR_POSITION
+2],CX ;AN000;
346 invoke CALL_IFS
; call fs with lseek request ;AN000;
349 MOV AX,WORD PTR ES:[BX.IFSR_POSITION
] ;AN000;
350 MOV DX,WORD PTR ES:[BX.IFSR_POSITION
+2] ;AN000;
351 invoke SFF_TO_SFT
;AN000;
355 RestoreReg
<DI,ES> ; restore sft ptr for ibmdos ;AN012;
358 EndProc IFS_LSEEK
;AN000;
360 BREAK <IFS_READ Read
from a NET SFT
> ;AN000;
362 ;****************************************************************************** ;AN000;
366 ; Called by: IFSFUNC dispatcher ;AN000;
368 ; Routines called: CALL_IFS ;AN000;
373 ; Outputs of SETUP: ;AN000;
374 ; CX = byte count ;AN000;
375 ; ES:DI Points to SFT ;AN000;
376 ; [DMAADD] = transfer addr ;AN000;
377 ; SFT checked for access mode ;AN000;
379 ; Prep IFSRH: ;AN000;
380 ; * IFSR_LENGTH DW 46 ; Total length of request ;AN000;
381 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
382 ; + IFSR_RETCODE DW ? ;AN000;
383 ; + IFSR_RETCLASS DB ? ;AN000;
384 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
385 ; * IFSR_APIFUNC DB 11 ; Read Byte Block ;AN000;
386 ; + IFSR_ERROR_CLASS DB ? ;AN000;
387 ; + IFSR_ERROR_ACTION DB ? ;AN000;
388 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
389 ; + IFSR_ALLOWED DB ? ;AN000;
390 ; + IFSR_I24_RETRY DB ? ;AN000;
391 ; + IFSR_I24_RESP DB ? ;AN000;
392 ; IFSR_RESV2 DB ? ;AN000;
393 ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF - specified in SF_DEVPTR ;AN000;
394 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
395 ; ; and set this as pointer to it. ;AN000;
396 ; IFSR_RESV3 DW 0 ;AN000;
397 ; IFSR_COUNT DW 0 ;AN000;
398 ; *+ IFSR_BUFFER@ DD ? ; [DMAADD] ;AN000;
400 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
401 ; IF IFSR_RETCODE = 0 THEN ;AN000;
403 ; Call SFF_TO_SFT ;AN000;
404 ; CX = IFSR_COUNT ;AN000;
405 ; ES:DI -> SFT ;AN000;
407 ; ELSE DO {error} ;AN000;
408 ; AX = IFSR_RETCODE ;AN000;
410 ; ES:DI -> SFT ;AN000;
415 ; Carry clear ;AN000;
416 ; SFT Position updated ;AN000;
417 ; CX = No. of bytes read ;AN000;
418 ; ES:DI point to SFT ;AN000;
419 ; [DMAADD] filled with info read ;AN000;
421 ; AX is error code ;AN000;
423 ; ES:DI point to SFT ;AN000;
424 ; DS preserved, all other registers destroyed ;AN000;
426 ;****************************************************************************** ;AN000;
428 procedure IFS_READ
,NEAR ;AN000;
429 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
431 ifsr_fcn_def EXECAPI
; define ifsr for read ;AN000;
432 MOV CS:IFSPROC_FLAGS
,SetDeviceCB
;AN000;
433 MOV WORD PTR [THISSFT
],DI ; set thissft ;AN000;
434 MOV WORD PTR [THISSFT
+2],ES ;AN000;
436 R_20: ; (welcome lock/read) ;AN000;
437 ifsr_api_def READFILE
;AN000;
438 invoke PREP_IFSR
; zero out ifsr, es:bx -> ifsr ;AN000;
439 MOV ES:[BX.IFSR_LENGTH
],LENGTH_READFILE
; prep IFSRH ;AN000;
440 MOV ES:[BX.IFSR_APIFUNC
],IFSREADFILE
;AN000;
441 ; XOR AL,AL ; for now, set mode = read (0) ;AD010;
442 ; TEST CS:IFSPROC_FLAGS,ISLOCKREAD ;AD010;
444 ; INC AL ; inc mode to mode_lock_read ;AD010;
445 JMP W_80
; cont. read/write common code ;AN000;
446 ; in ifs_write below ;AN000;
448 EndProc IFS_READ
;AN000;
450 BREAK <IFS_WRITE Write to a NET SFT
> ;AN000;
452 ;****************************************************************************** ;AN000;
456 ; Called by: IFSFUNC dispatcher ;AN000;
458 ; Routines called: CALL_IFS ;AN000;
463 ; Outputs of SETUP: ;AN000;
464 ; CX = byte count ;AN000;
465 ; ES:DI Points to SFT ;AN000;
466 ; [DMAADD] = transfer addr ;AN000;
467 ; SFT checked for access mode ;AN000;
469 ; Prep IFSRH: ;AN000;
470 ; * IFSR_LENGTH DW 46 ; Length of request ;AN000;
471 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
472 ; + IFSR_RETCODE DW ? ;AN000;
473 ; + IFSR_RETCLASS DB ? ;AN000;
474 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
475 ; * IFSR_APIFUNC DB 12 ; Write Byte Block ;AN000;
476 ; + IFSR_ERROR_CLASS DB ? ;AN000;
477 ; + IFSR_ERROR_ACTION DB ? ;AN000;
478 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
479 ; + IFSR_ALLOWED DB ? ;AN000;
480 ; + IFSR_I24_RETRY DB ? ;AN000;
481 ; + IFSR_I24_RESP DB ? ;AN000;
482 ; IFSR_RESV2 DB ? ;AN000;
483 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
484 ; *+ IFSR_OPEN_CB@ DD ? ; call SFT_TO_SFF & set this as ptr ;AN000;
485 ; IFSR_RESV3 DW 0 ;AN000;
486 ; * IFSR_COUNT DW ? ; # bytes to write - CX ;AN000;
487 ; * IFSR_BUFFER@ DD ? ; Data buffer - [DMAADD] ;AN000;
489 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
490 ; IF IFSR_RETCODE = 0 THEN ;AN000;
492 ; Call SFF_TO_SFT ;AN000;
493 ; CX = IFSR_COUNT ;AN000;
494 ; ES:DI -> SFT ;AN000;
495 ; Clear carry ;AN000;
497 ; ELSE DO {error} ;AN000;
498 ; AX = IFSR_RETCODE ;AN000;
500 ; ES:DI -> SFT ;AN000;
505 ; Carry clear ;AN000;
506 ; SFT Position updated ;AN000;
507 ; CX = No. of bytes written ;AN000;
508 ; ES:DI point to SFT ;AN000;
510 ; AX is error code ;AN000;
512 ; ES:DI point to SFT ;AN000;
513 ; DS preserved, all other registers destroyed ;AN000;
515 ;****************************************************************************** ;AN000;
517 procedure IFS_WRITE
,NEAR ;AN000;
518 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
520 ifsr_fcn_def EXECAPI
; define ifsr for write ;AN000;
521 MOV CS:IFSPROC_FLAGS
,SetDeviceCB
; init processing flags ;AN000;
522 MOV WORD PTR [THISSFT
],DI ; set thissft ;AN000;
523 MOV WORD PTR [THISSFT
+2],ES ;AN000;
525 W_20: ; (welcome write/unlock) ;AN000;
526 ifsr_api_def WRITEFILE
;AN000;
527 invoke PREP_IFSR
;AN000;
528 MOV ES:[BX.IFSR_LENGTH
],LENGTH_WRITEFILE
; prep IFSRH ;AN000;
529 MOV ES:[BX.IFSR_APIFUNC
],IFSWRITEFILE
;AN000;
530 ; XOR AL,AL ; for now set mode to write (bit0=0) ;AD010;
531 ; TEST CS:IFSPROC_FLAGS,ISWRITEUNLOCK ;AD010;
533 ; INC AL ; set mode to write/unlock (bit0=1) ;AD010;
535 ; TEST CS:IFSPROC_FLAGS,ISADD ;AD010;
537 ; OR AL,MODE_ADD_MASK ; set mode to add (bit 1) ;AD010;
538 ;W_80: ; (welcome read) ;AD010;
539 ; TEST CS:IFSPROC_FLAGS,ISWOLOCK ;AD010; BAF
540 ; JZ W_90 ;AD010; BAF
541 ; OR AL,MODE_WO_MASK ; set mode to Write Only Lock ;AD010; BAF
543 ; MOV ES:[BX.IFSR_MODE],AL ;AD010;
544 W_80: ; (welcome read) ;AN010;
545 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AC015;
546 MOV ES:[BX.IFSR_FUNCTION
],IFSEXECAPI
;AN000;
547 MOV ES:[BX.IFSR_COUNT
],CX ;AN000;
549 MOV AX,WORD PTR [DMAADD
] ; to access dmaadd ;AN000;
550 MOV WORD PTR ES:[BX.IFSR_BUFFER@
],AX ;AN000;
551 MOV AX,WORD PTR [DMAADD
+2] ;AN000;
552 MOV WORD PTR ES:[BX.IFSR_BUFFER@
+2],AX ;AN000;
554 invoke DRIVE_FROM_SFT
; set IFSDRV for possible criter ;AN000;
555 invoke SFT_TO_SFF
; sets: [THISIFS] ;AN000;
556 ; ES:BX -> IFSRH ;AN000;
557 ; IFSR_OPEN_CB@ ;AN000;
558 ; ds - IFSSEG ;AN000;
560 invoke CALL_IFS
; *** call fs with read/write request ;AN000;
563 Context
DS ; restore ds-dosgroup ;AN001;
564 LES DI,[THISSFT
] ; restore esdi-sft ;AN001;
565 transfer ifs_1000
; transfer to general ret as carry set ;AC001;
567 MOV CX,ES:[BX.IFSR_COUNT
] ; prep reg output ;AN000;
568 invoke SFF_TO_SFT
;AN000;
570 Context
DS ; restore ds-dosgroup ;AN001;
571 LES DI,[THISSFT
] ; restore esdi-sft ;AN001;
572 transfer ifs_990
; transfer to general good ret in util ;AN001;
574 EndProc IFS_WRITE
;AN000;
576 BREAK <IFS_XLOCK
Lock a
FS SFT
> ;AN000;
578 ;****************************************************************************** ;AN000;
582 ; Called by: IFSFUNC dispatcher ;AN000;
584 ; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
589 ; BL = 80H bit: 0 lock all operations ;AN000;
590 ; 1 lock write operations only ;AN000;
593 ; 2 lock multiple range ;AN000;
594 ; 3 unlock multiple range ;AN000;
595 ; 4 lock/read ;AN000;
596 ; 5 write/unlock ;AN000;
597 ; 6 add (lseek eof/lock/write/unlock) ;AN000;
598 ; ES:DI -> SFT ;AN000;
599 ; CX = count/size Number of ranges/block size ;AN000;
600 ; DS:DX -> BUFFER LABEL DWORD ;AN000;
601 ; DD POSITION ; lock range, repeats CX times ;AN000;
602 ; DD LENGTH ; ;AN000;
606 ; Prep IFSRH: ;AN000;
607 ; * IFSR_LENGTH DW 46+ ; Length of request ;AN000;
608 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609 ; + IFSR_RETCODE DW ? ;AN000;
610 ; + IFSR_RETCLASS DB ? ;AN000;
611 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612 ; * IFSR_APIFUNC DB 13 ; Lock Function ;AN000;
613 ; + IFSR_ERROR_CLASS DB ? ;AN000;
614 ; + IFSR_ERROR_ACTION DB ? ;AN000;
615 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
616 ; + IFSR_ALLOWED DB ? ;AN000;
617 ; + IFSR_I24_RETRY DB ? ;AN000;
618 ; + IFSR_I24_RESP DB ? ;AN000;
619 ; IFSR_RESV2 DB ? ;AN000;
620 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
621 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SFF ;AN000;
622 ; ; and set this as pointer to it. ;AN000;
623 ; * IFSR_FUNC DB subfunction ; 0=LOCK, 1=UNLOCK ;AN000;
624 ; IFSR_RESV3 DB DOS reserved ;AN000;
625 ; * IFSR_POSITION DD range start ; single range ;AN000;
626 ; * IFSR_LENGTH DD range length ;AN000;
628 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
629 ; IF IFSR_RETCODE = 0 THEN ;AN000;
631 ; Call SFF_TO_SFT ;AN000;
632 ; Clear carry ;AN000;
634 ; ELSE DO {error} ;AN000;
635 ; AX = IFSR_RETCODE ;AN000;
641 ; AX set on error: Lock conflict ;AN000;
642 ; Too many locks ;AN000;
644 ;****************************************************************************** ;AN000;
646 procedure IFS_XLOCK
,NEAR ;AN000;
648 ifsr_fcn_def EXECAPI
;AN000;
649 ifsr_api_def LOCKFILE
;AN000;
651 SaveReg
<BX> ; save input bl ;AN014;
652 MOV CS:IFSPROC_FLAGS
,SetDeviceCB
;AC002;
653 ;;;;;;;;TEST BL,80H ;AN006;AD010;
654 ; JZ L_10 ;AN006;AD010;
655 ; OR CS:IFSPROC_FLAGS,IsWOLock ; This is Write Only lock ;AN006;AD010;
657 ; SaveReg <BX> ; save function (int 21h al value) ;AD010;
658 ; AND BL,07FH ; ditch 80h bit for now ;AD010;
659 ; CMP BL,INT21AL_LOCK_READ ; Check for special case locks ;AD010;
660 ; JB L_60 ; these generate different ;AD010;
661 ; JNE L_20 ; ifsrh's. ;AD010;
662 ; OR CS:IFSPROC_FLAGS,IsLockRead ; This is lock/read request ;AD010;
663 ; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
665 ; JMP R_20 ; let ifs_read above handle this ;AD010;
667 ; CMP BL,INT21AL_WRITE_UNLOCK ;AD010;
668 ; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
670 ; OR CS:IFSPROC_FLAGS,IsWriteUnlock ; This is write/unlock request ;AD010;
671 ; JMP SHORT L_50 ; cont. ifs_write above ;AD010;
673 ; OR IFSPROC_FLAGS,IsAdd ;AD010;
676 ;;;;;;;;JMP W_20 ; cont. in ifs_write above ;AD010;
679 SaveReg
<DS> ; save input ds (buffer ptr) ;AN000;
680 Context
DS ; ds-dosgroup to access thissft ;AN000;
681 MOV WORD PTR [THISSFT
],DI ; set [THISSFT] ;AN000;
682 MOV WORD PTR [THISSFT
+2],ES ;AN000;
683 invoke DRIVE_FROM_SFT
; set IFSDRV for possible criter ;AN000;
684 invoke PREP_IFSR
; clear ifsrh ;AM003;
685 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
686 invoke SFT_TO_SFF
; sets: [THISIFS] ;AN000;
687 ; ES:BX -> IFSRH ;AN000;
688 ; IFSR_OPEN_CB@ ;AN000;
689 ; ds - IFSSEG ;AN000;
690 MOV ES:[BX.IFSR_LENGTH
],LENGTH_LOCKFILE
; prep IFSRH ;AN000;
691 MOV ES:[BX.IFSR_FUNCTION
],IFSEXECAPI
;AN000;
692 MOV ES:[BX.IFSR_APIFUNC
],IFSLOCKFILE
;AN000;
693 ;;;;;;;;MOV ES:[BX.IFSR_COUNT],CX ;AN003;AD010;
694 RestoreReg
<DS> ; range segment, mode (input bl) ;AC003;AC010;
695 ;;;;;;;;MOV AL,CL ;AN003;AD010;
696 ; AND AL,07FH ; mask off hi 80 bit ;AN003;AD010;
697 ; CMP AL,2 ;AN003;AD010;
698 ; JGE L_70 ;AN003;AD010;
699 ; ADD CL,2 ;AN003;AD010;
701 ; MOV ES:[BX.IFSR_MODE],CL ;AN000;AD010;
702 ; AND ES:[BX.IFSR_MODE],80H ; ditch input bl in low nibble ;AN005;AD010;
703 ; AND CL,07FH ;AN003;AD010;
704 ;;;;;;;;SUB CL,2 ; set func (0-lock,1-unlock) ;AC003;AD010;
705 RestoreReg
<AX> ; restore input bl into al ;AN014;
706 MOV ES:[BX.IFSR_FUNC
],AL ;AC003;AC010;
707 ;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@],DX ;AD010;
708 ;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@+2],DS ;AD010;
709 SaveReg
<SI,DX> ;AN010;
710 RestoreReg
<SI> ;AN010;
711 MOV AX,WORD PTR DS:[SI] ;AN010;
712 MOV WORD PTR ES:[BX.IFSR_LK_POSITION
],AX ;AN010;
713 MOV AX,WORD PTR DS:[SI+2] ;AN010;
714 MOV WORD PTR ES:[BX.IFSR_LK_POSITION
+2],AX ;AN010;
715 MOV AX,WORD PTR DS:[SI+4] ;AN010;
716 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH
],AX ;AN010;
717 MOV AX,WORD PTR DS:[SI+6] ;AN010;
718 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH
+2],AX ;AN010;
720 SaveReg
<CS> ; set ds=ifsseg for ifs call ;AN003;
721 RestoreReg
<DS> ;AN003;
723 invoke CALL_IFS
; *** call fs with lock request ;AN000;
726 transfer ifs_1000
; go to general return (util) ;AN000;
728 invoke SFF_TO_SFT
;AN000;
729 transfer ifs_990
; go to general good ret (util) ;AN000;
732 EndProc IFS_XLOCK
;AN000;
734 BREAK <IFS_FILE_XATTRIBUTES Get
/Set
File Extended Attributes by handle
> ;AN000;
736 ;******************************************************************************
738 ; IFS_FILE_XATTRIBUTES
740 ; Called by: IFSFUNC dispatcher
742 ; Routines called: CALL_IFS DRIVE_FROM_SFT
747 ; [THISSFT] Points to SFT being used
748 ; [SAVE_ES:DI] -> Buffer for EA or EA names list
749 ; [SAVE_DS:SI] -> Query List (BL=2)
750 ; [SAVE_CX] = buffer size (BL=2,3)
751 ; BL = function - 2=Get EA
756 ; This call is driven by the new INT 21H call 57H. *** REMOVED
758 ; * IFSR_LENGTH DW 50 ; Total length of request
759 ; * IFSR_FUNCTION DB 4 ; Execute API function
760 ; + IFSR_RETCODE DW ?
761 ; + IFSR_RETCLASS DB ?
762 ; IFSR_RESV1 DB 16 DUP(0)
763 ; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name
764 ; + IFSR_ERROR_CLASS DB ?
765 ; + IFSR_ERROR_ACTION DB ?
766 ; + IFSR_ERROR_LOCUS DB ?
767 ; + IFSR_ALLOWED DB ?
768 ; + IFSR_I24_RETRY DB ?
769 ; + IFSR_I24_RESP DB ?
771 ; IFSR_DEVICE_CB@ DD ?
772 ; *+ IFSR_OPEN_CB@ DD ?
773 ; * IFSR_FUNC DB ? ; 0-get 1-set
774 ; * IFSR_SUBFUNC DB ? ; 2-EA 3-EA names
775 ; *+ IFSR_BUFFER1@ DD ? ; Query List
776 ; *+ IFSR_BUFFER2@ DD ? ; EA List
777 ; *+ IFSR_COUNT DW ? ; count
779 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR
780 ; IF IFSR_RETCODE = 0 THEN
793 ; Carry clear: On Get:
794 ; QUERY LIST or LIST filled in.
796 ; Extended attributes set. All SFTs are updated.
798 ; Carry set: AX is error code
799 ; error_file_not_found
800 ; Last element of path not found
801 ; error_path_not_found
802 ; Bad path (not in curr dir part if present)
803 ; error_access_denied
804 ; Attempt to set an attribute which cannot be set
805 ; (attr_directory, attr_volume_ID)
806 ; error_sharing_violation
807 ; Sharing mode of file did not allow the change
808 ; (this request requires exclusive write/read access)
809 ; (INT 24H generated)
810 ; DS preserved, others destroyed
812 ;******************************************************************************
814 procedure IFS_FILE_XATTRIBUTES
,NEAR ;AN000;
816 ;;;;;;;;ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000;
817 ; ifsr_api_def FILEATTR ;AN000;
819 ; MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
820 ; SaveReg <BX> ; save input function (2,3,4) ;AN000;
822 ; invoke PREP_IFSR ; init ifsr ;AN000;
823 ; Context DS ; ds - dosgroup ;AN000;
825 ; invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
826 ; MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
827 ; MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; prep IFSRH ;AN000;
828 ; MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
829 ; MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000;
830 ; MOV AL,FUNC_GET_BY_HANDLE ; start ifsr_func with get ;AN000;
831 ;;;;;;;;RestoreReg <CX> ; get original BX - func ;AN000;
835 JMP C_990
; just ret success if set ;AC010;
838 ;;;;;;;;MOV ES:[BX.IFSR_FUNC],AL ;AN000;
839 ; MOV AL,SUBFUNC_EA ; start ifsr_subfunc w/ea list ;AN000;
840 ; CMP CL,3 ; (input get ea names) ;AN000;
842 ; INC AL ; inc ifsr_subfunc to ea names ;AN000;
844 ; MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
845 ; CMP CL,4 ; no size offered on set so don't check ;AN009;
849 ; MOV AX,[SAVE_DI] ;AN000;
850 ; MOV WORD PTR ES:[BX.IFSR_BUFFER2@],AX ; get list ptr into buffer2@ ;AC002;
851 ; MOV AX,[SAVE_ES] ;AN000;
852 ; MOV WORD PTR ES:[BX.IFSR_BUFFER2@+2],AX ; get list ptr into buffer2@ ;AC002;
854 ; CMP CL,2 ; get ea list with qlist ;AN000;
856 ; MOV AX,[SAVE_SI] ;AN000;
857 ; CMP AX,NULL_PTR ; if null, don't set buffer1 ;AN005;
859 ; MOV WORD PTR ES:[BX.IFSR_BUFFER1@],AX ; get list ptr into buffer2@ ;AC002;
860 ; MOV AX,[SAVE_DS] ;AN000;
861 ; MOV WORD PTR ES:[BX.IFSR_BUFFER1@+2],AX ; get list ptr into buffer2@ ;AC002;
863 ; PUSH [SAVE_CX] ; buffer size ;AN000;
864 ; POP ES:[BX.IFSR_COUNT] ;AN000;
865 ; invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
866 ; ; ES:BX -> IFSRH ;AN000;
867 ; ; IFSR_OPEN_CB@ ;AN000;
868 ; ; ds - IFSSEG ;AN000;
869 ;************************************************
870 ; invoke CALL_IFS ; *** call fs with fileattr request ;AN000;
871 ;************************************************
872 ; JNC XFA_100 ;AN000;
875 ;;;;;;;;invoke SFF_TO_SFT ;AN000;
878 Context
DS ; on get - set size to 2 and count=0 ;AN010;
879 MOV AX,[SAVE_CX
] ; if count < 2 than no buffer2 ;AN008;;AC013;
880 CMP AX,2 ;AN008;;AC013;
881 JGE XFA_120
;AN008;;AC013;
885 PUSH [SAVE_ES
] ;AN010;
887 MOV DI,[SAVE_DI
] ;AN010;
889 STOSW ; count in buffer ;AN010;
890 MOV AX,2 ;AN007;AC010;
892 SaveReg
<AX> ; preserve future cx ;AN016;
893 CallInstall Get_User_Stack
,multDOS
,24 ; put size in user cx ;AN007;
894 RestoreReg
<AX> ; restore future cx ;AN016;
895 MOV DS:[SI.USER_CX
],AX ;AN007;
896 JMP C_990
; go ret in close to get ds-dosgroup ;AN000;
899 EndProc IFS_FILE_XATTRIBUTES
;AN000;