diff options
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSHAND.ASM')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSHAND.ASM | 903 |
1 files changed, 903 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM new file mode 100644 index 0000000..19a997f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM | |||
| @@ -0,0 +1,903 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifshand.asm 1.0 87/05/11 ;AN000; | ||
| 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 | ;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 | ;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; | ||