]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/IFSFUNC/IFSHAND.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / IFSFUNC / IFSHAND.ASM
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;
4 NAME IFSHANDLE ;AN000;
5 ;******************************************************************************
6 ;
7 ; HANDLE (SFT) related FS calls
8 ;
9 ;
10 ; IFS_CLOSE
11 ; IFS_COMMIT
12 ; IFS_LSEEK
13 ; IFS_READ
14 ; IFS_WRITE
15 ; IFS_LOCK
16 ; IFS_XATTR
17 ;
18 ; REVISION HISTORY:
19 ; A000 Original version 4.00 May 1987
20 ; A001 P635 - Correct Read problem - restore es:di -> sft
21 ; RG Sept 1,1987
22 ; A002 P659 - Copy cmd problems (xattr)
23 ; RG Sept 1,1987
24 ; A003 P868 - Lock problems R.G
25 ; A004 P849 - Printer problems R.G
26 ; A005 P1601- lock/xattr problems R.G
27 ; A006 P????- Write Only Lock support in Lock Read/Write 10/27 FEIGENBAUM
28 ; A007 P2339- Not getting count back to user in xattr call 11/09 RG
29 ; A008 P2433- redir copy problem (Xattr) 11/17 RG
30 ; A009 P2566- xattrs not propagated across network 12/3 RG
31 ; (due to size check on set that does not offer size)
32 ; A010 D285 - Remove Extended Attributes/Lock 1/88 RG
33 ; A011 P2994- double close problem 1/88 RG
34 ; A012 P3149- basica file redirection - seek problem 1/88 RMG
35 ; A013 P3185- get ea cx check 1/88 RMG
36 ; A014 P3249- lock problem 1/88 RMG
37 ; A015 P3432- copy to remote ptr problem - write 2/88 RMG
38 ; A016 P3513- return cx on xattr wrong 2/88 RMG
39 ; A017 P3968- set sf time/date on close 3/25/88 RMG
40 ; A018 P4839- fcb open/ren/term problem on abort close 5/13/88 RMG
41 ; A019 P4791- don't overwrite ax on error 5/19/88 RMG
42 ; A020 P5003- LSEEK hang using Austin Test tool 6/01/88 RPS
43 ;
44 ; LOC - 251
45 ; Programming note: In the prologues to the routines, the input/output are
46 ; accurate. The pseudocode, however, is outdated and does
47 ; not reflect the code.
48 ;
49 ;******************************************************************************
50 ;AN000;
51 .xlist ;AN000;
52 .xcref ;AN000;
53 INCLUDE IFSSYM.INC ;AN000;
54 INCLUDE IFSFSYM.INC ;AN000;
55 INCLUDE DOSSYM.INC ;AN000;
56 INCLUDE DEVSYM.INC ;AN000;
57 ;AN000;
58 .cref ;AN000;
59 .list ;AN000;
60 ;AN000;
61 AsmVars <IBM, Installed, DEBUG> ;AN000;
62 ;AN000;
63 ; define the base code segment of the network support first ;AN000;
64 ;AN000;
65 IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
66 IFSSEG ENDS ;AN000;
67 ;AN000;
68 ; include THE REST of the segment definitions for normal MSDOS ;AN000;
69 ;AN000;
70 include dosseg.asm ;AN000;
71 ;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;
77 Extrn SAVE_BX:WORD
78 Extrn SAVE_CX:WORD
79 Extrn SAVE_DS:WORD
80 Extrn SAVE_SI:WORD
81 Extrn SAVE_ES:WORD
82 Extrn SAVE_DI:WORD
83 DATA ENDS ;AN000;
84 ;AN000;
85 ;AN000;
86 ; define our own code segment ;AN000;
87 ;AN000;
88 IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
89 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
90 ;AN000;
91 ;IFS Data ;AN000;
92 Extrn THISDFL:DWORD ;AN000;
93 Extrn THISIFS:DWORD ;AN000;
94 Extrn IFSPROC_FLAGS:WORD ;AN000;
95 Extrn IFSR:WORD ;AN000;
96 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
97 ;AN000;
98 BREAK <IFS_CLOSE Close a FS SFT> ;AN000;
99 ;AN000;
100 ;****************************************************************************** ;AN000;
101 ; ;AN000;
102 ; IFS_CLOSE - see IFS_COMMIT for details ;AN000;
103 ; ;AN000;
104 ;****************************************************************************** ;AN000;
105 ;AN000;
106 procedure IFS_CLOSE,NEAR ;AN000;
107 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
108 ;AN000;
109 ifsr_fcn_def EXECAPI ; define ifsr for close ;AN000;
110 ifsr_api_def CLOSEFILE ;AN000;
111 ;AN000;
112 TEST ES:[DI.SF_FLAGS],devid_file_clean + sf_close_nodate ;AN017;
113 JNZ C_05 ;AN017;
114 CallInstall DATE16,MultDOS,13 ; set sf date/time on close ;AN017;
115 MOV ES:[DI.SF_DATE],AX ;AN017;
116 MOV ES:[DI.SF_TIME],DX ;AN017;
117 C_05: ;AN017;
118
119 SaveReg <ES,DI> ; save SFT ptr ;AN000;
120 CallInstall FREE_SFT,MultDOS,8 ; set SFT busy ;AN000;
121 PUSH AX ; save old ref count ;AN000;
122 ;AN000;
123 TEST ES:[DI.SF_MODE],SF_ISFCB ; always close fcb ;AN011;
124 JNZ C_10 ; only do real close when ;AN011;
125 CMP AX,1 ; sft being freed ;AN011;
126 JE C_10 ;AN011;
127 JMP C_80 ;AN011;
128 C_10: ;AN011;
129 MOV CS:IFSPROC_FLAGS,ISCLOSE + SETDEVICECB ;AN000;
130 ; 2nd flag causes sft_to_sff to ;AN000;
131 ; set device cb@ ;AN000;
132 JMP C_20 ; cont. in ifs_commit ;AN000;
133 ;AN000;
134 EndProc IFS_CLOSE ;AN000;
135 ;AN000;
136 BREAK <IFS_COMMIT Commit a FS SFT> ;AN000;
137 ;AN000;
138 ;****************************************************************************** ;AN000;
139 ; ;AN000;
140 ; IFS_COMMIT ;AN000;
141 ; ;AN000;
142 ; Called by: IFSFUNC dispatcher ;AN000;
143 ; ;AN000;
144 ; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
145 ; SFT_TO_SFF ;AN000;
146 ; SFF_TO_SFT ;AN000;
147 ; ;AN000;
148 ; Inputs: ;AN000;
149 ; [THISSFT] set to the SFT for the file being used ;AN000;
150 ; ES:DI = [THISSFT] (date time are NOT correct) ;AN000;
151 ; SFT must never be for an FCB on commit (error not detected) ;AN000;
152 ; ;AN000;
153 ; Function: ;AN000;
154 ; Prep IFSRH: ;AN000;
155 ; * IFSR_LENGTH DW 40 ; Total length of request ;AN000;
156 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
157 ; + IFSR_RETCODE DW ? ;AN000;
158 ; + IFSR_RETCLASS DB ? ;AN000;
159 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
160 ; * IFSR_APIFUNC DB 14 ; Close/commit file ;AN000;
161 ; + IFSR_ERROR_CLASS DB ? ;AN000;
162 ; + IFSR_ERROR_ACTION DB ? ;AN000;
163 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
164 ; + IFSR_ALLOWED DB ? ;AN000;
165 ; + IFSR_I24_RETRY DB ? ;AN000;
166 ; + IFSR_I24_RESP DB ? ;AN000;
167 ; IFSR_RESV2 DB ? ;AN000;
168 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
169 ; *+ IFSR_OPEN_CB@ DD ? ; SF ;AN000;
170 ; * IFSR_FUNC DB ? ; 0=CLOSE, 1=COMMIT ;AN000;
171 ; IFSR_RESV2 DB 0 ;AN000;
172 ; ;AN000;
173 ; IF close THEN ;AN000;
174 ; IFSR_FUNC = 0 ;AN000;
175 ; ELSE IFSR_FUNC = 1 ;AN000;
176 ; CALL routine, CALL_IFS, with pointer to SF_IFS_HDR ;AN000;
177 ; IF IFSR_RETCODE = 0 THEN ;AN000;
178 ; DO ;AN000;
179 ; Call SFF_TO_SFT ;AN000;
180 ; Decrement SF_REF_COUNT if close ;AN000;
181 ; Clear carry ;AN000;
182 ; ENDDO ;AN000;
183 ; ELSE DO {error} ;AN000;
184 ; AX = IFSR_RETCODE ;AN000;
185 ; Set carry ;AN000;
186 ; ENDDO ;AN000;
187 ; ENDIF ;AN000;
188 ; ;AN000;
189 ; Outputs: ;AN000;
190 ; sf_ref_count decremented on close unless FAIL ;AN000;
191 ; (AX has old value for COMMIT) ;AN000;
192 ; ES:DI point to SFT ;AN000;
193 ; Carry set if error (file deleted or disk changed) ;AN000;
194 ; ;AN000;
195 ; DS preserved, others destroyed ;AN000;
196 ; ;AN000;
197 ;****************************************************************************** ;AN000;
198 ;AN000;
199 procedure IFS_COMMIT,NEAR ;AN000;
200 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
201 ;AN000;
202 ifsr_fcn_def EXECAPI ;AN000;
203 ifsr_api_def CLOSEFILE ;AN000;
204 ;AN000;
205 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; set ifsproc_flags ;AN000;
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;
214 ;AN000;
215 MOV ES:[BX.IFSR_LENGTH],LENGTH_CLOSEFILE ; prep IFSRH ;AN000;
216 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
217 MOV ES:[BX.IFSR_APIFUNC],IFSCLOSEFILE ;AN000;
218 XOR AL,AL ;AN000;
219 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
220 JNZ C_40 ;AN000;
221 INC AL ;AN000;
222 C_40: ;AN000;
223 MOV ES:[BX.IFSR_FUNC],AL ;AN000;
224 ;AN000;
225 invoke CALL_IFS ; *** call fs with close request ;AN000;
226 ;AN000;
227 JNC C_60 ;AN000;
228 TEST IFSPROC_FLAGS,ISCLOSE ; ifs error ;AN000;
229 JZ C_980 ; return w/carry, if close ;AN000;
230 ;;;;;;;;ADD SP,6 ; restore stack first ;AD018;
231 RestoreReg <CX,DI,ES> ; old ref count & sft ;AN018;;AC019;
232 CMP CX,1 ;AN018;;AC019;
233 JNE C_980 ;AN018;
234 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN018;
235 JMP C_980 ;AN000;
236 C_60: ;AN000;
237 invoke SFF_TO_SFT ;AN000;
238 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
239 JZ C_990 ; finished w/commit ;AN000;
240 C_80: ;AN011;
241 RestoreReg <AX,DI,ES> ; old ref count & sft ;AN000;
242 CMP AX,1 ;AN000;
243 JNE C_990 ;AN000;
244 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN000;
245 JMP C_990 ; busy mark ;AN000;
246 ;AN000;
247 ;AN000;
248 C_980: ; Return area ;AN000;
249 STC ;AN000;
250 JMP C_1000 ;AN000;
251 C_990: ;AN000;
252 CLC ;AN000;
253 C_1000: ; preserve ds - dosgroup ;AN000;
254 PUSH SS ;AN000;
255 POP DS ;AN000;
256 return ;AN000;
257 ;AN000;
258 EndProc IFS_COMMIT ;AN000;
259 ;AN000;
260 BREAK <IFS_LSEEK Seek on a NET SFT> ;AN000;
261 ;AN000;
262 ;****************************************************************************** ;AN000;
263 ; ;AN000;
264 ; IFS_LSEEK ;AN000;
265 ; ;AN000;
266 ; Inputs: ;AN000;
267 ; ES:DI -> SFT ;AN000;
268 ; CX:DX = Input CX:DX to $Lseek (offset) ;AN000;
269 ; NOTE: THIS LSEEK IS ALWAYS ASSUMED TO BE A TYPE 2 (relative to EOF) ;AN000;
270 ; Function: ;AN000;
271 ; Prep IFSRH: ;AN000;
272 ; * IFSR_LENGTH DW 44 ; Request length ;AN000;
273 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
274 ; + IFSR_RETCODE DW ? ;AN000;
275 ; + IFSR_RETCLASS DB ? ;AN000;
276 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
277 ; * IFSR_APIFUNC DB 10 ; Lseek file ;AN000;
278 ; + IFSR_ERROR_CLASS DB ? ;AN000;
279 ; + IFSR_ERROR_ACTION DB ? ;AN000;
280 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
281 ; + IFSR_ALLOWED DB ? ;AN000;
282 ; + IFSR_I24_RETRY DB ? ;AN000;
283 ; + IFSR_I24_RESP DB ? ;AN000;
284 ; IFSR_RESV2 DB ? ;AN000;
285 ; IFSR_DEVICE_CB@ DD ? ;AN000;
286 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
287 ; ; and set this as pointer to it. ;AN000;
288 ; * IFSR_MODE DB 2 ; Position mode: - BL ;AN000;
289 ; ; 2 = ptr moved eof + offset ;AN000;
290 ; IFSR_RESV2 DB 0 ;AN000;
291 ; * IFSR_POSITION DD ? ; displacement of LSEEK - CX:DX ;AN000;
292 ; ;AN000;
293 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
294 ; IF IFSR_RETCODE = 0 THEN ;AN000;
295 ; DO ;AN000;
296 ; Call SFF_TO_SFT ;AN000;
297 ; Set DX:AX = IFSR_POSITION ;AN000;
298 ; Clear carry ;AN000;
299 ; ENDDO ;AN000;
300 ; ELSE DO {error} ;AN000;
301 ; AX = IFSR_RETCODE ;AN000;
302 ; Set carry ;AN000;
303 ; ENDDO ;AN000;
304 ; ENDIF ;AN000;
305 ; Returns: ;AN000;
306 ; ES:DI -> SFT ;AN000;
307 ; Carry clear ;AN000;
308 ; DX:AX return as with local $Lseek ;AN000;
309 ; Carry Set ;AN000;
310 ; AX is error code ;AN000;
311 ; All destroyed ;AN000;
312 ; ;AN000;
313 ;****************************************************************************** ;AN000;
314 ;AN000;
315 procedure IFS_LSEEK,NEAR ;AN000;
316 ASSUME DS:Nothing,ES:NOTHING ; Initially DS is unknown ;AN020;
317 ;AN000;
318 ifsr_fcn_def EXECAPI ; define ifsr for lseek ;AN000;
319 ifsr_api_def LSEEKFILE ;AN000;
320 ;AN000;
321 PUSH SS ; Set DS to DOSGROUP ;AN020;
322 POP DS ; ;AN020;
323 ASSUME DS:DOSGROUP ; ;AN020;
324
325 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000;
326 MOV WORD PTR [THISSFT],DI ;AN020;
327 MOV WORD PTR [THISSFT+2],ES ;AN020;
328 SaveReg <ES,DI> ; save for later restore before leave ;AN012;;AN020;
329
330 invoke PREP_IFSR ;AN000;
331 ;AN000;
332 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
333 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
334 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
335 ; ES:BX -> IFSRH ;AN000;
336 ; IFSR_OPEN_CB@ ;AN000;
337 ; ds - IFSSEG ;AN000;
338 ;AN000;
339 MOV ES:[BX.IFSR_LENGTH],LENGTH_LSEEKFILE ; prep IFSRH ;AN000;
340 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
341 MOV ES:[BX.IFSR_APIFUNC],IFSLSEEKFILE ;AN000;
342 MOV ES:[BX.IFSR_MODE],MODE2 ;AN000;
343 MOV WORD PTR ES:[BX.IFSR_POSITION],DX ;AN000;
344 MOV WORD PTR ES:[BX.IFSR_POSITION+2],CX ;AN000;
345 ;AN000;
346 invoke CALL_IFS ; call fs with lseek request ;AN000;
347 ;AN000;
348 JC LS_1000 ;AN000;
349 MOV AX,WORD PTR ES:[BX.IFSR_POSITION] ;AN000;
350 MOV DX,WORD PTR ES:[BX.IFSR_POSITION+2] ;AN000;
351 invoke SFF_TO_SFT ;AN000;
352 ;AN000;
353 CLC ;AN000;
354 LS_1000: ;AN000;
355 RestoreReg <DI,ES> ; restore sft ptr for ibmdos ;AN012;
356 return ;AN000;
357 ;AN000;
358 EndProc IFS_LSEEK ;AN000;
359 \f ;AN000;
360 BREAK <IFS_READ Read from a NET SFT> ;AN000;
361 ;AN000;
362 ;****************************************************************************** ;AN000;
363 ; ;AN000;
364 ; IFS_READ ;AN000;
365 ; ;AN000;
366 ; Called by: IFSFUNC dispatcher ;AN000;
367 ; ;AN000;
368 ; Routines called: CALL_IFS ;AN000;
369 ; SFT_TO_SFF ;AN000;
370 ; SFF_TO_SFT ;AN000;
371 ; ;AN000;
372 ; Inputs: ;AN000;
373 ; Outputs of SETUP: ;AN000;
374 ; CX = byte count ;AN000;
375 ; ES:DI Points to SFT ;AN000;
376 ; [DMAADD] = transfer addr ;AN000;
377 ; SFT checked for access mode ;AN000;
378 ; Function: ;AN000;
379 ; Prep IFSRH: ;AN000;
380 ; * IFSR_LENGTH DW 46 ; Total length of request ;AN000;
381 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
382 ; + IFSR_RETCODE DW ? ;AN000;
383 ; + IFSR_RETCLASS DB ? ;AN000;
384 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
385 ; * IFSR_APIFUNC DB 11 ; Read Byte Block ;AN000;
386 ; + IFSR_ERROR_CLASS DB ? ;AN000;
387 ; + IFSR_ERROR_ACTION DB ? ;AN000;
388 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
389 ; + IFSR_ALLOWED DB ? ;AN000;
390 ; + IFSR_I24_RETRY DB ? ;AN000;
391 ; + IFSR_I24_RESP DB ? ;AN000;
392 ; IFSR_RESV2 DB ? ;AN000;
393 ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF - specified in SF_DEVPTR ;AN000;
394 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
395 ; ; and set this as pointer to it. ;AN000;
396 ; IFSR_RESV3 DW 0 ;AN000;
397 ; IFSR_COUNT DW 0 ;AN000;
398 ; *+ IFSR_BUFFER@ DD ? ; [DMAADD] ;AN000;
399 ; ;AN000;
400 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
401 ; IF IFSR_RETCODE = 0 THEN ;AN000;
402 ; DO ;AN000;
403 ; Call SFF_TO_SFT ;AN000;
404 ; CX = IFSR_COUNT ;AN000;
405 ; ES:DI -> SFT ;AN000;
406 ; ENDDO ;AN000;
407 ; ELSE DO {error} ;AN000;
408 ; AX = IFSR_RETCODE ;AN000;
409 ; CX = 0 ;AN000;
410 ; ES:DI -> SFT ;AN000;
411 ; Set carry ;AN000;
412 ; ENDDO ;AN000;
413 ; ENDIF ;AN000;
414 ; Outputs: ;AN000;
415 ; Carry clear ;AN000;
416 ; SFT Position updated ;AN000;
417 ; CX = No. of bytes read ;AN000;
418 ; ES:DI point to SFT ;AN000;
419 ; [DMAADD] filled with info read ;AN000;
420 ; Carry set ;AN000;
421 ; AX is error code ;AN000;
422 ; CX = 0 ;AN000;
423 ; ES:DI point to SFT ;AN000;
424 ; DS preserved, all other registers destroyed ;AN000;
425 ; ;AN000;
426 ;****************************************************************************** ;AN000;
427 ;AN000;
428 procedure IFS_READ,NEAR ;AN000;
429 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
430 ;AN000;
431 ifsr_fcn_def EXECAPI ; define ifsr for read ;AN000;
432 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AN000;
433 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
434 MOV WORD PTR [THISSFT+2],ES ;AN000;
435 ;AN000;
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;
443 ; JZ W_80 ;AD010;
444 ; INC AL ; inc mode to mode_lock_read ;AD010;
445 JMP W_80 ; cont. read/write common code ;AN000;
446 ; in ifs_write below ;AN000;
447 ;AN000;
448 EndProc IFS_READ ;AN000;
449 ;AN000;
450 BREAK <IFS_WRITE Write to a NET SFT> ;AN000;
451 ;AN000;
452 ;****************************************************************************** ;AN000;
453 ; ;AN000;
454 ; IFS_WRITE ;AN000;
455 ; ;AN000;
456 ; Called by: IFSFUNC dispatcher ;AN000;
457 ; ;AN000;
458 ; Routines called: CALL_IFS ;AN000;
459 ; SFT_TO_SFF ;AN000;
460 ; SFF_TO_SFT ;AN000;
461 ; ;AN000;
462 ; Inputs: ;AN000;
463 ; Outputs of SETUP: ;AN000;
464 ; CX = byte count ;AN000;
465 ; ES:DI Points to SFT ;AN000;
466 ; [DMAADD] = transfer addr ;AN000;
467 ; SFT checked for access mode ;AN000;
468 ; Function: ;AN000;
469 ; Prep IFSRH: ;AN000;
470 ; * IFSR_LENGTH DW 46 ; Length of request ;AN000;
471 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
472 ; + IFSR_RETCODE DW ? ;AN000;
473 ; + IFSR_RETCLASS DB ? ;AN000;
474 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
475 ; * IFSR_APIFUNC DB 12 ; Write Byte Block ;AN000;
476 ; + IFSR_ERROR_CLASS DB ? ;AN000;
477 ; + IFSR_ERROR_ACTION DB ? ;AN000;
478 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
479 ; + IFSR_ALLOWED DB ? ;AN000;
480 ; + IFSR_I24_RETRY DB ? ;AN000;
481 ; + IFSR_I24_RESP DB ? ;AN000;
482 ; IFSR_RESV2 DB ? ;AN000;
483 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
484 ; *+ IFSR_OPEN_CB@ DD ? ; call SFT_TO_SFF & set this as ptr ;AN000;
485 ; IFSR_RESV3 DW 0 ;AN000;
486 ; * IFSR_COUNT DW ? ; # bytes to write - CX ;AN000;
487 ; * IFSR_BUFFER@ DD ? ; Data buffer - [DMAADD] ;AN000;
488 ; ;AN000;
489 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
490 ; IF IFSR_RETCODE = 0 THEN ;AN000;
491 ; DO ;AN000;
492 ; Call SFF_TO_SFT ;AN000;
493 ; CX = IFSR_COUNT ;AN000;
494 ; ES:DI -> SFT ;AN000;
495 ; Clear carry ;AN000;
496 ; ENDDO ;AN000;
497 ; ELSE DO {error} ;AN000;
498 ; AX = IFSR_RETCODE ;AN000;
499 ; CX = 0 ;AN000;
500 ; ES:DI -> SFT ;AN000;
501 ; Set carry ;AN000;
502 ; ENDDO ;AN000;
503 ; ENDIF ;AN000;
504 ; Outputs: ;AN000;
505 ; Carry clear ;AN000;
506 ; SFT Position updated ;AN000;
507 ; CX = No. of bytes written ;AN000;
508 ; ES:DI point to SFT ;AN000;
509 ; Carry set ;AN000;
510 ; AX is error code ;AN000;
511 ; CX = 0 ;AN000;
512 ; ES:DI point to SFT ;AN000;
513 ; DS preserved, all other registers destroyed ;AN000;
514 ; ;AN000;
515 ;****************************************************************************** ;AN000;
516 ;AN000;
517 procedure IFS_WRITE,NEAR ;AN000;
518 ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
519 ;AN000;
520 ifsr_fcn_def EXECAPI ; define ifsr for write ;AN000;
521 MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
522 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
523 MOV WORD PTR [THISSFT+2],ES ;AN000;
524 ;AN000;
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;
532 ; JZ W_40 ;AD010;
533 ; INC AL ; set mode to write/unlock (bit0=1) ;AD010;
534 ;W_40: ;AD010;
535 ; TEST CS:IFSPROC_FLAGS,ISADD ;AD010;
536 ; JZ W_80 ;AD010;
537 ; OR AL,MODE_ADD_MASK ; set mode to add (bit 1) ;AD010;
538 ;W_80: ; (welcome read) ;AD010;
539 ; TEST CS:IFSPROC_FLAGS,ISWOLOCK ;AD010; BAF
540 ; JZ W_90 ;AD010; BAF
541 ; OR AL,MODE_WO_MASK ; set mode to Write Only Lock ;AD010; BAF
542 ;W_90: ;AD010; BAF
543 ; MOV ES:[BX.IFSR_MODE],AL ;AD010;
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;
548 ;AN000;
549 MOV AX,WORD PTR [DMAADD] ; to access dmaadd ;AN000;
550 MOV WORD PTR ES:[BX.IFSR_BUFFER@],AX ;AN000;
551 MOV AX,WORD PTR [DMAADD+2] ;AN000;
552 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],AX ;AN000;
553 ;AN000;
554 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
555 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
556 ; ES:BX -> IFSRH ;AN000;
557 ; IFSR_OPEN_CB@ ;AN000;
558 ; ds - IFSSEG ;AN000;
559 ;AN000;
560 invoke CALL_IFS ; *** call fs with read/write request ;AN000;
561 ;AN000;
562 JNC W_100 ;AN000;
563 Context DS ; restore ds-dosgroup ;AN001;
564 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
565 transfer ifs_1000 ; transfer to general ret as carry set ;AC001;
566 W_100: ;AN000;
567 MOV CX,ES:[BX.IFSR_COUNT] ; prep reg output ;AN000;
568 invoke SFF_TO_SFT ;AN000;
569
570 Context DS ; restore ds-dosgroup ;AN001;
571 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
572 transfer ifs_990 ; transfer to general good ret in util ;AN001;
573 ;AN000;
574 EndProc IFS_WRITE ;AN000;
575 \f ;AN000;
576 BREAK <IFS_XLOCK Lock a FS SFT> ;AN000;
577 ;AN000;
578 ;****************************************************************************** ;AN000;
579 ; ;AN000;
580 ; IFS_XLOCK ;AN000;
581 ; ;AN000;
582 ; Called by: IFSFUNC dispatcher ;AN000;
583 ; ;AN000;
584 ; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
585 ; SFT_TO_SFF ;AN000;
586 ; SFF_TO_SFT ;AN000;
587 ; ;AN000;
588 ; Inputs: ;AN000;
589 ; BL = 80H bit: 0 lock all operations ;AN000;
590 ; 1 lock write operations only ;AN000;
591 ; 0 Lock
592 ; 1 Unlock
593 ; 2 lock multiple range ;AN000;
594 ; 3 unlock multiple range ;AN000;
595 ; 4 lock/read ;AN000;
596 ; 5 write/unlock ;AN000;
597 ; 6 add (lseek eof/lock/write/unlock) ;AN000;
598 ; ES:DI -> SFT ;AN000;
599 ; CX = count/size Number of ranges/block size ;AN000;
600 ; DS:DX -> BUFFER LABEL DWORD ;AN000;
601 ; DD POSITION ; lock range, repeats CX times ;AN000;
602 ; DD LENGTH ; ;AN000;
603 ; ;AN000;
604 ; ;AN000;
605 ; Function: ;AN000;
606 ; Prep IFSRH: ;AN000;
607 ; * IFSR_LENGTH DW 46+ ; Length of request ;AN000;
608 ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609 ; + IFSR_RETCODE DW ? ;AN000;
610 ; + IFSR_RETCLASS DB ? ;AN000;
611 ; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612 ; * IFSR_APIFUNC DB 13 ; Lock Function ;AN000;
613 ; + IFSR_ERROR_CLASS DB ? ;AN000;
614 ; + IFSR_ERROR_ACTION DB ? ;AN000;
615 ; + IFSR_ERROR_LOCUS DB ? ;AN000;
616 ; + IFSR_ALLOWED DB ? ;AN000;
617 ; + IFSR_I24_RETRY DB ? ;AN000;
618 ; + IFSR_I24_RESP DB ? ;AN000;
619 ; IFSR_RESV2 DB ? ;AN000;
620 ; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
621 ; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SFF ;AN000;
622 ; ; and set this as pointer to it. ;AN000;
623 ; * IFSR_FUNC DB subfunction ; 0=LOCK, 1=UNLOCK ;AN000;
624 ; IFSR_RESV3 DB DOS reserved ;AN000;
625 ; * IFSR_POSITION DD range start ; single range ;AN000;
626 ; * IFSR_LENGTH DD range length ;AN000;
627 ; ;AN000;
628 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
629 ; IF IFSR_RETCODE = 0 THEN ;AN000;
630 ; DO ;AN000;
631 ; Call SFF_TO_SFT ;AN000;
632 ; Clear carry ;AN000;
633 ; ENDDO ;AN000;
634 ; ELSE DO {error} ;AN000;
635 ; AX = IFSR_RETCODE ;AN000;
636 ; Set carry ;AN000;
637 ; ENDDO ;AN000;
638 ; ENDIF ;AN000;
639 ; ;AN000;
640 ; Outputs: ;AN000;
641 ; AX set on error: Lock conflict ;AN000;
642 ; Too many locks ;AN000;
643 ; ;AN000;
644 ;****************************************************************************** ;AN000;
645 ;AN000;
646 procedure IFS_XLOCK,NEAR ;AN000;
647 ;AN000;
648 ifsr_fcn_def EXECAPI ;AN000;
649 ifsr_api_def LOCKFILE ;AN000;
650 ;AN000;
651 SaveReg <BX> ; save input bl ;AN014;
652 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AC002;
653 ;;;;;;;;TEST BL,80H ;AN006;AD010;
654 ; JZ L_10 ;AN006;AD010;
655 ; OR CS:IFSPROC_FLAGS,IsWOLock ; This is Write Only lock ;AN006;AD010;
656 ;L_10: ;AN006;AD010;
657 ; SaveReg <BX> ; save function (int 21h al value) ;AD010;
658 ; AND BL,07FH ; ditch 80h bit for now ;AD010;
659 ; CMP BL,INT21AL_LOCK_READ ; Check for special case locks ;AD010;
660 ; JB L_60 ; these generate different ;AD010;
661 ; JNE L_20 ; ifsrh's. ;AD010;
662 ; OR CS:IFSPROC_FLAGS,IsLockRead ; This is lock/read request ;AD010;
663 ; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
664 ; Context DS ;AD010;
665 ; JMP R_20 ; let ifs_read above handle this ;AD010;
666 ;L_20: ;AD010;
667 ; CMP BL,INT21AL_WRITE_UNLOCK ;AD010;
668 ; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
669 ; JNE L_40 ;AD010;
670 ; OR CS:IFSPROC_FLAGS,IsWriteUnlock ; This is write/unlock request ;AD010;
671 ; JMP SHORT L_50 ; cont. ifs_write above ;AD010;
672 ;L_40: ;AD010;
673 ; OR IFSPROC_FLAGS,IsAdd ;AD010;
674 ;L_50: ;AD010;
675 ; Context DS ;AD010;
676 ;;;;;;;;JMP W_20 ; cont. in ifs_write above ;AD010;
677 ;AN000;
678 L_60: ;AN000;
679 SaveReg <DS> ; save input ds (buffer ptr) ;AN000;
680 Context DS ; ds-dosgroup to access thissft ;AN000;
681 MOV WORD PTR [THISSFT],DI ; set [THISSFT] ;AN000;
682 MOV WORD PTR [THISSFT+2],ES ;AN000;
683 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
684 invoke PREP_IFSR ; clear ifsrh ;AM003;
685 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
686 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
687 ; ES:BX -> IFSRH ;AN000;
688 ; IFSR_OPEN_CB@ ;AN000;
689 ; ds - IFSSEG ;AN000;
690 MOV ES:[BX.IFSR_LENGTH],LENGTH_LOCKFILE ; prep IFSRH ;AN000;
691 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
692 MOV ES:[BX.IFSR_APIFUNC],IFSLOCKFILE ;AN000;
693 ;;;;;;;;MOV ES:[BX.IFSR_COUNT],CX ;AN003;AD010;
694 RestoreReg <DS> ; range segment, mode (input bl) ;AC003;AC010;
695 ;;;;;;;;MOV AL,CL ;AN003;AD010;
696 ; AND AL,07FH ; mask off hi 80 bit ;AN003;AD010;
697 ; CMP AL,2 ;AN003;AD010;
698 ; JGE L_70 ;AN003;AD010;
699 ; ADD CL,2 ;AN003;AD010;
700 ;L_70: ;AN003;AD010;
701 ; MOV ES:[BX.IFSR_MODE],CL ;AN000;AD010;
702 ; AND ES:[BX.IFSR_MODE],80H ; ditch input bl in low nibble ;AN005;AD010;
703 ; AND CL,07FH ;AN003;AD010;
704 ;;;;;;;;SUB CL,2 ; set func (0-lock,1-unlock) ;AC003;AD010;
705 RestoreReg <AX> ; restore input bl into al ;AN014;
706 MOV ES:[BX.IFSR_FUNC],AL ;AC003;AC010;
707 ;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@],DX ;AD010;
708 ;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@+2],DS ;AD010;
709 SaveReg <SI,DX> ;AN010;
710 RestoreReg <SI> ;AN010;
711 MOV AX,WORD PTR DS:[SI] ;AN010;
712 MOV WORD PTR ES:[BX.IFSR_LK_POSITION],AX ;AN010;
713 MOV AX,WORD PTR DS:[SI+2] ;AN010;
714 MOV WORD PTR ES:[BX.IFSR_LK_POSITION+2],AX ;AN010;
715 MOV AX,WORD PTR DS:[SI+4] ;AN010;
716 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH],AX ;AN010;
717 MOV AX,WORD PTR DS:[SI+6] ;AN010;
718 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH+2],AX ;AN010;
719 RestoreReg <SI>
720 SaveReg <CS> ; set ds=ifsseg for ifs call ;AN003;
721 RestoreReg <DS> ;AN003;
722
723 invoke CALL_IFS ; *** call fs with lock request ;AN000;
724 ;AN000;
725 JNC L_100 ;AN000;
726 transfer ifs_1000 ; go to general return (util) ;AN000;
727 L_100: ;AN000;
728 invoke SFF_TO_SFT ;AN000;
729 transfer ifs_990 ; go to general good ret (util) ;AN000;
730 ;AN000;
731 ;AN000;
732 EndProc IFS_XLOCK ;AN000;
733 ;AN000;
734 BREAK <IFS_FILE_XATTRIBUTES Get/Set File Extended Attributes by handle> ;AN000;
735
736 ;******************************************************************************
737 ;
738 ; IFS_FILE_XATTRIBUTES
739 ;
740 ; Called by: IFSFUNC dispatcher
741 ;
742 ; Routines called: CALL_IFS DRIVE_FROM_SFT
743 ; SFT_TO_SFF
744 ; SFF_TO_SFT
745 ;
746 ; Inputs:
747 ; [THISSFT] Points to SFT being used
748 ; [SAVE_ES:DI] -> Buffer for EA or EA names list
749 ; [SAVE_DS:SI] -> Query List (BL=2)
750 ; [SAVE_CX] = buffer size (BL=2,3)
751 ; BL = function - 2=Get EA
752 ; 3=Get EA Names
753 ; 4=Set EA
754 ;
755 ; Function:
756 ; This call is driven by the new INT 21H call 57H. *** REMOVED
757 ; Prep IFSRH:
758 ; * IFSR_LENGTH DW 50 ; Total length of request
759 ; * IFSR_FUNCTION DB 4 ; Execute API function
760 ; + IFSR_RETCODE DW ?
761 ; + IFSR_RETCLASS DB ?
762 ; IFSR_RESV1 DB 16 DUP(0)
763 ; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name
764 ; + IFSR_ERROR_CLASS DB ?
765 ; + IFSR_ERROR_ACTION DB ?
766 ; + IFSR_ERROR_LOCUS DB ?
767 ; + IFSR_ALLOWED DB ?
768 ; + IFSR_I24_RETRY DB ?
769 ; + IFSR_I24_RESP DB ?
770 ; IFSR_RESV2 DB ?
771 ; IFSR_DEVICE_CB@ DD ?
772 ; *+ IFSR_OPEN_CB@ DD ?
773 ; * IFSR_FUNC DB ? ; 0-get 1-set
774 ; * IFSR_SUBFUNC DB ? ; 2-EA 3-EA names
775 ; *+ IFSR_BUFFER1@ DD ? ; Query List
776 ; *+ IFSR_BUFFER2@ DD ? ; EA List
777 ; *+ IFSR_COUNT DW ? ; count
778 ;
779 ; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR
780 ; IF IFSR_RETCODE = 0 THEN
781 ; DO
782 ; Call SFF_TO_SFT
783 ; Clear carry
784 ; ENDDO
785 ; ELSE DO
786 ; AX = IFSR_RETCODE
787 ; Set carry
788 ; ENDDO
789 ; ENDIF
790 ; ENDDO
791 ;
792 ; Outputs:
793 ; Carry clear: On Get:
794 ; QUERY LIST or LIST filled in.
795 ; On Set:
796 ; Extended attributes set. All SFTs are updated.
797 ; CARRY SET
798 ; Carry set: AX is error code
799 ; error_file_not_found
800 ; Last element of path not found
801 ; error_path_not_found
802 ; Bad path (not in curr dir part if present)
803 ; error_access_denied
804 ; Attempt to set an attribute which cannot be set
805 ; (attr_directory, attr_volume_ID)
806 ; error_sharing_violation
807 ; Sharing mode of file did not allow the change
808 ; (this request requires exclusive write/read access)
809 ; (INT 24H generated)
810 ; DS preserved, others destroyed
811 ;
812 ;******************************************************************************
813 ;AN000;
814 procedure IFS_FILE_XATTRIBUTES,NEAR ;AN000;
815 ;AN000;
816 ;;;;;;;;ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000;
817 ; ifsr_api_def FILEATTR ;AN000;
818 ; ;AN000;
819 ; MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
820 ; SaveReg <BX> ; save input function (2,3,4) ;AN000;
821 ; ;AN000;
822 ; invoke PREP_IFSR ; init ifsr ;AN000;
823 ; Context DS ; ds - dosgroup ;AN000;
824 ; ;AN000;
825 ; invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
826 ; MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
827 ; MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; prep IFSRH ;AN000;
828 ; MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
829 ; MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000;
830 ; MOV AL,FUNC_GET_BY_HANDLE ; start ifsr_func with get ;AN000;
831 ;;;;;;;;RestoreReg <CX> ; get original BX - func ;AN000;
832
833 CMP BL,4 ; ;AC010;
834 JNE XFA_40 ; ;AC010;
835 JMP C_990 ; just ret success if set ;AC010;
836 XFA_40: ;AN000;
837
838 ;;;;;;;;MOV ES:[BX.IFSR_FUNC],AL ;AN000;
839 ; MOV AL,SUBFUNC_EA ; start ifsr_subfunc w/ea list ;AN000;
840 ; CMP CL,3 ; (input get ea names) ;AN000;
841 ; JNE XFA_80 ;AN000;
842 ; INC AL ; inc ifsr_subfunc to ea names ;AN000;
843 ;FA_80: ;AN000;
844 ; MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
845 ; CMP CL,4 ; no size offered on set so don't check ;AN009;
846 ; JE XFA_82 ;AN009;
847 ;
848 ;FA_82: ;AN009;
849 ; MOV AX,[SAVE_DI] ;AN000;
850 ; MOV WORD PTR ES:[BX.IFSR_BUFFER2@],AX ; get list ptr into buffer2@ ;AC002;
851 ; MOV AX,[SAVE_ES] ;AN000;
852 ; MOV WORD PTR ES:[BX.IFSR_BUFFER2@+2],AX ; get list ptr into buffer2@ ;AC002;
853 ;FA_85: ;AN008;
854 ; CMP CL,2 ; get ea list with qlist ;AN000;
855 ; JNE XFA_90 ;AN000;
856 ; MOV AX,[SAVE_SI] ;AN000;
857 ; CMP AX,NULL_PTR ; if null, don't set buffer1 ;AN005;
858 ; JE XFA_90 ;AN005;
859 ; MOV WORD PTR ES:[BX.IFSR_BUFFER1@],AX ; get list ptr into buffer2@ ;AC002;
860 ; MOV AX,[SAVE_DS] ;AN000;
861 ; MOV WORD PTR ES:[BX.IFSR_BUFFER1@+2],AX ; get list ptr into buffer2@ ;AC002;
862 ;FA_90: ;AN000;
863 ; PUSH [SAVE_CX] ; buffer size ;AN000;
864 ; POP ES:[BX.IFSR_COUNT] ;AN000;
865 ; invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
866 ; ; ES:BX -> IFSRH ;AN000;
867 ; ; IFSR_OPEN_CB@ ;AN000;
868 ; ; ds - IFSSEG ;AN000;
869 ;************************************************
870 ; invoke CALL_IFS ; *** call fs with fileattr request ;AN000;
871 ;************************************************
872 ; JNC XFA_100 ;AN000;
873 ; JMP C_1000 ;AN000;
874 ;FA_100: ;AN000;
875 ;;;;;;;;invoke SFF_TO_SFT ;AN000;
876
877
878 Context DS ; on get - set size to 2 and count=0 ;AN010;
879 MOV AX,[SAVE_CX] ; if count < 2 than no buffer2 ;AN008;;AC013;
880 CMP AX,2 ;AN008;;AC013;
881 JGE XFA_120 ;AN008;;AC013;
882 XOR AX,AX
883 JMP SHORT XFA_140
884 XFA_120: ;AN013;
885 PUSH [SAVE_ES] ;AN010;
886 POP ES ;AN010;
887 MOV DI,[SAVE_DI] ;AN010;
888 XOR AX,AX ;AN010;
889 STOSW ; count in buffer ;AN010;
890 MOV AX,2 ;AN007;AC010;
891 XFA_140: ;AN013;
892 SaveReg <AX> ; preserve future cx ;AN016;
893 CallInstall Get_User_Stack,multDOS,24 ; put size in user cx ;AN007;
894 RestoreReg <AX> ; restore future cx ;AN016;
895 MOV DS:[SI.USER_CX],AX ;AN007;
896 JMP C_990 ; go ret in close to get ds-dosgroup ;AN000;
897 ;AN000;
898 ;AN000;
899 EndProc IFS_FILE_XATTRIBUTES ;AN000;
900 ;AN000;
901 ;AN000;
902 IFSSEG ENDS ;AN000;
903 END ;AN000;