diff options
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSDEV.ASM | 1267 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSDIR.ASM | 313 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSERROR.ASM | 637 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM | 476 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | 1778 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM | 202 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFSYM.INC | 162 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK | 12 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL | 49 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSHAND.ASM | 903 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSINIT.ASM | 1373 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSPARSE.INC | 92 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSSESS.ASM | 2187 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM | 2739 | ||||
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/MAKEFILE | 127 |
15 files changed, 12317 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM new file mode 100644 index 0000000..1ad88ff --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM | |||
| @@ -0,0 +1,1267 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC DEVICE ROUTINES - Device/IOCTL routines ;AN000; | ||
| 4 | NAME IFSDEV ;AN000; | ||
| 5 | ;AN000; | ||
| 6 | ;****************************************************************************** | ||
| 7 | ; | ||
| 8 | ; Device related IFS calls | ||
| 9 | ; | ||
| 10 | ; Printer_GetSet_String | ||
| 11 | ; IFS_Device_Check | ||
| 12 | ; IFS_Device_Close | ||
| 13 | ; IFS_Device_Oper | ||
| 14 | ; IFS_Spool_Echo_Check | ||
| 15 | ; IFS_DEPENDENT_IOCTL | ||
| 16 | ; DEVICE_IOCTL | ||
| 17 | ; GET_DFL_FROM_INDEX | ||
| 18 | ; | ||
| 19 | ; Programming notes: | ||
| 20 | ; Old redirector segmentation and DOS interface preserved. | ||
| 21 | ; Routine prologues are accurate for input/output. | ||
| 22 | ; However, the pseudocode was not kept up to date. | ||
| 23 | ; Use it for a rough idea of the routine function. | ||
| 24 | ; | ||
| 25 | ; REVISION HISTORY: | ||
| 26 | ; A000 Original version 4.00 May 1987 | ||
| 27 | ; A001 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA | ||
| 28 | ; A002 PTM 764 - printer attach problems 8/87 RGAZZIA | ||
| 29 | ; A003 PTM 849 - printer open problems 8/87 RGAZZIA | ||
| 30 | ; A004 PTM 1244- Net Print problems 8/87 RGAZZIA | ||
| 31 | ; A005 PTM 1600- dev ioctl ds bug 8/87 RGAZZIA | ||
| 32 | ; A006 PTM 3619- thiscds,thissft not set in ifs dep ioctl 2/88 RGazzia | ||
| 33 | ; A007 PTM 3971 Austin Print bug raid 3/88 RMG | ||
| 34 | ; A008 PTM 4055 UNC problems (make sure thisdfl null on error) 3/30/88 RMG | ||
| 35 | ; A009 PTM 4188 Names=0 problems 4/08/88 RMG | ||
| 36 | ; A010 PTM 4554 Echo across network in vitt alt task 5/12/88 RMG | ||
| 37 | ; A011 PTM 4841 Ctrl ptrsc problems 5/13/88 RMG | ||
| 38 | ; A012 PTM 4885 ifs dept ioctl not recog non-ifs drive 5/17/88 RMG | ||
| 39 | ; A013 PTM 4791 problem with ax error code overwrite 5/19/88 RMG | ||
| 40 | ; A014 PTM 4946 net - no ptrs 5E02 doesn't return error 5/20/88 RMG | ||
| 41 | ; A015 PTM 5005 get truncate flag faulty - ret on user stack 6/02/88 RMG | ||
| 42 | ; LOC - 477 | ||
| 43 | ; | ||
| 44 | ;****************************************************************************** | ||
| 45 | ;AN000; | ||
| 46 | .xlist ;AN000; | ||
| 47 | .xcref ;AN000; | ||
| 48 | INCLUDE IFSSYM.INC ;AN000; | ||
| 49 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 50 | INCLUDE DOSSYM.INC ;AN000; | ||
| 51 | INCLUDE DEVSYM.INC ;AN000; | ||
| 52 | .cref ;AN000; | ||
| 53 | .list ;AN000; | ||
| 54 | ;AN000; | ||
| 55 | AsmVars <IBM,KANJI,DEBUG> ;AN000; | ||
| 56 | ;AN000; | ||
| 57 | ; define the base code segment of the network support first ;AN000; | ||
| 58 | ;AN000; | ||
| 59 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 60 | IFSSEG ENDS ;AN000; | ||
| 61 | ;AN000; | ||
| 62 | ; include THE REST Of the segment definitions for normal MSDOS ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | .xlist ;AN000; | ||
| 65 | include dosseg.asm ;AN000; | ||
| 66 | .list ;AN000; | ||
| 67 | ;AN000; | ||
| 68 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 69 | ; DOSGROUP Data ;AN000; | ||
| 70 | Extrn THISCDS:DWORD ;AN000; | ||
| 71 | Extrn THISSFT:DWORD ;AN000; | ||
| 72 | Extrn CDSAddr:DWORD ;AN000; | ||
| 73 | Extrn CDSCount:BYTE ;AN000; | ||
| 74 | Extrn CurrentPDB:WORD ;AN000; | ||
| 75 | DATA ENDS ;AN000; | ||
| 76 | ;AN000; | ||
| 77 | ;AN000; | ||
| 78 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 79 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | ; IFS data ;AN000; | ||
| 82 | ;;;aliasExtrn NLAddr:DWORD ;AN000; | ||
| 83 | Extrn TEMPBUF:BYTE ;AN000; | ||
| 84 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 85 | Extrn THISIFS:DWORD ;AN000; | ||
| 86 | Extrn THISDFL:DWORD ;AN000; | ||
| 87 | Extrn DFLCount:BYTE ;AN000; | ||
| 88 | Extrn DFLAddr:DWORD ;AN000; | ||
| 89 | Extrn IFSDRV:BYTE ;AN000; | ||
| 90 | Extrn fAssign:BYTE ;AN000; | ||
| 91 | Extrn CDSAlt:DWORD ;AN000; | ||
| 92 | Extrn TRUNCATE_FLAG:BYTE ;AN000; | ||
| 93 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 94 | Extrn IFSFUNC_FLAGS:WORD ;AN000; | ||
| 95 | Extrn IFSR:WORD ;AN000; | ||
| 96 | Extrn LPT1_NAME:BYTE ;AN000; | ||
| 97 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 98 | ;AN000; | ||
| 99 | ;AN000; | ||
| 100 | BREAK <PRINTER_GETSET_STRING Get/Set a Pre-pend string> ;AN000; | ||
| 101 | ;AN000; | ||
| 102 | ;****************************************************************************** ;AN000; | ||
| 103 | ; ;AN000; | ||
| 104 | ; PRINTER_GETSET_STRING Get or Set the printer string and flag word ;AN000; | ||
| 105 | ; ;AN000; | ||
| 106 | ; Called by: Dispatcher ;AN000; | ||
| 107 | ; ;AN000; | ||
| 108 | ; Routines called: CALL_IFS DOS: Get_User_Stack ;AN000; | ||
| 109 | ; GET_DFL_FROM_INDEX ;AN000; | ||
| 110 | ; DF_TO_DFL ;AN000; | ||
| 111 | ; ;AN000; | ||
| 112 | ; Inputs: ;AN000; | ||
| 113 | ; AL has function type (2-printer-set 3-printer-get ;AN000; | ||
| 114 | ; 4-printer-set-flags 5-printer-get-flags ;AN000; | ||
| 115 | ; VALUE ALREADY RANGE CHECKED BY CALLER ;AN000; | ||
| 116 | ; DS:SI is user string pointer (call 2) ;AN000; | ||
| 117 | ; ES:DI is user buffer (call 3) ;AN000; | ||
| 118 | ; BX is assign index (calls 2,3,4,5) ;AN000; | ||
| 119 | ; CX is length DS:SI (call 2) ;AN000; | ||
| 120 | ; DX is flag word (call 4) ;AN000; | ||
| 121 | ; ;AN000; | ||
| 122 | ; Function: ;AN000; | ||
| 123 | ; Prep IFSRH: ;AN000; | ||
| 124 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 125 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 126 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 127 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 128 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 129 | ; * IFSR_APIFUNC DB 16 ; REDIR IOCTL (Printer Getset String) ;AN000; | ||
| 130 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 131 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 132 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 133 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 134 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 135 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 136 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 137 | ; * IFSR_DEVICE_CB@ DD ? ; DFL entry found by IFSFUNC ;AN000; | ||
| 138 | ; ; Step through CDS & DFL lists counting ;AN000; | ||
| 139 | ; ; (0,1,2,...) ones with IFS bit set. ;AN000; | ||
| 140 | ; ; Stop at BXth one. Pass that in ;AN000; | ||
| 141 | ; ; IFSR_DEVICE_CB@. ;AN000; | ||
| 142 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 143 | ; * IFSR_FUNC DB 0 ; subfunction: ;AN000; | ||
| 144 | ; ; 00 Generic IOCTL by device number ;AN000; | ||
| 145 | ; IFSR_RESV3 DB 0 ;AN000; | ||
| 146 | ; * IFSR_BUFFER@ DD ? ; user buffer (see below) ;AN000; | ||
| 147 | ; * IFSR_BUFSIZE DW ? ; length ;AN000; | ||
| 148 | ; * IFSR_CATEGORY DB 1 ; category 1 for REDIR ;AN000; | ||
| 149 | ; * IFSR_CTLFUNC DB ? ; For AL=2,3 00F00001H F=0 GET,F=1 SET ;AN000; | ||
| 150 | ; ; printer string ;AN000; | ||
| 151 | ; ; For AL=4,5 00F00010H F=0 GET,F=1 SET ;AN000; | ||
| 152 | ; ; printer flag ;AN000; | ||
| 153 | ; ;AN000; | ||
| 154 | ; BUFFER LABEL WORD ; AL=2,3 ;AN000; | ||
| 155 | ; DATA DB ... ;AN000; | ||
| 156 | ; ;AN000; | ||
| 157 | ; BUFFER LABEL WORD ; AL=4,5 ;AN000; | ||
| 158 | ; DW FLAGS ; Printer mode flags ;AN000; | ||
| 159 | ; ; 8000H=binary (vs.ascii) ;AN000; | ||
| 160 | ; ;AN000; | ||
| 161 | ; ;AN000; | ||
| 162 | ; CALL routine, CALL_IFS, with pointer to UNC capable IFS header ;AN000; | ||
| 163 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 164 | ; DO ;AN000; | ||
| 165 | ; IF AL=5 THEN DX = Flags ;AN000; | ||
| 166 | ; Call DF_TO_DFL ;AN000; | ||
| 167 | ; ENDDO ;AN000; | ||
| 168 | ; ELSE ;AN000; | ||
| 169 | ; Set carry ;AN000; | ||
| 170 | ; Put error code in AX ;AN000; | ||
| 171 | ; ENDIF ;AN000; | ||
| 172 | ; ;AN000; | ||
| 173 | ; Outputs: ;AN000; | ||
| 174 | ; If AL = 3 then CX bytes have been put at input ES:DI ;AN000; | ||
| 175 | ; If AL = 5 then DX is the flag word ;AN000; | ||
| 176 | ; ;AN000; | ||
| 177 | ; Regs: nothing preserved ;AN000; | ||
| 178 | ; ;AN000; | ||
| 179 | ; Notes: This request is a REDIR.SYS dependent ioctl request ;AN000; | ||
| 180 | ; ;AN000; | ||
| 181 | ;****************************************************************************** ;AN000; | ||
| 182 | ;AN000; | ||
| 183 | procedure PRINTER_GETSET_STRING,NEAR ;AN000; | ||
| 184 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 185 | ;AN000; | ||
| 186 | TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; unc (redir.sys) must be ;AN000; | ||
| 187 | JNZ PGS_05 ; installed, else do nothing ;AN000; | ||
| 188 | MOV AX,error_invalid_function ;AN000; | ||
| 189 | transfer ifs_980 ;AN000; | ||
| 190 | ;AN000; | ||
| 191 | PGS_05: ;AN000; | ||
| 192 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 193 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 194 | ;AN000; | ||
| 195 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; | ||
| 196 | ; right ;AN000; | ||
| 197 | SaveReg <ES,AX> ; preserve input es since ;AC007; | ||
| 198 | ; next call destroys it ;AN000; | ||
| 199 | ; preserve ax too ;AN007; | ||
| 200 | CALL GET_DFL_FROM_INDEX ; sets [THISDFL], ;AN000; | ||
| 201 | ; ifsr_device_cb@ & ;AN000; | ||
| 202 | ; [THISIFS] ;AN000; | ||
| 203 | JNC PGS_10 ; error on carry - no dfl ;AN000; | ||
| 204 | ADD SP,4 ; restore stack and ;AC007; | ||
| 205 | transfer IFS_980 ; go return in ifsutil ;AC007; | ||
| 206 | ;AN000; | ||
| 207 | PGS_10: ;AN000; | ||
| 208 | RestoreReg <AX> ; restore input al ;AN007; | ||
| 209 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; | ||
| 210 | MOV ES:[BX.IFSR_CATEGORY],CATEGORY_REDIR ;AN000; | ||
| 211 | CMP AL,PRINTER_SET_STRING ;AN000; | ||
| 212 | JNE PGS_20 ;AN000; | ||
| 213 | ; printer set string ;AN000; | ||
| 214 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ; ;AN000; | ||
| 215 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ; ;AN000; | ||
| 216 | MOV ES:[BX.IFSR_BUFSIZE],CX ; ;AN000; | ||
| 217 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_STRING ;AN000; | ||
| 218 | ADD SP,2 ; restore stack (es) & ;AN000; | ||
| 219 | JMP SHORT PGS_100 ; go call redir.sys ;AN000; | ||
| 220 | ;AN000; | ||
| 221 | PGS_20: ;AN000; | ||
| 222 | CMP AL,PRINTER_GET_STRING ; printer get string ;AN000; | ||
| 223 | JNE PGS_40 ;AN000; | ||
| 224 | POP CX ; retrieve es in cx ;AN000; | ||
| 225 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ; ;AN000; | ||
| 226 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000; | ||
| 227 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_STRING ;AN000; | ||
| 228 | JMP SHORT PGS_100 ;AN000; | ||
| 229 | ;AN000; | ||
| 230 | PGS_40: ; flags ;AN000; | ||
| 231 | ADD SP,2 ; 1st clean stack of es ;AN000; | ||
| 232 | PUSH CS ; not needed here ;AN000; | ||
| 233 | POP DS ; must set up buffer ;AN000; | ||
| 234 | ASSUME DS:IFSSEG ; to hold flag word ;AN000; | ||
| 235 | MOV SI,OFFSET TEMPBUF ;AN000; | ||
| 236 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000; | ||
| 237 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; | ||
| 238 | CMP AL,PRINTER_SET_FLAGS ;AN000; | ||
| 239 | JNE PGS_60 ;AN000; | ||
| 240 | MOV DS:[SI],DX ; printer set flags ;AN000; | ||
| 241 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_FLAGS ;AN000; | ||
| 242 | JMP PGS_100 ;AN000; | ||
| 243 | ;AN000; | ||
| 244 | PGS_60: ; printer get flags ;AN000; | ||
| 245 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_FLAGS ;AN000; | ||
| 246 | ;AN000; | ||
| 247 | PGS_100: ;AN000; | ||
| 248 | PUSH AX ; save function ;AN000; | ||
| 249 | ;AN000; | ||
| 250 | PUSH CS ;AN000; | ||
| 251 | POP DS ;AN000; | ||
| 252 | ASSUME DS:IFSSEG ;AN000; | ||
| 253 | ;AN000; | ||
| 254 | invoke SET_THISIFS_UNC ; set thisifs to unc ;AN000; | ||
| 255 | ;AN000; | ||
| 256 | invoke CALL_IFS ; call ifs driver w/request ;AN000; | ||
| 257 | ;AN000; | ||
| 258 | JNC PGS_120 ;AN000; | ||
| 259 | ADD SP,2 ; clean stack of ax (fcn #) ;AN013; | ||
| 260 | transfer ifs_980 ; go ret on error ;AN000; | ||
| 261 | ;AN000; | ||
| 262 | PGS_120: ;AN000; | ||
| 263 | POP AX ; restore original input fcn ;AN000;;AM013; | ||
| 264 | invoke DF_TO_DFL ; Update dfl entry ;AN000; | ||
| 265 | ;AN000; | ||
| 266 | CMP AL,PRINTER_GET_FLAGS ; if printer get flags ;AN000; | ||
| 267 | JE PGS_140 ; put flags in DX ;AN000; | ||
| 268 | CMP AL,PRINTER_GET_STRING ; if printer get string ;AN000; | ||
| 269 | JE PGS_160 ; put stg size in CX ;AN000; | ||
| 270 | ;AN000; | ||
| 271 | transfer ifs_990 ;AN000; | ||
| 272 | PGS_140: ;AN000; | ||
| 273 | LES DI,ES:[BX.IFSR_BUFFER@] ;AN000; | ||
| 274 | MOV DX,WORD PTR ES:[DI] ;AC004; | ||
| 275 | CallInstall Get_User_Stack,multDOS,24 ;AN000; | ||
| 276 | MOV [SI].User_DX,DX ; return user flags to dos ;AN000; | ||
| 277 | transfer ifs_990 ; go return with no carry ;AN000; | ||
| 278 | ;AN000; | ||
| 279 | PGS_160: ;AN000; | ||
| 280 | MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000; | ||
| 281 | CallInstall Get_User_Stack,multDOS,24 ;AN000; | ||
| 282 | MOV [SI].User_CX,CX ; Size of pre string just transferred ;AN000; | ||
| 283 | transfer ifs_990 ; go return with no carry ;AN000; | ||
| 284 | ;AN000; | ||
| 285 | EndProc PRINTER_GETSET_STRING ;AN000; | ||
| 286 | ;AN000; | ||
| 287 | ;AN000; | ||
| 288 | ;AN000; | ||
| 289 | BREAK <IFS_DEVICE_CHECK See if given path is device> ;AN000; | ||
| 290 | ;AN000; | ||
| 291 | ;****************************************************************************** ;AN000; | ||
| 292 | ; ;AN000; | ||
| 293 | ; IFS_DEVICE_CHECK ;AN000; | ||
| 294 | ; ;AN000; | ||
| 295 | ; Called by: Dispatcher ;AN000; | ||
| 296 | ; ;AN000; | ||
| 297 | ; Routines called: DFL_MATCH DOS: PathChrCmp ;AN000; | ||
| 298 | ; DFL_TO_DF StrCpy ;AN000; | ||
| 299 | ; CALL_IFS ;AN000; | ||
| 300 | ; Inputs: ;AN000; | ||
| 301 | ; DS:SI -> name ;AN000; | ||
| 302 | ; ES:DI -> buffer ;AN000; | ||
| 303 | ; ;AN000; | ||
| 304 | ; Function: ;AN000; | ||
| 305 | ; Search DFL for match on name. ;AN000; | ||
| 306 | ; IF match found THEN ;AN000; | ||
| 307 | ; DO /* match found */ ;AN000; | ||
| 308 | ; IF DFL_TYPE = 3 (net device) THEN ;AN000; | ||
| 309 | ; ES:DI -> parms ;AN000; | ||
| 310 | ; Clear carry ;AN000; | ||
| 311 | ; ENDDO ;AN000; | ||
| 312 | ; ELSE /* no match found */ ;AN000; | ||
| 313 | ; Set carry ;AN000; | ||
| 314 | ; ENDIF ;AN000; | ||
| 315 | ; ;AN000; | ||
| 316 | ; Outputs: ;AN000; | ||
| 317 | ; no match: carry set ;AN000; | ||
| 318 | ; match: carry clear, es:di -> parms if unc ;AN000; | ||
| 319 | ; ;AN000; | ||
| 320 | ; ;AN000; | ||
| 321 | ; Regs: nothing preserved ;AN000; | ||
| 322 | ; ;AN000; | ||
| 323 | ; Programming notes: Most of this code lifted right out of the Redirector. ;AN000; | ||
| 324 | ; ;AN000; | ||
| 325 | ;****************************************************************************** ;AN000; | ||
| 326 | ;AN000; | ||
| 327 | procedure IFS_DEVICE_CHECK,NEAR ;AN000; | ||
| 328 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 329 | ;AN000; | ||
| 330 | ifsr_fcn_def ATTSTAT ;AN000; | ||
| 331 | ;AN000; | ||
| 332 | LocalVar Src,DWORD ; ** netprn parse code begins ;AN000; | ||
| 333 | LocalVar Dst,DWORD ;AN000; | ||
| 334 | LocalVar DotPos,WORD ;AN000; | ||
| 335 | Enter ;AN000; | ||
| 336 | ; ;AN000; | ||
| 337 | ; Preserve all of the input quantities ;AN000; | ||
| 338 | ; ;AN000; | ||
| 339 | MOV SrcL,SI ;AN000; | ||
| 340 | MOV SrcH,DS ;AN000; | ||
| 341 | MOV DstL,DI ;AN000; | ||
| 342 | MOV DstH,ES ;AN000; | ||
| 343 | MOV DotPos,-1 ;AN000; | ||
| 344 | ; ;AN000; | ||
| 345 | ; Check for a UNC string. If UNC, is not spooled. ;AN000; | ||
| 346 | ; ;AN000; | ||
| 347 | MOV AX,[SI] ;AN000; | ||
| 348 | CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000; | ||
| 349 | JNZ NOT_UNC ;AN000; | ||
| 350 | XCHG AH,AL ;AN000; | ||
| 351 | CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000; | ||
| 352 | JZ NOTSpool ;AN000; | ||
| 353 | NOT_UNC: ;AN000; | ||
| 354 | ; ;AN000; | ||
| 355 | ; Scan string remembering previous path separator char. ;AN000; | ||
| 356 | ; ;AN000; | ||
| 357 | MOV DI,SI ; remember first character ;AN000; | ||
| 358 | PathSkip: ;AN000; | ||
| 359 | LODSB ;AN000; | ||
| 360 | OR AL,AL ;AN000; | ||
| 361 | JZ FoundEnd ;AN000; | ||
| 362 | IF Kanji ;AN000; | ||
| 363 | kanji load of next char too ;AN000; | ||
| 364 | ENDIF ;AN000; | ||
| 365 | CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000; | ||
| 366 | JZ SaveSI ;AN000; | ||
| 367 | CMP AL,':' ;AN000; | ||
| 368 | JNZ TestDot ;AN000; | ||
| 369 | SaveSI: ;AN000; | ||
| 370 | MOV DI,SI ;AN000; | ||
| 371 | JMP PathSkip ;AN000; | ||
| 372 | TestDot: ;AN000; | ||
| 373 | CMP AL,'.' ;AN000; | ||
| 374 | JNZ PathSkip ;AN000; | ||
| 375 | MOV DotPos,SI ;AN000; | ||
| 376 | JMP PathSkip ;AN000; | ||
| 377 | ;AN000; | ||
| 378 | ; ;AN000; | ||
| 379 | ; Better check for trailing :. They are ILLEGAL (read this comment, IBM) in ;AN000; | ||
| 380 | ; file names. ;AN000; | ||
| 381 | ; ;AN000; | ||
| 382 | FoundEnd: ;AN000; | ||
| 383 | CMP BYTE PTR [SI-2],':' ;AN000; | ||
| 384 | JNZ NOCOL ;AN000; | ||
| 385 | NotSpool: ;AN000; | ||
| 386 | SaveReg <AX,CS> ;AN008; | ||
| 387 | RestoreReg <DS> ;AN008; | ||
| 388 | MOV AX,NULL_PTR ;AN008; | ||
| 389 | MOV WORD PTR [THISDFL],AX ;AN008; | ||
| 390 | MOV WORD PTR [THISDFL+2],AX ;AN008; | ||
| 391 | RestoreReg <AX> ;AN008; | ||
| 392 | LDS SI,Src ;AN000; | ||
| 393 | STC ;AN000; | ||
| 394 | Done: ;AN000; | ||
| 395 | LES DI,Dst ;AN000; | ||
| 396 | Leave ;AN000; | ||
| 397 | return ;AN000; | ||
| 398 | ;AN000; | ||
| 399 | NotSpoolLv: ;AN000; | ||
| 400 | LeaveCrit critNet ;AN000; | ||
| 401 | JMP NotSpool ;AN000; | ||
| 402 | ;AN000; | ||
| 403 | NOCOL: ;AN000; | ||
| 404 | XCHG SI,DI ;AN000; | ||
| 405 | ; ;AN000; | ||
| 406 | ; DS:SI points to remainder of string. DS:DI points to 1 past NUL. AL = 0 ;AN000; | ||
| 407 | ; ;AN000; | ||
| 408 | CMP DotPos,-1 ;AN000; | ||
| 409 | JZ GetP ;AN000; | ||
| 410 | MOV DI,DotPos ;AN000; | ||
| 411 | XCHG AL,[DI-1] ;AN000; | ||
| 412 | ; ;AN000; | ||
| 413 | ; DI points to 1 past either former . (now NUL) or terminating NUL. AL has ;AN000; | ||
| 414 | ; former character (. or NUL) ;AN000; | ||
| 415 | ; ;AN000; | ||
| 416 | ; ** end of netprn code ;AN000; | ||
| 417 | GETP: ; ds:si -> parsed string ;AN000; | ||
| 418 | invoke DFL_MATCH ;AN000; | ||
| 419 | MOV ES,SrcH ;AN000; | ||
| 420 | MOV ES:[DI-1],AL ; replace original character ;AN000; | ||
| 421 | JNC IDC_100 ; not in dfl; set bl=ff ;AN000; | ||
| 422 | JMP NotSpool ;AN000; | ||
| 423 | ;AN000; | ||
| 424 | IDC_100: ; match found ;AN000; | ||
| 425 | LES DI,[THISDFL] ;AN000; | ||
| 426 | CMP ES:[DI.DFL_TYPE],TYPE_NET_DEVICE ;AN000; | ||
| 427 | JE IDC_120 ;AN000; | ||
| 428 | LES DI,Dst ;AN000; | ||
| 429 | JMP IDC_220 ;AN000; | ||
| 430 | ;AN000; | ||
| 431 | IDC_120: ; ifs: get parms ;AN000; | ||
| 432 | invoke PREP_IFSR ; clear ifsr ;AN003; | ||
| 433 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN003; | ||
| 434 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; | ||
| 435 | ; ES:BX -> IFSRH ;AN000; | ||
| 436 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 437 | ; ds - IFSSEG ;AN000; | ||
| 438 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AN000; | ||
| 439 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AN000; | ||
| 440 | invoke SET_CATEGORY ; this has nothing to do w/catrgory ;AN000; | ||
| 441 | ; want to determine if unc or not ;AN000; | ||
| 442 | OR CL,CL ; unc cl=1, other cl=0 ;AN000; | ||
| 443 | JNE IDC_140 ;AN000; | ||
| 444 | MOV ES:[BX.IFSR_TYPE],TYPE_DEVICE ;AN000; | ||
| 445 | JMP SHORT IDC_160 ;AN000; | ||
| 446 | IDC_140: ;AN000; | ||
| 447 | MOV ES:[BX.IFSR_TYPE],TYPE_NET_DEVICE ;AN000; | ||
| 448 | IDC_160: ;AN000; | ||
| 449 | PUSH CS ;AN000; | ||
| 450 | POP DS ;AN000; | ||
| 451 | ASSUME DS:IFSSEG ;AN000; | ||
| 452 | MOV SI,OFFSET TEMPBUF ;AN000; | ||
| 453 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000; | ||
| 454 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000; | ||
| 455 | ;AN000; | ||
| 456 | invoke CALL_IFS ;AN000; | ||
| 457 | JNC IDC_200 ;AN008; | ||
| 458 | JMP NotSpool ;AC008; | ||
| 459 | ;AN000; | ||
| 460 | IDC_200: ;AN000; | ||
| 461 | MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AN000; | ||
| 462 | MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AN000; | ||
| 463 | MOV BL,ES:[BX.IFSR_TYPE] ;AC001; | ||
| 464 | XOR BH,BH ;AN001; | ||
| 465 | INC SI ; ds:si -> parms returned by redir ;AN000; | ||
| 466 | INC SI ;AN000; | ||
| 467 | LES DI,Dst ;AN000; | ||
| 468 | CallInstall StrCpy,multDOS,17 ;AN000; | ||
| 469 | DEC DI ; now append device name to net path ;AN003; | ||
| 470 | MOV AL,'\' ; | ;AN003; | ||
| 471 | STOSB ; | ;AN003; | ||
| 472 | LDS SI,CS:[THISDFL] ; | ;AN003; | ||
| 473 | ADD SI,2 ; | ;AN003; | ||
| 474 | invoke CONVERT_NAME_ASCIIZ ; | mov name string over ;AN003; | ||
| 475 | |||
| 476 | IDC_220: ;AN000; | ||
| 477 | LDS SI,Dst ;AN000; | ||
| 478 | CLC ;AN000; | ||
| 479 | JMP DONE ;AN000; | ||
| 480 | ;AN000; | ||
| 481 | ;AN000; | ||
| 482 | EndProc IFS_DEVICE_CHECK ;AN000; | ||
| 483 | ;AN000; | ||
| 484 | ;AN000; | ||
| 485 | ;AN000; | ||
| 486 | ;AN000; | ||
| 487 | BREAK <IFS_DEVICE_CLOSE Do a close on a device session directly> ;AN000; | ||
| 488 | ;AN000; | ||
| 489 | ;****************************************************************************** ;AN000; | ||
| 490 | ; ;AN000; | ||
| 491 | ; IFS_DEVICE_CLOSE ;AN000; | ||
| 492 | ; ;AN000; | ||
| 493 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 494 | ; ;AN000; | ||
| 495 | ; Routines called: ;AN000; | ||
| 496 | ; SFT_TO_SFF ;AN000; | ||
| 497 | ; SFF_TO_SFT ;AN000; | ||
| 498 | ; CALL_IFS ;AN000; | ||
| 499 | ; ;AN000; | ||
| 500 | ; Inputs: ES:DI -> SFT ;AN000; | ||
| 501 | ; ;AN000; | ||
| 502 | ; Function: ;AN000; | ||
| 503 | ; Send request below to IFS specified if SFT. ;AN000; | ||
| 504 | ; ;AN000; | ||
| 505 | ; Prep IFSRH: ;AN000; | ||
| 506 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 507 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 508 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 509 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 510 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 511 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; | ||
| 512 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 513 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 514 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 515 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 516 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 517 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 518 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 519 | ; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000; | ||
| 520 | ; * IFSR_OPEN_CB@ DD ? ; SF ;AN000; | ||
| 521 | ; * IFSR_FUNC DB 0 ; generic IOCTL by handle ;AN000; | ||
| 522 | ; IFSR_RESV3 DB 0 ;AN000; | ||
| 523 | ; IFSR_BUFFER@ DD ? ;AN000; | ||
| 524 | ; IFSR_BUFSIZE DW ? ;AN000; | ||
| 525 | ; IFSR_CATEGORY DB 1 for UNC, 0 for all other FSs ;AN000; | ||
| 526 | ; IFSR_CTLFUNC DB 00000101B ; device spool close ;AN000; | ||
| 527 | ; ;AN000; | ||
| 528 | ; Outputs: ;AN000; | ||
| 529 | ; Carry set - error code in AX ;AN000; | ||
| 530 | ; ;AN000; | ||
| 531 | ; ;AN000; | ||
| 532 | ; Regs: nothing preserved ;AN000; | ||
| 533 | ; ;AN000; | ||
| 534 | ; ;AN000; | ||
| 535 | ;****************************************************************************** ;AN000; | ||
| 536 | ;AN000; | ||
| 537 | procedure IFS_DEVICE_CLOSE,NEAR ;AN000; | ||
| 538 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 539 | ;AN000; | ||
| 540 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 541 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 542 | ;AN000; | ||
| 543 | SaveReg <DS,SI,ES,DI> ; preserve these for dos - guesing ;AN011; | ||
| 544 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002; | ||
| 545 | MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000; | ||
| 546 | ;AN000; | ||
| 547 | Context DS ;AN000; | ||
| 548 | MOV WORD PTR [THISSFT],DI ;AN000; | ||
| 549 | MOV WORD PTR [THISSFT+2],ES ;AN000; | ||
| 550 | |||
| 551 | invoke PREP_IFSR ; & ifsr ;AM011; | ||
| 552 | invoke SFT_TO_SFF ; sets [THISIFS] ;AN000; | ||
| 553 | ; ES:BX -> IFSRH ;AN000; | ||
| 554 | ; IFSR_OPEN_CB@ ;AN000; | ||
| 555 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 556 | ; ds - IFSSEG ;AN000; | ||
| 557 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; | ||
| 558 | ;;;;;;;;INC ES:[BX.IFSR_FUNC] ; inc func from gen_ioctl_by_devnum ;AD011; | ||
| 559 | ;;;;;;;; ; to gen_ioctl_by_handle ;AD011; | ||
| 560 | invoke SET_CATEGORY ;AN000; | ||
| 561 | MOV ES:[BX.IFSR_CATEGORY],CL ;AN002; | ||
| 562 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVCLOSE ;AN000; | ||
| 563 | ;AN000; | ||
| 564 | invoke CALL_IFS ; call ifs w/device close request ;AN000; | ||
| 565 | ;AN000; | ||
| 566 | JNC IDCL_60 ;AN000; | ||
| 567 | JMP IDCL_1000 ; go ret w/carry already set ;AC011; | ||
| 568 | ;AN000; | ||
| 569 | IDCL_60: ;AN000; | ||
| 570 | invoke SFF_TO_SFT ;AN000; | ||
| 571 | ;;;;;;;;transfer ifs_990 ;AD011; | ||
| 572 | IDCL_1000: ;AN011; | ||
| 573 | RestoreReg <DI,ES,SI,DS> ;AN011; | ||
| 574 | XOR CX,CX ; set zero flag ;AN011;;AC013; | ||
| 575 | return ;AN011; | ||
| 576 | ;AN000; | ||
| 577 | ;AN000; | ||
| 578 | EndProc IFS_DEVICE_CLOSE ;AN000; | ||
| 579 | ;AN000; | ||
| 580 | ;AN000; | ||
| 581 | BREAK <IFS_DEVICE_OPER Do various device control functions> ;AN000; | ||
| 582 | ;AN000; | ||
| 583 | ;****************************************************************************** ;AN000; | ||
| 584 | ; ;AN000; | ||
| 585 | ; IFS_DEVICE_OPER ;AN000; | ||
| 586 | ; ;AN000; | ||
| 587 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 588 | ; ;AN000; | ||
| 589 | ; Routines called: PREP_IFSR ;AN000; | ||
| 590 | ; CALL_IFS ;AN000; | ||
| 591 | ; DFL_TO_DF ;AN000; | ||
| 592 | ; ;AN000; | ||
| 593 | ; Inputs: AL = 7 Get truncate flag ;AN000; | ||
| 594 | ; AL = 8 Set truncate flag ;AN000; | ||
| 595 | ; DL = value ;AN000; | ||
| 596 | ; AL = 9 Close all spool files ;AN000; | ||
| 597 | ; ;AN000; | ||
| 598 | ; Function: ;AN000; | ||
| 599 | ; IF AL=7 THEN DL = [TRUNCATE_FLAG] ;AN000; | ||
| 600 | ; ELSE DO ;AN000; | ||
| 601 | ; Get addr of 1st DFL entry. ;AN000; | ||
| 602 | ; FOR I = 1 to last DFL entry in use ;AN000; | ||
| 603 | ; Send request below to IFS specified if DFL. ;AN000; | ||
| 604 | ; ENDDO ;AN000; | ||
| 605 | ; ;AN000; | ||
| 606 | ; Prep IFSRH: ;AN000; | ||
| 607 | ; * IFSR_LENGTH DW 48 ; Request length ;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 16 ; IFS dependent IOCTL ;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 ? ; DF ;AN000; | ||
| 621 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 622 | ; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by device number ;AN000; | ||
| 623 | ; IFSR_RESV3 DB 0 ;AN000; | ||
| 624 | ; * IFSR_BUFFER@ DD ? ;AN000; | ||
| 625 | ; * IFSR_BUFSIZE DW 1 ;AN000; | ||
| 626 | ; IFSR_CATEGORY DB 1 for UNC, 0 for other FSs ;AN000; | ||
| 627 | ; IFSR_CTLFUNC DB 00000110 ; device_oper ;AN000; | ||
| 628 | ; ;AN000; | ||
| 629 | ; BUFFER LABEL BYTE ;AN000; | ||
| 630 | ; DB function ; 8 set truncate flag ;AN000; | ||
| 631 | ; ; 9 close all spool files ;AN000; | ||
| 632 | ; DB truncate flag on set ;AN000; | ||
| 633 | ; ;AN000; | ||
| 634 | ; Outputs: ;AN000; | ||
| 635 | ; Carry clear - DL = truncate flag on get ;AN000; | ||
| 636 | ; Carry set - AX = error code ;AN000; | ||
| 637 | ; ;AN000; | ||
| 638 | ; Regs: nothing preserved ;AN000; | ||
| 639 | ; ;AN000; | ||
| 640 | ; Notes: DFL not updated ;AN000; | ||
| 641 | ; ;AN000; | ||
| 642 | ;****************************************************************************** ;AN000; | ||
| 643 | ;AN000; | ||
| 644 | procedure IFS_DEVICE_OPER,NEAR ;AN000; | ||
| 645 | ;AN000; | ||
| 646 | CMP AL,GET_TRUNCATE_FLAG ;AN000; | ||
| 647 | JNE IDO_20 ;AN000; | ||
| 648 | MOV DL,[TRUNCATE_FLAG] ; Get truncate flag ;AN000; | ||
| 649 | XOR DH,DH ;AN015; | ||
| 650 | CallInstall Get_User_Stack,multDOS,24 ;AN015; | ||
| 651 | MOV [SI].User_DX,DX ;AN015; | ||
| 652 | transfer ifs_990 ; go ret no carry ;AN000; | ||
| 653 | ;AN000; | ||
| 654 | IDO_20: ; Set truncate flag or close all ;AN000; | ||
| 655 | ifsr_fcn_def EXECAPI ; spool files ;AN000; | ||
| 656 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 657 | ;AN000; | ||
| 658 | PUSH CS ; get addressability to IFSSEG ;AN000; | ||
| 659 | POP DS ;AN000; | ||
| 660 | ASSUME DS:IFSSEG,ES:NOTHING ;AN000; | ||
| 661 | ;AN000; | ||
| 662 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002; | ||
| 663 | CMP AL,SET_TRUNCATE_FLAG ; Set local storage of truncate_flag ;AN000; | ||
| 664 | JNE IDO_30 ;AN000; | ||
| 665 | MOV [TRUNCATE_FLAG],DL ;AC002; | ||
| 666 | MOV AH,DL ; for safekeeping ;AN002; | ||
| 667 | ;AN000; | ||
| 668 | IDO_30: ;AN000; | ||
| 669 | MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000; | ||
| 670 | OR CL,CL ; check for no dfl ;AN009; | ||
| 671 | JNZ IDO_35 ;AN009; | ||
| 672 | transfer ifs_990 ; no dfl - just go successfully ;AN009; | ||
| 673 | IDO_35: | ||
| 674 | XOR CH,CH ;AN000; | ||
| 675 | MOV DX,SIZE DFLL_LIST ;AN000; | ||
| 676 | LDS SI,[DFLAddr] ;AN000; | ||
| 677 | ;AN000; | ||
| 678 | IDO_40: ; ** Loop here thru DFL list entries ;AN000; | ||
| 679 | ;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ;AN000; | ||
| 680 | ;;;aliasJE IDO_100 ; skip alias dfl entries ;AN000; | ||
| 681 | ;;;alias ;AN000; | ||
| 682 | TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ; skip unused dfl entries ;AN000; | ||
| 683 | JZ IDO_100 ;AN000; | ||
| 684 | MOV WORD PTR [THISDFL],SI ; Prep IFSRH ;AN000; | ||
| 685 | MOV WORD PTR [THISDFL+2],DS ;AN000; | ||
| 686 | invoke PREP_IFSR ;AN000; | ||
| 687 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; | ||
| 688 | ; ES:BX -> IFSRH ;AN000; | ||
| 689 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 690 | ; ds - IFSSEG ;AN000; | ||
| 691 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; | ||
| 692 | MOV SI,OFFSET TEMPBUF ; prep devoper buffer ;AN000; | ||
| 693 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000; | ||
| 694 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; | ||
| 695 | MOV BYTE PTR DS:[SI],AL ; buffer contains: db fcn ;AN000; | ||
| 696 | MOV ES:[BX.IFSR_BUFSIZE],1 ;AN002; | ||
| 697 | CMP AL,CLOSE_SPOOL_FILES ; db truncate flag ;AN000; | ||
| 698 | JE IDO_60 ;AN000; | ||
| 699 | MOV BYTE PTR DS:[SI+1],AH ;AC002; | ||
| 700 | INC ES:[BX.IFSR_BUFSIZE] | ||
| 701 | IDO_60: ;AN000; | ||
| 702 | invoke SET_CATEGORY ;AN000; | ||
| 703 | MOV ES:[BX.IFSR_CATEGORY],CL ;AN002; | ||
| 704 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVOPER ;AN000; | ||
| 705 | ;AN000; | ||
| 706 | SaveReg <CX> ; save count ;AN000; | ||
| 707 | invoke CALL_IFS ; call ifs with device oper request ;AN000; | ||
| 708 | RestoreReg <CX> ; restore count ;AN000; | ||
| 709 | ;AN000; | ||
| 710 | IDO_100: ;AN000; | ||
| 711 | ADD SI,DX ; prep for next dfl ;AN000; | ||
| 712 | LOOP IDO_40 ; go process next dfl ;AN000; | ||
| 713 | transfer ifs_990 ; Finished. Go ret no carry. ;AN000; | ||
| 714 | ;AN000; | ||
| 715 | ;AN000; | ||
| 716 | EndProc IFS_DEVICE_OPER ;AN000; | ||
| 717 | ;AN000; | ||
| 718 | ;AN000; | ||
| 719 | BREAK <IFS_SPOOL_ECHO_CHECK See if FS controling LPT1 allows echo> ;AN000; | ||
| 720 | ;AN000; | ||
| 721 | ;****************************************************************************** ;AN000; | ||
| 722 | ; ;AN000; | ||
| 723 | ; IFS_SPOOL_ECHO_CHECK ;AN000; | ||
| 724 | ; ;AN000; | ||
| 725 | ; Called by: Dispatcher ;AN000; | ||
| 726 | ; ;AN000; | ||
| 727 | ; Routines called: DFL_MATCH ;AN000; | ||
| 728 | ; DFL_TO_DF ;AN000; | ||
| 729 | ; CALL_IFS ;AN000; | ||
| 730 | ; Inputs: None ;AN000; | ||
| 731 | ; ;AN000; | ||
| 732 | ; Function: ;AN000; | ||
| 733 | ; Call DFL_MATCH for match on "LPT1". ;AN000; | ||
| 734 | ; IF match found THEN ;AN000; | ||
| 735 | ; DO ;AN000; | ||
| 736 | ; Prep IFSRH: ;AN000; | ||
| 737 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 738 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 739 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 740 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 741 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 742 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; | ||
| 743 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 744 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 745 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 746 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 747 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 748 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 749 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 750 | ; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000; | ||
| 751 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 752 | ; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by devnum ;AN000; | ||
| 753 | ; IFSR_RESV2 DB 0 ;AN000; | ||
| 754 | ; * IFSR_BUFFER@ DD ? ;AN000; | ||
| 755 | ; * IFSR_BUFSIZE DW ? ;AN000; | ||
| 756 | ; IFSR_CATEGORY DB ? ; 0 non-unc, 1 unc ;AN000; | ||
| 757 | ; IFSR_CTLFUNC DB 00000011B ;AN000; | ||
| 758 | ; ;AN000; | ||
| 759 | ; BUFFER LABEL BYTE ;AN000; | ||
| 760 | ; DB VALUE,0 ; 0 echo allowed ;AN000; | ||
| 761 | ; ; 1 echo not allowed ;AN000; | ||
| 762 | ; ;AN000; | ||
| 763 | ; ;AN000; | ||
| 764 | ; Call routine, CALL_IFS, with DFL_IFSR_HDR ;AN000; | ||
| 765 | ; ENDDO ;AN000; | ||
| 766 | ; ;AN000; | ||
| 767 | ; Outputs: ;AN000; | ||
| 768 | ; Carry clear - echo allowed ;AN000; | ||
| 769 | ; Carry set - echo NOT allowed ;AN000; | ||
| 770 | ; ;AN000; | ||
| 771 | ; ;AN000; | ||
| 772 | ; Regs: nothing preserved ;AN000; | ||
| 773 | ; ;AN000; | ||
| 774 | ; Programming notes: DFL FSDA not updated ;AN000; | ||
| 775 | ; ;AN000; | ||
| 776 | ;****************************************************************************** ;AN000; | ||
| 777 | ;AN000; | ||
| 778 | procedure IFS_SPOOL_ECHO_CHECK,NEAR ;AN000; | ||
| 779 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 780 | ;AN000; | ||
| 781 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 782 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 783 | ;AN000; | ||
| 784 | SaveReg <ES,DI,DS,SI> ; save these for ibmdos (guessing which) ;AN011; | ||
| 785 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; | ||
| 786 | ; right ;AN000; | ||
| 787 | PUSH CS ; Set ds:si -> "lpt1",0 ;AN000; | ||
| 788 | POP DS ; want to find dfl entry with ;AN000; | ||
| 789 | ASSUME DS:IFSSEG ; this dev name ;AN000; | ||
| 790 | MOV SI,OFFSET LPT1_NAME ;AN000; | ||
| 791 | ;AN000; | ||
| 792 | invoke DFL_MATCH ;AN000; | ||
| 793 | JNC ISEC_10 ;AN000; | ||
| 794 | CLC ; not in dfl; assume echo ok ;AN011; | ||
| 795 | JMP ISEC_1000 ;AC011; | ||
| 796 | ;AN000; | ||
| 797 | ISEC_10: ;AN000; | ||
| 798 | LES DI,[THISDFL] ;AN000; | ||
| 799 | ;;;aliasCMP ES:[DI.DFL_TYPE],TYPE_ALIAS ;AN000; | ||
| 800 | ;;;aliasJNE ISEC_15 ;AN000; | ||
| 801 | ;;;aliastransfer ifs_980 ; lpt1 is alias, assume no echo ;AN000; | ||
| 802 | ;AN000; | ||
| 803 | ISEC_15: ;AN000; | ||
| 804 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 805 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; | ||
| 806 | ; ES:BX -> IFSRH ;AN000; | ||
| 807 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 808 | ; ds - IFSSEG ;AN000; | ||
| 809 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; | ||
| 810 | MOV SI,OFFSET TEMPBUF ;AN000; | ||
| 811 | MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ; use tempbuf for ;AN000; | ||
| 812 | MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ; return byte value ;AN000; | ||
| 813 | MOV ES:[BX.IFSR_BUFSIZE],LENGTH_DEVECHOCHECK_BUFFER ; (1) ;AN000; | ||
| 814 | ;AN000; | ||
| 815 | invoke SET_CATEGORY ;AN000; | ||
| 816 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVECHOCHECK ; (00000011) ;AN000; | ||
| 817 | ;AN000; | ||
| 818 | invoke CALL_IFS ;AN000; | ||
| 819 | ;AN000; | ||
| 820 | JNC ISEC_60 ;AN000; | ||
| 821 | JMP SHORT ISEC_1000 ; no echo on err, cf set ;AC011; | ||
| 822 | ;AN000; | ||
| 823 | ISEC_60: ;AN000; | ||
| 824 | CMP BYTE PTR DS:[SI],0 ; else byte returned in buffr ;AN000; | ||
| 825 | JE ISEC_80 ; determines echo (0-yes,1-no) ;AN000; | ||
| 826 | STC ;AN011; | ||
| 827 | JMP SHORT ISEC_1000 ; no echo ret ;AC011; | ||
| 828 | ISEC_80: ;AN000; | ||
| 829 | CLC ;AN011; | ||
| 830 | |||
| 831 | |||
| 832 | ISEC_1000: ; echo ret ;AN011; | ||
| 833 | RestoreReg <SI,DS,DI,ES> ;AN011; | ||
| 834 | RET ;AN011; | ||
| 835 | |||
| 836 | ;AN000; | ||
| 837 | EndProc IFS_SPOOL_ECHO_CHECK ;AN000; | ||
| 838 | ;AN000; | ||
| 839 | BREAK <IFS_DEPENDENT_IOCTL - dependent ioctl> ;AN000; | ||
| 840 | ;AN000; | ||
| 841 | ;****************************************************************************** ;AN000; | ||
| 842 | ; ;AN000; | ||
| 843 | ; IFS_DEPENDENT_IOCTL ;AN000; | ||
| 844 | ; ;AN000; | ||
| 845 | ; Called by: Dispatcher ;AN000; | ||
| 846 | ; ;AN000; | ||
| 847 | ; Routines called: CALL_IFS ;AN000; | ||
| 848 | ; CDS_TO_CD SFT_TO_SFF ;AN000; | ||
| 849 | ; CD_TO_CDS SFF_TO_SFT ;AN000; | ||
| 850 | ; ;AN000; | ||
| 851 | ; Inputs: ;AN000; | ||
| 852 | ; AL = 0 - Generic by device number ;AN000; | ||
| 853 | ; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000; | ||
| 854 | ; CX = private subfunction ;AN000; | ||
| 855 | ; DS:DX -> buffer ;AN000; | ||
| 856 | ; AL = 1 - Generic by handle ;AN000; | ||
| 857 | ; BX = handle [THISSFT] set ;AN000; | ||
| 858 | ; CX = private subfunction ;AN000; | ||
| 859 | ; DS:DX -> buffer ;AN000; | ||
| 860 | ; AL = 2 - Query OS type ;AN000; | ||
| 861 | ; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000; | ||
| 862 | ; CX = buffer size ;AN000; | ||
| 863 | ; ES:DI -> buffer ;AN000; | ||
| 864 | ; ;AN000; | ||
| 865 | ; Function: ;AN000; | ||
| 866 | ; Prep IFSRH: ;AN000; | ||
| 867 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 868 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 869 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 870 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 871 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 872 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; | ||
| 873 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 874 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 875 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 876 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 877 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 878 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 879 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 880 | ; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (subfs 0,2) ;AN000; | ||
| 881 | ; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SFF (subf 1) ;AN000; | ||
| 882 | ; * IFSR_FUNC DB 0 ; AL - 0,1,or 2 ;AN000; | ||
| 883 | ; IFSR_RESV2 DB 0 ;AN000; | ||
| 884 | ; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000; | ||
| 885 | ; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000; | ||
| 886 | ;;;; for al=0,1 ;AN000; | ||
| 887 | ; * IFSR_CATEGORY DB 1 ; 1 for UNC, 0 for non-UNC ;AN000; | ||
| 888 | ; * IFSR_CTLFUNC DB ? ; al-2 ???, else cx ;AN000; | ||
| 889 | ; ;AN000; | ||
| 890 | ; ;AN000; | ||
| 891 | ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; | ||
| 892 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 893 | ; DO ;AN000; | ||
| 894 | ; IF CDS THEN ;AN000; | ||
| 895 | ; Call CD_TO_CDS ;AN000; | ||
| 896 | ; ELSE Call SFF_TO_SFT ;AN000; | ||
| 897 | ; ENDDO ;AN000; | ||
| 898 | ; ELSE ;AN000; | ||
| 899 | ; Set carry ;AN000; | ||
| 900 | ; Put error code in AX ;AN000; | ||
| 901 | ; ENDIF ;AN000; | ||
| 902 | ; ;AN000; | ||
| 903 | ; Outputs: function dependent ;AN000; | ||
| 904 | ; ;AN000; | ||
| 905 | ; Regs: nothing preserved ;AN000; | ||
| 906 | ; ;AN000; | ||
| 907 | ;****************************************************************************** ;AN000; | ||
| 908 | ;AN000; | ||
| 909 | procedure IFS_DEPENDENT_IOCTL,NEAR ;AN000; | ||
| 910 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 911 | ;AN000; | ||
| 912 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 913 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 914 | ;AN000; | ||
| 915 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; | ||
| 916 | ; right ;AN000; | ||
| 917 | SaveReg <BX,ES> ; save input es for query os type ;AC006; | ||
| 918 | ; and bx for drive # / handle ;AN006; | ||
| 919 | ;AN000; | ||
| 920 | MOV CS:IFSPROC_FLAGS,ZERO ; init ifsfunc flags ;AN000; | ||
| 921 | invoke PREP_IFSR ; & IFSR ;AN000; | ||
| 922 | ;AN000; | ||
| 923 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; | ||
| 924 | MOV ES:[BX.IFSR_FUNC],AL ; 0,1, or 2 ;AN000; | ||
| 925 | CMP AL,QUERY_OS_TYPE ;AN000; | ||
| 926 | JE IDI_10 ;AN000; | ||
| 927 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ; ioctl generic ;AN000; | ||
| 928 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; | ||
| 929 | MOV ES:[BX.IFSR_CTLFUNC],CL ;AN000; | ||
| 930 | ADD SP,2 ; ditch es stored on stack ;AN000; | ||
| 931 | JMP SHORT IDI_15 ;AN000; | ||
| 932 | IDI_10: ; query os type ;AN000; | ||
| 933 | MOV ES:[BX.IFSR_BUFSIZE],CX ; cx is bufsize ;AN000; | ||
| 934 | POP CX ; pop input es in cx ;AN000; | ||
| 935 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ;AN000; | ||
| 936 | MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000; | ||
| 937 | IDI_15: ;AN000; | ||
| 938 | CMP AL,GEN_IOCTL_BY_HANDLE ;AN000; | ||
| 939 | RestoreReg <CX> ; restore input bx into ax, no cx ;AN006;;AC012; | ||
| 940 | ; (drive # or handle) ;AN006; | ||
| 941 | JE IDI_20 ;AN000; | ||
| 942 | ;AN000; | ||
| 943 | ;;;;;;; LDS SI,[THISCDS] ; have device number (block only???) ;AD006; | ||
| 944 | ; Now get CDS: ;AN006; | ||
| 945 | SaveReg <AX> ; function 0,1,2 ;AN012; | ||
| 946 | MOV AX,CX ; input bx ;AN012; | ||
| 947 | DEC AL ; make 0-based ;AN006; | ||
| 948 | MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN006; | ||
| 949 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN006; | ||
| 950 | RestoreReg <AX> ; fcn 0,1,2 ;AN012; | ||
| 951 | JNC IDI_17 ;AN006; | ||
| 952 | IDI_16: ;AN012; | ||
| 953 | MOV AX,error_invalid_drive ; no cds, set error & ret ;AN006; | ||
| 954 | JMP IDI_120 ; ret up in FA to preserve DS ;AN006; | ||
| 955 | IDI_17: ; (welcome lock) ;AN006; | ||
| 956 | TEST DS:[SI.curdir_flags],curdir_isifs ; check if drive ifs ;AN012; | ||
| 957 | JZ IDI_16 | ||
| 958 | SaveReg <DS,SI> ; save cds ptr al=0,2 ;AN000; | ||
| 959 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 960 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 961 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 962 | ; ds - netwrk ;AN000; | ||
| 963 | CMP AL,QUERY_OS_TYPE ;AN000; | ||
| 964 | JNE IDI_40 ;AN000; | ||
| 965 | JMP SHORT IDI_60 ;AN000; | ||
| 966 | ;AN000; | ||
| 967 | IDI_20: ; al=1 ;AN000; | ||
| 968 | Context DS ;AN000; | ||
| 969 | OR IFSPROC_FLAGS,SETDEVICECB ;AN000; | ||
| 970 | ; Now, need to get THISSFT set: ;AN006; | ||
| 971 | SaveReg <ES,DI,BX> ; these about to be clobbered ;AN006; | ||
| 972 | MOV BX,CX ; put handle in bx ;AC012; | ||
| 973 | CallInstall pJFNFromHandle,multDOS,32 ; intermediate step to getting sft ;AN006; | ||
| 974 | JC IDI_25 ;AN006; | ||
| 975 | CMP BYTE PTR ES:[DI],-1 ; unused handle ;AN006; | ||
| 976 | JE IDI_25 ;AN006; | ||
| 977 | MOV BL,BYTE PTR ES:[DI] ; get SFN ;AN006; | ||
| 978 | XOR BH,BH ; ignore upper half ;AN006; | ||
| 979 | CallInstall SFFromSFN,multDOS,22 ; get real sf spot ;AN006; | ||
| 980 | MOV WORD PTR [THISSFT],DI ;AN006; | ||
| 981 | MOV WORD PTR [THISSFT+2],ES ;AN006; | ||
| 982 | RestoreReg <BX,DI,ES> ;AN006; | ||
| 983 | JMP SHORT IDI_30 ;AN006; | ||
| 984 | IDI_25: ; sft error ;AN006; | ||
| 985 | RestoreReg <BX,DI,ES> ; restore regs ;AN006; | ||
| 986 | MOV AX,error_invalid_handle ;AN006; | ||
| 987 | JMP IDI_120 ;AN006; | ||
| 988 | |||
| 989 | IDI_30: ;AN006; | ||
| 990 | invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; | ||
| 991 | ; IFSR_OPEN_CB@ ;AN000; | ||
| 992 | ; ds - netwrk ;AN000; | ||
| 993 | IDI_40: ;AN000; | ||
| 994 | invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000; | ||
| 995 | MOV ES:[BX.IFSR_CATEGORY],CL ;AN000; | ||
| 996 | IDI_60: | ||
| 997 | MOV DX,IFSIOCTL ; check if fs supports fs ioctl | ||
| 998 | invoke CHECK_IFS_ATTRIBUTE | ||
| 999 | JZ IDI_80 ; Z = no support, NZ = yes support | ||
| 1000 | JMP DI_70 ; continues in device_ioctl ;AN000; | ||
| 1001 | ;AN000; | ||
| 1002 | IDI_80: ; error invalid fcn - fs doesn't support ;AN000; | ||
| 1003 | TEST IFSPROC_FLAGS,ISCDS ; if cds, must clean stack of ;AN000; | ||
| 1004 | JZ IDI_100 ; cds ptr ;AN000; | ||
| 1005 | ADD SP,4 ;AN000; | ||
| 1006 | IDI_100: ;AN000; | ||
| 1007 | MOV AX,error_invalid_function ;AN000; | ||
| 1008 | IDI_120: ;AN006; | ||
| 1009 | invoke SET_EXTERR_INFO ; set error info ;AN006; | ||
| 1010 | transfer ifs_980 ; go to general error return ;AN000; | ||
| 1011 | ;AN000; | ||
| 1012 | EndProc IFS_DEPENDENT_IOCTL ;AN000; | ||
| 1013 | |||
| 1014 | |||
| 1015 | BREAK <DEVICE_IOCTL - device ioctl> ;AN000; | ||
| 1016 | ;AN000; | ||
| 1017 | ;****************************************************************************** | ||
| 1018 | ; | ||
| 1019 | ; DEVICE_IOCTL | ||
| 1020 | ; | ||
| 1021 | ; Called by: Dispatcher | ||
| 1022 | ; | ||
| 1023 | ; Routines called: CALL_IFS | ||
| 1024 | ; CDS_TO_CD SFT_TO_SFF | ||
| 1025 | ; CD_TO_CDS SFF_TO_SFT | ||
| 1026 | ; | ||
| 1027 | ; Inputs: | ||
| 1028 | ; AL = 02H(03H0 Read from(Write to) character device | ||
| 1029 | ; BX = handle [THISSFT] set | ||
| 1030 | ; CX = number of bytes to read(write) | ||
| 1031 | ; DS:DX -> buffer | ||
| 1032 | ; AL = 0CH Character Generic IOCTL | ||
| 1033 | ; CH = 1-async, 3-display, 5-printer | ||
| 1034 | ; CL = 5F-set, 7F-get | ||
| 1035 | ; DS:DX -> buffer | ||
| 1036 | ; AL = 0DH Block Generic IOCTL | ||
| 1037 | ; BH = 0 | ||
| 1038 | ; BL = Drive number [THISCDS] set (0-based) | ||
| 1039 | ; CH = 08 | ||
| 1040 | ; CL = 43-set, 63-get media id | ||
| 1041 | ; DS:DX -> buffer | ||
| 1042 | ; | ||
| 1043 | ; Function: | ||
| 1044 | ; Prep IFSRH: | ||
| 1045 | ; * IFSR_LENGTH DW 48 ; Request length | ||
| 1046 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1047 | ; IFSR_RETCODE DW ? | ||
| 1048 | ; IFSR_RETCLASS DB ? | ||
| 1049 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1050 | ; * IFSR_APIFUNC DB 17 ; IFS device IOCTL | ||
| 1051 | ; IFSR_ERROR_CLASS DB ? | ||
| 1052 | ; IFSR_ERROR_ACTION DB ? | ||
| 1053 | ; IFSR_ERROR_LOCUS DB ? | ||
| 1054 | ; IFSR_ALLOWED DB ? | ||
| 1055 | ; IFSR_I24_RETRY DB ? | ||
| 1056 | ; IFSR_I24_RESP DB ? | ||
| 1057 | ; IFSR_RESV2 DB ? | ||
| 1058 | ; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (0DH) | ||
| 1059 | ; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SF (0CH) | ||
| 1060 | ; * IFSR_FUNC DB 0 ; AL 2,3,12,or 13 | ||
| 1061 | ; IFSR_RESV2 DB 0 | ||
| 1062 | ; * IFSR_BUFFER@ DD ? ; ds:dx | ||
| 1063 | ; * IFSR_BUFSIZE DW ? ; cx for al=2,3 | ||
| 1064 | ; * IFSR_CATEGORY DB 1 ; ch for al=12,13 | ||
| 1065 | ; * IFSR_CTLFUNC DB ? ; cl for al=12,13 | ||
| 1066 | ; | ||
| 1067 | ; | ||
| 1068 | ; CALL routine, CALL_IFS | ||
| 1069 | ; IF IFSR_RETCODE = 0 THEN | ||
| 1070 | ; DO | ||
| 1071 | ; IF CDS THEN | ||
| 1072 | ; Call CD_TO_CDS | ||
| 1073 | ; ELSE Call SFF_TO_SFT | ||
| 1074 | ; ENDDO | ||
| 1075 | ; ELSE | ||
| 1076 | ; Set carry | ||
| 1077 | ; Put error code in AX | ||
| 1078 | ; ENDIF | ||
| 1079 | ; | ||
| 1080 | ; Outputs: function dependent | ||
| 1081 | ; | ||
| 1082 | ; Regs: nothing preserved | ||
| 1083 | ; | ||
| 1084 | ;****************************************************************************** | ||
| 1085 | ;AN000; | ||
| 1086 | procedure DEVICE_IOCTL,NEAR ;AN000; | ||
| 1087 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1088 | ;AN000; | ||
| 1089 | ; mov ax,26 ; these two instrs temporary | ||
| 1090 | ; transfer ifs_980 | ||
| 1091 | |||
| 1092 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 1093 | ifsr_api_def DEVIOCTL ;AN000; | ||
| 1094 | ;AN000; | ||
| 1095 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; | ||
| 1096 | ; right ;AN000; | ||
| 1097 | PUSH DS ; save input ds ;AN000; | ||
| 1098 | ;AN000; | ||
| 1099 | MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000; | ||
| 1100 | invoke PREP_IFSR ; & ifsr ;AN000; | ||
| 1101 | POP ES:WORD PTR [BX.IFSR_BUFFER@+2] ; put input ds in now before clobber it ;AN005; | ||
| 1102 | ;AN000; | ||
| 1103 | CMP AL,BLOCK_GENERIC ;AN000; | ||
| 1104 | JNE DI_20 ;AN000; | ||
| 1105 | ;AN000; | ||
| 1106 | LDS SI,[THISCDS] ; block generic - cds processing ;AN000; | ||
| 1107 | SaveReg <DS,SI> ; save cds ptr ;AN000; | ||
| 1108 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1109 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1110 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1111 | ; ds - netwrk ;AN000; | ||
| 1112 | JMP SHORT DI_40 ;AN000; | ||
| 1113 | ;AN000; | ||
| 1114 | DI_20: ; handle function ;AN000; | ||
| 1115 | OR CS:IFSPROC_FLAGS,SetDeviceCB ; to get possible related cd or df ;AN000; | ||
| 1116 | Context DS ;AN000; | ||
| 1117 | invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; | ||
| 1118 | ; IFSR_OPEN_CB@ ;AN000; | ||
| 1119 | ; ds - netwrk ;AN000; | ||
| 1120 | DI_40: ;AN000; | ||
| 1121 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DEVIOCTL ;AN000; | ||
| 1122 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1123 | MOV ES:[BX.IFSR_APIFUNC],IFSDEVIOCTL ;AN000; | ||
| 1124 | MOV ES:[BX.IFSR_FUNC],AL ; 2,3,12 or 13 ;AN000; | ||
| 1125 | ;;;;; POP DS ; retrieve input ds ;AD005; | ||
| 1126 | MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ;AN000; | ||
| 1127 | ;;;;; MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AD005; | ||
| 1128 | CMP AL,CHAR_GENERIC ; fork 2,3 vs 12,13 ;AN000; | ||
| 1129 | JGE DI_60 ; go if 12,13 | ||
| 1130 | MOV ES:[BX.IFSR_BUFSIZE],CX ; 2,3 processing | ||
| 1131 | JMP SHORT DI_70 | ||
| 1132 | DI_60: ; 12,13 processing | ||
| 1133 | MOV ES:[BX.IFSR_CATEGORY],CH ; 1,3,5,or 8 | ||
| 1134 | MOV ES:[BX.IFSR_CTLFUNC],CL ; 5F,7F,4E,or 6E | ||
| 1135 | ;AN000; | ||
| 1136 | DI_70: ;AN000; | ||
| 1137 | ;----------------------------------------------------------------------------------------- | ||
| 1138 | invoke CALL_IFS ; call ifs driver w/request ;AN000; | ||
| 1139 | ;----------------------------------------------------------------------------------------- | ||
| 1140 | ;AN000; | ||
| 1141 | JNC DI_100 ;AN000; | ||
| 1142 | TEST IFSPROC_FLAGS,ISCDS ; error return ;AN000; | ||
| 1143 | JNZ DI_80 ; if cds clean up stack ;AN000; | ||
| 1144 | transfer ifs_1000 ; go return in ifsutil ;AN000; | ||
| 1145 | DI_80: ;AN000; | ||
| 1146 | ADD SP,4 ; restore stack ;AN000; | ||
| 1147 | transfer ifs_980 ;AN000; | ||
| 1148 | ;AN000; | ||
| 1149 | DI_100: ;AN000; | ||
| 1150 | TEST IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1151 | JNZ DI_120 ;AN000; | ||
| 1152 | MOV AX,ES:[BX.IFSR_BUFSIZE] ; set return size for 2,3 (won't hurt ;AN000; | ||
| 1153 | invoke SFF_TO_SFT ; for 12 either ;AN000; | ||
| 1154 | transfer ifs_990 ;AN000; | ||
| 1155 | DI_120: ;AN000; | ||
| 1156 | MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000; | ||
| 1157 | RestoreReg <DI,ES> ; restore cds ptr into esdi ;AN000; | ||
| 1158 | invoke CD_TO_CDS ;AN000; | ||
| 1159 | transfer ifs_990 ;AN000; | ||
| 1160 | ;AN000; | ||
| 1161 | ;AN000; | ||
| 1162 | EndProc DEVICE_IOCTL ;AN000; | ||
| 1163 | ;AN000; | ||
| 1164 | ;AN000; | ||
| 1165 | ;AN000; | ||
| 1166 | BREAK <GET_DFL_FROM_INDEX Get DFL entry from index> ;AN000; | ||
| 1167 | ;AN000; | ||
| 1168 | ;****************************************************************************** ;AN000; | ||
| 1169 | ; ;AN000; | ||
| 1170 | ; GET_DFL_FROM_INDEX ;AN000; | ||
| 1171 | ; ;AN000; | ||
| 1172 | ; Called by: PRINTER_GETSET_STRING ;AN000; | ||
| 1173 | ; ;AN000; | ||
| 1174 | ; Routines called: none ;AN000; | ||
| 1175 | ; ;AN000; | ||
| 1176 | ; Inputs: ;AN000; | ||
| 1177 | ; BX is index number (as in GetIFSFUNCItem) ;AN000; | ||
| 1178 | ; ;AN000; | ||
| 1179 | ; Outputs: ;AN000; | ||
| 1180 | ; Carry Clear ;AN000; | ||
| 1181 | ; [THISDFL] set ;AN000; | ||
| 1182 | ; Carry Set ;AN000; | ||
| 1183 | ; Bad index number ;AN000; | ||
| 1184 | ; ;AN000; | ||
| 1185 | ; Regs: Preserves Printer Get/Set String input regs ;AN000; | ||
| 1186 | ; ;AN000; | ||
| 1187 | ;****************************************************************************** ;AN000; | ||
| 1188 | ;AN000; | ||
| 1189 | procedure GET_DFL_FROM_INDEX,NEAR ;AN000; | ||
| 1190 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1191 | ;AN000; | ||
| 1192 | SaveReg <DS,SI,CX,DX> ; save Ptr GetSet Str input regs ;AC007; | ||
| 1193 | ; (removed ax from above) ;AN007; | ||
| 1194 | PUSH BX ;AN000; | ||
| 1195 | ; Compute index # of first device ;AN000; | ||
| 1196 | XOR BX,BX ;AN000; | ||
| 1197 | MOV CX,BX ;AN000; | ||
| 1198 | Context DS ; DS-Dosgroup ;AN003; | ||
| 1199 | MOV CL,[CDSCount] ;AN000; | ||
| 1200 | LDS SI,[CDSAddr] ; Assume not paused ;AN000; | ||
| 1201 | CMP CS:[fAssign],0 ;AN000; | ||
| 1202 | JNZ GDFI_20 ;AN000; | ||
| 1203 | LDS SI,CS:[CDSAlt] ; Paused, get REAL CDSs from here ;AN000; | ||
| 1204 | GDFI_20: ;AN000; | ||
| 1205 | TEST [SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000; | ||
| 1206 | JZ GDFI_40 ;AN000; | ||
| 1207 | INC BX ;AN000; | ||
| 1208 | ;;; TEST [SI.CURDIR_TYPE],TYPE_NET_DRIVE ;AD003; | ||
| 1209 | ;;; JZ GDFI_40 ; count 2 for redir ;AD003; | ||
| 1210 | ;;; INC BX ;AD003; | ||
| 1211 | GDFI_40: ;AN000; | ||
| 1212 | ADD SI,SIZE CURDIR_LIST ; Next CDS ;AN000; | ||
| 1213 | LOOP GDFI_20 ;AN000; | ||
| 1214 | ; BX is index # of first device ;AN000; | ||
| 1215 | POP AX ; Get user index # ;AN000; | ||
| 1216 | SUB AX,BX ;AN000; | ||
| 1217 | JB GDFI_60 ; if carry set (JB), user index < ;AN000; | ||
| 1218 | ; 1st device index - too low ;AN000; | ||
| 1219 | ; go return w/carry already set ;AN000; | ||
| 1220 | MOV CL,CS:[DFLCount] ;AN000; | ||
| 1221 | CMP CL,AL ; AL is now device index # ;AN000; | ||
| 1222 | JAE GDFI_80 ;AN000; | ||
| 1223 | GDFI_60: ;AN000; | ||
| 1224 | MOV AX,error_invalid_parameter ; user index too high ;AN000; | ||
| 1225 | JMP GDFI_980 ; go return w/carry already set ;AN000; | ||
| 1226 | GDFI_80: ;AN000; | ||
| 1227 | LDS SI,CS:[DFLAddr] ;AN000; | ||
| 1228 | MOV BL,SIZE DFLL_list ; size in convenient spot ;AN000; | ||
| 1229 | ;;; DEC AX ;AD003 | ||
| 1230 | MUL BL ; get net offset ;AN000; | ||
| 1231 | ADD SI,AX ; convert to true pointer ;AN000; | ||
| 1232 | TEST DS:[SI.DFLL_FLAGS],dfl_inuse ; is this device attached????? ;AN014; | ||
| 1233 | JZ GDFI_60 ; error if not | ||
| 1234 | ;AN000; | ||
| 1235 | PUSH DS ;AN000; | ||
| 1236 | POP DX ;AN000; | ||
| 1237 | PUSH CS ;AN000; | ||
| 1238 | POP DS ;AN000; | ||
| 1239 | ASSUME DS:IFSSEG ;AN000; | ||
| 1240 | MOV WORD PTR [THISDFL],SI ;AN000; | ||
| 1241 | MOV WORD PTR [THISDFL+2],DX ;AN000; | ||
| 1242 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 1243 | invoke DFL_TO_DF ;AN000; | ||
| 1244 | JMP GDFI_990 ;AN000; | ||
| 1245 | ;AN000; | ||
| 1246 | ;AN000; | ||
| 1247 | GDFI_980: ; Return area ;AN000; | ||
| 1248 | SaveReg <AX,CS> ; set thisdfl null on error ;AN008; | ||
| 1249 | RestoreReg <DS> ;AN008; | ||
| 1250 | MOV AX,NULL_PTR ;AN008; | ||
| 1251 | MOV WORD PTR [THISDFL],AX ;AN008; | ||
| 1252 | MOV WORD PTR [THISDFL+2],AX ;AN008; | ||
| 1253 | RestoreReg <AX> ;AN008; | ||
| 1254 | STC ;AN000; | ||
| 1255 | JMP GDFI_1000 ;AN000; | ||
| 1256 | GDFI_990: ;AN000; | ||
| 1257 | CLC ;AN000; | ||
| 1258 | GDFI_1000: ;AN000; | ||
| 1259 | RestoreReg <DX,CX,SI,DS> ; restore regs ;AC007; | ||
| 1260 | ; (removed ax from above) ;AN007; | ||
| 1261 | return ;AN000; | ||
| 1262 | ;AN000; | ||
| 1263 | EndProc GET_DFL_FROM_INDEX ;AN000; | ||
| 1264 | ;AN000; | ||
| 1265 | ;AN000; | ||
| 1266 | IFSSEG ENDS ;AN000; | ||
| 1267 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM new file mode 100644 index 0000000..dc64893 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM | |||
| @@ -0,0 +1,313 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsdir.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC DIRECTORY ROUTINES - Routines for IFS driver dispatch ;AN000; | ||
| 4 | NAME NETDIR ;AN000; | ||
| 5 | ;************************************************************************************ ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; DIRECTORY related IFS driver calls ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; IFS_RMDIR ;AN000; | ||
| 10 | ; IFS_MKDIR ;AN000; | ||
| 11 | ; IFS_CHDIR ;AN000; | ||
| 12 | ; ;AN000; | ||
| 13 | ; Programming notes: ;AN000; | ||
| 14 | ; Old redirector segmentation preserved. ;AN000; | ||
| 15 | ; Directory routines do not generate critical errors. ;AN000; | ||
| 16 | ; ;AN000; | ||
| 17 | ; REVISION HISTORY: ;AN000; | ||
| 18 | ; A000 Original version 4.00 May 1987 | ||
| 19 | ; A001 PTM 3671- check for null cds 3/88 RPS/RMG | ||
| 20 | ; ;AN000; | ||
| 21 | ; LOC - 67 ;AN000; | ||
| 22 | ; LOD - 4 ;AN000; | ||
| 23 | ; ;AN000; | ||
| 24 | ;************************************************************************************ ;AN000; | ||
| 25 | ;AN000; | ||
| 26 | .xlist ;AN000; | ||
| 27 | .xcref ;AN000; | ||
| 28 | INCLUDE IFSSYM.INC ;AN000; | ||
| 29 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 30 | INCLUDE DOSSYM.INC ;AN000; | ||
| 31 | INCLUDE DEVSYM.INC ;AN000; | ||
| 32 | .cref ;AN000; | ||
| 33 | .list ;AN000; | ||
| 34 | ;AN000; | ||
| 35 | AsmVars <IBM, Installed, Debug> ;AN000; | ||
| 36 | ;AN000; | ||
| 37 | ; define the base code segment of the network support first ;AN000; | ||
| 38 | ;AN000; | ||
| 39 | ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000; | ||
| 40 | ifsseg ENDS ;AN000; | ||
| 41 | ;AN000; | ||
| 42 | ; include the rest of the segment definitions for normal MSDOS ;AN000; | ||
| 43 | ;AN000; | ||
| 44 | include dosseg.asm ;AN000; | ||
| 45 | ;AN000; | ||
| 46 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 47 | ;AN000; | ||
| 48 | ; DOSGROUP data ;AN000; | ||
| 49 | Extrn WFP_START:WORD ;AN000; | ||
| 50 | Extrn THISCDS:DWORD ;AN000; | ||
| 51 | ;AN000; | ||
| 52 | DATA ENDS ;AN000; | ||
| 53 | ;AN000; | ||
| 54 | ;AN000; | ||
| 55 | ; define our own code segment ;AN000; | ||
| 56 | ;AN000; | ||
| 57 | ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000; | ||
| 58 | ASSUME SS:DOSGROUP,CS:ifsseg ;AN000; | ||
| 59 | ;AN000; | ||
| 60 | ;IFS Data ;AN000; | ||
| 61 | Extrn IFSR:WORD ;AN000; | ||
| 62 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | BREAK <IFS_RMDIR Remove an IFS Directory> ;AN000; | ||
| 65 | ;************************************************************************************ ;AN000; | ||
| 66 | ; ;AN000; | ||
| 67 | ; IFS_RMDIR ;AN000; | ||
| 68 | ; ;AN000; | ||
| 69 | ;Called by: ;AN000; | ||
| 70 | ; IFSFUNC Dispatcher ;AN000; | ||
| 71 | ; ;AN000; | ||
| 72 | ; Routines called: ;AN000; | ||
| 73 | ; CDS_TO_CD ;AN000; | ||
| 74 | ; CALL_IFS ;AN000; | ||
| 75 | ; ;AN000; | ||
| 76 | ; Inputs: ;AN000; | ||
| 77 | ; [WFP_START] Points to WFP string ;AN000; | ||
| 78 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 79 | ; ;AN000; | ||
| 80 | ; Function: ;AN000; | ||
| 81 | ; Prep IFSRH as follows: (* indicate which fields set) ;AN000; | ||
| 82 | ; * IFSR_LENGTH DW 42 ; Request length ;AN000; | ||
| 83 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 84 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 85 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 86 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 87 | ; * IFSR_APIFUNC DB 4 ; Remove Directory ;AN000; | ||
| 88 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 89 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 90 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 91 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 92 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 93 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 94 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 95 | ; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; | ||
| 96 | ; ; and set this as pointer to it. ;AN000; | ||
| 97 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 98 | ; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; | ||
| 99 | ; ;AN000; | ||
| 100 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 101 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 102 | ; Call CD_TO_CDS ;AN000; | ||
| 103 | ; Clear carry ;AN000; | ||
| 104 | ; ELSE ;AN000; | ||
| 105 | ; Set carry ;AN000; | ||
| 106 | ; Put error code in AX ;AN000; | ||
| 107 | ; ENDIF ;AN000; | ||
| 108 | ; ;AN000; | ||
| 109 | ; Outputs: ;AN000; | ||
| 110 | ; Carry clear: CDS FSDA updated ;AN000; | ||
| 111 | ; Carry set on error: error_path_not_found (bad path) ;AN000; | ||
| 112 | ; error_access_denied (file/device not empty) ;AN000; | ||
| 113 | ; ;AN000; | ||
| 114 | ; Notes: DS preserved, others destroyed ;AN000; | ||
| 115 | ; ;AN000; | ||
| 116 | ;************************************************************************************ ;AN000; | ||
| 117 | ;AN000; | ||
| 118 | ;AN000; | ||
| 119 | procedure IFS_RMDIR,NEAR ;AN000; | ||
| 120 | ;AN000; | ||
| 121 | entry IFS_SEQ_RMDIR ;AN000; | ||
| 122 | ;AN000; | ||
| 123 | ifsr_fcn_def EXECAPI ; define ifsr fields for rmdir ;AN000; | ||
| 124 | ifsr_api_def RMDIR ;AN000; | ||
| 125 | ;AN000; | ||
| 126 | PUSH DS ; preserve DS ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; | ||
| 129 | ;AN000; | ||
| 130 | MOV ES:[BX.IFSR_APIFUNC],IFSRMDIR ;AN000; | ||
| 131 | JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000; | ||
| 132 | ;AN000; | ||
| 133 | EndProc IFS_RMDIR ;AN000; | ||
| 134 | ;AN000; | ||
| 135 | BREAK <IFS_MKDIR Create an IFS Directory> ;AN000; | ||
| 136 | ;AN000; | ||
| 137 | ;************************************************************************************ ;AN000; | ||
| 138 | ; ;AN000; | ||
| 139 | ; IFS_MKDIR ;AN000; | ||
| 140 | ; ;AN000; | ||
| 141 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 142 | ; ;AN000; | ||
| 143 | ; Routines called: CDS_TO_CD ;AN000; | ||
| 144 | ; CALL_IFS ;AN000; | ||
| 145 | ; ;AN000; | ||
| 146 | ; Inputs: ;AN000; | ||
| 147 | ; [WFP_START] Points to WFP string ;AN000; | ||
| 148 | ; [THISCDS] Points to CDS being used. Not NULL. ;AN000; | ||
| 149 | ; ;AN000; | ||
| 150 | ; Function: ;AN000; | ||
| 151 | ; Prep IFSRH as follows: (* indicate which fields set) ;AN000; | ||
| 152 | ; * IFSR_LENGTH DW 42 ; Request length ;AN000; | ||
| 153 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 154 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 155 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 156 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 157 | ; * IFSR_APIFUNC DB 3 ; Create Directory ;AN000; | ||
| 158 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 159 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 160 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 161 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 162 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 163 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 164 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 165 | ; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; | ||
| 166 | ; ; and set this as pointer to it. ;AN000; | ||
| 167 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 168 | ; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; | ||
| 169 | ; ;AN000; | ||
| 170 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 171 | ; ;AN000; | ||
| 172 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 173 | ; Call CD_TO_CDS ;AN000; | ||
| 174 | ; Clear carry ;AN000; | ||
| 175 | ; ELSE ;AN000; | ||
| 176 | ; Set carry ;AN000; | ||
| 177 | ; Put error code in AX ;AN000; | ||
| 178 | ; ENDIF ;AN000; | ||
| 179 | ; ;AN000; | ||
| 180 | ; Outputs: ;AN000; | ||
| 181 | ; Carry clear: CDS FSDA updated ;AN000; | ||
| 182 | ; Carry set on error: error_path_not_found (bad path) ;AN000; | ||
| 183 | ; error_access_denied ;AN000; | ||
| 184 | ; (Attempt to re-create read only file , or ;AN000; | ||
| 185 | ; create a second volume id or create a dir) ;AN000; | ||
| 186 | ; ;AN000; | ||
| 187 | ; Notes: DS preserved, others destroyed ;AN000; | ||
| 188 | ; ;AN000; | ||
| 189 | ;************************************************************************************ ;AN000; | ||
| 190 | ;AN000; | ||
| 191 | procedure IFS_MKDIR,NEAR ;AN000; | ||
| 192 | ;AN000; | ||
| 193 | entry IFS_SEQ_MKDIR ;AN000; | ||
| 194 | ;AN000; | ||
| 195 | ifsr_fcn_def EXECAPI ; define ifsr fields for mkdir ;AN000; | ||
| 196 | ifsr_api_def MKDIR ;AN000; | ||
| 197 | ;AN000; | ||
| 198 | PUSH DS ; preserve DS ;AN000; | ||
| 199 | ;AN000; | ||
| 200 | invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; | ||
| 201 | ;AN000; | ||
| 202 | MOV ES:[BX.IFSR_APIFUNC],IFSMKDIR ;AN000; | ||
| 203 | JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000; | ||
| 204 | ;AN000; | ||
| 205 | EndProc IFS_MKDIR ;AN000; | ||
| 206 | ;AN000; | ||
| 207 | BREAK <IFS_CHDIR Check for validity and change directory> ;AN000; | ||
| 208 | ;AN000; | ||
| 209 | ;AN000; | ||
| 210 | ;************************************************************************************ ;AN000; | ||
| 211 | ; ;AN000; | ||
| 212 | ; IFS_CHDIR ;AN000; | ||
| 213 | ; ;AN000; | ||
| 214 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 215 | ; ;AN000; | ||
| 216 | ; Routines called: CDS_TO_CD ;AN000; | ||
| 217 | ; CD_TO_CDS ;AN000; | ||
| 218 | ; CALL_IFS ;AN000; | ||
| 219 | ; ;AN000; | ||
| 220 | ; Inputs: ;AN000; | ||
| 221 | ; [WFP_START] Points to WFP string ;AN000; | ||
| 222 | ; [THISCDS] Points to CDS being used. Not NUL. ;AN000; | ||
| 223 | ; ;AN000; | ||
| 224 | ; Function: ;AN000; | ||
| 225 | ; Prep IFSRH as follows: (* indicate which fields set) ;AN000; | ||
| 226 | ; * IFSR_LENGTH DW 42 ; Request length ;AN000; | ||
| 227 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 228 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 229 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 230 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 231 | ; * IFSR_APIFUNC DB 5 ; Change Directory ;AN000; | ||
| 232 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 233 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 234 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 235 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 236 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 237 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 238 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 239 | ; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; | ||
| 240 | ; ; and set this as pointer to it. ;AN000; | ||
| 241 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 242 | ; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; | ||
| 243 | ; ;AN000; | ||
| 244 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 245 | ; ;AN000; | ||
| 246 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 247 | ; Call CD_TO_CDS to update CDS ;AN000; | ||
| 248 | ; Clear carry ;AN000; | ||
| 249 | ; ELSE ;AN000; | ||
| 250 | ; Set carry ;AN000; | ||
| 251 | ; Put error code in AX ;AN000; | ||
| 252 | ; ENDIF ;AN000; | ||
| 253 | ; ;AN000; | ||
| 254 | ; Outputs: ;AN000; | ||
| 255 | ; Carry clear: CDS updated. ;AN000; | ||
| 256 | ; Carry set on error: error_path_not_found (bad path) ;AN000; | ||
| 257 | ; error_access_denied ;AN000; | ||
| 258 | ; ;AN000; | ||
| 259 | ; Notes: DS preserved, others destroyed ;AN000; | ||
| 260 | ; ;AN000; | ||
| 261 | ;************************************************************************************ ;AN000; | ||
| 262 | ;AN000; | ||
| 263 | procedure IFS_CHDIR,NEAR ;AN000; | ||
| 264 | ;AN000; | ||
| 265 | ifsr_fcn_def EXECAPI ; define ifsr fields for chdir ;AN000; | ||
| 266 | ifsr_api_def CHDIR ;AN000; | ||
| 267 | ;AN000; | ||
| 268 | PUSH DS ; preserve DS ;AN000; | ||
| 269 | ;AN000; | ||
| 270 | invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; | ||
| 271 | ;AN000; | ||
| 272 | MOV ES:[BX.IFSR_APIFUNC],IFSCHDIR ;AN000; | ||
| 273 | ;AN000; | ||
| 274 | CHDIR_10: ; Welcome rmdir/mkdir code ;AN000; | ||
| 275 | MOV ES:[BX.IFSR_LENGTH],LENGTH_CHDIR ;AN000; | ||
| 276 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 277 | ; ds -> dosgroup ;AN000; | ||
| 278 | MOV SI,WORD PTR [WFP_START] ; to access thiscds & wfp ;AN000; | ||
| 279 | invoke STRIP_WFP_START ; ditch leading d:\ ;AN000; | ||
| 280 | MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000; | ||
| 281 | MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000; | ||
| 282 | LDS SI,[THISCDS] ;AN000; | ||
| 283 | SaveReg <DS,SI> ;AN000; | ||
| 284 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 285 | CMP SI,NULL_PTR ; skip cds work if cds null ;AN001; | ||
| 286 | JE CHDIR_20 ;AN001; | ||
| 287 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 288 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 289 | ; ds - ifsseg ;AN000; | ||
| 290 | CHDIR_20: ;AN001; | ||
| 291 | SaveReg <CS> ; make sure ds = ifsseg ;AN001; | ||
| 292 | RestoreReg <DS> ;AN001; | ||
| 293 | ;************************************************ | ||
| 294 | invoke CALL_IFS ; call fs with dir request ;AN000; | ||
| 295 | ;************************************************ | ||
| 296 | ;AN000; | ||
| 297 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 298 | JC CHDIR_1000 ;AN000; | ||
| 299 | CMP DI,NULL_PTR ; skip cds work if cds null ;AN001; | ||
| 300 | JE CHDIR_40 ;AN001; | ||
| 301 | invoke CD_TO_CDS ; update cds ;AN000; | ||
| 302 | |||
| 303 | CHDIR_40: ;AN001; | ||
| 304 | CLC ;AN000; | ||
| 305 | ;AN000; | ||
| 306 | CHDIR_1000: ; finished ;AN000; | ||
| 307 | POP DS ; restore DS ;AN000; | ||
| 308 | return ;AN000; | ||
| 309 | ;AN000; | ||
| 310 | EndProc IFS_CHDIR ;AN000; | ||
| 311 | ;AN000; | ||
| 312 | ifsseg ENDS ;AN000; | ||
| 313 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM new file mode 100644 index 0000000..5240556 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM | |||
| @@ -0,0 +1,637 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)IFSERROR.INC 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC ERROR ROUTINES ;AN000; | ||
| 4 | NAME IFSERROR ;AN000; | ||
| 5 | ;************************************************************************************ ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; IFS error Routines ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; INT_2F_5 ;AN000; | ||
| 10 | ; ;AN000; | ||
| 11 | ; IFS_I24 ;AN000; | ||
| 12 | ; SET_EXTERR_INFO ;AN000; | ||
| 13 | ; PHONEY_DPB ;AN000; | ||
| 14 | ; ;AN000; | ||
| 15 | ; REVISION HISTORY: ;AN000; | ||
| 16 | ; Evolved from Network Redirector NETERROR: MAY 11 1987 ;AN000; | ||
| 17 | ; A000 - Original version 4.00 MAY 1987 ;AN000; | ||
| 18 | ; A001 - PTM 842 Messages | ||
| 19 | ; A002 - PTM 1602 INT 2f-5 interface ds bug RG 10/87 | ||
| 20 | ; A003 - PTM 1683/1769 error msg problems RG 10/87 | ||
| 21 | ; A004 - PTM 2827 error proc chgs RG 1/88 | ||
| 22 | ; A005 - PTM 4140 int 2f 5 interface change RMG 4/12/88 | ||
| 23 | ; A006 - P4789 message problems w/no ifs drivers loaded 5/18/88 RMG | ||
| 24 | ; A007 - P4962 I24 AH not set right for printer 5/24/88 RMG | ||
| 25 | ; A008 - P5030 I24 tempbuf conflict 6/03/88 RMG | ||
| 26 | ; ;AN000; | ||
| 27 | ; LOC - 167 ;AN000; | ||
| 28 | ; ;AN000; | ||
| 29 | ;************************************************************************************ ;AN000; | ||
| 30 | ;AN000; | ||
| 31 | .xlist ;AN000; | ||
| 32 | .xcref ;AN000; | ||
| 33 | INCLUDE IFSSYM.INC ;AN000; | ||
| 34 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 35 | INCLUDE DOSSYM.INC ;AN000; | ||
| 36 | INCLUDE DEVSYM.INC ;AN000; | ||
| 37 | INCLUDE SYSMSG.INC | ||
| 38 | msg_utilname <IFSFUNC> | ||
| 39 | .cref ;AN000; | ||
| 40 | .list ;AN000; | ||
| 41 | ;AN000; | ||
| 42 | AsmVars <IBM, Installed, Debug> ;AN000; | ||
| 43 | ;AN000; | ||
| 44 | ; define the base code segment of the network support first ;AN000; | ||
| 45 | ;AN000; | ||
| 46 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 47 | IFSSEG ENDS ;AN000; | ||
| 48 | ;AN000; | ||
| 49 | ; include the rest of the segment definitions for normal MSDOS ;AN000; | ||
| 50 | ;AN000; | ||
| 51 | include dosseg.asm ;AN000; | ||
| 52 | ;AN000; | ||
| 53 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 54 | ; DOSGROUP Data ;AN000; | ||
| 55 | Extrn THISDPB:DWORD ;AN000; | ||
| 56 | Extrn EXTERR:WORD ;AN000; | ||
| 57 | Extrn EXTERR_ACTION:BYTE ;AN000; | ||
| 58 | Extrn EXTERR_CLASS:BYTE ;AN000; | ||
| 59 | Extrn EXTERR_LOCUS:BYTE ;AN000; | ||
| 60 | Extrn ALLOWED:BYTE ;AN000; | ||
| 61 | Extrn ExitHold:DWORD ;AN000; | ||
| 62 | Extrn ERR_TABLE_21:BYTE | ||
| 63 | DATA ENDS ;AN000; | ||
| 64 | ;AN000; | ||
| 65 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 66 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 67 | ;AN000; | ||
| 68 | ; IFS Data ;AN000; | ||
| 69 | Extrn IFSDRV:BYTE ;AN000; | ||
| 70 | Extrn IFSR:WORD ;AN000; | ||
| 71 | Extrn TEMPBUF:BYTE ;AN003; | ||
| 72 | Extrn IFSPROC_FLAGS:WORD ;AN003; | ||
| 73 | Extrn SYSGetMsg:NEAR | ||
| 74 | Extrn IFSSEM:BYTE | ||
| 75 | Extrn THISIFS:DWORD ;AN006; | ||
| 76 | ;AN000; | ||
| 77 | ; Phoney DPB used by IFS Share/Lock errors ;AN000; | ||
| 78 | ;AN000; | ||
| 79 | DUMMY_DPB LABEL BYTE ;AN000; | ||
| 80 | DB 0 ; dpb_drive ;AN000; | ||
| 81 | DB 0 ; dpb_UNIT ;AN000; | ||
| 82 | DW 512 ; dpb_sector_size ;AN000; | ||
| 83 | DB 0 ; dpb_cluster_mask ;AN000; | ||
| 84 | DB 0 ; dpb_cluster_shift ;AN000; | ||
| 85 | DW 1 ; dpb_first_FAT ;AN000; | ||
| 86 | DB 1 ; dpb_FAT_count ;AN000; | ||
| 87 | DW 16 ; dpb_root_entries ;AN000; | ||
| 88 | DW 3 ; dpb_first_sector ;AN000; | ||
| 89 | DW 3 ; dpb_max_cluster ;AN000; | ||
| 90 | DB 1 ; dpb_FAT_size ;AN000; | ||
| 91 | DW 2 ; dpb_dir_sector ;AN000; | ||
| 92 | DD ? ; dpb_driver_addr ;AN000; | ||
| 93 | DB 0F8H ; dpb_media ;AN000; | ||
| 94 | DB -1 ; dpb_first_access ;AN000; | ||
| 95 | DW -1 ; dpb_next_dpb low ;AN000; | ||
| 96 | DW -1 ; dpb_next_dpb high ;AN000; | ||
| 97 | DW 0 ; dpb_next_free ;AN000; | ||
| 98 | DW -1 ; dpb_free_cnt ;AN000; | ||
| 99 | ;AN000; | ||
| 100 | ; Phoney device headers used by IFS INT 24H ;AN000; | ||
| 101 | ;AN000; | ||
| 102 | PHONEY_BLOCK LABEL BYTE ;AN000; | ||
| 103 | DD ? ; Pointer ;AN000; | ||
| 104 | DW ISNET ; Block net dev ;AN000; | ||
| 105 | DW ? ; Strat entry ;AN000; | ||
| 106 | DW ? ; Int entry ;AN000; | ||
| 107 | DB 8 DUP (0) ;AN000; | ||
| 108 | ;AN000; | ||
| 109 | PHONEY_DEVICE LABEL BYTE ;AN000; | ||
| 110 | DD ? ; Pointer ;AN000; | ||
| 111 | DW DEVTYP + ISNET ; Char net dev ;AN000; | ||
| 112 | DW ? ; Strat entry ;AN000; | ||
| 113 | DW ? ; Int entry ;AN000; | ||
| 114 | ;AN000; | ||
| 115 | PUBLIC PHONEY_NAME ;AN000; | ||
| 116 | PHONEY_NAME DB " " ;AN000; | ||
| 117 | ;AN000; | ||
| 118 | ;AN000; | ||
| 119 | NEXT_2F_5 DD ? ;AN000; | ||
| 120 | PUBLIC NEXT_2F_5 ;AN000; | ||
| 121 | ;AN000; | ||
| 122 | ; ;AN000; | ||
| 123 | ; ;AN000; | ||
| 124 | MAXERR EQU 89 ; Don't know errors above 79 ;AN000; | ||
| 125 | ;AN000; | ||
| 126 | PUBLIC RODS_LABEL | ||
| 127 | RODS_LABEL LABEL BYTE | ||
| 128 | .xcref ;AN000; | ||
| 129 | .xlist | ||
| 130 | MSG_SERVICES <IFSFUNC.CL1> | ||
| 131 | .cref ;AN000; | ||
| 132 | .list | ||
| 133 | |||
| 134 | ; | ||
| 135 | ; The following table defines CLASS ACTION and LOCUS info for the INT 21H/24H | ||
| 136 | ; errors. Each entry is 5 bytes long: | ||
| 137 | ; | ||
| 138 | ; Err#,Class,Action,Locus,Allowed_Val | ||
| 139 | ; | ||
| 140 | |||
| 141 | ERR_TABLE_IFS LABEL BYTE | ||
| 142 | DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;50 ;AN003; | ||
| 143 | DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;51 ;AN003; | ||
| 144 | DB errCLASS_Already, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;52 ;AN003; | ||
| 145 | DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;53 ;AN003; | ||
| 146 | DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;54 ;AN003; | ||
| 147 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;55 ;AN003; | ||
| 148 | DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;56 ;AN003; | ||
| 149 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;57 ;AN003; | ||
| 150 | DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;58 ;AN003; | ||
| 151 | DB errCLASS_SysFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;59 ;AN003; | ||
| 152 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;60 ;AN003; | ||
| 153 | DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;61 ;AN003; | ||
| 154 | DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;62 ;AN003; | ||
| 155 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;63 ;AN003; | ||
| 156 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;64 ;AN003; | ||
| 157 | DB errCLASS_Auth, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;65 ;AN003; | ||
| 158 | DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;66 ;AN003; | ||
| 159 | DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;67 ;AN003; | ||
| 160 | DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;68 ;AN003; | ||
| 161 | DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;69 ;AN003; | ||
| 162 | DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;70 ;AN003; | ||
| 163 | DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;71 ;AN003; | ||
| 164 | DB errCLASS_TempSit, errACT_Retry, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;72 ;AN003; | ||
| 165 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;73 ;AN003; | ||
| 166 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;74 ;AN003; | ||
| 167 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;75 ;AN003; | ||
| 168 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;76 ;AN003; | ||
| 169 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;77 ;AN003; | ||
| 170 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;78 ;AN003; | ||
| 171 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;79 ;AN003; | ||
| 172 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;80 ;AN003; | ||
| 173 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;81 ;AN003; | ||
| 174 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;82 ;AN003; | ||
| 175 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;83 ;AN003; | ||
| 176 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;84 ;AN003; | ||
| 177 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;85 ;AN003; | ||
| 178 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;86 ;AN003; | ||
| 179 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;87 ;AN003; | ||
| 180 | DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;88 ;AN003; | ||
| 181 | DB errCLASS_Unk, errACT_Panic, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;?? ;AN003; | ||
| 182 | |||
| 183 | ; | ||
| 184 | ; We need to map old int 24 errors and device driver errors into the new set | ||
| 185 | ; of errors. The following table is indexed by the new errors | ||
| 186 | ; | ||
| 187 | ErrMap24 Label BYTE | ||
| 188 | DB error_write_protect ; 0 | ||
| 189 | DB error_bad_unit ; 1 | ||
| 190 | DB error_not_ready ; 2 | ||
| 191 | DB error_bad_command ; 3 | ||
| 192 | DB error_CRC ; 4 | ||
| 193 | DB error_bad_length ; 5 | ||
| 194 | DB error_Seek ; 6 | ||
| 195 | DB error_not_DOS_disk ; 7 | ||
| 196 | DB error_sector_not_found ; 8 | ||
| 197 | DB error_out_of_paper ; 9 | ||
| 198 | DB error_write_fault ; A | ||
| 199 | DB error_read_fault ; B | ||
| 200 | DB error_gen_failure ; C | ||
| 201 | DB error_gen_failure ; D RESERVED | ||
| 202 | DB error_gen_failure ; E RESERVED | ||
| 203 | DB error_wrong_disk ; F | ||
| 204 | |||
| 205 | ErrMap24End LABEL BYTE | ||
| 206 | |||
| 207 | |||
| 208 | BREAK <INT_2F_5 -- Routine for Extended error messages> | ||
| 209 | |||
| 210 | ;************************************************************************************ | ||
| 211 | ; | ||
| 212 | ; INT_2F_5 | ||
| 213 | ; | ||
| 214 | ; Called by: COMMAND.COM | ||
| 215 | ; | ||
| 216 | ; Routines called: CALL_IFS | ||
| 217 | ; | ||
| 218 | ; Input: [THISIFS] set | ||
| 219 | ; BX = extended error number ;AN005; | ||
| 220 | ; AL = component ID 0 - install check ;AN005; | ||
| 221 | ; 1 - command.com ;AN005; | ||
| 222 | ; 2 - message retriever ;AN005; | ||
| 223 | ; Function: | ||
| 224 | ; This handler uses 2F multiplex number 5. It allows the INT 24H | ||
| 225 | ; Handler in COMMAND to get message texts for NET extended errors. | ||
| 226 | ; | ||
| 227 | ; IF AH = 5 THEN | ||
| 228 | ; DO | ||
| 229 | ; IF AL < 0F8H THEN | ||
| 230 | ; DO | ||
| 231 | ; ³ IF AL .NE. 0 THEN | ||
| 232 | ; ³ DO | ||
| 233 | ; ³ ³ IF AL >= 50 .AND. AL <= 74 THEN /* or AL = 88 */ | ||
| 234 | ; ³ ³ DO | ||
| 235 | ; ³ ³ ³ Prep IFSRH below | ||
| 236 | ; ³ ³ ³ * IFSR_LENGTH DW 28 ; Request length | ||
| 237 | ; ³ ³ ³ * IFSR_FUNCTION DB 6 ; Get Criter Text | ||
| 238 | ; ³ ³ ³ *+ IFSR_RETCODE DB ? ; AL | ||
| 239 | ; ³ ³ ³ IFSR_RETCLASS DB ? | ||
| 240 | ; ³ ³ ³ IFSR_RESV1 DB 17 DUP(0) | ||
| 241 | ; ³ ³ ³ *+ IFSR_MSG@ DD ? ; Msg buffer address | ||
| 242 | ; ³ ³ ³ *+ IFSR_MSG_TYPE DB ? ; Msg type | ||
| 243 | ; ³ ³ ³ IFSR_RESV2 DB ? | ||
| 244 | ; ³ ³ ³ | ||
| 245 | ; ³ ³ ³ Call IFS specified in [THISIFS] | ||
| 246 | ; ³ ³ ³ IF IFSR_RETCODE = 0 THEN | ||
| 247 | ; ³ ³ ³ DO | ||
| 248 | ; ³ ³ ³ ES:DI = IFSR_MSG@ | ||
| 249 | ; ³ ³ ³ AL = IFSR_MSG_TYPE | ||
| 250 | ; ³ ³ ³ ENDDO | ||
| 251 | ; ³ ³ ³ ELSE get ifsfunc standard msg | ||
| 252 | ; ³ ³ ³ ENDIF | ||
| 253 | ; ³ ³ ³ RET 2 | ||
| 254 | ; ³ ³ ENDDO | ||
| 255 | ; ³ ³ ELSE RET 2 | ||
| 256 | ; ³ ³ ENDIF | ||
| 257 | ; ³ ENDDO | ||
| 258 | ; ³ ELSE DO | ||
| 259 | ; ³ AL = 0FFH /* install check */ | ||
| 260 | ; ³ iret | ||
| 261 | ; ³ ENDDO | ||
| 262 | ; ³ ENDIF | ||
| 263 | ; ENDDO | ||
| 264 | ; ELSE iret | ||
| 265 | ; ENDIF | ||
| 266 | ; ENDDO | ||
| 267 | ; ELSE jump far to [NEXT_2F_5] | ||
| 268 | ; ENDIF | ||
| 269 | ; | ||
| 270 | ; Output: carry clear - AL = msg type (0 or 1) | ||
| 271 | ; If EType is 1 then message is printed in form | ||
| 272 | ; <message> | ||
| 273 | ; Abort, Retry Ignore | ||
| 274 | ; If EType is 0 then message is printed in form | ||
| 275 | ; <message> error (read/writ)ing (drive/device) XXX | ||
| 276 | ; Abort, Retry Ignore | ||
| 277 | ; The message is ASCIZ and DOES NOT | ||
| 278 | ; include a trailing CR,LF | ||
| 279 | ; ES:DI -> message text | ||
| 280 | ; carry set - no message | ||
| 281 | ; | ||
| 282 | ; Notes: all destroyed | ||
| 283 | ; | ||
| 284 | ;************************************************************************************ | ||
| 285 | ;AN000; | ||
| 286 | procedure INT_2F_5,FAR ;AN000; | ||
| 287 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 288 | ;AN000; | ||
| 289 | ifsr_fcn_def CRITMSG ;AN000; | ||
| 290 | ;AN000; | ||
| 291 | CMP AH,5 ; check for IFS error 2F call ;AN000; | ||
| 292 | JZ I2F5_20 ;AN000; | ||
| 293 | JMP [NEXT_2F_5] ;AN000; | ||
| 294 | ;AN000; | ||
| 295 | I2F5_20: ; call ok ;AN000; | ||
| 296 | STI ; INTs OK ;AN000; | ||
| 297 | CMP AL,0F8H ;AN000; | ||
| 298 | JB I2F5_40 ;AN000; | ||
| 299 | IRET ; IRET on reserved functions ;AN000; | ||
| 300 | I2F5_40: ;AN000; | ||
| 301 | OR AL,AL ;AN000; | ||
| 302 | JNZ I2F5_60 ;AN000; | ||
| 303 | MOV AL,0FFH ; Tell Ellen I'm here ;AN000; | ||
| 304 | IRET ;AN000; | ||
| 305 | I2F5_60: ;AN000; | ||
| 306 | ;;;;;;;;CMP AL,error_NET_write_fault ; check for special error ;AN000; | ||
| 307 | ;;;;;;;;JE I2F5_80 ;AN000; | ||
| 308 | CMP BX,50 ;AC005; | ||
| 309 | JAE I2F5_70 | ||
| 310 | JMP I2F5_1000 ; Carry set ;AN000; | ||
| 311 | I2F5_70: | ||
| 312 | CMP BX,MAXERR ;AC005; | ||
| 313 | JBE I2F5_80 ;AN000; | ||
| 314 | I2F5_75: ;AN005; | ||
| 315 | STC ;AN000; | ||
| 316 | JMP I2F5_1000 ;AN000; | ||
| 317 | ;AN000; | ||
| 318 | I2F5_80: ;AN000; | ||
| 319 | CMP WORD PTR CS:[THISIFS+2],NULL_PTR ;if no ifs driver set, quit w/carry ;AN006; | ||
| 320 | JNE I2F5_85 ;AN006; | ||
| 321 | CMP WORD PTR CS:[THISIFS],NULL_PTR ;AN006; | ||
| 322 | JZ I2F5_75 ;AN006; | ||
| 323 | I2F5_85: ;AN006; | ||
| 324 | TEST CS:IFSSEM,MR_ERRMSG_SEM ; if already in msgret loop, exit fast ;AN005; | ||
| 325 | JNZ I2F5_75 ;AN005; | ||
| 326 | MOV CS:IFSPROC_FLAGS,0 ;AN005; | ||
| 327 | CMP AL,I2F5_MsgRet ;AN005; | ||
| 328 | JNE I2F5_90 ;AN005; | ||
| 329 | OR CS:IFSPROC_FLAGS,IsMsgRet ;AN005; | ||
| 330 | OR CS:IFSSEM,MR_ERRMSG_SEM ; set msgret error msg semaphore ;AN005; | ||
| 331 | I2F5_90: ;AN005; | ||
| 332 | SaveReg <DS,SI,BX,CS> ; save command.com regs ;AN002;AC003; | ||
| 333 | RestoreReg <DS> ; set ds-ifsseg ;AN002; | ||
| 334 | MOV AX,BX ; whole ax now ext error ;AN003;;AC005; | ||
| 335 | SaveReg <AX> ; save ext err # ;AN000; | ||
| 336 | invoke PREP_IFSR ; zero out ifsr, sets es:bx -> ifsr ;AN000; | ||
| 337 | MOV ES:[BX.IFSR_LENGTH],LENGTH_CRITMSG ;AN000; | ||
| 338 | MOV ES:[BX.IFSR_FUNCTION],IFSCRITMSG ;AN000; | ||
| 339 | MOV ES:[BX.IFSR_RETCODE],AX ;AN003; | ||
| 340 | |||
| 341 | ;*********************************************************************************************** | ||
| 342 | invoke CALL_IFS ; call ifs with chance to set errmsg ;AN000; | ||
| 343 | ;*********************************************************************************************** | ||
| 344 | |||
| 345 | JNC I2F5_200 ;AN000; | ||
| 346 | POP AX ; fs error set - get ifsfunc msg ;AN000; | ||
| 347 | TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret don't call msg ret for ;AN005; | ||
| 348 | JZ I2F5_95 ; default msg - just fail ;AN005; | ||
| 349 | STC ;AN005; | ||
| 350 | JMP SHORT I2F5_220 ;AN005; | ||
| 351 | I2F5_95: ;AN005; | ||
| 352 | MOV DH,1 ;AN000; | ||
| 353 | CALL SYSGETMSG ; puts msg in dssi,cx=msg size ;AN000; | ||
| 354 | MOV AH,1 ; set al = msg type 0 or 1 ;AN000; | ||
| 355 | CMP AL,55 ; all but 55,64,65,88 are 1 ;AN000; | ||
| 356 | JL I2F5_120 ;AN000; | ||
| 357 | JE I2F5_100 ;AN000; | ||
| 358 | CMP AL,64 ;AN000; | ||
| 359 | JL I2F5_120 ;AN000; | ||
| 360 | JE I2F5_100 ;AN000; | ||
| 361 | CMP AL,65 ;AN000; | ||
| 362 | JE I2F5_100 ;AN000; | ||
| 363 | CMP AL,88 ;AN000; | ||
| 364 | JNE I2F5_120 ;AN000; | ||
| 365 | ;AN000; | ||
| 366 | I2F5_100: ;AN000; | ||
| 367 | DEC AH ;AN000; | ||
| 368 | ;AN000; | ||
| 369 | I2F5_120: ;AN000; | ||
| 370 | MOV AL,AH ;AN000; | ||
| 371 | SaveReg <CS> ; msg ret has 0D0A24 at end of msg ;AN003; | ||
| 372 | RestoreReg <ES> ; must change this to asciiz ;AN003; | ||
| 373 | MOV DI,OFFSET CS:TEMPBUF+80 ; move to temp buff and put 0 at 0DH ;AN003;;AC008;(80) | ||
| 374 | SaveReg <DI,AX> ; preserve msg offset and msg type ;AN003; | ||
| 375 | REP MOVSB ; move msg to temp buff ;AN003; | ||
| 376 | XOR AL,AL ;AN003; | ||
| 377 | STOSB ; store zero at end ;AN003; | ||
| 378 | I2F5_160: ;AN003; | ||
| 379 | RestoreReg <AX,DI> ; msg type/ msg offset ;AN003; | ||
| 380 | JMP SHORT I2F5_220 ;AN000; | ||
| 381 | ;AN000; | ||
| 382 | ;AN000; | ||
| 383 | I2F5_200: ; fs supplies error msg ;AN000; | ||
| 384 | MOV AL,ES:[BX.IFSR_MSG_TYPE] ; grab ifs msg info ;AN000; | ||
| 385 | MOV DI,WORD PTR ES:[BX.IFSR_MSG@] ;AN000; | ||
| 386 | MOV ES,WORD PTR ES:[BX.IFSR_MSG@+2] ;AN000; | ||
| 387 | ADD SP,2 ; restore stack ;AN000; | ||
| 388 | I2F5_220: ;AN000; | ||
| 389 | PUSHF ; save carry ;AN005; | ||
| 390 | TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msgret reset semaphore ;AN005; | ||
| 391 | JZ I2F5_240 ;AN005; | ||
| 392 | AND CS:IFSSEM,NOT MR_ERRMSG_SEM ;AN005; | ||
| 393 | I2F5_240: ;AN005; | ||
| 394 | POPF ; restore carry ;AN005; | ||
| 395 | RestoreReg <BX,SI,DS> ; retrieve command.com regs ;AN002;AC003; | ||
| 396 | ;AN000; | ||
| 397 | I2F5_1000: ;AN000; | ||
| 398 | RET 2 ; Fakey IRET ;AN000; | ||
| 399 | ;AN000; | ||
| 400 | EndProc INT_2F_5 ;AN000; | ||
| 401 | ;AN000; | ||
| 402 | ASSUME SS:DOSGROUP ;AN000; | ||
| 403 | ;AN000; | ||
| 404 | ;AN000; | ||
| 405 | ;AN000; | ||
| 406 | BREAK <SET_EXTERR_INFO -- Set IBMDOS error info> ;AN000; | ||
| 407 | ;AN000; | ||
| 408 | ;************************************************************************************ ;AN000; | ||
| 409 | ; ;AN000; | ||
| 410 | ; SET_EXTERR_INFO ;AN000; | ||
| 411 | ; ;AN000; | ||
| 412 | ; Inputs: ;AN000; | ||
| 413 | ; AL is extended error ;AN000; | ||
| 414 | ; IFSR ;AN000; | ||
| 415 | ; ;AN000; | ||
| 416 | ; Function: ;AN000; | ||
| 417 | ; Set all the EXTERR stuff and ALLOWED ;AN000; | ||
| 418 | ; ;AN000; | ||
| 419 | ; Outputs: ;AN000; | ||
| 420 | ; following set: ;AN000; | ||
| 421 | ; EXTERR word ;AN000; | ||
| 422 | ; EXTERR_ACTION byte ;AN000; | ||
| 423 | ; EXTERR_CLASS " ;AN000; | ||
| 424 | ; EXTERR_LOCUS " ;AN000; | ||
| 425 | ; ALLOWED " ;AN000; | ||
| 426 | ; ;AN000; | ||
| 427 | ; Regs: all preserved ;AN000; | ||
| 428 | ; ;AN000; | ||
| 429 | ;************************************************************************************ ;AN000; | ||
| 430 | ;AN000; | ||
| 431 | procedure SET_EXTERR_INFO,NEAR ;AN000; | ||
| 432 | ASSUME DS:IFSSEG,ES:NOTHING ;AN000; | ||
| 433 | ;AN000; | ||
| 434 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 435 | ;AN000; | ||
| 436 | PUSHF ;AN000; | ||
| 437 | SaveReg <AX,CX,SI,DS> ;AC003; | ||
| 438 | ;AN000; | ||
| 439 | XOR AH,AH ; set unknown ah=0 ;AN003; | ||
| 440 | MOV SS:[EXTERR],AX ; Set extended error ;AC003; | ||
| 441 | MOV SI,OFFSET ERR_TABLE_IFS ;AC003; | ||
| 442 | SaveReg <CS> ;AN003; | ||
| 443 | RestoreReg <DS> ; ds-ifsseg to access err_table_ifs ;AN003; | ||
| 444 | CMP AL,50 ; if err not in range, set to ?? ;AN003; | ||
| 445 | JL SEI_10 ;AN003; | ||
| 446 | CMP AL,88 ;AN003; | ||
| 447 | JLE SEI_20 ;AN003; | ||
| 448 | SEI_10: ;AN003; | ||
| 449 | MOV AL,89 ;AN003; | ||
| 450 | ;AN003; | ||
| 451 | SEI_20: ;AN003; | ||
| 452 | SUB AL,50 ; space to correct table entry ;AN003; | ||
| 453 | MOV CL,4 | ||
| 454 | MUL CL ;AN003; | ||
| 455 | ADD SI,AX ;AN003; | ||
| 456 | |||
| 457 | SEI_40: ;AN003; | ||
| 458 | LODSW ; AL is CLASS, AH is ACTION ;AN003; | ||
| 459 | MOV [EXTERR_ACTION],AH ; Set ACTION ;AN003; | ||
| 460 | MOV [EXTERR_CLASS],AL ; Set CLASS ;AN003; | ||
| 461 | LODSW ; al- LOCUS ah- ALLOWED ;AN003; | ||
| 462 | TEST IFSPROC_FLAGS,ISCDS ;AN003; | ||
| 463 | JNZ SEI_50 ;AN003; | ||
| 464 | ADD AL,2 ;AN003; | ||
| 465 | SEI_50: ;AN003; | ||
| 466 | MOV [EXTERR_LOCUS],AL ;AN003; | ||
| 467 | MOV [ALLOWED],AH ;AN003; | ||
| 468 | ;AN003; | ||
| 469 | MOV SI,BX ; Set ds:si -> ifsr so can use ;AN003; | ||
| 470 | SaveReg <ES> ; lodsw to get cl,act,loc,allowed ;AN003; | ||
| 471 | RestoreReg <DS> ;AN003; | ||
| 472 | ADD SI,IFSR_ERROR_CLASS ;AN003; | ||
| 473 | ; only set if ifs set (not -1) ;AN000; | ||
| 474 | LODSW ; AH = action, AL = class ;AN000; | ||
| 475 | CMP AL,ERROR_INFO_NOT_SET ;AN000; | ||
| 476 | JE SEI_60 ;AN000; | ||
| 477 | MOV [EXTERR_CLASS],AL ; set class ;AN000; | ||
| 478 | SEI_60: ;AN000; | ||
| 479 | CMP AH,ERROR_INFO_NOT_SET ;AN000; | ||
| 480 | JE SEI_80 ;AN000; | ||
| 481 | MOV [EXTERR_ACTION],AH ; set action ;AN000; | ||
| 482 | SEI_80: ;AN000; | ||
| 483 | LODSW ; AH = allowed, AL = locus ;AN000; | ||
| 484 | CMP AL,ERROR_INFO_NOT_SET ;AN000; | ||
| 485 | JE SEI_100 ;AN000; | ||
| 486 | MOV [EXTERR_LOCUS],AL ; Set locus ;AN000; | ||
| 487 | SEI_100: ;AN000; | ||
| 488 | CMP AH,ERROR_INFO_NOT_SET ;AN000; | ||
| 489 | JE SEI_1000 ;AN000; | ||
| 490 | MOV [ALLOWED],AH ;AN000; | ||
| 491 | |||
| 492 | SEI_1000: ;AN003; | ||
| 493 | RestoreReg <DS,SI,CX,AX> ;AN000; | ||
| 494 | POPF ;AN000; | ||
| 495 | return ;AN000; | ||
| 496 | |||
| 497 | EndProc SET_EXTERR_INFO ;AN000; | ||
| 498 | |||
| 499 | |||
| 500 | BREAK <DEVICE2EXTERR -- Convert device error to extended error > ;AN004; | ||
| 501 | |||
| 502 | ;************************************************************************************ | ||
| 503 | ; | ||
| 504 | ; DEVICE2EXTERR | ||
| 505 | ; | ||
| 506 | ; Inputs: | ||
| 507 | ; AX is device error | ||
| 508 | ; | ||
| 509 | ; Function: | ||
| 510 | ; Convert device error to extended error | ||
| 511 | ; This is essentially the same routine as in IBMDOS | ||
| 512 | ; | ||
| 513 | ; Outputs: | ||
| 514 | ; AX = extended error | ||
| 515 | ; | ||
| 516 | ; Regs: all preserved | ||
| 517 | ; | ||
| 518 | ;************************************************************************************ | ||
| 519 | |||
| 520 | procedure DEVICE2EXTERR,NEAR ;AN004; | ||
| 521 | ;AN004; | ||
| 522 | SaveReg <DI> ;AN004; | ||
| 523 | MOV DI,AX ;AN004; | ||
| 524 | MOV AX,OFFSET ErrMap24End ;AN004; | ||
| 525 | SUB AX,OFFSET ErrMap24 ; AX is the index of the first ;AN004; | ||
| 526 | ; unavailable error. ;AN004; | ||
| 527 | ; Do not translate if >= AX. ;AN004; | ||
| 528 | CMP DI,AX ;AN004; | ||
| 529 | MOV AX,DI ;AN004; | ||
| 530 | JAE D2E_20 ;AN004; | ||
| 531 | MOV AL,ErrMap24[DI] ;AN004; | ||
| 532 | XOR AH,AH ;AN004; | ||
| 533 | D2E_20: ;AN004; | ||
| 534 | RestoreReg <DI> ;AN004; | ||
| 535 | return ;AN004; | ||
| 536 | ;AN004; | ||
| 537 | EndProc DEVICE2EXTERR ;AN004; | ||
| 538 | |||
| 539 | BREAK <IFS_I24 -- Do an INT 24 error> ;AN000; | ||
| 540 | ;AN000; | ||
| 541 | ;************************************************************************************ ;AN000; | ||
| 542 | ; ;AN000; | ||
| 543 | ; IFS_I24 ;AN000; | ||
| 544 | ; ;AN000; | ||
| 545 | ; Called by: CALL_IFS ;AN000; | ||
| 546 | ; ;AN000; | ||
| 547 | ; Routines called: DOS: NET_I24_ENTRY ;AN000; | ||
| 548 | ; ;AN000; | ||
| 549 | ; Inputs: ;AN000; | ||
| 550 | ; [IFSDRV] set (-1 = device, PHONEY_NAME set) ;AN000; | ||
| 551 | ; [EXTERR...] Set ;AN000; | ||
| 552 | ; [ALLOWED] Set ;AN000; | ||
| 553 | ; IFSR ;AN000; | ||
| 554 | ; ;AN000; | ||
| 555 | ; Function: ;AN000; | ||
| 556 | ; DI = Mapped I 24 error code (0-12) ;AN000; | ||
| 557 | ; AH is bit info (if block) ;AN000; | ||
| 558 | ; Perform I 24 error to get user response ;AN000; | ||
| 559 | ; ;AN000; | ||
| 560 | ; Outputs: ;AN000; | ||
| 561 | ; AL = 0 ;AN000; | ||
| 562 | ; Ignore ;AN000; | ||
| 563 | ; AL = 1 ;AN000; | ||
| 564 | ; Retry ;AN000; | ||
| 565 | ; AL = 3 ;AN000; | ||
| 566 | ; Fail ;AN000; | ||
| 567 | ; ;AN000; | ||
| 568 | ; Regs: DI, AX Revised ;AN000; | ||
| 569 | ; ;AN000; | ||
| 570 | ;************************************************************************************ ;AN000; | ||
| 571 | ;AN000; | ||
| 572 | procedure IFS_I24,NEAR ;AN000; | ||
| 573 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 574 | ;AN000; | ||
| 575 | XOR AH,AH ; AL - extended error (retcode) ;AD007; | ||
| 576 | MOV DI,AX ; set DI = i24 error code C-general fail ;AC007; | ||
| 577 | MOV WORD PTR [EXITHOLD+2],ES ; save es:bp here since fetchi ;AN000; | ||
| 578 | MOV WORD PTR [EXITHOLD],BP ; restores in NET_I24_ENTRY ;AN000; | ||
| 579 | PUSH CS ;AN000; | ||
| 580 | POP BP ; BP=seg part of BP:SI dev ptr ;AN000; | ||
| 581 | ;AN000; | ||
| 582 | MOV AL,[IFSDRV] ; set dev hdr offset ;AN000; | ||
| 583 | CMP AL,-1 ;AN000; | ||
| 584 | JZ I24_20 ;AN000; | ||
| 585 | MOV SI,OFFSET PHONEY_BLOCK ; block device ;AN000; | ||
| 586 | JMP SHORT I24_40 ;AN000; | ||
| 587 | I24_20: ;AN000; | ||
| 588 | MOV SI,OFFSET PHONEY_DEVICE ; char device ;AN000; | ||
| 589 | MOV AH,87H ; char dev, write, data area ;AN007; | ||
| 590 | ;AN000; | ||
| 591 | I24_40: ;AN000; | ||
| 592 | OR AH,ES:[BX.IFSR_ALLOWED] ; bit 7 = 0-disk or 1(other),... ;AC007; | ||
| 593 | ;AN000; | ||
| 594 | CallInstall NET_I24_ENTRY,MultDOS,6,<AX>,<SI> ;AN000; | ||
| 595 | ;AN000; | ||
| 596 | return ;AN000; | ||
| 597 | ;AN000; | ||
| 598 | EndProc IFS_I24 ;AN000; | ||
| 599 | ;AN000; | ||
| 600 | BREAK <PHONEY_DPB -- Set up a phoney DPB for sharing NET INT 24 errors> ;AN000; | ||
| 601 | ;AN000; | ||
| 602 | ;************************************************************************************ ;AN000; | ||
| 603 | ; ;AN000; | ||
| 604 | ; PHONEY_DPB ;AN000; | ||
| 605 | ; ;AN000; | ||
| 606 | ; Input: ;AN000; | ||
| 607 | ; [IFSDRV] Set ;AN000; | ||
| 608 | ; ;AN000; | ||
| 609 | ; Function: ;AN000; | ||
| 610 | ; Build a phoney DPB for IFS Share/Lock errors ;AN000; | ||
| 611 | ; ;AN000; | ||
| 612 | ; Outputs: ;AN000; | ||
| 613 | ; [THISDPB] Set ;AN000; | ||
| 614 | ; ;AN000; | ||
| 615 | ; Regs: ALL preserved ;AN000; | ||
| 616 | ; ;AN000; | ||
| 617 | ;************************************************************************************ ;AN000; | ||
| 618 | ;AN000; | ||
| 619 | procedure PHONEY_DPB,NEAR ;AN000; | ||
| 620 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 621 | ;AN000; | ||
| 622 | PUSH AX ;AN000; | ||
| 623 | MOV WORD PTR [THISDPB],OFFSET DUMMY_DPB ;AN000; | ||
| 624 | MOV WORD PTR [THISDPB+2],CS ;AN000; | ||
| 625 | MOV AL,[IFSDRV] ;AN000; | ||
| 626 | MOV BYTE PTR [DUMMY_DPB + dpb_drive],AL ;AN000; | ||
| 627 | MOV WORD PTR [DUMMY_DPB + dpb_driver_addr],OFFSET PHONEY_BLOCK ;AN000; | ||
| 628 | MOV WORD PTR [DUMMY_DPB + dpb_driver_addr + 2],CS ;AN000; | ||
| 629 | POP AX ;AN000; | ||
| 630 | return ;AN000; | ||
| 631 | ;AN000; | ||
| 632 | EndProc PHONEY_DPB ;AN000; | ||
| 633 | |||
| 634 | include msgdcl.inc ;AN000; | ||
| 635 | ;AN000; | ||
| 636 | IFSSEG ENDS ;AN000; | ||
| 637 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM new file mode 100644 index 0000000..6f3ff2d --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM | |||
| @@ -0,0 +1,476 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsfdos.asm 1.0 87/08/29 ;AN000; | ||
| 3 | TITLE IFSFUNC DOS CALLBACK ROUTINES - Routines for ifs ;AN000; | ||
| 4 | NAME IFSFDOS ;AN000; | ||
| 5 | ;*********************************************************************************** ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; IFS DOS Callback Routines ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; IFSFDOS ;AN000; | ||
| 10 | ; ;AN000; | ||
| 11 | ; REVISION HISTORY: ;AN000; | ||
| 12 | ; A000 - Original version 4.00 AUG 1987 DCR - 96 ;AN000; | ||
| 13 | ; A001 - DCR 47 Get disk/device pause status AUG '87 RG ;AN000; | ||
| 14 | ; A002 - PTM 2610 Time/date problems DEC '87 RG ;AN000; | ||
| 15 | ; ;AN000; | ||
| 16 | ; LOC - ;AN000; | ||
| 17 | ; ;AN000; | ||
| 18 | ;*********************************************************************************** ;AN000; | ||
| 19 | ;AN000; | ||
| 20 | .xlist ;AN000; | ||
| 21 | .xcref ;AN000; | ||
| 22 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 23 | INCLUDE IFSSYM.INC ;AN000; | ||
| 24 | INCLUDE DOSSYM.INC ;AN000; | ||
| 25 | INCLUDE DEVSYM.INC ;AN000; | ||
| 26 | .cref ;AN000; | ||
| 27 | .list ;AN000; | ||
| 28 | .sall ;AN000; | ||
| 29 | ;AN000; | ||
| 30 | AsmVars <IBM, INSTALLED, DEBUG, PATHGEN> ;AN000; | ||
| 31 | ;AN000; | ||
| 32 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 33 | IFSSEG ENDS ;AN000; | ||
| 34 | ;AN000; | ||
| 35 | include dosseg.asm ;AN000; | ||
| 36 | ;AN000; | ||
| 37 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 38 | ; DOSGROUP data ;AN000; | ||
| 39 | Extrn YEAR:WORD | ||
| 40 | Extrn YRTAB:BYTE | ||
| 41 | Extrn MONTAB:BYTE | ||
| 42 | DATA ENDS ;AN000; | ||
| 43 | ;AN000; | ||
| 44 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 45 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 46 | ;AN000; | ||
| 47 | ;IFS Data ;AN000; | ||
| 48 | ;AN000; | ||
| 49 | Extrn IFSFUNC_FLAGS:WORD ;AN000; | ||
| 50 | Extrn DOSCALL@:DWORD ;AN000; | ||
| 51 | Extrn fAssign:BYTE ;AN001; | ||
| 52 | Extrn fPrint:BYTE ;AN001; | ||
| 53 | ;AN000; | ||
| 54 | ;AN000; | ||
| 55 | BREAK <SET_IFS_DOSCALL@ - prep for ifs dos requests to come to ifsfunc> ;AN000; | ||
| 56 | ;************************************************************************************ ;AN000; | ||
| 57 | ; ;AN000; | ||
| 58 | ; SET_IFS_DOSCALL@ ;AN000; | ||
| 59 | ; ;AN000; | ||
| 60 | ;Called by: ;AN000; | ||
| 61 | ; IFSFUNCINIT ;AN000; | ||
| 62 | ; ;AN000; | ||
| 63 | ; Routines called: ;AN000; | ||
| 64 | ; none ;AN000; | ||
| 65 | ; ;AN000; | ||
| 66 | ; Inputs: ;AN000; | ||
| 67 | ; DS-ifsseg ;AN000; | ||
| 68 | ; ;AN000; | ||
| 69 | ; Function: ;AN000; | ||
| 70 | ; replace ifs_doscall@ addresses in all ifs driver headers with ;AN000; | ||
| 71 | ; ifsfunc address ;AN000; | ||
| 72 | ; ;AN000; | ||
| 73 | ; Outputs: ;AN000; | ||
| 74 | ; none ;AN000; | ||
| 75 | ; ;AN000; | ||
| 76 | ; Notes: all preserved ;AN000; | ||
| 77 | ; ;AN000; | ||
| 78 | ;************************************************************************************ ;AN000; | ||
| 79 | ;AN000; | ||
| 80 | procedure SET_IFS_DOSCALL@,NEAR ;AN000; | ||
| 81 | ASSUME DS:IFSSEG ;AN000; | ||
| 82 | TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; | ||
| 83 | JZ SID_20 ;AN000; | ||
| 84 | transfer ifs_1000 ;AN000; | ||
| 85 | SID_20: ;AN000; | ||
| 86 | SaveReg <AX,BX,ES,DI,SI> ;AN000; | ||
| 87 | MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; | ||
| 88 | INT 21h ; es:bx -> sysinitvars ;AN000; | ||
| 89 | LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; | ||
| 90 | SaveReg <ES,DI> ;AN000; | ||
| 91 | LES DI,ES:[DI.IFS_DOSCALL@] ;AN000; | ||
| 92 | MOV WORD PTR [DOSCALL@],DI ;AN000; | ||
| 93 | MOV WORD PTR [DOSCALL@+2],ES ;AN000; | ||
| 94 | RestoreReg <DI,ES> ; 1st driver addr ;AN000; | ||
| 95 | MOV SI,OFFSET IFSFUNC_DOSCALL@ ;AN000; | ||
| 96 | SID_40: ; *** loop here on ifs_doscall@ fixing ;AN000; | ||
| 97 | MOV WORD PTR ES:[DI.IFS_DOSCALL@],SI ;AN000; | ||
| 98 | MOV WORD PTR ES:[DI.IFS_DOSCALL@+2],DS ;AN000; | ||
| 99 | LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000; | ||
| 100 | CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000; | ||
| 101 | JNE SID_40 ;AN000; | ||
| 102 | MOV AX,ES ;AN000; | ||
| 103 | CMP AX,NULL_PTR ;AN000; | ||
| 104 | JNE SID_40 ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | SID_1000: ;AN000; | ||
| 107 | RestoreReg <SI,DI,ES,BX,AX> ;AN000; | ||
| 108 | return ;AN000; | ||
| 109 | ;AN000; | ||
| 110 | EndProc SET_IFS_DOSCALL@ ;AN000; | ||
| 111 | ;AN000; | ||
| 112 | ;AN000; | ||
| 113 | ;AN000; | ||
| 114 | BREAK <IFSFUNC_DOSCALL@ - DOS Callbacks> ;AN000; | ||
| 115 | ;************************************************************************************ ;AN000; | ||
| 116 | ; ;AN000; | ||
| 117 | ; IFSFUNC_DOSCALL@ ;AN000; | ||
| 118 | ; ;AN000; | ||
| 119 | ;Called by: ;AN000; | ||
| 120 | ; IFS Drivers ;AN000; | ||
| 121 | ; ;AN000; | ||
| 122 | ; Routines called: ;AN000; | ||
| 123 | ; none ;AN000; | ||
| 124 | ; ;AN000; | ||
| 125 | ; Inputs: ;AN000; | ||
| 126 | ; SS-dosgroup ;AN000; | ||
| 127 | ; ;AN000; | ||
| 128 | ; Function: ;AN000; | ||
| 129 | ; ;AN000; | ||
| 130 | ; Outputs: ;AN000; | ||
| 131 | ; none ;AN000; | ||
| 132 | ; ;AN000; | ||
| 133 | ; Notes: none preserved ;AN000; | ||
| 134 | ; ;AN000; | ||
| 135 | ;************************************************************************************ ;AN000; | ||
| 136 | ;AN000; | ||
| 137 | procedure IFSFUNC_DOSCALL@,FAR ;AN000; | ||
| 138 | ;AN000; | ||
| 139 | CMP AH,33 ;AN001; | ||
| 140 | JNE ID_20 ;AN000; | ||
| 141 | CALL DOS_RETURN_ASSIGN_MODE ;AN001; | ||
| 142 | JMP SHORT ID_1000 ;AN001; | ||
| 143 | ID_20: ;AN001; | ||
| 144 | CMP AH,34 ;AN000; | ||
| 145 | JNE ID_40 ;AN000; | ||
| 146 | CALL DOS_TO_NET_DATE ;AN000; | ||
| 147 | JMP SHORT ID_1000 ;AN000; | ||
| 148 | ID_40: ;AN000; | ||
| 149 | CMP AH,35 ;AN000; | ||
| 150 | JNE ID_100 ;AN000; | ||
| 151 | CALL NET_TO_DOS_DATE ;AN000; | ||
| 152 | JMP SHORT ID_1000 ;AN000; | ||
| 153 | ID_100: ;AN000; | ||
| 154 | CALL CS:[DOSCALL@] ;AN000; | ||
| 155 | ;AN000; | ||
| 156 | ID_1000: ;AN000; | ||
| 157 | RET ;AN000; | ||
| 158 | ;AN000; | ||
| 159 | ;AN000; | ||
| 160 | EndProc IFSFUNC_DOSCALL@ ;AN000; | ||
| 161 | |||
| 162 | |||
| 163 | BREAK <DOS_RETURN_ASSIGN_MODE -- Return Assign Mode> ;AN000; | ||
| 164 | |||
| 165 | ;************************************************************************************ | ||
| 166 | ; | ||
| 167 | ; DOS_RETURN_ASSIGN_MODE | ||
| 168 | ; | ||
| 169 | ; Called by: IFSFUNC_DOSCALL@ | ||
| 170 | ; | ||
| 171 | ; Routines called: None | ||
| 172 | ; | ||
| 173 | ; Inputs: | ||
| 174 | ; BL = macro type | ||
| 175 | ; 3 - device | ||
| 176 | ; 4 - drive | ||
| 177 | ; Function: | ||
| 178 | ; If macro type = 3 (network printer) THEN | ||
| 179 | ; BX = fPrint .AND. 1 | ||
| 180 | ; Elseif macro type = 4 (network disk) THEN | ||
| 181 | ; BX = fAssign .AND. 1 | ||
| 182 | ; Else set error_invalid_function | ||
| 183 | ; | ||
| 184 | ; Output: | ||
| 185 | ; Carry clear - BH = mode (0 - off, 1 - on) | ||
| 186 | ; Carry set - AL error code | ||
| 187 | ; | ||
| 188 | ; Notes: This routine needed only for UNC file system. This is the | ||
| 189 | ; only FS that supports pause. | ||
| 190 | ; | ||
| 191 | ;************************************************************************************ | ||
| 192 | |||
| 193 | Procedure DOS_RETURN_ASSIGN_MODE,NEAR ;AN001; | ||
| 194 | ASSUME DS:NOTHING,ES:NOTHING ;AN001; | ||
| 195 | ;AN001; | ||
| 196 | CMP BL,3 ; if (type == drive) ;AN001; | ||
| 197 | JZ DRAM_20 ;AN001; | ||
| 198 | CMP BL,4 ;AN001; | ||
| 199 | JNZ DRAM_60 ;AN001; | ||
| 200 | MOV BH,fAssign ; t = fAssign; ;AN001; | ||
| 201 | JMP Short DRAM_40 ; else ;AN001; | ||
| 202 | DRAM_20: ; if (type == print) ;AN001; | ||
| 203 | MOV BH,fPrint ; t = fPrint; ;AN001; | ||
| 204 | DRAM_40: ;AN001; | ||
| 205 | AND BH,1 ; return t&1; ;AN001; | ||
| 206 | transfer ifs_990 ; go to general good ret in util ;AN001; | ||
| 207 | ;AN001; | ||
| 208 | DRAM_60: ;AN001; | ||
| 209 | MOV AL,error_invalid_function ;AN001; | ||
| 210 | transfer ifs_980 ; go to general bad ret in util ;AN001; | ||
| 211 | ;AN001; | ||
| 212 | EndProc DOS_RETURN_ASSIGN_MODE ;AN001; | ||
| 213 | |||
| 214 | BREAK <DOS_TO_NET_DATE -- Convert dos date/time to network date> ;AN000; | ||
| 215 | |||
| 216 | ;************************************************************************************ | ||
| 217 | ; | ||
| 218 | ; DOS_TO_NET | ||
| 219 | ; | ||
| 220 | ; Called by: IFSFUNC_DOSCALL@ | ||
| 221 | ; | ||
| 222 | ; Routines called: None | ||
| 223 | ; | ||
| 224 | ; Inputs: ;AN000; | ||
| 225 | ; DX = MS-DOS Date ;AN000; | ||
| 226 | ; CX = MS-DOS Time ;AN000; | ||
| 227 | ; Function: ;AN000; | ||
| 228 | ; Convert DOS Date Time to Network date ;AN000; | ||
| 229 | ; Outputs: ;AN000; | ||
| 230 | ; DX:CX = Seconds since 1-1-70 ;AN000; | ||
| 231 | ; No other registers Revised ;AN000; | ||
| 232 | ; | ||
| 233 | ;************************************************************************************ | ||
| 234 | |||
| 235 | FOURYEARS = (3*365) + 366 ; Days in four years ;AN000; | ||
| 236 | |||
| 237 | procedure DOS_TO_NET_DATE,NEAR ;AN000; | ||
| 238 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 239 | ;AN000; | ||
| 240 | OR AL,AL ; check where to get dos date/time ;AN002; | ||
| 241 | JNZ DTND_20 ;AN002; | ||
| 242 | CallInstall DATE16,MultDOS,13 ; Get local date/time ;AN000; | ||
| 243 | MOV CX,DX ;AN000; | ||
| 244 | XCHG AX,DX ;AN000; | ||
| 245 | ;AN000; | ||
| 246 | DTND_20: ;AN002; | ||
| 247 | PUSH DS ;AN000; | ||
| 248 | PUSH SS ;AN000; | ||
| 249 | POP DS ;AN000; | ||
| 250 | ASSUME DS:DOSGROUP ;AN000; | ||
| 251 | PUSH [YEAR] ; The routines in DOS (in particular ;AN000; | ||
| 252 | ; GET_DATE) do not like [YEAR] ;AN000; | ||
| 253 | ; getting changed by the call ;AN000; | ||
| 254 | ; to SETYEAR. ;AN000; | ||
| 255 | PUSH SI ;AN000; | ||
| 256 | PUSH BX ;AN000; | ||
| 257 | PUSH AX ;AN000; | ||
| 258 | PUSH CX ;AN000; | ||
| 259 | PUSH DX ;AN000; | ||
| 260 | ;AN000; | ||
| 261 | MOV CL,9 ;AN000; | ||
| 262 | SHR DX,CL ; Year to DL ;AN000; | ||
| 263 | MOV CX,DX ; Year in CX (CL) ;AN000; | ||
| 264 | POP DX ;AN000; | ||
| 265 | AND DX,1FFH ; Mask off year ;AN000; | ||
| 266 | SHL DX,1 ;AN000; | ||
| 267 | SHL DX,1 ;AN000; | ||
| 268 | SHL DX,1 ; Month in DH ;AN000; | ||
| 269 | SHR DL,1 ;AN000; | ||
| 270 | SHR DL,1 ;AN000; | ||
| 271 | SHR DL,1 ; Right justify day in DL ;AN000; | ||
| 272 | CallInstall SetYear,MultDOS,27 ; Set [YEAR] and # days in FEB ;AN000; | ||
| 273 | SHR CX,1 ;AN000; | ||
| 274 | SHR CX,1 ; Divide year by 4, chuck remainder ;AN000; | ||
| 275 | MOV AX,FOURYEARS ;AN000; | ||
| 276 | MOV BX,DX ; Get DX out of way ;AN000; | ||
| 277 | MUL CX ; # days in AX ;AN000; | ||
| 278 | MOV CL,BYTE PTR [YEAR] ;AN000; | ||
| 279 | AND CL,3 ; Get remainder from / by 4 ;AN000; | ||
| 280 | MOV SI,OFFSET DOSGROUP:YRTAB ;AN000; | ||
| 281 | MOV DX,AX ;AN000; | ||
| 282 | SHL CX,1 ; Two entries/year ;AN000; | ||
| 283 | CallInstall DSum,MultDOS,28,<AX>,<SI> ;AN000; | ||
| 284 | MOV CL,BH ; Month ;AN000; | ||
| 285 | DEC CX ; Make 0 indexed ;AN000; | ||
| 286 | MOV SI,OFFSET DOSGROUP:MONTAB ;AN000; | ||
| 287 | CallInstall DSum,MultDOS,28,<AX>,<AX> ;AN000; | ||
| 288 | MOV CL,BL ; day of month ;AN000; | ||
| 289 | DEC CX ; Make 0 indexed ;AN000; | ||
| 290 | ADD CX,DX ; CX is days since 1-1-80 ;AN000; | ||
| 291 | ; ;AN000; | ||
| 292 | ; The following three instructions implement this: ;AN000; | ||
| 293 | ; ;AN000; | ||
| 294 | ; CX * 15180H sec/day = (CX * 5180H) + (CX * 10000H) ;AN000; | ||
| 295 | ; ;AN000; | ||
| 296 | MOV AX,5180h ;AN000; | ||
| 297 | MUL CX ; (DX:AX) = days * 5180h ;AN000; | ||
| 298 | ADD DX,CX ; (DX:AX) = days * 15180h = seconds ;AN000; | ||
| 299 | ;AN000; | ||
| 300 | ADD AX,0A600H ;AN000; | ||
| 301 | ADC DX,012CEH ; Bias by # seconds from 1-1-70 to ;AN000; | ||
| 302 | ; 1-1-80 (12CEA600H) ;AN000; | ||
| 303 | POP BX ; Get DOS time ;AN000; | ||
| 304 | PUSH AX ;AN000; | ||
| 305 | PUSH DX ; Save date seconds ;AN000; | ||
| 306 | PUSH BX ;AN000; | ||
| 307 | MOV CL,11 ;AN000; | ||
| 308 | SHR BX,CL ; BX is hours ;AN000; | ||
| 309 | MOV AX,60 ;AN000; | ||
| 310 | MUL BX ; AX hours converted to minutes ;AN000; | ||
| 311 | ; 5A0H min/day so DX = 0 ;AN000; | ||
| 312 | POP BX ;AN000; | ||
| 313 | PUSH BX ;AN000; | ||
| 314 | AND BX,7FFH ; Mask off hours ;AN000; | ||
| 315 | MOV CL,5 ;AN000; | ||
| 316 | SHR BX,CL ; BX is minutes ;AN000; | ||
| 317 | ADD AX,BX ; AX is minutes ;AN000; | ||
| 318 | MOV BX,60 ;AN000; | ||
| 319 | MUL BX ; DX:AX is hours:min converted to sec ;AN000; | ||
| 320 | POP BX ;AN000; | ||
| 321 | AND BX,1FH ; BX is seconds/2 ;AN000; | ||
| 322 | SHL BX,1 ; BX is seconds ;AN000; | ||
| 323 | ADD AX,BX ;AN000; | ||
| 324 | ADC DX,0 ;AN000; | ||
| 325 | MOV CX,AX ; DX:CX is DOS time in seconds ;AN000; | ||
| 326 | POP BX ;AN000; | ||
| 327 | POP SI ; BX:SI is DOS Date in seconds ;AN000; | ||
| 328 | ADD CX,SI ;AN000; | ||
| 329 | ADC DX,BX ; DX:CX is NET time ;AN000; | ||
| 330 | POP AX ;AN000; | ||
| 331 | POP BX ;AN000; | ||
| 332 | POP SI ;AN000; | ||
| 333 | POP [YEAR] ;AN000; | ||
| 334 | POP DS ;AN000; | ||
| 335 | return ;AN000; | ||
| 336 | ;AN000; | ||
| 337 | EndProc DOS_TO_NET_DATE ;AN000; | ||
| 338 | ;AN000; | ||
| 339 | ; Inputs: ;AN000; | ||
| 340 | ; DX:CX = Seconds since 1-1-70 ;AN000; | ||
| 341 | ; Function: ;AN000; | ||
| 342 | ; Convert Network date to DOS Date Time ;AN000; | ||
| 343 | ; NOTE: WARNING!!!!!!! ;AN000; | ||
| 344 | ; This routine WILL NOT convert network times > 92CEA5FFH ;AN000; | ||
| 345 | ; (7FFFFFFF + 12CEA600). If such a time is encountered this ;AN000; | ||
| 346 | ; routine returns 1-1-80 0:0:0. ;AN000; | ||
| 347 | ; Outputs: ;AN000; | ||
| 348 | ; DX = MS-DOS Date ;AN000; | ||
| 349 | ; CX = MS-DOS Time ;AN000; | ||
| 350 | ; No other registers Revised ;AN000; | ||
| 351 | ;AN000; | ||
| 352 | procedure NET_TO_DOS_DATE,NEAR ;AN000; | ||
| 353 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 354 | SUB CX,0A600H ;AN000; | ||
| 355 | SBB DX,012CEH ; UnBias by # seconds from 1-1-70 to ;AN000; | ||
| 356 | ; 1-1-80 (12CEA600H) ;AN000; | ||
| 357 | JNC GO_ON ;AN000; | ||
| 358 | ; Date is before 1-1-80 ;AN000; | ||
| 359 | TO_BIG_LITTLE_TIME: ;AN000; | ||
| 360 | XOR DX,DX ;AN000; | ||
| 361 | MOV CX,DX ; Set 1-1-80 0:0:0 ;AN000; | ||
| 362 | return ;AN000; | ||
| 363 | ;AN000; | ||
| 364 | GO_ON: ;AN000; | ||
| 365 | TEST DX,8000H ; Check for high bit ;AN000; | ||
| 366 | JNZ TO_BIG_LITTLE_TIME ;AN000; | ||
| 367 | PUSH DS ;AN000; | ||
| 368 | PUSH SS ;AN000; | ||
| 369 | POP DS ;AN000; | ||
| 370 | ASSUME DS:DOSGROUP ;AN000; | ||
| 371 | PUSH [YEAR] ; The routines in DOS (in particular ;AN000; | ||
| 372 | ; GET_DATE) do not like [YEAR] ;AN000; | ||
| 373 | ; getting changed by the call ;AN000; | ||
| 374 | ; to SETYEAR. ;AN000; | ||
| 375 | PUSH AX ;AN000; | ||
| 376 | PUSH BX ;AN000; | ||
| 377 | PUSH SI ;AN000; | ||
| 378 | PUSH BP ;AN000; | ||
| 379 | XCHG AX,CX ; DX:AX # seconds ;AN000; | ||
| 380 | MOV SI,0A8C0h ; (si) = seconds in a half day ;AN000; | ||
| 381 | ; 15180H/2 ;AN000; | ||
| 382 | ; ;AN000; | ||
| 383 | ; NOTE: The following DIV is the reason we can't convert times with the ;AN000; | ||
| 384 | ; high bit set (after they're unbiased by 1-1-80 - 1-1-70). ;AN000; | ||
| 385 | ; If we tried one it MIGHT overflow. The cutoff is ;AN000; | ||
| 386 | ; actually (A8C0 * FFFF) + A8BF = A8BFFFFF but we choose a smaller ;AN000; | ||
| 387 | ; number (7FFFFFFF) because it's easier to test for. 7FFFFFFF = ;AN000; | ||
| 388 | ; about 68 years from 1-1-80 which is 1-1-2048. ;AN000; | ||
| 389 | ; ;AN000; | ||
| 390 | DIV SI ; (AX) = 2*days ;AN000; | ||
| 391 | ; (CX) = half-day remainder ;AN000; | ||
| 392 | MOV BX,DX ;AN000; | ||
| 393 | XOR DX,DX ;AN000; | ||
| 394 | MOV CX,DX ;AN000; | ||
| 395 | SHR AX,1 ; DX:AX = days ;AN000; | ||
| 396 | JNC NTDD1 ; didn't shift off a bit, no extra rem ;AN000; | ||
| 397 | ADD BX,0A8C0h ; did shift bit, adjust remainder ;AN000; | ||
| 398 | ADC CX,0 ; by extra 1/2 day of seconds ;AN000; | ||
| 399 | ;AN000; | ||
| 400 | ;DX:AX is # days since 1-1-80 ;AN000; | ||
| 401 | ;CX:BX is seconds into that day ;AN000; | ||
| 402 | NTDD1: ;AN000; | ||
| 403 | PUSH DX ;AN000; | ||
| 404 | PUSH AX ;AN000; | ||
| 405 | MOV DX,CX ;AN000; | ||
| 406 | MOV AX,BX ;AN000; | ||
| 407 | MOV CX,60 ; 60 sec/min ;AN000; | ||
| 408 | DIV CX ;AN000; | ||
| 409 | ;AX is min, DX(DL) is secs ;AN000; | ||
| 410 | DIV CL ; 60 min/hr ;AN000; | ||
| 411 | ;AH is Min, AL is hrs ;AN000; | ||
| 412 | SHR DL,1 ; Div seconds by 2 ;AN000; | ||
| 413 | AND DL,1FH ; DL is seconds/2 ;AN000; | ||
| 414 | MOV DH,AH ; Copy min to DH ;AN000; | ||
| 415 | MOV CL,5 ;AN000; | ||
| 416 | SHL AH,CL ; Low 3 bits of min in high 3 bits ;AN000; | ||
| 417 | OR DL,AH ; DL is now low byte of time ;AN000; | ||
| 418 | MOV CL,3 ;AN000; | ||
| 419 | SHR DH,CL ; High 3 bits of min to low 3 bits ;AN000; | ||
| 420 | AND DH,7 ;AN000; | ||
| 421 | MOV CL,3 ;AN000; | ||
| 422 | SHL AL,CL ; Hours to high 5 bits ;AN000; | ||
| 423 | AND AL,0F8H ;AN000; | ||
| 424 | OR DH,AL ; DX is now DOS time ;AN000; | ||
| 425 | MOV CX,DX ;AN000; | ||
| 426 | POP AX ;AN000; | ||
| 427 | POP DX ; DX:AX days since 1-1-80 ;AN000; | ||
| 428 | PUSH CX ; Stash time ;AN000; | ||
| 429 | MOV CX,FOURYEARS ;AN000; | ||
| 430 | DIV CX ; AX # four year increments ;AN000; | ||
| 431 | ; DX remainder days ;AN000; | ||
| 432 | SHL AX,1 ;AN000; | ||
| 433 | SHL AX,1 ;AN000; | ||
| 434 | SHL AX,1 ; Mult by 8 (AX # 1/2 years) ;AN000; | ||
| 435 | MOV CX,AX ;AN000; | ||
| 436 | MOV SI,OFFSET DOSGROUP:YRTAB ;AN000; | ||
| 437 | CallInstall DSlide,MultDOS,29,<AX>,<AX> ;AN000; | ||
| 438 | SHR CX,1 ; 1/2 years to whole years ;AN000; | ||
| 439 | JNC SK ;AN000; | ||
| 440 | ADD DX,200 ; Extra 1/2 year ;AN000; | ||
| 441 | SK: ;AN000; | ||
| 442 | CallInstall SetYear,multDOS,27 ;AN000; | ||
| 443 | PUSH CX ;AN000; | ||
| 444 | MOV CL,1 ; At least at first month in year ;AN000; | ||
| 445 | MOV SI,OFFSET DOSGROUP:MONTAB ;AN000; | ||
| 446 | CallInstall DSlide,MultDOS,29,<AX>,<AX> ;AN000; | ||
| 447 | INC DX ; Days start at 1 ;AN000; | ||
| 448 | POP AX ;AN000; | ||
| 449 | MOV CH,CL ;AN000; | ||
| 450 | ; DL is day, CH is month, AL is year ;AN000; | ||
| 451 | SHL AL,1 ; Year to high 7 bits ;AN000; | ||
| 452 | AND AL,0FEH ;AN000; | ||
| 453 | MOV AH,CH ;AN000; | ||
| 454 | MOV CL,3 ;AN000; | ||
| 455 | SHR AH,CL ; High bit of month to bit 0 ;AN000; | ||
| 456 | AND AH,1 ;AN000; | ||
| 457 | OR AH,AL ; AH is high byte of date ;AN000; | ||
| 458 | AND DL,1FH ; Day is low 5 bits ;AN000; | ||
| 459 | MOV CL,5 ;AN000; | ||
| 460 | SHL CH,CL ; Low 3 bits of month to high 3 bits ;AN000; | ||
| 461 | AND CH,0E0H ;AN000; | ||
| 462 | OR DL,CH ;AN000; | ||
| 463 | MOV DH,AH ; Date in DX ;AN000; | ||
| 464 | POP CX ; Time to CX ;AN000; | ||
| 465 | POP BP ;AN000; | ||
| 466 | POP SI ;AN000; | ||
| 467 | POP BX ;AN000; | ||
| 468 | POP AX ;AN000; | ||
| 469 | POP [YEAR] ;AN000; | ||
| 470 | POP DS ;AN000; | ||
| 471 | return ;AN000; | ||
| 472 | ;AN000; | ||
| 473 | EndProc NET_TO_DOS_DATE ;AN000; | ||
| 474 | ;AN000; | ||
| 475 | IFSSEG ENDS ;AN000; | ||
| 476 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM new file mode 100644 index 0000000..5b0188f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | |||
| @@ -0,0 +1,1778 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsfile.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFS FILE ROUTINES - Routines for IFS dispatch ;AN000; | ||
| 4 | NAME IFSFILE ;AN000; | ||
| 5 | ;************************************************************************************ | ||
| 6 | ; | ||
| 7 | ; FILE (WFP_START) related Network calls | ||
| 8 | ; | ||
| 9 | ; IFS_DISK_INFO | ||
| 10 | ; IFS_SEQ_SET_FILE_ATTRIBUTE | ||
| 11 | ; IFS_SET_FILE_ATTRIBUTE | ||
| 12 | ; IFS_SEQ_GET_FILE_INFO | ||
| 13 | ; IFS_GET_FILE_INFO | ||
| 14 | ; IFS_SEQ_RENAME | ||
| 15 | ; IFS_RENAME | ||
| 16 | ; IFS_SEQ_DELETE | ||
| 17 | ; IFS_DELETE | ||
| 18 | ; IFS_SEQ_OPEN | ||
| 19 | ; IFS_OPEN | ||
| 20 | ; IFS_SEQ_CREATE | ||
| 21 | ; IFS_CREATE | ||
| 22 | ; IFS_SEQ_XOPEN | ||
| 23 | ; IFS_XOPEN | ||
| 24 | ; IFS_SEQ_SEARCH_FIRST | ||
| 25 | ; IFS_SEQ_SEARCH_NEXT | ||
| 26 | ; IFS_SEARCH_FIRST | ||
| 27 | ; IFS_SEARCH_NEXT | ||
| 28 | ; OPEN_CHECK_SEQ | ||
| 29 | ; | ||
| 30 | ; Programming notes: | ||
| 31 | ; Old redirector segmentation and DOS interface preserved. | ||
| 32 | ; Routine prologues are accurate for input/output. | ||
| 33 | ; However, the pseudocode was not kept up to date. | ||
| 34 | ; Use it for a rough idea of the routine function. | ||
| 35 | ; | ||
| 36 | ; REVISION HISTORY: | ||
| 37 | ; A000 Original version 4.00 - May 1987 | ||
| 38 | ; A001 PTM 316 - Fix search next drive byte interpretation | ||
| 39 | ; Set drive number in DMAADD | ||
| 40 | ; A002 PTM 845 - Disk info ignored | ||
| 41 | ; A003 PTM 869 - Lock failure due to sf_ifs_hdr not set | ||
| 42 | ; A004 DCR 213 - SFT Serial number | ||
| 43 | ; A005 PTM 849 - Printer open problems | ||
| 44 | ; A006 PTM 1518- open mode/flag finalized | ||
| 45 | ; A007 PTM ????- Action Taken not set on Extended open 10/27 FEIGENBAUM | ||
| 46 | ; A008 PTM ????- Old Open/Creates pass parms list 10/27 FEIGENBAUM | ||
| 47 | ; A009 PTM 2247- Delete does not return carry on error 11/3 RG | ||
| 48 | ; A010 PTM 2248- Old Create mode incorrect - must be 2 11/3 RG | ||
| 49 | ; A011 DCR 285 - Remove Extended Attribute/Lock support 1/88 RG | ||
| 50 | ; A012 PTM 3968- set sft time/date on create 3/25/88 RMG | ||
| 51 | ; A013 - sft analysis changes 3/25/88 RMG | ||
| 52 | ; A014 Austin Deviceless Attach problems 3/28/88 RMG | ||
| 53 | ; A015 P4392 SFT change - attr_hi gone 4/19/88 RMG | ||
| 54 | ; A016 P4801 File size segment not right 5/10/88 RMG | ||
| 55 | ; A017 P???? DS not preserved during CALLBACK 5/13/88 RPS | ||
| 56 | ; LOC - 486 | ||
| 57 | ; | ||
| 58 | ;************************************************************************************ | ||
| 59 | |||
| 60 | .xlist ;AN000; | ||
| 61 | .xcref ;AN000; | ||
| 62 | INCLUDE IFSSYM.INC ;AN000; | ||
| 63 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 64 | INCLUDE DOSSYM.INC ;AN000; | ||
| 65 | INCLUDE DEVSYM.INC ;AN000; | ||
| 66 | INCLUDE DOSCNTRY.INC | ||
| 67 | .cref ;AN000; | ||
| 68 | .list ;AN000; | ||
| 69 | ;AN000; | ||
| 70 | AsmVars <IBM, Installed, DEBUG> ;AN000; | ||
| 71 | ;AN000; | ||
| 72 | ; then define the base code segment of the ifsfunc support first ;AN000; | ||
| 73 | ;AN000; | ||
| 74 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 75 | IFSSEG ENDS ;AN000; | ||
| 76 | ;AN000; | ||
| 77 | ; include the rest of the segment definitions for normal MSDOS ;AN000; | ||
| 78 | ;AN000; | ||
| 79 | include dosseg.asm ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 82 | ;DOSGROUP Data ;AN000; | ||
| 83 | Extrn REN_WFP:WORD ;AN000; | ||
| 84 | Extrn WFP_START:WORD ;AN000; | ||
| 85 | Extrn SATTRIB:BYTE ;AN000; | ||
| 86 | Extrn ATTRIB:BYTE ;AN000; | ||
| 87 | Extrn THISCDS:DWORD ;AN000; | ||
| 88 | Extrn THISSFT:DWORD ;AN000; | ||
| 89 | Extrn DMAADD:DWORD ;AN000; | ||
| 90 | Extrn CDSADDR:DWORD ;AN000; | ||
| 91 | Extrn SAVE_BX:WORD ;AN000; | ||
| 92 | Extrn SAVE_CX:WORD ;AN000; | ||
| 93 | Extrn SAVE_DX:WORD ;AN000; | ||
| 94 | Extrn SAVE_SI:WORD ;AN000; | ||
| 95 | Extrn SAVE_DI:WORD ;AN000; | ||
| 96 | Extrn SAVE_DS:WORD ;AN000; | ||
| 97 | Extrn SAVE_ES:WORD ;AN000; | ||
| 98 | Extrn Name1:BYTE ;AN000; | ||
| 99 | Extrn DEVPT:DWORD ;AN000; | ||
| 100 | Extrn CPSWFLAG:BYTE | ||
| 101 | Extrn COUNTRY_CDPG:BYTE | ||
| 102 | if debug ;AN000; | ||
| 103 | Extrn BugLev:WORD ;AN000; | ||
| 104 | Extrn BugTyp:WORD ;AN000; | ||
| 105 | include bugtyp.asm ;AN000; | ||
| 106 | endif ;AN000; | ||
| 107 | DATA ENDS ;AN000; | ||
| 108 | ;AN000; | ||
| 109 | ;AN000; | ||
| 110 | ; define our own code segment ;AN000; | ||
| 111 | ;AN000; | ||
| 112 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 113 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 114 | ;AN000; | ||
| 115 | ;IFS Data ;AN000; | ||
| 116 | Extrn IFSR:WORD ;AN000; | ||
| 117 | Extrn IFSDRV:BYTE ;AN000; | ||
| 118 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 119 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 120 | Extrn THISIFS:DWORD ;AN000; | ||
| 121 | Extrn THISDFL:DWORD ;AN000; | ||
| 122 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 123 | Extrn SFT_SERIAL_NUMBER:WORD ;AN004; | ||
| 124 | Extrn fAssign:BYTE ;AN014; | ||
| 125 | ;AN000; | ||
| 126 | BREAK <IFS_DISK_INFO Get disk Info> ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | ;************************************************************************************ ;AN000; | ||
| 129 | ; ;AN000; | ||
| 130 | ; IFS_DISK_INFO ;AN000; | ||
| 131 | ; ;AN000; | ||
| 132 | ; Input: ;AN000; | ||
| 133 | ; ES:DI -> CDS (not NULL) ;AN000; | ||
| 134 | ; DS -> DOSGROUP ;AN000; | ||
| 135 | ; Function: ;AN000; | ||
| 136 | ; Prep IFSRH: ;AN000; | ||
| 137 | ; * IFSR_LENGTH DW 48 ; Total length of request ;AN000; | ||
| 138 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 139 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 140 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 141 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 142 | ; * IFSR_APIFUNC DB 2 ; Disk Attributes ;AN000; | ||
| 143 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 144 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 145 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 146 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 147 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 148 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 149 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 150 | ; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; | ||
| 151 | ; ; and set this as pointer to it. ;AN000; | ||
| 152 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 153 | ; + IFSR_ALLOCUNITS DW number of allocation units ;AN000; | ||
| 154 | ; + IFSR_ALLOCSIZE DW allocation unit sectors ;AN000; | ||
| 155 | ; + IFSR_SECTSIZE DW sector size ;AN000; | ||
| 156 | ; + IFSR_AVAILALLOC DW free allocation units ;AN000; | ||
| 157 | ; + IFSR_FSID DB file system media id ;AN000; | ||
| 158 | ; IFSR_RESV3 DB 0 ;AN000; | ||
| 159 | ; ;AN000; | ||
| 160 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 161 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 162 | ; DO ;AN000; | ||
| 163 | ; Call CD_TO_CDS to update CDS ;AN000; | ||
| 164 | ; Set: ;AN000; | ||
| 165 | ; DX = IFSR_AVAILALLOC ;AN000; | ||
| 166 | ; BX = IFSR_ALLOCUNITS ;AN000; | ||
| 167 | ; CX = IFSR_SECTSIZE ;AN000; | ||
| 168 | ; AL = IFSR_ALLOCSIZE ;AN000; | ||
| 169 | ; AH = IFSR_FSID ;AN000; | ||
| 170 | ; Clear carry ;AN000; | ||
| 171 | ; ENDDO ;AN000; | ||
| 172 | ; ELSE DO ;AN000; | ||
| 173 | ; Put error code in AX ;AN000; | ||
| 174 | ; Set carry ;AN000; | ||
| 175 | ; ENDDO ;AN000; | ||
| 176 | ; ENDIF ;AN000; | ||
| 177 | ; ;AN000; | ||
| 178 | ; Output: ;AN000; | ||
| 179 | ; DX = Number of free allocation units ;AN000; | ||
| 180 | ; BX = Total Number of allocation units on disk ;AN000; | ||
| 181 | ; CX = Sector size ;AN000; | ||
| 182 | ; AL = Sectors per allocation unit ;AN000; | ||
| 183 | ; AH = Media ID BYTE ;AN000; | ||
| 184 | ; Carry set if error ;AN000; | ||
| 185 | ; ;AN000; | ||
| 186 | ; Regs: Segs and DI preserved, others destroyed ;AN000; | ||
| 187 | ; ;AN000; | ||
| 188 | ;************************************************************************************ ;AN000; | ||
| 189 | ;AN000; | ||
| 190 | procedure IFS_DISK_INFO,NEAR ;AN000; | ||
| 191 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 192 | ;AN000; | ||
| 193 | MOV AX,DI ; set ifsDrv for possible I24 ;AN000; | ||
| 194 | invoke IFSDrvFromCDS ;AN000; | ||
| 195 | ;AN000; | ||
| 196 | ifsr_fcn_def EXECAPI ; define ifsr for diskattr ;AN000; | ||
| 197 | ifsr_api_def DISKATTR ;AN000; | ||
| 198 | MOV CS:IFSPROC_FLAGS,ZERO ; & processing flags ;AN000; | ||
| 199 | ;AN000; | ||
| 200 | PUSH ES ; set ds:si -> cds ;AN000; | ||
| 201 | POP DS ;AN000; | ||
| 202 | MOV SI,DI ;AN000; | ||
| 203 | ;AN000; | ||
| 204 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 205 | SaveReg <DS,SI> ; save for cd_to_cds ;AN000; | ||
| 206 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 207 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 208 | ; ES:BX -> IFSRH ;AN000; | ||
| 209 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 210 | ; ds - IFSSEG ;AN000; | ||
| 211 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DISKATTR ; prep IFSRH ;AN000; | ||
| 212 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 213 | MOV ES:[BX.IFSR_APIFUNC],IFSDISKATTR ;AN000; | ||
| 214 | ;AN000; | ||
| 215 | invoke CALL_IFS ; call fs with diskattr request ;AN000; | ||
| 216 | ;AN000; | ||
| 217 | JNC DA_20 ;AN000; | ||
| 218 | RestoreReg <DI,ES> ; error - restore stack ;AN000; | ||
| 219 | JMP FA_1000 ; go return ;AN000; | ||
| 220 | DA_20: ;AN000; | ||
| 221 | MOV DX,ES:[BX.IFSR_AVAILALLOC] ; no error - load return regs ;AN000; | ||
| 222 | MOV CX,ES:[BX.IFSR_SECTSIZE] ;AN000; | ||
| 223 | MOV AX,ES:[BX.IFSR_ALLOCSIZE] ;AN000; | ||
| 224 | MOV AH,ES:[BX.IFSR_FSID] ;AN000; | ||
| 225 | MOV BX,ES:[BX.IFSR_ALLOCUNITS] ;AM002; | ||
| 226 | RestoreReg <DI,ES> ; restore cds into es:di ;AN000; | ||
| 227 | invoke CD_TO_CDS ;AN000; | ||
| 228 | CLC ;AN000; | ||
| 229 | JMP FA_1000 ; go ret in file attr routine ;AN000; | ||
| 230 | ; since it restores ds-dosgroup ;AN000; | ||
| 231 | ;AN000; | ||
| 232 | EndProc IFS_DISK_INFO ;AN000; | ||
| 233 | ;AN000; | ||
| 234 | ;AN000; | ||
| 235 | BREAK <IFS_SEQ_SET_FILE_ATTRIBUTE - Seq Set File Attributes> ;AN000; | ||
| 236 | ;AN000; | ||
| 237 | ;************************************************************************************ ;AN000; | ||
| 238 | ; ;AN000; | ||
| 239 | ; IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 240 | ; ;AN000; | ||
| 241 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 242 | ; ;AN000; | ||
| 243 | ;************************************************************************************ ;AN000; | ||
| 244 | ;AN000; | ||
| 245 | procedure IFS_SEQ_SET_FILE_ATTRIBUTE,NEAR ;AN000; | ||
| 246 | ;AN000; | ||
| 247 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 248 | ifsr_api_def FILEATTR ;AN000; | ||
| 249 | ;AN000; | ||
| 250 | PUSH AX ; save file attrs ;AN000; | ||
| 251 | ;AN000; | ||
| 252 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 253 | JC SA_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 254 | ;AN000; | ||
| 255 | PUSH CS ; get addressability to IFSSEG ;AN000; | ||
| 256 | POP DS ; prep ifsflags for set ;AN000; | ||
| 257 | ASSUME DS:IFSSEG ;AN000; | ||
| 258 | MOV IFSPROC_FLAGS,ZERO ;AN000; | ||
| 259 | JMP SHORT SFA_20 ; cont. in ifs_seq_get_fa ;AN000; | ||
| 260 | ;AN000; | ||
| 261 | EndProc IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 262 | ;AN000; | ||
| 263 | BREAK <IFS_SET_FILE_ATTRIBUTE - Set File Attributes> ;AN000; | ||
| 264 | ;AN000; | ||
| 265 | ;************************************************************************************ ;AN000; | ||
| 266 | ; ;AN000; | ||
| 267 | ; IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 268 | ; ;AN000; | ||
| 269 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 270 | ; ;AN000; | ||
| 271 | ;************************************************************************************ ;AN000; | ||
| 272 | ;AN000; | ||
| 273 | procedure IFS_SET_FILE_ATTRIBUTE,NEAR ;AN000; | ||
| 274 | ;AN000; | ||
| 275 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 276 | ifsr_api_def FILEATTR ;AN000; | ||
| 277 | ;AN000; | ||
| 278 | PUSH AX ; save file attrs ;AN000; | ||
| 279 | SA_20: ;AN000; | ||
| 280 | MOV CS:IFSPROC_FLAGS,0 ; prep ifsflags ;AN000; | ||
| 281 | JMP SHORT FA_20 ; cont. in ifs_get_file_info ;AN000; | ||
| 282 | ;AN000; | ||
| 283 | EndProc IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 284 | ;AN000; | ||
| 285 | BREAK <IFS_SEQ_GET_FILE_INFO - Seq Get File Attributes> ;AN000; | ||
| 286 | ;AN000; | ||
| 287 | ;************************************************************************************ ;AN000; | ||
| 288 | ; ;AN000; | ||
| 289 | ; IFS_SEQ_GET_FILE_ATTRIBUTE ;AN000; | ||
| 290 | ; ;AN000; | ||
| 291 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 292 | ; ;AN000; | ||
| 293 | ;************************************************************************************ ;AN000; | ||
| 294 | ;AN000; | ||
| 295 | procedure IFS_SEQ_GET_FILE_INFO,NEAR ;AN000; | ||
| 296 | ;AN000; | ||
| 297 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 298 | ifsr_api_def FILEATTR ;AN000; | ||
| 299 | ;AN000; | ||
| 300 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 301 | JC FA_10 ; cf=0 unc, cf=1 device ;AN000; | ||
| 302 | ;AN000; | ||
| 303 | PUSH CS ; prep ifsflags for get & seq ;AN000; | ||
| 304 | POP DS ;AN000; | ||
| 305 | ASSUME DS:IFSSEG ;AN000; | ||
| 306 | MOV IFSPROC_FLAGS,ISGET ;AN000; | ||
| 307 | ;AN000; | ||
| 308 | SFA_20: ;AN000; | ||
| 309 | OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; | ||
| 310 | invoke SET_THISIFS_UNC ; set thisifs = unc ;AN000; | ||
| 311 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 312 | JMP SHORT FA_200 ; cont. in ifs_get_file_info ;AN000; | ||
| 313 | ;AN000; | ||
| 314 | EndProc IFS_SEQ_GET_FILE_INFO ;AN000; | ||
| 315 | ;AN000; | ||
| 316 | BREAK <IFS_GET_FILE_INFO - Get File Attributes> ;AN000; | ||
| 317 | ;AN000; | ||
| 318 | ;************************************************************************************ ;AN000; | ||
| 319 | ; ;AN000; | ||
| 320 | ; GET_FILE_INFO ;AN000; | ||
| 321 | ; ;AN000; | ||
| 322 | ; Routines called: DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 323 | ; ;AN000; | ||
| 324 | ; Inputs: ;AN000; | ||
| 325 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 326 | ; terminated) ;AN000; | ||
| 327 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 328 | ; (Low word = -1 if NUL CDS (dfl)) ;AN000; | ||
| 329 | ; [SATTRIB] is attribute of search (determines what files may be found) ;AN000; | ||
| 330 | ; AX is new attributes to give to file (already checked for bad bits) ;AN000; | ||
| 331 | ; Function: ;AN000; | ||
| 332 | ; ;AN000; | ||
| 333 | ; IF seq call THEN ;AN000; | ||
| 334 | ; DO ;AN000; | ||
| 335 | ; Set IFS Header pointer to UNC IFS ;AN000; | ||
| 336 | ; Set IFSR_DEVICE_CB@ = null ;AN000; | ||
| 337 | ; ENDDO ;AN000; | ||
| 338 | ; ELSE DO ;AN000; | ||
| 339 | ; IF [THISCDS] .NOT. NULL THEN ;AN000; | ||
| 340 | ; CALL CDS_TO_CD ;AN000; | ||
| 341 | ; ELSE DO ;AN000; | ||
| 342 | ; CALL DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 343 | ; IF have DFL that supports single file fcns THEN ;AN000; | ||
| 344 | ; call DFL_TO_DF ;AN000; | ||
| 345 | ; ELSE set error - device not IFS or no single file support ;AN000; | ||
| 346 | ; ENDIF ;AN000; | ||
| 347 | ; ENDDO ;AN000; | ||
| 348 | ; ENDIF ;AN000; | ||
| 349 | ; ENDDO ;AN000; | ||
| 350 | ; IF no error THEN ;AN000; | ||
| 351 | ; DO ;AN000; | ||
| 352 | ; Prep IFSRH: ;AN000; | ||
| 353 | ; * IFSR_LENGTH DW 66 ; Total length of request ;AN000; | ||
| 354 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 355 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 356 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 357 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 358 | ; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name ;AN000; | ||
| 359 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 360 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 361 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 362 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 363 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 364 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 365 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 366 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF ;AN000; | ||
| 367 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 368 | ; * IFSR_FUNC DB ? ; 2=get 3=set depends on INT 2FH ;AN000; | ||
| 369 | ; * IFSR_RESV3 DB ? | ||
| 370 | ; * IFSR_SUBFUNC DB 0 ; in-line parms ;AN000; | ||
| 371 | ; * IFSR_RESV4 DB ? | ||
| 372 | ; IFSR_BUFFER1@ DD ? ; not used here | ||
| 373 | ; IFSR_BUFFER2@ DD ? ; not used here | ||
| 374 | ; IFSR_COUNT DW ? ; not used here | ||
| 375 | ; * IFSR_MATCHATTR DW ? ; format 0000000re0advshr ;AN000; | ||
| 376 | ; * IFSR_NAME@ DD ? ; ASCIIZ file name ptr ;AN000; | ||
| 377 | ; + IFSR_SIZE DD ? ; file size ;AN000; | ||
| 378 | ; + IFSR_DATE DW ? ; file date ;AN000; | ||
| 379 | ; + IFSR_TIME DW ? ; file time ;AN000; | ||
| 380 | ; *+ IFSR_ATTR DW ? ; file attribute ;AN000; | ||
| 381 | ; ; format 0000000re0advshr ;AN000; | ||
| 382 | ; ; Set to AX on set ;AN000; | ||
| 383 | ; ;AN000; | ||
| 384 | ; IF set THEN ;AN000; | ||
| 385 | ; DO ;AN000; | ||
| 386 | ; IFSR_FUNC = 3 ;AN000; | ||
| 387 | ; IFSR_ATTR = AX ;AN000; | ||
| 388 | ; ENDDO ;AN000; | ||
| 389 | ; ELSE IFSR_FUNC = 2 ;AN000; | ||
| 390 | ; ENDIF ;AN000; | ||
| 391 | ; CALL routine, CALL_IFS, with pointer to IFS Header ;AN000; | ||
| 392 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 393 | ; DO ;AN000; | ||
| 394 | ; IF cds THEN Call CD_TO_CDS ;AN000; | ||
| 395 | ; IF dfl THEN Call DF_TO_DFL ;AN000; | ||
| 396 | ; IF get THEN ;AN000; | ||
| 397 | ; DO ;AN000; | ||
| 398 | ; AX = IFSR_ATTR ;AN000; | ||
| 399 | ; CX = IFSR_TIME ;AN000; | ||
| 400 | ; DX = IFSR_DATE ;AN000; | ||
| 401 | ; BX:DI = IFSR_SIZE ;AN000; | ||
| 402 | ; ENDDO ;AN000; | ||
| 403 | ; Clear carry ;AN000; | ||
| 404 | ; ENDDO ;AN000; | ||
| 405 | ; ELSE DO ;AN000; | ||
| 406 | ; AX = IFSR_RETCODE ;AN000; | ||
| 407 | ; Set carry ;AN000; | ||
| 408 | ; ENDDO ;AN000; | ||
| 409 | ; ENDIF ;AN000; | ||
| 410 | ; ENDDO ;AN000; | ||
| 411 | ; ELSE Set carry ;AN000; | ||
| 412 | ; ENDIF ;AN000; | ||
| 413 | ; Outputs: ;AN000; | ||
| 414 | ; CARRY CLEAR ;AN000; | ||
| 415 | ; AX = ATTR ;AN000; | ||
| 416 | ; CX = TIME ;AN000; | ||
| 417 | ; DX = DATE ;AN000; | ||
| 418 | ; BX:DI = SIZE ;AN000; | ||
| 419 | ; CARRY SET ;AN000; | ||
| 420 | ; AX is error code ;AN000; | ||
| 421 | ; error_file_not_found ;AN000; | ||
| 422 | ; Last element of path not found ;AN000; | ||
| 423 | ; error_path_not_found ;AN000; | ||
| 424 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 425 | ; error_access_denied ;AN000; | ||
| 426 | ; Attempt to set an attribute which cannot be set ;AN000; | ||
| 427 | ; (attr_directory, attr_volume_ID) ;AN000; | ||
| 428 | ; error_sharing_violation ;AN000; | ||
| 429 | ; Sharing mode of file did not allow the change ;AN000; | ||
| 430 | ; (this request requires exclusive write/read access) ;AN000; | ||
| 431 | ; (INT 24H generated) ;AN000; | ||
| 432 | ; ;AN000; | ||
| 433 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 434 | ; ;AN000; | ||
| 435 | ;************************************************************************************ ;AN000; | ||
| 436 | ;AN000; | ||
| 437 | procedure IFS_GET_FILE_INFO,NEAR ;AN000; | ||
| 438 | ;AN000; | ||
| 439 | ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000; | ||
| 440 | ifsr_api_def FILEATTR ;AN000; | ||
| 441 | ;AN000; | ||
| 442 | FA_10: ;AN000; | ||
| 443 | MOV CS:IFSPROC_FLAGS,ISGET ; set for get ;AN000; | ||
| 444 | ;AN000; | ||
| 445 | FA_20: ;AN000; | ||
| 446 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 447 | CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; | ||
| 448 | JE FA_100 ;AN000; | ||
| 449 | LDS SI,[THISCDS] ;AN000; | ||
| 450 | ASSUME DS:NOTHING ;AN000; | ||
| 451 | TEST CS:IFSPROC_FLAGS,ISGET ;AN000; | ||
| 452 | JZ FA_40 ;AN000; | ||
| 453 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 454 | JMP SHORT FA_60 ;AN000; | ||
| 455 | FA_40: ;AN000; | ||
| 456 | RestoreReg <AX> ; want attr on stack to stay on top ;AN000; | ||
| 457 | SaveReg <DS,SI,AX> ; stack - ax,si,ds ;AN000; | ||
| 458 | ;AN000; | ||
| 459 | FA_60: ;AN000; | ||
| 460 | invoke PREP_IFSR ; clear ifsrh ;AN000; | ||
| 461 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 462 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 463 | ; ES:BX -> IFSRH ;AN000; | ||
| 464 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 465 | ; DS - IFSSEG ;AN000; | ||
| 466 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 467 | JMP FA_200 ;AN000; | ||
| 468 | ;AN000; | ||
| 469 | FA_100: ;AN000; | ||
| 470 | invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; | ||
| 471 | ; ES:BX -> IFSRH ;AN000; | ||
| 472 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 473 | ; DS - IFSSEG ;AN000; | ||
| 474 | JNC SHORT FA_200 ;AN000; | ||
| 475 | MOV AX,error_invalid_function ; error - invalid fcn ;AN000; | ||
| 476 | invoke SET_EXTERR_INFO ; set error info & ;AN000; | ||
| 477 | JMP FA_980 ; go return ;AN000; | ||
| 478 | ;AN000; | ||
| 479 | FA_200: ;AN000; | ||
| 480 | invoke DRIVE_FROM_CDS ; set IFSDrv for possible I24 ;AN000; | ||
| 481 | ;AN000; | ||
| 482 | MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; continue prepping ifsr ;AN000; | ||
| 483 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 484 | MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000; | ||
| 485 | TEST IFSPROC_FLAGS,ISGET ;AN000; | ||
| 486 | JNZ FA_220 ;AN000; | ||
| 487 | MOV ES:[BX.IFSR_FUNC],FUNC_SET_BY_NAME ;AN000; | ||
| 488 | POP ES:[BX.IFSR_ATTR] ; retrieve attr from stack ;AN000; | ||
| 489 | JMP SHORT FA_240 ;AN000; | ||
| 490 | FA_220: ;AN000; | ||
| 491 | MOV ES:[BX.IFSR_FUNC],FUNC_GET_BY_NAME ; get file info ;AN000; | ||
| 492 | ;AN000; | ||
| 493 | FA_240: ;AN000; | ||
| 494 | PUSH DS ; save ds - IFSSEG ;AN000; | ||
| 495 | PUSH SS ; get ds = dosgroup so can access ;AN000; | ||
| 496 | POP DS ; wfp_start, sattrib ;AN000; | ||
| 497 | ASSUME DS:DOSGROUP ;AN000; | ||
| 498 | ;AN000; | ||
| 499 | MOV SI,[WFP_START] ;AN000; | ||
| 500 | invoke STRIP_WFP_START ;AN000; | ||
| 501 | MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; | ||
| 502 | MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; | ||
| 503 | MOV AL,[SATTRIB] ;AN000; | ||
| 504 | XOR AH,AH ;AN000; | ||
| 505 | MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; | ||
| 506 | ;AN000; | ||
| 507 | POP DS ; restore ds=IFSSEG ;AN000; | ||
| 508 | ASSUME DS:IFSSEG ;AN000; | ||
| 509 | |||
| 510 | ;************************************************ | ||
| 511 | invoke CALL_IFS ; call ifs with file attr request ;AN000; | ||
| 512 | ;************************************************ | ||
| 513 | ;AN000; | ||
| 514 | JNC FA_260 ;AN000; | ||
| 515 | TEST IFSPROC_FLAGS,ISCDS ; request failed - ;AN000; | ||
| 516 | JZ FA_980 ; go set carry & return ;AN000; | ||
| 517 | ADD SP,4 ; if cds, restore stack first ;AN000; | ||
| 518 | JMP FA_980 ;AN000; | ||
| 519 | ;AN000; | ||
| 520 | FA_260: ; request successful ;AN000; | ||
| 521 | TEST IFSPROC_FLAGS,ISGET ; if get - prep return regs with ;AN000; | ||
| 522 | JZ FA_270 ; file info ;AN000; | ||
| 523 | MOV AX,ES:[BX.IFSR_ATTR] ;AN000; | ||
| 524 | MOV CX,ES:[BX.IFSR_TIME] ;AN000; | ||
| 525 | MOV DX,ES:[BX.IFSR_DATE] ;AN000; | ||
| 526 | MOV DI,ES:WORD PTR [BX.IFSR_SIZE] ;AN000; | ||
| 527 | MOV BX,ES:WORD PTR [BX.IFSR_SIZE+2] ;AC016; | ||
| 528 | FA_270: ;AN000; | ||
| 529 | TEST IFSPROC_FLAGS,ISCDS ; if cds - update cds w/cd ;AN000; | ||
| 530 | JZ FA_280 ;AN000; | ||
| 531 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 532 | invoke CD_TO_CDS ; cd-cds ;AN000; | ||
| 533 | JMP SHORT FA_990 ; go clc & return ;AN000; | ||
| 534 | FA_280: ;AN000; | ||
| 535 | TEST IFSPROC_FLAGS,ISSEQ ;AN000; | ||
| 536 | JNZ FA_990 ;AN000; | ||
| 537 | invoke DF_TO_DFL ; update dfl w/df ;AN000; | ||
| 538 | JMP SHORT FA_990 ;AN000; | ||
| 539 | ;AN000; | ||
| 540 | FA_980: ;AN000; | ||
| 541 | STC ;AN000; | ||
| 542 | JMP SHORT FA_1000 ;AN000; | ||
| 543 | FA_990: ;AN000; | ||
| 544 | CLC ;AN000; | ||
| 545 | FA_1000: ;AN000; | ||
| 546 | PUSH SS ; restore original ds (dosgroup) ;AN000; | ||
| 547 | POP DS ; since this routine preserves ds ;AN000; | ||
| 548 | return ;AN000; | ||
| 549 | ;AN000; | ||
| 550 | ;AN000; | ||
| 551 | EndProc IFS_GET_FILE_INFO ;AN000; | ||
| 552 | ;AN000; | ||
| 553 | BREAK <IFS_SEQ_RENAME Rename> ;AN000; | ||
| 554 | ;************************************************************************************ ;AN000; | ||
| 555 | ; ;AN000; | ||
| 556 | ; IFS_SEQ_RENAME ;AN000; | ||
| 557 | ; ;AN000; | ||
| 558 | ; see ifs_rename for details ;AN000; | ||
| 559 | ; ;AN000; | ||
| 560 | ;************************************************************************************ ;AN000; | ||
| 561 | procedure IFS_SEQ_RENAME,NEAR ;AN000; | ||
| 562 | ;AN000; | ||
| 563 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 564 | ifsr_api_def RENFILE ;AN000; | ||
| 565 | ;AN000; | ||
| 566 | MOV CS:IFSPROC_FLAGS,ISREN ; set for rename and cont. ;AN000; | ||
| 567 | JMP SHORT SD_10 ; in ifs_seq_delete ;AN000; | ||
| 568 | ;AN000; | ||
| 569 | ;AN000; | ||
| 570 | EndProc IFS_SEQ_RENAME ;AN000; | ||
| 571 | ;AN000; | ||
| 572 | ;AN000; | ||
| 573 | BREAK <IFS_RENAME Rename> ;AN000; | ||
| 574 | ;AN000; | ||
| 575 | ;************************************************************************************ ;AN000; | ||
| 576 | ; ;AN000; | ||
| 577 | ; IFS_RENAME ;AN000; | ||
| 578 | ; ;AN000; | ||
| 579 | ; Inputs: ;AN000; | ||
| 580 | ; [WFP_START] Points to SOURCE WFP string ("//" must be first 2 ;AN000; | ||
| 581 | ; chars, NUL terminated) ;AN000; | ||
| 582 | ; [REN_WFP] Points to DEST WFP string ("//" must be first 2 ;AN000; | ||
| 583 | ; chars, NUL terminated) ;AN000; | ||
| 584 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 585 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 586 | ; Function: ;AN000; | ||
| 587 | ; same processing as delete except for following parms: ;AN000; | ||
| 588 | ; * IFSR_LENGTH DB 48 ;AN000; | ||
| 589 | ; * IFSR_APIFUNC DB 7 ; Rename file ;AN000; | ||
| 590 | ; * IFSR_NAME1@ DD ? ; addr of WFP_START ;AN000; | ||
| 591 | ; * IFSR_NAME2@ DD ? ; addr of REN_WFP ;AN000; | ||
| 592 | ; ;AN000; | ||
| 593 | ; Outputs: ;AN000; | ||
| 594 | ; CARRY CLEAR ;AN000; | ||
| 595 | ; OK ;AN000; | ||
| 596 | ; CARRY SET ;AN000; | ||
| 597 | ; AX is error code ;AN000; | ||
| 598 | ; error_file_not_found ;AN000; | ||
| 599 | ; No match for source, or dest path invalid ;AN000; | ||
| 600 | ; error_not_same_device ;AN000; | ||
| 601 | ; Source and dest are on different devices ;AN000; | ||
| 602 | ; error_access_denied ;AN000; | ||
| 603 | ; Directory specified (not simple rename), ;AN000; | ||
| 604 | ; Device name given, Destination exists. ;AN000; | ||
| 605 | ; NOTE: In third case some renames may have ;AN000; | ||
| 606 | ; been done if metas. ;AN000; | ||
| 607 | ; error_path_not_found ;AN000; | ||
| 608 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 609 | ; SOURCE ONLY ;AN000; | ||
| 610 | ; error_sharing_violation ;AN000; | ||
| 611 | ; Deny both access required, generates an INT 24. ;AN000; | ||
| 612 | ; DS preserved, others destroyed ;AN000; | ||
| 613 | ; ;AN000; | ||
| 614 | ;************************************************************************************ ;AN000; | ||
| 615 | ;AN000; | ||
| 616 | procedure IFS_RENAME,NEAR ;AN000; | ||
| 617 | ;AN000; | ||
| 618 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 619 | ifsr_api_def RENFILE ;AN000; | ||
| 620 | ;AN000; | ||
| 621 | MOV CS:IFSPROC_FLAGS,ISREN ; set for rename ;AN000; | ||
| 622 | JMP SHORT D_20 ; processing continues in ifs_delete ;AN000; | ||
| 623 | ;AN000; | ||
| 624 | EndProc IFS_RENAME ;AN000; | ||
| 625 | ;AN000; | ||
| 626 | ;AN000; | ||
| 627 | BREAK <IFS_SEQ_DELETE Delete> ;AN000; | ||
| 628 | ;AN000; | ||
| 629 | ;************************************************************************************ ;AN000; | ||
| 630 | ; ;AN000; | ||
| 631 | ; IFS_SEQ_DELETE ;AN000; | ||
| 632 | ; ;AN000; | ||
| 633 | ; see ifs_delete for details ;AN000; | ||
| 634 | ; ;AN000; | ||
| 635 | ;************************************************************************************ ;AN000; | ||
| 636 | procedure IFS_SEQ_DELETE,NEAR ;AN000; | ||
| 637 | ;AN000; | ||
| 638 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 639 | ifsr_api_def DELFILE ;AN000; | ||
| 640 | ;AN000; | ||
| 641 | MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; | ||
| 642 | SD_10: ;AN000; | ||
| 643 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 644 | JC D_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 645 | ;AN000; | ||
| 646 | SD_20: ; welcome ifs_seq_rename code ;AN000; | ||
| 647 | PUSH CS ;AN000; | ||
| 648 | POP DS ;AN000; | ||
| 649 | ASSUME DS:IFSSEG ;AN000; | ||
| 650 | OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; | ||
| 651 | invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; | ||
| 652 | JMP SHORT D_30 ; cont. in ifs_delete ;AN000; | ||
| 653 | ;AN000; | ||
| 654 | EndProc IFS_SEQ_DELETE ;AN000; | ||
| 655 | ;AN000; | ||
| 656 | ;AN000; | ||
| 657 | BREAK <IFS_DELETE Delete> ;AN000; | ||
| 658 | ;AN000; | ||
| 659 | ;************************************************************************************ ;AN000; | ||
| 660 | ; ;AN000; | ||
| 661 | ; IFS_DELETE ;AN000; | ||
| 662 | ; ;AN000; | ||
| 663 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 664 | ; ;AN000; | ||
| 665 | ; Routines called: CDS_TO_CD ;AN000; | ||
| 666 | ; CD_TO_CDS CALL_IFS ;AN000; | ||
| 667 | ; ;AN000; | ||
| 668 | ; Inputs: ;AN000; | ||
| 669 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 670 | ; terminated) ;AN000; | ||
| 671 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 672 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 673 | ; Function: ;AN000; | ||
| 674 | ; IF INT 2FH call .NOT. SEQ version THEN ;AN000; | ||
| 675 | ; DO ;AN000; | ||
| 676 | ; IF [THISCDS] .NOT. NULL THEN ;AN000; | ||
| 677 | ; DO ;AN000; | ||
| 678 | ; CALL CDS_TO_CD ;AN000; | ||
| 679 | ; Set IFS_DEVICE_CB@ as pointer to CD ;AN000; | ||
| 680 | ; Set IFS_HDR_PTR = CURDIR_IFS_HDR ;AN000; | ||
| 681 | ; ENDDO ;AN000; | ||
| 682 | ; ELSE DO ;AN000; | ||
| 683 | ; Set AX = invalid function ;AN000; | ||
| 684 | ; Set extended error info ;AN000; | ||
| 685 | ; ENDDO ;AN000; | ||
| 686 | ; ENDIF ;AN000; | ||
| 687 | ; ENDDO ;AN000; | ||
| 688 | ; ELSE DO ;AN000; | ||
| 689 | ; Set IFS_DEVICE_CB@ to NULL ;AN000; | ||
| 690 | ; Set IFS_HDR_PTR = [UNC_FS_HDR] ;AN000; | ||
| 691 | ; ENDDO ;AN000; | ||
| 692 | ; ENDIF ;AN000; | ||
| 693 | ; IF no error THEN ;AN000; | ||
| 694 | ; DO ;AN000; | ||
| 695 | ; Prep IFSRH: ;AN000; | ||
| 696 | ; * IFSR_LENGTH DW 44 ; Total length of request ;AN000; | ||
| 697 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 698 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 699 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 700 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 701 | ; * IFSR_APIFUNC DB 6 ; Delete file ;AN000; | ||
| 702 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 703 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 704 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 705 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 706 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 707 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 708 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 709 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD ;AN000; | ||
| 710 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 711 | ; * IFSR_MATCHATTR DW ? ; attribute - format 00000000e0a00shr ;AN000; | ||
| 712 | ; * IFSR_NAME@ DD ? ; filename to delete ;AN000; | ||
| 713 | ; ;AN000; | ||
| 714 | ; Call routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 715 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 716 | ; DO ;AN000; | ||
| 717 | ; Call CD_TO_CDS or DF_TO_DFL ;AN000; | ||
| 718 | ; Clear carry ;AN000; | ||
| 719 | ; ENDDO ;AN000; | ||
| 720 | ; ELSE DO ;AN000; | ||
| 721 | ; AX = IFSR_RETCODE ;AN000; | ||
| 722 | ; Set carry ;AN000; | ||
| 723 | ; ENDDO ;AN000; | ||
| 724 | ; ENDIF ;AN000; | ||
| 725 | ; ENDDO ;AN000; | ||
| 726 | ; ELSE set carry ;AN000; | ||
| 727 | ; ENDIF ;AN000; | ||
| 728 | ; ;AN000; | ||
| 729 | ; Outputs: ;AN000; | ||
| 730 | ; CARRY CLEAR ;AN000; | ||
| 731 | ; OK ;AN000; | ||
| 732 | ; CARRY SET ;AN000; | ||
| 733 | ; AX is error code ;AN000; | ||
| 734 | ; error_file_not_found ;AN000; | ||
| 735 | ; Last element of path not found ;AN000; | ||
| 736 | ; error_path_not_found ;AN000; | ||
| 737 | ; Bad path ;AN000; | ||
| 738 | ; error_access_denied ;AN000; | ||
| 739 | ; Attempt to delete device or directory ;AN000; | ||
| 740 | ; DS preserved, others destroyed ;AN000; | ||
| 741 | ; ;AN000; | ||
| 742 | ;************************************************************************************ ;AN000; | ||
| 743 | ;AN000; | ||
| 744 | procedure IFS_DELETE,NEAR ;AN000; | ||
| 745 | ;AN000; | ||
| 746 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 747 | ifsr_api_def DELFILE ;AN000; | ||
| 748 | ;AN000; | ||
| 749 | MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; | ||
| 750 | ;AN000; | ||
| 751 | D_20: ; (Welcome ifs_ren) ;AN000; | ||
| 752 | ASSUME DS:DOSGROUP ;AN000; | ||
| 753 | invoke DRIVE_FROM_CDS ; ds - dosgroup ;AN000; | ||
| 754 | CMP WORD PTR [THISCDS],NULL_PTR ; CDS must not be null ;AN000; | ||
| 755 | JNE D_30 ;AN000; | ||
| 756 | MOV AX,error_invalid_function ;AN000; | ||
| 757 | invoke SET_EXTERR_INFO ;AN000; | ||
| 758 | JMP FA_980 ; go up, preserve ds, ret w/carry ;AN000; | ||
| 759 | D_30: ; (Welcome seq ren/del code) ;AN000; | ||
| 760 | invoke PREP_IFSR ; zero ifsr, es:bx -> ifsr ;AN000; | ||
| 761 | MOV SI,[WFP_START] ;AN000; | ||
| 762 | invoke STRIP_WFP_START ;AN000; | ||
| 763 | TEST CS:IFSPROC_FLAGS,ISREN ;AN000; | ||
| 764 | JZ D_40 ; rename ;AN000; | ||
| 765 | MOV ES:WORD PTR [BX.IFSR_NAME1@],SI ; ifsr_name1@ & 2@ ;AN000; | ||
| 766 | MOV ES:WORD PTR [BX.IFSR_NAME1@+2],DS ;AN000; | ||
| 767 | MOV SI,[REN_WFP] ;AN000; | ||
| 768 | CMP BYTE PTR DS:[SI+1],":" ;AN000; | ||
| 769 | JNE D_36 ;AN000; | ||
| 770 | ADD SI,2 ;AN000; | ||
| 771 | D_36: ;AN000; | ||
| 772 | MOV ES:WORD PTR [BX.IFSR_NAME2@],SI ;AN000; | ||
| 773 | MOV ES:WORD PTR [BX.IFSR_NAME2@+2],DS ;AN000; | ||
| 774 | MOV ES:[BX.IFSR_LENGTH],LENGTH_RENFILE ; ifsr_length ;AN000; | ||
| 775 | MOV ES:[BX.IFSR_APIFUNC],IFSRENFILE ; ifsr_apifunc ;AN000; | ||
| 776 | JMP SHORT D_60 ;AN000; | ||
| 777 | D_40: ; delete ;AN000; | ||
| 778 | MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; | ||
| 779 | MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; | ||
| 780 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DELFILE ; ifsr_length ;AN000; | ||
| 781 | MOV ES:[BX.IFSR_APIFUNC],IFSDELFILE ; ifsr_apifunc ;AN000; | ||
| 782 | D_60: ;AN000; | ||
| 783 | MOV AL,[SATTRIB] ;AN000; | ||
| 784 | XOR AH,AH ;AN000; | ||
| 785 | MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; | ||
| 786 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ; ifsr_function ;AN000; | ||
| 787 | ;AN000; | ||
| 788 | TEST CS:IFSPROC_FLAGS,ISSEQ ; if unc, don't do cds stuff ;AN000; | ||
| 789 | JNZ D_70 ;AN000; | ||
| 790 | LDS SI,[THISCDS] ;AN000; | ||
| 791 | ASSUME DS:NOTHING ;AN000; | ||
| 792 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 793 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 794 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 795 | ; ES:BX -> IFSRH ;AN000; | ||
| 796 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 797 | ; ds - IFSSEG ;AN000; | ||
| 798 | ;AN000; | ||
| 799 | D_70: ;AN000; | ||
| 800 | invoke CALL_IFS ; call ifs w/request ;AN000; | ||
| 801 | ;AN000; | ||
| 802 | JNC D_80 ;AN000; | ||
| 803 | TEST IFSPROC_FLAGS,ISSEQ ; fs error - restore stack ;AN000; | ||
| 804 | JZ D_75 ; if not unc - go ret ;AN000; | ||
| 805 | JMP FA_980 ;AC009; | ||
| 806 | D_75: ;AN000; | ||
| 807 | ADD SP,4 ;AN000; | ||
| 808 | JMP FA_980 ;AC009; | ||
| 809 | ;AN000; | ||
| 810 | D_80: ;AN000; | ||
| 811 | TEST IFSPROC_FLAGS,ISSEQ ; fs successful ;AN000; | ||
| 812 | JZ D_90 ; if seq, just ret ;AN000; | ||
| 813 | JMP FA_990 ;AN000; | ||
| 814 | D_90: ; else - ;AN000; | ||
| 815 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 816 | invoke CD_TO_CDS ;AN000; | ||
| 817 | JMP FA_990 ; go up & ret in fa to preserve ds ;AN000; | ||
| 818 | ;AN000; | ||
| 819 | ;AN000; | ||
| 820 | EndProc IFS_DELETE ;AN000; | ||
| 821 | ;AN000; | ||
| 822 | BREAK <IFS_SEQ_OPEN Open> ;AN000; | ||
| 823 | ;************************************************************************************ ;AN000; | ||
| 824 | ; see IFS_OPEN for details ;AN000; | ||
| 825 | ;************************************************************************************ ;AN000; | ||
| 826 | ;AN000; | ||
| 827 | procedure IFS_SEQ_OPEN,NEAR ;AN000; | ||
| 828 | ;AN000; | ||
| 829 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 830 | ifsr_api_def OPENFILE ;AN000; | ||
| 831 | ;AN000; | ||
| 832 | PUSH AX ; save access/share byte ;AN000; | ||
| 833 | ;AN000; | ||
| 834 | MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; remember this is old open ;AN000; | ||
| 835 | JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; | ||
| 836 | ;AN000; | ||
| 837 | EndProc IFS_SEQ_OPEN ;AN000; | ||
| 838 | ;AN000; | ||
| 839 | BREAK <IFS_OPEN Open> ;AN000; | ||
| 840 | ;AN000; | ||
| 841 | ;************************************************************************************ ;AN000; | ||
| 842 | ; ;AN000; | ||
| 843 | ; IFS_OPEN ;AN000; | ||
| 844 | ; ;AN000; | ||
| 845 | ; Inputs: ;AN000; | ||
| 846 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 847 | ; terminated) ;AN000; | ||
| 848 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 849 | ; [THISSFT] Points to SFT to fill in if file found ;AN000; | ||
| 850 | ; (sf_mode field set so that FCB may be detected) ;AN000; | ||
| 851 | ; ES:DI = [THISSFT] ;AN000; | ||
| 852 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 853 | ; AX is Access and Sharing mode ;AN000; | ||
| 854 | ; High NIBBLE of AL (Sharing Mode) ;AN000; | ||
| 855 | ; sharing_compat file is opened in compatibility mode ;AN000; | ||
| 856 | ; sharing_deny_none file is opened Multi reader, Multi writer ;AN000; | ||
| 857 | ; sharing_deny_read file is opened Only reader, Multi writer ;AN000; | ||
| 858 | ; sharing_deny_write file is opened Multi reader, Only writer ;AN000; | ||
| 859 | ; sharing_deny_both file is opened Only reader, Only writer ;AN000; | ||
| 860 | ; Low NIBBLE of AL (Access Mode) ;AN000; | ||
| 861 | ; open_for_read file is opened for reading ;AN000; | ||
| 862 | ; open_for_write file is opened for writing ;AN000; | ||
| 863 | ; open_for_both file is opened for both reading and writing. ;AN000; | ||
| 864 | ; ;AN000; | ||
| 865 | ; For FCB SFTs AL should = -1 ;AN000; | ||
| 866 | ; (not checked) ;AN000; | ||
| 867 | ; Function: ;AN000; | ||
| 868 | ; see IFS_XOPEN ;AN000; | ||
| 869 | ; Outputs: ;AN000; | ||
| 870 | ; sf_ref_count is NOT altered ;AN000; | ||
| 871 | ; CARRY CLEAR ;AN000; | ||
| 872 | ; THISSFT filled in. ;AN000; | ||
| 873 | ; CARRY SET ;AN000; | ||
| 874 | ; AX is error code ;AN000; | ||
| 875 | ; error_file_not_found ;AN000; | ||
| 876 | ; Last element of path not found ;AN000; | ||
| 877 | ; error_path_not_found ;AN000; | ||
| 878 | ; Bad path ;AN000; | ||
| 879 | ; error_access_denied ;AN000; | ||
| 880 | ; Attempt to open read only file for writting, or ;AN000; | ||
| 881 | ; open a directory ;AN000; | ||
| 882 | ; error_sharing_violation ;AN000; | ||
| 883 | ; The sharing mode was correct but not allowed ;AN000; | ||
| 884 | ; generates an INT 24 on compatibility mode SFTs ;AN000; | ||
| 885 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 886 | ; ;AN000; | ||
| 887 | ;************************************************************************************ ;AN000; | ||
| 888 | ;AN000; | ||
| 889 | procedure IFS_OPEN,NEAR ;AN000; | ||
| 890 | ;AN000; | ||
| 891 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 892 | ifsr_api_def OPENFILE ;AN000; | ||
| 893 | ;AN000; | ||
| 894 | PUSH AX ; save access/share mode ;AN000; | ||
| 895 | ;AN000; | ||
| 896 | MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; set for old open ;AN000; | ||
| 897 | JMP SHORT XO_20 ; Rest of processing in ;AN000; | ||
| 898 | ; extended open routine. ;AN000; | ||
| 899 | EndProc IFS_Open ;AN000; | ||
| 900 | ;AN000; | ||
| 901 | BREAK <IFS_SEQ_CREATE Open> ;AN000; | ||
| 902 | ;AN000; | ||
| 903 | ;************************************************************************************ ;AN000; | ||
| 904 | ; ;AN000; | ||
| 905 | ; IFS_SEQ_CREATE ;AN000; | ||
| 906 | ; ;AN000; | ||
| 907 | ; see IFS_CREATE for details ;AN000; | ||
| 908 | ; ;AN000; | ||
| 909 | ;************************************************************************************ ;AN000; | ||
| 910 | ;AN000; | ||
| 911 | procedure IFS_SEQ_CREATE,NEAR ;AN000; | ||
| 912 | ;AN000; | ||
| 913 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 914 | ifsr_api_def OPENFILE ;AN000; | ||
| 915 | ;AN000; | ||
| 916 | PUSH AX ; save attribute ;AN000; | ||
| 917 | ;AN000; | ||
| 918 | MOV CS:IFSPROC_FLAGS,IsOldCreate + IsCreate ; remember is old create ;AN012; | ||
| 919 | JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; | ||
| 920 | ;AN000; | ||
| 921 | EndProc IFS_SEQ_CREATE ;AN000; | ||
| 922 | ;AN000; | ||
| 923 | BREAK <IFS_CREATE Create> ;AN000; | ||
| 924 | ;AN000; | ||
| 925 | ;************************************************************************************ ;AN000; | ||
| 926 | ; ;AN000; | ||
| 927 | ; IFS_CREATE ;AN000; | ||
| 928 | ; ;AN000; | ||
| 929 | ; Inputs: ;AN000; | ||
| 930 | ; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; | ||
| 931 | ; terminated) ;AN000; | ||
| 932 | ; [CURR_DIR_END] Points to end of Current dir part of string ;AN000; | ||
| 933 | ; ( = -1 if current dir not involved, else ;AN000; | ||
| 934 | ; Points to first char after last "/" of current dir part) ;AN000; | ||
| 935 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 936 | ; [THISSFT] Points to SFT to fill in if file created ;AN000; | ||
| 937 | ; (sf_mode field set so that FCB may be detected) ;AN000; | ||
| 938 | ; ES:DI = [THISSFT] ;AN000; | ||
| 939 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 940 | ; AL is Attribute to create ;AN000; | ||
| 941 | ; AH is 0 if CREATE, non zero if CREATE_NEW ;AN000; | ||
| 942 | ; Function: ;AN000; | ||
| 943 | ; See IFS_XOPEN for details ;AN000; | ||
| 944 | ; Outputs: ;AN000; | ||
| 945 | ; sf_ref_count is NOT altered ;AN000; | ||
| 946 | ; CARRY CLEAR ;AN000; | ||
| 947 | ; THISSFT filled in. ;AN000; | ||
| 948 | ; sf_mode = sharing_compat + open_for_both for Non-FCB SFT ;AN000; | ||
| 949 | ; CARRY SET ;AN000; | ||
| 950 | ; AX is error code ;AN000; | ||
| 951 | ; error_path_not_found ;AN000; | ||
| 952 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 953 | ; error_access_denied ;AN000; | ||
| 954 | ; Attempt to re-create read only file , or ;AN000; | ||
| 955 | ; create a second volume id or create a dir ;AN000; | ||
| 956 | ; error_sharing_violation ;AN000; | ||
| 957 | ; The sharing mode was correct but not allowed ;AN000; | ||
| 958 | ; generates an INT 24 ;AN000; | ||
| 959 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 960 | ; ;AN000; | ||
| 961 | ;************************************************************************************ ;AN000; | ||
| 962 | ;AN000; | ||
| 963 | procedure IFS_CREATE,NEAR ;AN000; | ||
| 964 | ;AN000; | ||
| 965 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 966 | ifsr_api_def OPENFILE ;AN000; | ||
| 967 | ;AN000; | ||
| 968 | PUSH AX ; save attribute ;AN000; | ||
| 969 | ;AN000; | ||
| 970 | MOV CS:IFSPROC_FLAGS,ISOLDCREATE ; remember is old create ;AN000; | ||
| 971 | JMP SHORT XO_20 ; cont. in ifs_xopen ;AN000; | ||
| 972 | ;AN000; | ||
| 973 | EndProc IFS_Create ;AN000; | ||
| 974 | ;AN000; | ||
| 975 | ;AN000; | ||
| 976 | BREAK <IFS_SEQ_XOPEN Open> ;AN000; | ||
| 977 | ;AN000; | ||
| 978 | ;************************************************************************************ ;AN000; | ||
| 979 | ; ;AN000; | ||
| 980 | ; IFS_SEQ_XOPEN ;AN000; | ||
| 981 | ; ;AN000; | ||
| 982 | ; see IFS_XOPEN for details ;AN000; | ||
| 983 | ; ;AN000; | ||
| 984 | ;************************************************************************************ ;AN000; | ||
| 985 | ;AN000; | ||
| 986 | procedure IFS_SEQ_XOPEN,NEAR ;AN000; | ||
| 987 | ;AN000; | ||
| 988 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 989 | ifsr_api_def OPENFILE ;AN000; | ||
| 990 | ;AN000; | ||
| 991 | MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; | ||
| 992 | SXO_10: ;AN000; | ||
| 993 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 994 | JC XO_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 995 | ;AN000; | ||
| 996 | SXO_20: ;AN000; | ||
| 997 | PUSH CS ; ds-ifsseg ;AN000; | ||
| 998 | POP DS ;AN000; | ||
| 999 | ASSUME DS:IFSSEG ;AN000; | ||
| 1000 | ;AN000; | ||
| 1001 | OR IFSPROC_FLAGS,ISSEQ ; SEQ = UNC ;AN000; | ||
| 1002 | invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; | ||
| 1003 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1004 | JMP XO_200 ; cont. in ifs_xopen ;AN000; | ||
| 1005 | ;AN000; | ||
| 1006 | EndProc IFS_SEQ_XOPEN ;AN000; | ||
| 1007 | ;AN000; | ||
| 1008 | ;AN000; | ||
| 1009 | BREAK <IFS_XOPEN Open> ;AN000; | ||
| 1010 | ;AN000; | ||
| 1011 | ;************************************************************************************ | ||
| 1012 | ; | ||
| 1013 | ; IFS_XOPEN | ||
| 1014 | ; | ||
| 1015 | ; Called by: IFSFUNC dispatcher | ||
| 1016 | ; | ||
| 1017 | ; Routines called: CALL_IFS DFL_MATCH | ||
| 1018 | ; CD_TO_CDS DFL_TO_DF | ||
| 1019 | ; CDS_TO_CD DF_TO_DFL | ||
| 1020 | ; SFT_TO_SFF | ||
| 1021 | ; SF_TO_SFT | ||
| 1022 | ; | ||
| 1023 | ; Inputs: | ||
| 1024 | ; [THISCDS] Set | ||
| 1025 | ; [THISSFT] Set | ||
| 1026 | ; [SAVE_DX] = FLAG: FUNCTION CONTROL, FORMAT=0000000C NNNN EEEE | ||
| 1027 | ; C 0=VALIDATE CODE PAGE, 1=NO CODE PAGE CHECK | ||
| 1028 | ; NNNN=DOES NOT EXIST ACTION: 0=FAIL, 1=CREATE | ||
| 1029 | ; EEEE=EXISTS ACTION : 0=FAIL, 1=OPEN, 2=REPLACE/OPEN | ||
| 1030 | ; [SAVE_BX] = MODE OPEN MODE FORMAT : 0WF00000ISSS0AAA | ||
| 1031 | ; AAA = ACCESS CODE: 0=READ, 1=WRITE, 2=READ/WRITE | ||
| 1032 | ; 3=EXECUTE (UNDOCUMENTED) | ||
| 1033 | ; 7=FCB (UNDOCUMENTED) | ||
| 1034 | ; SSS=SHARING MODE : 0=COMPATIBILITY, 1=DENY READ/WRITE | ||
| 1035 | ; 2=DENY WRITE, 3=DENY READ, | ||
| 1036 | ; 4=DENY NONE | ||
| 1037 | ; I 0=PASS HANDLE TO CHILD, 1=NO INHERIT | ||
| 1038 | ; F 0=INT 24H, 1=RETURN ERROR | ||
| 1039 | ; ON THIS OPEN AND ANY IO TO THIS HANDLE | ||
| 1040 | ; W 0=NO COMMIT, 1=AUTO-COMMIT ON WRITE | ||
| 1041 | ; AX = ATTR SEARCH/CREATE ATTRIBUTE | ||
| 1042 | ; [SAVE_DS]:[SAVE_SI] = Full path name | ||
| 1043 | ; [SAVE_ES]:[SAVE_DI] = Parameter list | ||
| 1044 | ; Null list if DI=-1 | ||
| 1045 | ; | ||
| 1046 | ; Function: | ||
| 1047 | ; IF SEQ THEN | ||
| 1048 | ; prep for UNC | ||
| 1049 | ; ELSE DO | ||
| 1050 | ; IF [THISCDS] .NOT. NULL THEN | ||
| 1051 | ; DO | ||
| 1052 | ; Call CDS_TO_CD | ||
| 1053 | ; Set IFSR_DEVICE_CB@ as pointer to CD | ||
| 1054 | ; Set IFS pointer to CURDIR_IFSR_HDR | ||
| 1055 | ; DFL_FLAG = 0 | ||
| 1056 | ; ENDDO | ||
| 1057 | ; ELSE DO | ||
| 1058 | ; Call DFL_TO_DF | ||
| 1059 | ; Set IFSR_DEVICE_CB@ as pointer to DF | ||
| 1060 | ; Set IFS pointer to DFL_IFSR_HDR | ||
| 1061 | ; DFL_FLAG = 1 | ||
| 1062 | ; ENDDO | ||
| 1063 | ; ENDIF | ||
| 1064 | ; ENDDO | ||
| 1065 | ; ENDIF | ||
| 1066 | ; Prep IFSRH: | ||
| 1067 | ; * IFSR_LENGTH DW 62 ; Request length | ||
| 1068 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1069 | ; + IFSR_RETCODE DW ? | ||
| 1070 | ; + IFSR_RETCLASS DB ? | ||
| 1071 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1072 | ; * IFSR_APIFUNC DB 9 ; Open/Create File | ||
| 1073 | ; + IFSR_ERROR_CLASS DB ? | ||
| 1074 | ; + IFSR_ERROR_ACTION DB ? | ||
| 1075 | ; + IFSR_ERROR_LOCUS DB ? | ||
| 1076 | ; + IFSR_ALLOWED DB ? | ||
| 1077 | ; + IFSR_I24_RETRY DB ? | ||
| 1078 | ; + IFSR_I24_RESP DB ? | ||
| 1079 | ; IFSR_RESV2 DB ? | ||
| 1080 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF | ||
| 1081 | ; *+ IFSR_OPEN_CB@ DD ? ; convert SFT to SFF | ||
| 1082 | ; ; and set this as pointer to it. | ||
| 1083 | ; * IFSR_MODE DW ? ; BX - open mode | ||
| 1084 | ; * IFSR_FLAG DW ? ; AL | ||
| 1085 | ; * IFSR_CP DW ? ; Global code page | ||
| 1086 | ; * IFSR_CPSW DB 0 ; Code page switch flag | ||
| 1087 | ; IFSR_RESV3 DB 0 | ||
| 1088 | ; * IFSR_NAME@ DD ? ; ptr to full asciiz filename | ||
| 1089 | ; * IFSR_PARMS@ DD ? ; ES:DI | ||
| 1090 | ; * IFSR_MATCHATTR DW ? ; CX | ||
| 1091 | ; + IFSR_ACTION DW 0 ; Action taken code: 1=file opened | ||
| 1092 | ; ; 2=file created/opened | ||
| 1093 | ; ; 3=file replaced/opened | ||
| 1094 | ; | ||
| 1095 | ; CALL routine, CALL_IFS, with IFS pointer | ||
| 1096 | ; IF IFSR_RETCODE = 0 THEN | ||
| 1097 | ; DO | ||
| 1098 | ; IF DFL_FLAG = 0 THEN | ||
| 1099 | ; Call CD_TO_CDS | ||
| 1100 | ; ELSE Call DF_TO_DFL | ||
| 1101 | ; Call SF_TO_SFT | ||
| 1102 | ; CX = IFSR_ACTION | ||
| 1103 | ; ENDDO | ||
| 1104 | ; ELSE DO /* error */ | ||
| 1105 | ; AX = IFSR_RETCODE | ||
| 1106 | ; Set carry | ||
| 1107 | ; ENDDO | ||
| 1108 | ; ENDIF | ||
| 1109 | ; | ||
| 1110 | ; Outputs: | ||
| 1111 | ; CX=ACTION TAKEN CODE | ||
| 1112 | ; 1 = FILE OPENED | ||
| 1113 | ; 2 = FILE CREATED/OPENED | ||
| 1114 | ; 3 = FILE REPLACED/OPENED | ||
| 1115 | ; sf_ref_count is NOT altered | ||
| 1116 | ; THISSFT filled in or updated | ||
| 1117 | ; AX set on error: | ||
| 1118 | ; error_file_not_found | ||
| 1119 | ; Last element of path not found | ||
| 1120 | ; error_path_not_found | ||
| 1121 | ; Bad path | ||
| 1122 | ; error_access_denied | ||
| 1123 | ; Attempt to open read only file for writing, | ||
| 1124 | ; or open a directory | ||
| 1125 | ; error_sharing_violation | ||
| 1126 | ; The sharing mode was correct but not allowed | ||
| 1127 | ; generates an INT 24 on compatibility mode SFTs | ||
| 1128 | ; DS preserved, others destroyed | ||
| 1129 | ; | ||
| 1130 | ;************************************************************************************ | ||
| 1131 | ;AN000; | ||
| 1132 | procedure IFS_XOPEN,NEAR ;AN000; | ||
| 1133 | ;AN000; | ||
| 1134 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 1135 | ifsr_api_def OPENFILE ;AN000; | ||
| 1136 | ;AN000; | ||
| 1137 | PUSH AX ; srch attr/create attr | ||
| 1138 | MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; | ||
| 1139 | JMP SHORT XO_25 ;AN008; BAF | ||
| 1140 | ;AN000; | ||
| 1141 | XO_20: ; (welcome all old open/create calls) ;AN000; | ||
| 1142 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1143 | MOV [SAVE_DI],-1 ; set no parms list on old calls ;AN008; BAF | ||
| 1144 | XO_25: ;AN008; BAF | ||
| 1145 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1146 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1147 | ;AN000; | ||
| 1148 | LEA SI,COUNTRY_CDPG ; load cp and cpsw ;AN000; | ||
| 1149 | MOV AX,DS:[SI.ccDosCodePage] ; | ;AN000; | ||
| 1150 | MOV ES:[BX.IFSR_CP],AX ; | ;AN000; | ||
| 1151 | MOV AL,[CPSWFLAG] ; | ;AN000; | ||
| 1152 | MOV ES:[BX.IFSR_CPSW],AL ; | ;AN000; | ||
| 1153 | |||
| 1154 | CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; | ||
| 1155 | JE XO_100 ;AN000; | ||
| 1156 | ;AN000; | ||
| 1157 | LDS SI,[THISCDS] ; cds--cds--cds--cds--cds--cds ;AN000; | ||
| 1158 | MOV AX,SI ; set ifsDrv for possible I24 ;AN000; | ||
| 1159 | invoke IFSDrvFromCDS ;AN000; | ||
| 1160 | RestoreReg <AX> ; must have ax 1st on stack ;AN000; | ||
| 1161 | SaveReg <DS,SI,AX> ; cds ptr, attr ;AN000; | ||
| 1162 | XO_60: ;AN000; | ||
| 1163 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1164 | ; ES:BX -> IFSRH ;AN000; | ||
| 1165 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1166 | ; ds - IFSSEG ;AN000; | ||
| 1167 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1168 | JMP SHORT XO_200 ; go prep IFSRH ;AN000; | ||
| 1169 | ;AN000; | ||
| 1170 | XO_100: ;AN000; | ||
| 1171 | SaveReg <ES> ; if deviceless attach, skip device stuff;AN014; | ||
| 1172 | LES DI,CS:[THISDFL] ;AN014; | ||
| 1173 | CMP WORD PTR [THISDFL],NULL_PTR ;AN014; | ||
| 1174 | RestoreReg <ES> ;AN014; | ||
| 1175 | JNE XO_110 ;AN014; | ||
| 1176 | OR CS:IFSPROC_FLAGS,IsSeq ;AN014; | ||
| 1177 | CMP CS:[fAssign],ZERO | ||
| 1178 | JNE XO_200 | ||
| 1179 | ADD SP,2 | ||
| 1180 | MOV AX,72 | ||
| 1181 | JMP XO_120 ;AN014; | ||
| 1182 | XO_110: ;AN014; | ||
| 1183 | invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; | ||
| 1184 | ; ES:BX -> IFSRH ;AN000; | ||
| 1185 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1186 | ; ds - IFSSEG ;AN000; | ||
| 1187 | JNC XO_200 ;AN000; | ||
| 1188 | ;;;;;;;;TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; new open also pushes ax ;AD014; | ||
| 1189 | ;;;;;;;;JZ XO_120 ; dfl error ;AD014; | ||
| 1190 | ADD SP,2 ; get saved ax off stack if old ;AN000; | ||
| 1191 | ;XO_120: ;AD014; | ||
| 1192 | MOV AX,error_invalid_function ; set error info and quit ;AN000; | ||
| 1193 | XO_120: ;AN014; | ||
| 1194 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1195 | JMP FA_980 ; ret up in FA to preserve DS ;AN000; | ||
| 1196 | ;AN000; | ||
| 1197 | XO_200: ; (welcome seq open/create) ;AN000; | ||
| 1198 | Context DS ; get addressability to dosgroup ;AN000; | ||
| 1199 | invoke SFT_TO_SFF ; SFT: sets IFSR_OPEN_CB@ ;AN000; | ||
| 1200 | ; ES:BX -> IFSRH ;AN000; | ||
| 1201 | ; ds - IFSSEG ;AN000; | ||
| 1202 | MOV ES:[BX.IFSR_LENGTH],LENGTH_OPENFILE ; prep IFRH ;AN000; | ||
| 1203 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1204 | MOV ES:[BX.IFSR_APIFUNC],IFSOPENFILE ;AN000; | ||
| 1205 | POP AX ; restore input AX ;AN000; | ||
| 1206 | TEST IFSPROC_FLAGS,ISOLDOPEN ; check for old open/create ;AN000; | ||
| 1207 | JZ XO_220 ;AN000; | ||
| 1208 | ;;;;;; OR AX,OLDOPEN_MODE ; why did I do this???? scrap ;AD006; | ||
| 1209 | |||
| 1210 | SaveReg <DS,SI> ; old redirector does this ;AN013; | ||
| 1211 | Context DS ;AN013; | ||
| 1212 | LDS SI,[THISSFT] ;AN013; | ||
| 1213 | TEST DS:[SI.SF_MODE],sf_isFCB ;AN013; | ||
| 1214 | RestoreReg <SI,DS> ;AN013; | ||
| 1215 | JZ XO_210 ;AN013; | ||
| 1216 | MOV AL,-1 ;AN013; | ||
| 1217 | XO_210: ;AN013; | ||
| 1218 | |||
| 1219 | MOV ES:[BX.IFSR_MODE],AX ;AN000; | ||
| 1220 | MOV ES:[BX.IFSR_FLAG],OLDOPEN_FLAG ;AN000; | ||
| 1221 | XOR AH,AH ;AN000; | ||
| 1222 | JMP SHORT XO_240 ;AN000; | ||
| 1223 | XO_220: ;AN000; | ||
| 1224 | TEST IFSPROC_FLAGS,ISOLDCREATE ;AN000; | ||
| 1225 | JZ XO_260 ;AN000; | ||
| 1226 | MOV ES:[BX.IFSR_MODE],OLDCREATE_MODE ; old create ;AC006;AC010; | ||
| 1227 | MOV ES:[BX.IFSR_FLAG],OLDCREATE_FLAG ;AN000; | ||
| 1228 | OR AH,AH ; is this create new?? ;AN000; | ||
| 1229 | JZ XO_230 ;AN000; | ||
| 1230 | MOV ES:[BX.IFSR_FLAG],OLDCREATENEW_FLAG ;AN000; | ||
| 1231 | XO_230: ;AN000; | ||
| 1232 | XCHG AH,AL ;AN000; | ||
| 1233 | XO_240: ;AN000; | ||
| 1234 | PUSH SS ; get ds = dosgroup so can access ;AN000; | ||
| 1235 | POP DS ; wfp_start ;AN000; | ||
| 1236 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1237 | MOV AL,[SATTRIB] ;AN000; | ||
| 1238 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1239 | JMP SHORT XO_280 ; go call FS ;AN000; | ||
| 1240 | ;AN000; | ||
| 1241 | XO_260: ; -------extended open/create------------;AN000; | ||
| 1242 | Context DS ; set ds-dosgroup ;AN000; | ||
| 1243 | ;;;;;;;;PUSH [SAVE_DX] ;AD012; | ||
| 1244 | ;;;;;;;;POP ES:[BX.IFSR_FLAG] ; input dx - flag ;AD012; | ||
| 1245 | SaveReg <AX> ; check if create, if so set flag ;AN012; | ||
| 1246 | MOV AX,[SAVE_DX] ;AN012; | ||
| 1247 | MOV ES:[BX.IFSR_FLAG],AX | ||
| 1248 | MOV AH,AL ;AN012; | ||
| 1249 | AND AX,0FF0H ;AN012; | ||
| 1250 | CMP AL,NOTEXIST_ACT_CREATE*16 ;AN012; | ||
| 1251 | RestoreReg <AX> ;AN012; | ||
| 1252 | JNE XO_270 ;AN012; | ||
| 1253 | OR IFSPROC_FLAGS,IsCreate ;AN012; | ||
| 1254 | XO_270: ;AN012; | ||
| 1255 | |||
| 1256 | PUSH [SAVE_BX] ;AN000; | ||
| 1257 | POP ES:[BX.IFSR_MODE] ; input bx - mode ;AN000; | ||
| 1258 | XCHG AH,AL ; attr ;AN000; | ||
| 1259 | MOV AL,[SATTRIB] ;AN000; | ||
| 1260 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1261 | ; MOV DI,[SAVE_DI] ; parm list ;AD011; | ||
| 1262 | ; CMP DI,NULL_PTR ; if offset -1, then no parm list ;AD011; | ||
| 1263 | ; JE XO_280 ; | ;AD011; | ||
| 1264 | ; MOV ES:WORD PTR[BX.IFSR_PARMS@],DI ; | ;AD011; | ||
| 1265 | ; PUSH [SAVE_ES] ; | ;AD011; | ||
| 1266 | ; POP ES:WORD PTR[BX.IFSR_PARMS@+2] ; | ;AD011; | ||
| 1267 | |||
| 1268 | XO_280: ;AN000; | ||
| 1269 | MOV SI,[WFP_START] ;AN000; | ||
| 1270 | invoke STRIP_WFP_START ;AN000; | ||
| 1271 | MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000; | ||
| 1272 | MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000; | ||
| 1273 | PUSH CS ;AN000; | ||
| 1274 | POP DS ;AN000; | ||
| 1275 | ASSUME DS:IFSSEG ;AN000; | ||
| 1276 | ;AN000; | ||
| 1277 | ;****************************************************************************** ;AN000; | ||
| 1278 | invoke CALL_IFS ; call fs with open/create request ;AN000; | ||
| 1279 | ;****************************************************************************** ;AN000; | ||
| 1280 | ;AN000; | ||
| 1281 | JNC XO_300 ;AN000; | ||
| 1282 | TEST IFSPROC_FLAGS,ISCDS ; request FAILED - ;AN000; | ||
| 1283 | JNZ XO_290 ;AN000; | ||
| 1284 | JMP FA_980 ; go up, set carry & return ;AN000; | ||
| 1285 | XO_290: ;AN000; | ||
| 1286 | RestoreReg <SI,DS> ; if cds, restore stack first ;AN000; | ||
| 1287 | JMP FA_980 ;AN000; | ||
| 1288 | ;AN000; | ||
| 1289 | XO_300: ; request SUCCEEDED - ;AN000; | ||
| 1290 | TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; check for old open/create ;AN007; BAF | ||
| 1291 | JNZ XO_310 ;AN007; BAF | ||
| 1292 | SaveReg <DS,SI> ;AN007; BAF | ||
| 1293 | CallInstall Get_User_Stack,multDOS,24 ; Set action take back into CX ;AN007; BAF ;AN000; | ||
| 1294 | ASSUME DS:DOSGROUP ;AN007; BAF | ||
| 1295 | MOV AX,ES:[BX.IFSR_ACTION] ; action take only if Ext Open ;AN007; BAF | ||
| 1296 | MOV DS:[SI].USER_CX,AX ;AN007; BAF | ||
| 1297 | RestoreReg <SI,DS> ;AN007; BAF | ||
| 1298 | ASSUME DS:IFSSEG ;AN007; BAF | ||
| 1299 | XO_310: ; request SUCCEEDED - ;AN007; BAF | ||
| 1300 | MOV AX,ES:[BX.IFSR_MATCHATTR] ;AN000; | ||
| 1301 | ;AN000; | ||
| 1302 | invoke SFF_TO_SFT ; update sft ;AN000; | ||
| 1303 | TEST IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1304 | JZ XO_320 ;AN000; | ||
| 1305 | RestoreReg <DI,ES> ; cds-restore cds ptr into es:di ;AN000; | ||
| 1306 | invoke CD_TO_CDS ; update cds ;AN000; | ||
| 1307 | JMP XO_360 ;AN000; | ||
| 1308 | XO_320: ;AN000; | ||
| 1309 | TEST IFSPROC_FLAGS,ISSEQ ;AN000; | ||
| 1310 | JZ XO_340 ;AN000; | ||
| 1311 | MOV DI,NULL_PTR ; set seq devptr to null ;AN000; | ||
| 1312 | SaveReg <DI> ; this for sf_devptr ;AN000; | ||
| 1313 | RestoreReg <ES> ;AN000; | ||
| 1314 | JMP SHORT XO_360 ;AN000; | ||
| 1315 | ;AN000; | ||
| 1316 | XO_340: ;AN000; | ||
| 1317 | invoke DF_TO_DFL ; update dfl ;AN000; | ||
| 1318 | LES DI,[THISDFL] ; this for sf_devptr ;AN000; | ||
| 1319 | XOR AX,AX ; attr 0 for devices ;AN000; | ||
| 1320 | ;AN000; | ||
| 1321 | XO_360: ;AN000; | ||
| 1322 | Context DS ;AN000; | ||
| 1323 | LDS SI,[THISSFT] ; set some fields in sft ;AN000; | ||
| 1324 | MOV DS:[SI.sf_attr],AL ;AN000; | ||
| 1325 | ;;;;;;;;MOV DS:[SI.sf_attr_hi],AH ;AD015; | ||
| 1326 | MOV WORD PTR DS:[SI.sf_devptr],DI ;AN000; | ||
| 1327 | MOV WORD PTR DS:[SI.sf_devptr+2],ES ;AN000; | ||
| 1328 | TEST CS:IFSPROC_FLAGS,IsCDS + IsSeq ; let deviceless attach stuff thru here ;AC014; | ||
| 1329 | JZ XO_380 ;AN000; | ||
| 1330 | MOV AL,CS:[IFSDRV] ; drive ;AN000; | ||
| 1331 | AND AX,devid_file_mask_drive ; Drive in correct bits ;AN000; | ||
| 1332 | OR AX,sf_isnet + devid_file_clean ;AN000; | ||
| 1333 | MOV DS:[SI.sf_flags],AX ;AN000; | ||
| 1334 | ; now set sf_name to filename in form: ;AN000; | ||
| 1335 | ; filename ext (8 char fn spaced out - ;AN000; | ||
| 1336 | ; 3 char ext spaced out) ;AN000; | ||
| 1337 | SaveReg <CX,DS,SI,DS> ; save dssi->sf for later pop & action ;AN000; | ||
| 1338 | RestoreReg <ES> ;AN000; | ||
| 1339 | MOV DI,SI ; esdi->sft ;AN000; | ||
| 1340 | ;AN000; | ||
| 1341 | ADD DI,sf_name ; blank out sf_name ;AN000; | ||
| 1342 | SaveReg <DI> ; | ;AN000; | ||
| 1343 | MOV AX,2020H ; | ;AN000; | ||
| 1344 | MOV CX,5 ; | ;AN000; | ||
| 1345 | CLD ; | ;AN000; | ||
| 1346 | REP STOSW ; | ;AN000; | ||
| 1347 | STOSB ; | ;AN000; | ||
| 1348 | RestoreReg <DI> ; | ;AN000; | ||
| 1349 | ;AN000; | ||
| 1350 | Context DS ;AN000; | ||
| 1351 | MOV SI,[WFP_START] ; dssi->wfp_start ;AN000; | ||
| 1352 | CallInstall DStrlen,multDOS,37 ; get length of full path name (in cx) ;AN000; | ||
| 1353 | ADD SI,CX ; mov si to end of name ;AN000; | ||
| 1354 | DEC SI ; si now on null ;AN000; | ||
| 1355 | XO_362: ;AN000; | ||
| 1356 | DEC SI ; mov back one ;AN000; | ||
| 1357 | CMP BYTE PTR DS:[SI],"\" ; looking for \ just before fn ;AN000; | ||
| 1358 | JNE XO_362 ;AN000; | ||
| 1359 | ;AN000; | ||
| 1360 | INC SI ; si now pointing to 1st char fn ;AN000; | ||
| 1361 | MOV CX,8 ; esdi -> sf_name ;AN000; | ||
| 1362 | XO_364: ;AN000; | ||
| 1363 | LODSB ;AN000; | ||
| 1364 | STOSB ;AN000; | ||
| 1365 | DEC CX ;AN000; | ||
| 1366 | CMP AL,"." ;AN000; | ||
| 1367 | JE XO_368 ;AN000; | ||
| 1368 | OR AL,AL ;AN000; | ||
| 1369 | JZ XO_366 ;AN000; | ||
| 1370 | JCXZ XO_369 ;AN000; | ||
| 1371 | JMP SHORT XO_364 ;AN000; | ||
| 1372 | ;AN000; | ||
| 1373 | XO_366: ;AN000; | ||
| 1374 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1375 | JMP SHORT XO_378 ;AN000; | ||
| 1376 | ;AN000; | ||
| 1377 | XO_368: ;AN000; | ||
| 1378 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1379 | ADD DI,CX ;AN000; | ||
| 1380 | XO_369: ;AN000; | ||
| 1381 | MOV CX,3 ;AN000; | ||
| 1382 | XO_370: ;AN000; | ||
| 1383 | LODSB ;AN000; | ||
| 1384 | STOSB ;AN000; | ||
| 1385 | DEC CX ;AN000; | ||
| 1386 | OR AL,AL ;AN000; | ||
| 1387 | JZ XO_372 ;AN000; | ||
| 1388 | JCXZ XO_378 ;AN000; | ||
| 1389 | JMP SHORT XO_370 ;AN000; | ||
| 1390 | XO_372: ;AN000; | ||
| 1391 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1392 | ;AN000; | ||
| 1393 | XO_378: ;AN000; | ||
| 1394 | RestoreReg <SI,DS,CX> ; dssi -> sft, cx=action code ;AN000; | ||
| 1395 | JMP SHORT XO_500 ;AN000; | ||
| 1396 | ;AN000; | ||
| 1397 | XO_380: ;AN000; | ||
| 1398 | ;;;;;;;;TEST CS:IFSPROC_FLAGS,ISSEQ ;AD014; | ||
| 1399 | ;;;;;;;;JNZ XO_500 ;AD014; | ||
| 1400 | MOV DS:[SI.sf_flags],sf_isnet+devid_file_clean+sf_net_spool+devid_device ;AN000; | ||
| 1401 | SaveReg <CX,DS,SI> ; sft ptr, action ;AN003; | ||
| 1402 | invoke XCHGP ; dssi -> dfl, esdi -> sft ;AN000; | ||
| 1403 | ADD DI,sf_name ;AN000; | ||
| 1404 | ADD SI,DFL_DEV_NAME ; Skip over path sep, now pointing to name ;AN000; | ||
| 1405 | MOV CX,4 ;AN000; | ||
| 1406 | REP MOVSW ;AN000; | ||
| 1407 | MOV AX,2020H ;AN000; | ||
| 1408 | STOSW ;AN000; | ||
| 1409 | STOSB ;AN000; | ||
| 1410 | RestoreReg <SI,DS,CX> ; sft ptr, action ;AN003/AC005; | ||
| 1411 | |||
| 1412 | XO_500: ;AN000; | ||
| 1413 | MOV AX,WORD PTR CS:[THISIFS] ; set sf_ifs_hdr ;AN003; | ||
| 1414 | MOV WORD PTR DS:[SI.SF_IFS_HDR],AX ;AN003; | ||
| 1415 | MOV AX,WORD PTR CS:[THISIFS+2] ;AN003; | ||
| 1416 | MOV WORD PTR DS:[SI.SF_IFS_HDR+2],AX ;AN003; | ||
| 1417 | |||
| 1418 | MOV AX,CS:[SFT_SERIAL_NUMBER] ; give new sft serial number for ;AN004; | ||
| 1419 | MOV DS:[SI.SF_FIRCLUS],AX ; fcb processing ;AN004; | ||
| 1420 | INC CS:[SFT_SERIAL_NUMBER] ;AN004; | ||
| 1421 | |||
| 1422 | MOV WORD PTR DS:[SI.SF_POSITION],0 ;AN012; | ||
| 1423 | MOV WORD PTR DS:[SI.SF_POSITION+2],0 ;AN012; | ||
| 1424 | |||
| 1425 | TEST CS:IFSPROC_FLAGS,IsCreate ; if create, set sf time/date ;AN012; | ||
| 1426 | JZ XO_520 ;AN012; | ||
| 1427 | push ds ;AN017: SAVE DS **RPS | ||
| 1428 | CallInstall DATE16,MultDOS,13 ;AN012; | ||
| 1429 | pop ds ;AN017: SAVE DS **RPS | ||
| 1430 | MOV DS:[SI.SF_TIME],DX ;AN012; | ||
| 1431 | MOV DS:[SI.SF_DATE],AX ;AN012; | ||
| 1432 | MOV WORD PTR DS:[SI.SF_SIZE],0 ;AN012; | ||
| 1433 | MOV WORD PTR DS:[SI.SF_SIZE+2],0 ;AN012; | ||
| 1434 | XO_520: ;AN012; | ||
| 1435 | |||
| 1436 | PUSH SS ; Preserve input DS ;AN000; | ||
| 1437 | POP DS ;AN000; | ||
| 1438 | MOV AX,(multDOS SHL 8) OR 12 ;AN000; | ||
| 1439 | INT 2FH ;AN000; | ||
| 1440 | ;AN000; | ||
| 1441 | return ;AN000; | ||
| 1442 | ;AN000; | ||
| 1443 | EndProc IFS_XOPEN ;AN000; | ||
| 1444 | ;AN000; | ||
| 1445 | BREAK <IFS_SEQ_SEARCH> ;AN000; | ||
| 1446 | ;AN000; | ||
| 1447 | ;************************************************************************************ ;AN000; | ||
| 1448 | ; ;AN000; | ||
| 1449 | ; IFS_SEQ_SEARCH ;AN000; | ||
| 1450 | ; ;AN000; | ||
| 1451 | ; Inputs: ;AN000; | ||
| 1452 | ; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; | ||
| 1453 | ; terminated) ;AN000; | ||
| 1454 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 1455 | ; [DMAADD] Points to 53 byte buffer ;AN000; | ||
| 1456 | ; Function: ;AN000; | ||
| 1457 | ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; | ||
| 1458 | ; Outputs: ;AN000; | ||
| 1459 | ; CARRY SET ;AN000; | ||
| 1460 | ; AX = error_path_not_found ;AN000; | ||
| 1461 | ; DS preserved, others destroyed ;AN000; | ||
| 1462 | ; ;AN000; | ||
| 1463 | ;************************************************************************************ ;AN000; | ||
| 1464 | ;AN000; | ||
| 1465 | procedure IFS_SEQ_SEARCH_FIRST,NEAR ;AN000; | ||
| 1466 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1467 | ;AN000; | ||
| 1468 | MOV AX,error_path_not_found ;AN000; | ||
| 1469 | STC ;AN000; | ||
| 1470 | return ;AN000; | ||
| 1471 | ;AN000; | ||
| 1472 | EndProc IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 1473 | ;AN000; | ||
| 1474 | ;************************************************************************************ ;AN000; | ||
| 1475 | ; ;AN000; | ||
| 1476 | ; IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 1477 | ; ;AN000; | ||
| 1478 | ; Inputs: ;AN000; | ||
| 1479 | ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; | ||
| 1480 | ; (only first 21 bytes must have valid information) ;AN000; | ||
| 1481 | ; Function: ;AN000; | ||
| 1482 | ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; | ||
| 1483 | ; Outputs: ;AN000; | ||
| 1484 | ; CARRY SET ;AN000; | ||
| 1485 | ; AX = error_no_more_files ;AN000; | ||
| 1486 | ; DS preserved, others destroyed ;AN000; | ||
| 1487 | ; ;AN000; | ||
| 1488 | ;************************************************************************************ ;AN000; | ||
| 1489 | ;AN000; | ||
| 1490 | procedure IFS_SEQ_SEARCH_NEXT,NEAR ;AN000; | ||
| 1491 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1492 | ;AN000; | ||
| 1493 | JMP IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 1494 | ;AN000; | ||
| 1495 | EndProc IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 1496 | ;AN000; | ||
| 1497 | ;AN000; | ||
| 1498 | BREAK <IFS_SEARCH_FIRST Search for first entry> ;AN000; | ||
| 1499 | ;AN000; | ||
| 1500 | ;************************************************************************************ | ||
| 1501 | ; | ||
| 1502 | ; IFS_SEARCH_FIRST | ||
| 1503 | ; | ||
| 1504 | ; Inputs: | ||
| 1505 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL | ||
| 1506 | ; terminated) | ||
| 1507 | ; [THISCDS] Points to CDS being used may not be NUL | ||
| 1508 | ; [SATTRIB] Is attribute of search, determines what files can be found | ||
| 1509 | ; [DMAADD] Points to 53 byte buffer | ||
| 1510 | ; DS - dosgroup | ||
| 1511 | ; | ||
| 1512 | ; Function: | ||
| 1513 | ; Prep IFSRH: | ||
| 1514 | ; * IFSR_LENGTH DW 50 ; Request length | ||
| 1515 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1516 | ; + IFSR_RETCODE DW ? | ||
| 1517 | ; + IFSR_RETCLASS DB ? | ||
| 1518 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1519 | ; * IFSR_APIFUNC DB 8 ; Search file | ||
| 1520 | ; + IFSR_ERROR_CLASS DB ? | ||
| 1521 | ; + IFSR_ERROR_ACTION DB ? | ||
| 1522 | ; + IFSR_ERROR_LOCUS DB ? | ||
| 1523 | ; + IFSR_ALLOWED DB ? | ||
| 1524 | ; + IFSR_I24_RETRY DB ? | ||
| 1525 | ; + IFSR_I24_RESP DB ? | ||
| 1526 | ; IFSR_RESV2 DB ? | ||
| 1527 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1528 | ; IFSR_OPEN_CB@ DD ? ; null | ||
| 1529 | ; * IFSR_SUBFUNC DB subfunction ; 1=first, 2=next | ||
| 1530 | ; ; 4=last (CP/DOS only) | ||
| 1531 | ; * IFSR_RESV3 DB ? ; DOS Reserved | ||
| 1532 | ; *+ IFSR_CONTINFO@ DD continuation info address (always set): | ||
| 1533 | ; * DB 8 DUP(?) ; SEARCH FILE NAME | ||
| 1534 | ; * DB 3 DUP(?) ; SEARCH FILE EXTENSION | ||
| 1535 | ; * DB ? ; SEARCH ATTRIBUTE | ||
| 1536 | ; DB 8 DUP(?) ; FSDA | ||
| 1537 | ; DIRECTORY ENTRY | ||
| 1538 | ; + DB 8 DUP(?) ; FOUND FILE NAME | ||
| 1539 | ; + DB 3 DUP(?) ; FOUND FILE EXTENSION | ||
| 1540 | ; + DB ? ; FOUND ATTRIBUTE LOW ??? DB/DD | ||
| 1541 | ; + DW ? ; FILE CODE PAGE (OR 0) | ||
| 1542 | ; + DW ? ; RESERVED | ||
| 1543 | ; + DB ? ; FOUND ATTRIBUTE HIGH | ||
| 1544 | ; + DB 5 DUP(?) ; RESERVED | ||
| 1545 | ; + DW ? ; FILE TIME | ||
| 1546 | ; + DW ? ; FILE DATE | ||
| 1547 | ; + DW ? ; MEANING FILE SYSTEM SPECIFIC | ||
| 1548 | ; ; (STARTING CLUSTER IN FAT) | ||
| 1549 | ; + DD ? ; FILE SIZE | ||
| 1550 | ; following on search first only | ||
| 1551 | ; * IFSR_MATCHATTR DW ; search attribute ; format 0000000re0advshr | ||
| 1552 | ; * IFSR_NAME@ DD ; asciiz name to process | ||
| 1553 | ; | ||
| 1554 | ; IF search first THEN | ||
| 1555 | ; DO | ||
| 1556 | ; IFSR_SUBFUNC = 1 | ||
| 1557 | ; Get CDS from [THISCDS] | ||
| 1558 | ; Call CDS_TO_CD | ||
| 1559 | ; ENDDO | ||
| 1560 | ; ELSE DO | ||
| 1561 | ; IFSR_SUBFUNC = 2 | ||
| 1562 | ; Get CDS from drive byte in DMAADD | ||
| 1563 | ; Call CDS_TO_CD | ||
| 1564 | ; ENDDO | ||
| 1565 | ; ENDIF | ||
| 1566 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR | ||
| 1567 | ; IF IFSR_RETCODE = 0 THEN | ||
| 1568 | ; DO | ||
| 1569 | ; Call CD_TO_CDS | ||
| 1570 | ; DMAADD = IFSR_CONTINFO | ||
| 1571 | ; Clear carry | ||
| 1572 | ; ENDDO | ||
| 1573 | ; ELSE DO {error} | ||
| 1574 | ; AX = error code | ||
| 1575 | ; Set carry | ||
| 1576 | ; ENDDO | ||
| 1577 | ; ENDIF | ||
| 1578 | ; | ||
| 1579 | ; Outputs: | ||
| 1580 | ; CARRY CLEAR | ||
| 1581 | ; The 53 bytes ot DMAADD are filled in as follows: | ||
| 1582 | ; | ||
| 1583 | ; Drive Byte (A=1, B=2, ...) High bit = 1 --| | ||
| 1584 | ; 11 byte search name with Meta chars in it | From | ||
| 1585 | ; Search Attribute Byte, attribute of search | Server | ||
| 1586 | ; WORD LastEnt value | | ||
| 1587 | ; WORD DirStart ------------------------------| | ||
| 1588 | ; DWORD Local CDS | ||
| 1589 | ; 32 bytes of the directory entry found | ||
| 1590 | ; CARRY SET | ||
| 1591 | ; AX = error code | ||
| 1592 | ; error_no_more_files | ||
| 1593 | ; No match for this file | ||
| 1594 | ; error_access_denied | ||
| 1595 | ; Device name given | ||
| 1596 | ; error_path_not_found | ||
| 1597 | ; Bad path | ||
| 1598 | ; DS preserved, others destroyed | ||
| 1599 | ; | ||
| 1600 | ;************************************************************************************ | ||
| 1601 | ;AN000; | ||
| 1602 | procedure IFS_SEARCH_FIRST,NEAR ;AN000; | ||
| 1603 | ;AN000; | ||
| 1604 | ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; | ||
| 1605 | ifsr_api_def SEARCHFILE ;AN000; | ||
| 1606 | ;AN000; | ||
| 1607 | MOV CS:IFSPROC_FLAGS,ZERO ;AN000; | ||
| 1608 | invoke PREP_IFSR ; zero ifsr ;AN000; | ||
| 1609 | ;AN000; | ||
| 1610 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1611 | LES DI,[DMAADD] ; esdi -> dmaadd ;AN001; | ||
| 1612 | LDS SI,[THISCDS] ; dssi -> cds ;AN000; | ||
| 1613 | |||
| 1614 | invoke DRIVE_FROM_CDS ; set ifsdrv (0-based) ;AN001; | ||
| 1615 | MOV AL,CS:[IFSDRV] ; put 1-based drive # in dmaadd ;AN001; | ||
| 1616 | INC AL ;AN001; | ||
| 1617 | OR AL,80H ; turn on ifs indicator ;AN001; | ||
| 1618 | STOSB ;AN001; | ||
| 1619 | |||
| 1620 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 1621 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1622 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1623 | ; ES:BX -> IFSRH ;AN000; | ||
| 1624 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1625 | ; ds - IFSSEG ;AN000; | ||
| 1626 | PUSH DS ; save ds-ifsseg ;AN000; | ||
| 1627 | Context DS ; ds-dosgroup ;AN000; | ||
| 1628 | ;AN000; | ||
| 1629 | MOV SI,[WFP_START] ;AN000; | ||
| 1630 | invoke STRIP_WFP_START ; remove leading d:\ if present ;AN000; | ||
| 1631 | MOV ES:WORD PTR[BX.IFSR_NAME@],SI ;AN000; | ||
| 1632 | MOV ES:WORD PTR[BX.IFSR_NAME@+2],DS ;AN000; | ||
| 1633 | MOV AL,[SATTRIB] ;AN000; | ||
| 1634 | XOR AH,AH ;AN000; | ||
| 1635 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1636 | ;AN000; | ||
| 1637 | POP DS ;AN000; | ||
| 1638 | ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1639 | ;AN000; | ||
| 1640 | MOV AL,IFSSEARCH_FIRST ;AN000; | ||
| 1641 | JMP SHORT SN_60 ; rest of processing is in ;AN000; | ||
| 1642 | ; search_next routine ;AN000; | ||
| 1643 | ;AN000; | ||
| 1644 | EndProc IFS_SEARCH_FIRST ;AN000; | ||
| 1645 | ;AN000; | ||
| 1646 | BREAK <IFS_SEARCH_NEXT Search for next> ;AN000; | ||
| 1647 | ;AN000; | ||
| 1648 | ;************************************************************************************ ;AN000; | ||
| 1649 | ; ;AN000; | ||
| 1650 | ; IFS_SEARCH_NEXT ;AN000; | ||
| 1651 | ; ;AN000; | ||
| 1652 | ; Inputs: ;AN000; | ||
| 1653 | ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; | ||
| 1654 | ; (only first 21 bytes must have valid information) ;AN000; | ||
| 1655 | ; Function: ;AN000; | ||
| 1656 | ; Look for subsequent matches ;AN000; | ||
| 1657 | ; Outputs: ;AN000; | ||
| 1658 | ; CARRY CLEAR ;AN000; | ||
| 1659 | ; The 53 bytes at DMAADD are updated for next call ;AN000; | ||
| 1660 | ; (see NET_SEARCH_FIRST) ;AN000; | ||
| 1661 | ; CARRY SET ;AN000; | ||
| 1662 | ; AX = error code ;AN000; | ||
| 1663 | ; error_no_more_files ;AN000; | ||
| 1664 | ; No more files to find ;AN000; | ||
| 1665 | ; DS preserved, others destroyed ;AN000; | ||
| 1666 | ; ;AN000; | ||
| 1667 | ;************************************************************************************ ;AN000; | ||
| 1668 | ;AN000; | ||
| 1669 | procedure IFS_SEARCH_NEXT,NEAR ;AN000; | ||
| 1670 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1671 | ;AN000; | ||
| 1672 | ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; | ||
| 1673 | ifsr_api_def SEARCHFILE ;AN000; | ||
| 1674 | ;AN000; | ||
| 1675 | MOV CS:IFSPROC_FLAGS,ZERO ; clear processing flags ;AN000; | ||
| 1676 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1677 | ;AN000; | ||
| 1678 | SN_20: ;AN000; | ||
| 1679 | LDS SI,[DMAADD] ;AN000; | ||
| 1680 | LODSB ;AN000; | ||
| 1681 | AND AL,NOT 80H ; turn off ifs indicator ;AN000; | ||
| 1682 | DEC AL ; make 0-based ;AN000; | ||
| 1683 | MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN000; | ||
| 1684 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; | ||
| 1685 | ASSUME DS:NOTHING ;AN000; | ||
| 1686 | JNC SN_40 ;AN000; | ||
| 1687 | MOV AX,error_invalid_drive ; no cds, set error & ;AN000; | ||
| 1688 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1689 | JMP FA_1000 ; ret up in FA to preserve DS ;AN000; | ||
| 1690 | SN_40: ; (welcome lock) ;AN000; | ||
| 1691 | SaveReg <DS,SI> ; save cds ptr ;AN000; | ||
| 1692 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1693 | ; ES:BX -> IFSRH ;AN000; | ||
| 1694 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1695 | ; ds - IFSSEG ;AN000; | ||
| 1696 | MOV AL,IFSSEARCH_NEXT ; start with subfunc=search next ;AN000; | ||
| 1697 | ; TEST IFSPROC_FLAGS,ISADD ;AD011; | ||
| 1698 | ; JZ SN_60 ;AD011; | ||
| 1699 | ; INC AL ; inc subfunc to search same ;AD011; | ||
| 1700 | SN_60: ;AN000; | ||
| 1701 | MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; | ||
| 1702 | MOV ES:[BX.IFSR_LENGTH],LENGTH_SEARCHFILE ;AN000; | ||
| 1703 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1704 | MOV ES:[BX.IFSR_APIFUNC],IFSSEARCHFILE ;AN000; | ||
| 1705 | ;AN000; | ||
| 1706 | PUSH DS ;AN000; | ||
| 1707 | Context DS ;AN000; | ||
| 1708 | MOV AX,WORD PTR [DMAADD] ;AN000; | ||
| 1709 | INC AX ;AN000; | ||
| 1710 | MOV ES:WORD PTR[BX.IFSR_CONTINFO@],AX ;AN000; | ||
| 1711 | MOV AX,WORD PTR [DMAADD+2] ;AN000; | ||
| 1712 | MOV ES:WORD PTR[BX.IFSR_CONTINFO@+2],AX ;AN000; | ||
| 1713 | ;AN000; | ||
| 1714 | POP DS ;AN000; | ||
| 1715 | ASSUME DS:IFSSEG ;AN000; | ||
| 1716 | invoke CALL_IFS ; call FS ;AN000; | ||
| 1717 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 1718 | JC SN_1000 ;AN000; | ||
| 1719 | invoke CD_TO_CDS ;AN000; | ||
| 1720 | CLC ;AN000; | ||
| 1721 | ;AN000; | ||
| 1722 | SN_1000: ;AN000; | ||
| 1723 | JMP FA_1000 ; go up & preserve ds, ret ;AN000; | ||
| 1724 | ;AN000; | ||
| 1725 | EndProc IFS_SEARCH_NEXT ;AN000; | ||
| 1726 | ;AN000; | ||
| 1727 | ;AN000; | ||
| 1728 | BREAK <OPEN_CHECK_DEVICE - check that device to be opened is real> ;AN000; | ||
| 1729 | ;AN000; | ||
| 1730 | ;************************************************************************************ ;AN000; | ||
| 1731 | ; ;AN000; | ||
| 1732 | ; CHECK_OPEN_DEVICE ;AN000; | ||
| 1733 | ; ;AN000; | ||
| 1734 | ; Inputs: ;AN000; | ||
| 1735 | ; [WFP_START] ;AN000; | ||
| 1736 | ; ;AN000; | ||
| 1737 | ; Function: ;AN000; | ||
| 1738 | ; ;AN000; | ||
| 1739 | ; Outputs: ;AN000; | ||
| 1740 | ; ;AN000; | ||
| 1741 | ; ;AN000; | ||
| 1742 | ; ;AN000; | ||
| 1743 | ;************************************************************************************ ;AN000; | ||
| 1744 | ;AN000; | ||
| 1745 | procedure OPEN_CHECK_DEVICE,NEAR ;AN000; | ||
| 1746 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1747 | ;AN000; | ||
| 1748 | MOV SI,[WFP_START] ; dssi -> path to open ;AN000; | ||
| 1749 | ; invoke PARSE_DEVICE_PATH ; dssi -> device name (asciiz) ;AN000; | ||
| 1750 | ;AN000; | ||
| 1751 | PUSH SS ; Now check if this device is real ;AN000; | ||
| 1752 | POP ES ;AN000; | ||
| 1753 | MOV DI,OFFSET DOSGROUP:NAME1 ;AN000; | ||
| 1754 | MOV CX,4 ;AN000; | ||
| 1755 | REP MOVSW ; Transfer name to NAME1 ;AN000; | ||
| 1756 | MOV AX,2020H ;AN000; | ||
| 1757 | STOSW ;AN000; | ||
| 1758 | STOSB ;AN000; | ||
| 1759 | ;AN000; | ||
| 1760 | PUSH ES ;AN000; | ||
| 1761 | POP DS ;AN000; | ||
| 1762 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1763 | MOV [ATTRIB],attr_hidden + attr_system + attr_directory ;AN000; | ||
| 1764 | ; Must set this to something interesting ;AN000; | ||
| 1765 | ; to call DEVNAME. ;AN000; | ||
| 1766 | CallInstall DEVNAME,multDOS,35 ;AN000; | ||
| 1767 | JNC OCD_120 ;AN000; | ||
| 1768 | MOV AX,error_file_not_found ;AN000; | ||
| 1769 | transfer ifs_980 ;AN000; | ||
| 1770 | ;AN000; | ||
| 1771 | OCD_120: ;AN000; | ||
| 1772 | transfer ifs_990 ;AN000; | ||
| 1773 | ;AN000; | ||
| 1774 | EndProc OPEN_CHECK_DEVICE ;AN000; | ||
| 1775 | ;AN000; | ||
| 1776 | ;AN000; | ||
| 1777 | IFSSEG ENDS ;AN000; | ||
| 1778 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM new file mode 100644 index 0000000..7649951 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM | |||
| @@ -0,0 +1,202 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | ; SCCSID = @(#)ifsflink.asm 1.0 87/05/11 | ||
| 3 | TITLE IFSFUNC LINK FIX ROUTINES - Routines to resolve ifsfunc externals | ||
| 4 | NAME IFSFLINK | ||
| 5 | |||
| 6 | .xlist | ||
| 7 | .xcref | ||
| 8 | INCLUDE DOSSYM.INC | ||
| 9 | INCLUDE DEVSYM.INC | ||
| 10 | .cref | ||
| 11 | .list | ||
| 12 | |||
| 13 | CODE SEGMENT BYTE PUBLIC 'CODE' | ||
| 14 | code ENDS | ||
| 15 | |||
| 16 | include dosseg.asm | ||
| 17 | |||
| 18 | code SEGMENT BYTE PUBLIC 'code' | ||
| 19 | ASSUME CS:dosgroup | ||
| 20 | |||
| 21 | procedure OUTT,FAR | ||
| 22 | entry $DUP | ||
| 23 | entry MSG_RETRIEVAL | ||
| 24 | entry $ECS_CALL | ||
| 25 | entry $EXTENDED_OPEN | ||
| 26 | entry FASTINIT | ||
| 27 | entry $IFS_IOCTL | ||
| 28 | entry IFS_DOSCALL | ||
| 29 | entry $QUERY_DOS_VALUE | ||
| 30 | entry $STD_AUX_INPUT,FAR | ||
| 31 | entry LCRITDEVICE,FAR | ||
| 32 | entry $ABORT,FAR | ||
| 33 | entry $SET_TIME,FAR | ||
| 34 | entry $ALLOC,FAR | ||
| 35 | entry SETMEM,FAR | ||
| 36 | entry SKIPONE,FAR | ||
| 37 | entry $SET_DMA,FAR | ||
| 38 | entry $PARSE_FILE_DESCRIPTOR,FAR | ||
| 39 | entry $CREATETEMPFILE,FAR | ||
| 40 | entry $SLEAZEFUNCDL,FAR | ||
| 41 | entry $CHDIR,FAR | ||
| 42 | entry TWOESC,FAR | ||
| 43 | entry $GET_INTERRUPT_VECTOR,FAR | ||
| 44 | entry $FCB_SEQ_WRITE,FAR | ||
| 45 | entry DEVNAME,FAR | ||
| 46 | entry $GET_DEFAULT_DRIVE,FAR | ||
| 47 | entry $STD_CON_STRING_INPUT,FAR | ||
| 48 | entry $CLOSE,FAR | ||
| 49 | entry $RAW_CON_IO,FAR | ||
| 50 | entry $INTERNATIONAL,FAR | ||
| 51 | entry IDLE,FAR | ||
| 52 | entry $STD_CON_INPUT_NO_ECHO,FAR | ||
| 53 | entry $ASSIGNOPER,FAR | ||
| 54 | entry $LOCKOPER,FAR | ||
| 55 | entry $FCB_CLOSE,FAR | ||
| 56 | entry $STD_CON_STRING_OUTPUT,FAR | ||
| 57 | entry $DUP_PDB,FAR | ||
| 58 | entry GETCH,FAR | ||
| 59 | entry STRLEN,FAR | ||
| 60 | entry INITCDS,FAR | ||
| 61 | entry COPYONE,FAR | ||
| 62 | entry PJFNFROMHANDLE,FAR | ||
| 63 | entry $GET_VERIFY_ON_WRITE,FAR | ||
| 64 | entry $KEEP_PROCESS,FAR | ||
| 65 | entry STRCMP,FAR | ||
| 66 | entry $SET_INTERRUPT_VECTOR,FAR | ||
| 67 | entry $FCB_DELETE,FAR | ||
| 68 | entry $RAW_CON_INPUT,FAR | ||
| 69 | entry $RENAME,FAR | ||
| 70 | entry $FIND_FIRST,FAR | ||
| 71 | entry $FCB_RANDOM_WRITE,FAR | ||
| 72 | entry $SET_DEFAULT_DRIVE,FAR | ||
| 73 | entry $SETDPB,FAR | ||
| 74 | entry $STD_PRINTER_OUTPUT,FAR | ||
| 75 | entry $MKDIR,FAR | ||
| 76 | entry $DUP2,FAR | ||
| 77 | entry SET_SFT_MODE,FAR | ||
| 78 | entry $GET_DATE,FAR | ||
| 79 | entry $FCB_RENAME,FAR | ||
| 80 | entry $CREATE_PROCESS_DATA_BLOCK,FAR | ||
| 81 | entry $CREAT,FAR | ||
| 82 | entry ECRITDISK,FAR | ||
| 83 | entry PLACEBUF,FAR | ||
| 84 | entry $IOCTL,FAR | ||
| 85 | entry $READ,FAR | ||
| 86 | entry PATHCHRCMP,FAR | ||
| 87 | entry $GET_VERSION,FAR | ||
| 88 | entry COPYLIN,FAR | ||
| 89 | entry LCRITDISK,FAR | ||
| 90 | entry $LSEEK,FAR | ||
| 91 | entry STRCPY,FAR | ||
| 92 | entry $FILE_TIMES,FAR | ||
| 93 | entry BACKSP,FAR | ||
| 94 | entry $SET_VERIFY_ON_WRITE,FAR | ||
| 95 | entry SETYEAR,FAR | ||
| 96 | entry FASTRET,FAR | ||
| 97 | entry $RMDIR,FAR | ||
| 98 | entry DIVOV,FAR | ||
| 99 | entry $GET_FCB_POSITION,FAR | ||
| 100 | entry $DISK_RESET,FAR | ||
| 101 | entry $DIR_SEARCH_FIRST,FAR | ||
| 102 | entry $WAIT,FAR | ||
| 103 | entry FASTOPENCOM,FAR | ||
| 104 | entry STAY_RESIDENT,FAR | ||
| 105 | entry $ALLOCOPER,FAR | ||
| 106 | entry $GET_DEFAULT_DPB,FAR | ||
| 107 | entry DSTRLEN,FAR | ||
| 108 | entry CTRLZ,FAR | ||
| 109 | entry $USEROPER,FAR | ||
| 110 | entry $SET_DATE,FAR | ||
| 111 | entry $FCB_RANDOM_WRITE_BLOCK,FAR | ||
| 112 | entry EXITINS,FAR | ||
| 113 | entry $GET_IN_VARS,FAR | ||
| 114 | entry GETDEVLIST,FAR | ||
| 115 | entry DATE16,FAR | ||
| 116 | entry POINTCOMP,FAR | ||
| 117 | entry SFFROMSFN,FAR | ||
| 118 | entry SKIPSTR,FAR | ||
| 119 | entry FREE_SFT,FAR | ||
| 120 | entry SHARE_ERROR,FAR | ||
| 121 | entry NLS_IOCTL,FAR | ||
| 122 | entry $CURRENT_DIR,FAR | ||
| 123 | entry $FCB_CREATE,FAR | ||
| 124 | entry $WRITE,FAR | ||
| 125 | entry $GET_INDOS_FLAG,FAR | ||
| 126 | entry RECSET,FAR | ||
| 127 | entry $CREATENEWFILE,FAR | ||
| 128 | entry $STD_CON_INPUT_STATUS,FAR | ||
| 129 | entry REEDIT,FAR | ||
| 130 | entry GETTHISDRV,FAR | ||
| 131 | entry DSUM,FAR | ||
| 132 | entry $GETEXTENDEDERROR,FAR | ||
| 133 | entry $EXTHANDLE,FAR | ||
| 134 | entry $NAMETRANS,FAR | ||
| 135 | entry NLS_LSEEK,FAR | ||
| 136 | entry SCANPLACE,FAR | ||
| 137 | entry GETCDSFROMDRV,FAR | ||
| 138 | entry DSLIDE,FAR | ||
| 139 | entry UCASE,FAR | ||
| 140 | entry $STD_CON_OUTPUT,FAR | ||
| 141 | entry $FCB_RANDOM_READ_BLOCK,FAR | ||
| 142 | entry CHECKFLUSH,FAR | ||
| 143 | entry COPYSTR,FAR | ||
| 144 | entry $GETSETCDPG,FAR | ||
| 145 | entry $DIR_SEARCH_NEXT,FAR | ||
| 146 | entry $OPEN,FAR | ||
| 147 | entry SKIPVISIT,FAR | ||
| 148 | entry $EXEC,FAR | ||
| 149 | entry $DEALLOC,FAR | ||
| 150 | entry DOS_CLOSE,FAR | ||
| 151 | entry $STD_CON_INPUT,FAR | ||
| 152 | entry NLS_GETEXT,FAR | ||
| 153 | entry BUFWRITE,FAR | ||
| 154 | entry $GET_TIME,FAR | ||
| 155 | entry $SLEAZEFUNC,FAR | ||
| 156 | entry $CHAR_OPER,FAR | ||
| 157 | entry NET_I24_ENTRY,FAR | ||
| 158 | entry $COMMIT,FAR | ||
| 159 | entry $SETBLOCK,FAR | ||
| 160 | entry $FCB_OPEN,FAR | ||
| 161 | entry NLS_OPEN,FAR | ||
| 162 | entry $GET_DMA,FAR | ||
| 163 | entry $UNLINK,FAR | ||
| 164 | entry $FCB_SEQ_READ,FAR | ||
| 165 | entry $STD_CON_INPUT_FLUSH,FAR | ||
| 166 | entry $GET_DRIVE_FREESPACE,FAR | ||
| 167 | entry DRIVEFROMTEXT,FAR | ||
| 168 | entry $GETEXTCNTRY,FAR | ||
| 169 | entry SETVISIT,FAR | ||
| 170 | entry $EXIT,FAR | ||
| 171 | entry $STD_AUX_OUTPUT,FAR | ||
| 172 | entry KILNEW,FAR | ||
| 173 | entry $CHMOD,FAR | ||
| 174 | entry $FCB_RANDOM_READ,FAR | ||
| 175 | entry SHARE_VIOLATION,FAR | ||
| 176 | entry ECRITDEVICE,FAR | ||
| 177 | entry $GET_DPB,FAR | ||
| 178 | entry $FIND_NEXT,FAR | ||
| 179 | entry $GET_FCB_FILE_LENGTH,FAR | ||
| 180 | entry ENTERINS,FAR | ||
| 181 | entry DEVIOCALL2,FAR | ||
| 182 | entry $SERVERCALL,FAR | ||
| 183 | entry $GSETMEDIAID,FAR | ||
| 184 | entry FETCHI_CHECK,FAR | ||
| 185 | entry TABLEDISPATCH,FAR | ||
| 186 | entry DSKSTATCHK,FAR | ||
| 187 | entry SET_RQ_SC_PARMS,FAR | ||
| 188 | entry SAVE_MAP,FAR | ||
| 189 | entry RESTORE_MAP,FAR | ||
| 190 | entry DSKREAD,FAR | ||
| 191 | entry FAST_DISPATCH,FAR | ||
| 192 | entry DSKWRITE,FAR | ||
| 193 | entry INTCNE0,FAR | ||
| 194 | entry SHARE_INSTALL,FAR ;P3568 | ||
| 195 | entry FAKE_VERSION,FAR ;D503 | ||
| 196 | NOP | ||
| 197 | EndProc OUTT | ||
| 198 | |||
| 199 | code ENDS | ||
| 200 | END | ||
| 201 | |||
| 202 | |||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC new file mode 100644 index 0000000..70a0a65 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsfsym.inc 1.0 87/05/11 ;AN000; | ||
| 3 | |||
| 4 | ;************************************************************************************ | ||
| 5 | ; | ||
| 6 | ; IFSFUNC Symbols | ||
| 7 | ; | ||
| 8 | ; Modification history: | ||
| 9 | ; Created: MAY 11 1987 | ||
| 10 | ; | ||
| 11 | ; LOD = 80 (IFS added) | ||
| 12 | ; REVISION HISTORY: | ||
| 13 | ; A000 Original version 4.00 May 1987 | ||
| 14 | ; A001 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA | ||
| 15 | ; A002 PTM ??? - 80H bit on Lock functions ignorred 10/27 FEIGENBAUM | ||
| 16 | ; A003 PTM 2270- filesys/network attach problem 11/27 RGAZZIA | ||
| 17 | ; A004 DCR 285 - remove Extended Attribute/Lock support 1/88 RGAZZIA | ||
| 18 | ; A005 PTM 2827- error msg problems 1/88 RMG | ||
| 19 | ; A006 PTM 3334- new ifsresetenv call 2/88 RMG | ||
| 20 | ; A007 PTM 3657- don't want val code page in flag 2/88 RGazzia | ||
| 21 | ; A008 PTM 3692- net use xxx /d error msg wrong 3/88 RGazzia | ||
| 22 | ; A009 PTM 3673- filesys problems again, undo a003 3/14/88 RMG | ||
| 23 | ; A010 PTM 3968- time/date stamping problems 3/25/88 RMG | ||
| 24 | ; A011 PTM 4140- INT 2F 5 interface change 4/12/88 RMG | ||
| 25 | ; A012 PTM 5006- need save original device ptr - new dfl field 6/02/88 RMG | ||
| 26 | ; | ||
| 27 | ;************************************************************************************ | ||
| 28 | ; ;AN000; | ||
| 29 | ; Old Redirector Stuff ;AN000; | ||
| 30 | ; ;AN000; | ||
| 31 | TRUE EQU 0FFFFh ;AN000; | ||
| 32 | FALSE EQU 0 ;AN000; | ||
| 33 | ;AN000; | ||
| 34 | PATHGEN = TRUE ;AN000; | ||
| 35 | DEBUG = FALSE ;AN000; | ||
| 36 | REDIRECTOR = TRUE ;AN000; | ||
| 37 | Installed = TRUE ;AN000; | ||
| 38 | ;AN000; | ||
| 39 | MSNET_TIMING = FALSE ;AN000; | ||
| 40 | ;AN000; | ||
| 41 | ;AN000; | ||
| 42 | IF1 ;AN000; | ||
| 43 | IF MSNET_TIMING ;AN000; | ||
| 44 | %out MSNET_TIMING version ;AN000; | ||
| 45 | ENDIF ;AN000; | ||
| 46 | IF DEBUG ;AN000; | ||
| 47 | %out DEBUGGING version ;AN000; | ||
| 48 | ENDIF ;AN000; | ||
| 49 | %out INSTALLED version ;AN000; | ||
| 50 | ENDIF ;AN000; | ||
| 51 | ; Structures and equates for the network support ;AN000; | ||
| 52 | ;AN000; | ||
| 53 | ;Net call interrupt - used to generate critical sections ;AN000; | ||
| 54 | NET_CALL_INT EQU 2AH ;AN000; | ||
| 55 | ;AN000; | ||
| 56 | ;Max size of PRINT_PRE_STRING ;AN000; | ||
| 57 | MAX_PRE_STRING EQU 64 ;AN000; | ||
| 58 | ;AN000; | ||
| 59 | ;AN000; | ||
| 60 | ;AH function code for $GET_IN_VARS INT 21 function ;AN000; | ||
| 61 | GET_IN_VAR EQU 52H ;AN000; | ||
| 62 | ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | ; The following EQUates control the replacement of the FCB SFT cache by ;AN000; | ||
| 65 | ; IFSFUNC. If the current FCB Cache Size,Keepcount is DefNumFCB,DefKeepVal ;AN000; | ||
| 66 | ; then IFSFUNC will set up a new cache of NewNumFCB,NewKeepVal. ;AN000; | ||
| 67 | DefNumFCB EQU 4 ;AN000; | ||
| 68 | DefKeepVal EQU 0 ;AN000; | ||
| 69 | ;AN000; | ||
| 70 | NewNumFCB EQU 16 ;AN000; | ||
| 71 | NewKeepVal EQU 8 ;AN000; | ||
| 72 | ;AN000; | ||
| 73 | SUBTTL IFSFUNC Data ;AN000; | ||
| 74 | PAGE ;AN000; | ||
| 75 | ; miscellaneous IFS equates ;AN000; | ||
| 76 | MINUS_ONE EQU -1 ;AN000; | ||
| 77 | NULL_PTR EQU -1 ;AN000; | ||
| 78 | ERROR_INFO_NOT_SET EQU -1 ;AN000; | ||
| 79 | CHECK_REMOVABLE EQU 4408H ;AN000; | ||
| 80 | ICOLON EQU ":" ;AN000; | ||
| 81 | ZERO EQU 0 ;AN000; | ||
| 82 | OLDOPEN_MODE EQU 2180H ;AN000; | ||
| 83 | OLDOPEN_FLAG EQU 0101H ;AN000; | ||
| 84 | OLDCREATE_MODE EQU 0002H ;AC007; | ||
| 85 | OLDCREATE_FLAG EQU 0112H ;AC007; | ||
| 86 | OLDCREATENEW_FLAG EQU 10H ;AN000; | ||
| 87 | ;INT21AL_LOCK_READ EQU 4 ;AD004; | ||
| 88 | ;INT21AL_WRITE_UNLOCK EQU 5 ;AD004; | ||
| 89 | IFSFINSTALLED EQU 0FFH ;AN000; | ||
| 90 | GET_TRUNCATE_FLAG EQU 7 ;AN000; | ||
| 91 | SET_TRUNCATE_FLAG EQU 8 ;AN000; | ||
| 92 | ;;;alias COMPLEX EQU 4 ;AN000; | ||
| 93 | PARSE_ERR_1 EQU 1 ;AN000; | ||
| 94 | PARSE_ERR_5 EQU 5 ;AN000; | ||
| 95 | PARSE_ERR_6 EQU 6 ;AN000; | ||
| 96 | PARSE_ERR_10 EQU 10 ;AN000; | ||
| 97 | COMMON_ERR_2 EQU 2 ;AN000; | ||
| 98 | COMMON_ERR_3 EQU 3 ;AN000; | ||
| 99 | UTIL_ERR_4 EQU 4 ;AN000; | ||
| 100 | RETRY EQU 1 ;AN000; | ||
| 101 | I2F5_MsgRet EQU 2 ;AN011; | ||
| 102 | ;AN000; | ||
| 103 | ; ifsproc flags ;AN000; | ||
| 104 | IsCDS EQU 80H ;AN000; | ||
| 105 | IsSFT EQU 40H ;AN000; | ||
| 106 | IsSEQ EQU 20H ;AN000; | ||
| 107 | IsGet EQU 10H ; vs. set ;AN000; | ||
| 108 | IsOldOpen EQU 10H ;AN000; | ||
| 109 | IsOldCreate EQU 08H ;AN000; | ||
| 110 | IsCreate EQU 8000H ; used in IFS_OPEN in setting sf date/time ;AN010; | ||
| 111 | IsClose EQU 10H ; vs. commit ;AN000; | ||
| 112 | IsRen EQU 10H ; vs. delete ;AN000; | ||
| 113 | ;IsLockRead EQU 10H ;AD005; | ||
| 114 | ;IsWriteUnlock EQU 08H ;AD005; | ||
| 115 | ;IsAdd EQU 04H ;AD005; | ||
| 116 | THISIFS_SET EQU 02H ;AN000; | ||
| 117 | IsShare EQU 80H ; used by auto-attach ;AN000; | ||
| 118 | IsCTLFCN EQU 01H ; used by IFS_UPDATE_CB@ ;AN000; | ||
| 119 | IsCritIFS EQU 02H ; indicates ifs cs ;AN000; | ||
| 120 | Print_On EQU 80H ; sess ;AN000; | ||
| 121 | SetDeviceCB EQU 0100H ; indicates to sft_to_sff to set ifs_device_cb@ ;AN000; | ||
| 122 | IsDummyCDS EQU 0200H ; used to indicate dummy cds (AttStrt/CDS-CD) ;AN000; | ||
| 123 | IsNetwork EQU 0400H ; indicates types 3 or 4 attach ;AN001; | ||
| 124 | SetBP EQU 0800H ; set if return lsn ;AN001; | ||
| 125 | Filesys_Status EQU 1000H ; indicates new style get ifsfunc item ;AN001; | ||
| 126 | ;Filesys_Network_Attach EQU 1000H ; flag used to determine if move ptr direct to parms ;AN003;;AD009; | ||
| 127 | ;IsWOLock EQU 2000H ; write operation only lock - flag moved RMG ;AD004; | ||
| 128 | IsInit EQU 2000H ; this set in AutoAttach for CI-error area ;AN005; | ||
| 129 | IsResetEnvirn EQU 4000H ; used in sess - diff abort from reset environment ;AN006; | ||
| 130 | IsMsgRet EQU 8000H ; used in ifserror - int2f5 to distinguish msg ret ;AN011; | ||
| 131 | ; from command.com ;AN011; | ||
| 132 | ; ifsfunc flags ;AN000; | ||
| 133 | UNC_INSTALLED EQU 80H ; unc file system installed ;AN000; | ||
| 134 | NO_IFS_DRIVERS EQU 40H ; no ifs drivers installed ;AN000; | ||
| 135 | |||
| 136 | ; ifs semaphores IFSSEM equates ;AN011; | ||
| 137 | MR_ERRMSG_SEM EQU 80H ; used by ifserror INT2F AH=5 as gate for msgret entry ;AN011; | ||
| 138 | ; ;AN000; | ||
| 139 | ; DFL - This structure stores IFS/NETUSE/ALIAS Device information ;AN000; | ||
| 140 | ; to IFS driver. ;AN000; | ||
| 141 | |||
| 142 | DFLL_LIST STRUC ;AN000; | ||
| 143 | DFLL_FLAGS DB ? ; Flags ;AN000; | ||
| 144 | DFLL_TYPE DB ? ; 1=IFS, 3=NETUSE, 0=ALIAS ;AN000; | ||
| 145 | DFLL_DEV_NAME DB 8 DUP (?) ; Device name ;AN000; | ||
| 146 | DFLL_USER_WORD DW ? ; attach user word ;AN001; | ||
| 147 | DFLL_ALIAS_INDEX DW ? ; Byte index into alias names list (resv) ;AN000; | ||
| 148 | DFLL_IFS_HDR DD ? ; Pointer to IFSHDR ;AN000; | ||
| 149 | DFLL_FSDA DB 8 DUP (?) ; File System Dependent Data Area ;AN000; | ||
| 150 | DFLL_DEVPTR DD ? ; sft_devptr ;AN012; | ||
| 151 | DFLL_LIST ENDS ;AN000; | ||
| 152 | ;AN000; | ||
| 153 | ; dfl flags ;AN000; | ||
| 154 | DFL_INPROG EQU 80H ; in progress ;AN000; | ||
| 155 | DFL_INUSE EQU 40H ; in use ;AN000; | ||
| 156 | DFL_PAUSED EQU 20H ; device is paused ;AN000; | ||
| 157 | DFL_DEV_REAL EQU 10H ; device is real ;AN000; | ||
| 158 | ;AN000; | ||
| 159 | ; error codes ;AN000; | ||
| 160 | device_not_attached equ 0FH ; ;AC008; | ||
| 161 | fs_driver_not_found equ 67 ; ;AN000; | ||
| 162 | error_out_of_structs equ 56 ; ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK new file mode 100644 index 0000000..f7b9623 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | IFSSESS.OBJ IFSDIR.OBJ IFSFILE.OBJ IFSHAND.OBJ + | ||
| 2 | IFSDEV.OBJ IFSUTIL.OBJ IFSERROR.OBJ IFSFDOS.OBJ IFSINIT.OBJ + | ||
| 3 | ..\..\inc\NIBDOS.OBJ+ | ||
| 4 | ..\..\inc\CONST2.OBJ+ | ||
| 5 | ..\..\inc\msDATA.OBJ+ | ||
| 6 | ..\..\inc\msTABLE.OBJ+ | ||
| 7 | ..\..\dos\msDISP.OBJ + | ||
| 8 | ..\..\dos\msCODE.OBJ + | ||
| 9 | ..\..\inc\msDOSME.OBJ+ | ||
| 10 | IFSFLINK.OBJ | ||
| 11 | IFSFUNC.EXE,IFSFUNC.MAP /EX; | ||
| 12 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL new file mode 100644 index 0000000..4188c7f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | :util IFSFUNC ;AN000; | ||
| 2 | :class 1 ;Extended Error messages ;AN007; | ||
| 3 | :use EXTEND50 ; file system extended error msg #s ;AN007; | ||
| 4 | :use EXTEND51 ;AN007; | ||
| 5 | :use EXTEND52 ;AN007; | ||
| 6 | :use EXTEND53 ;AN007; | ||
| 7 | :use EXTEND54 ;AN007; | ||
| 8 | :use EXTEND55 ;AN007; | ||
| 9 | :use EXTEND56 ;AN007; | ||
| 10 | :use EXTEND57 ;AN007; | ||
| 11 | :use EXTEND58 ;AN007; | ||
| 12 | :use EXTEND59 ;AN007; | ||
| 13 | :use EXTEND60 ;AN007; | ||
| 14 | :use EXTEND61 ;AN007; | ||
| 15 | :use EXTEND62 ;AN007; | ||
| 16 | :use EXTEND63 ;AN007; | ||
| 17 | :use EXTEND64 ;AN007; | ||
| 18 | :use EXTEND65 ;AN007; | ||
| 19 | :use EXTEND66 ;AN007; | ||
| 20 | :use EXTEND67 ;AN007; | ||
| 21 | :use EXTEND68 ;AN007; | ||
| 22 | :use EXTEND69 ;AN007; | ||
| 23 | :use EXTEND70 ;AN007; | ||
| 24 | :use EXTEND71 ;AN007; | ||
| 25 | :use EXTEND72 ;AN007; | ||
| 26 | :use EXTEND73 ;AN007; | ||
| 27 | :use EXTEND74 ;AN007; | ||
| 28 | :use EXTEND80 ;AN007; | ||
| 29 | :use EXTEND82 ;AN007; | ||
| 30 | :use EXTEND83 ;AN007; | ||
| 31 | :use EXTEND84 ;AN007; | ||
| 32 | :use EXTEND85 ;AN007; | ||
| 33 | :use EXTEND86 ;AN007; | ||
| 34 | :use EXTEND87 ;AN007; | ||
| 35 | :use EXTEND88 ;AN007; | ||
| 36 | :use EXTEND89 ;AN007; | ||
| 37 | :class 2 ;parse errors: ;AN000; | ||
| 38 | :use PARSE1 ;Too many parameters ;AN000; | ||
| 39 | :use PARSE4 ;Invalid keyword ;AN000; | ||
| 40 | :use PARSE6 ;Parameter value not in allowed range ;AN002; | ||
| 41 | :use PARSE7 ;Parameter value not allowed ;AN002; | ||
| 42 | :use PARSE9 ;Parameter format not correct ;AN002; | ||
| 43 | :use PARSE10 ;Invalid parameter ;AN000; | ||
| 44 | :class A ;AN000; | ||
| 45 | :use 1 COMMON1 ;Incorrect DOS version ;AN000; | ||
| 46 | :use 2 COMMON2 ;%1 already installed ;AN000; | ||
| 47 | :use 3 COMMON10 ;%1 not installed ;AN000; | ||
| 48 | :def 4 "Invalid configuration",CR,LF ;AN00?; | ||
| 49 | :end ;AN000; | ||
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; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM new file mode 100644 index 0000000..96fb591 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM | |||
| @@ -0,0 +1,1373 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsinit.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC INITIALIZATION ROUTINES - Routines for ifs ;AN000; | ||
| 4 | NAME IFSINIT ;AN000; | ||
| 5 | ;*********************************************************************************** ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; IFS Initialization Routines ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; IFSINIT ;AN000; | ||
| 10 | ; ;AN000; | ||
| 11 | ; REVISION HISTORY: ;AN000; | ||
| 12 | ; A000 - Original version 4.00 MAY 1987 ;AN000; | ||
| 13 | ; A001 - PTM 331 Entry point for device ioctl | ||
| 14 | ; A002 - PTM 430 Renumber parse errors | ||
| 15 | ; A003 - DCR 96 Transfer IFS DOS callbacks to IFSFUNC | ||
| 16 | ; A004 - PTM 696 IFSFUNC hang w/no drivers | ||
| 17 | ; A005 - PTM 541 Parse problem | ||
| 18 | ; A006 - PTM 1227 DOS Version Check problem | ||
| 19 | ; A007 - PTM 842 Error messages in ifsfunc | ||
| 20 | ; A008 - PTM 1950 Autoattach when 2 ifs drivers loaded & 1st fails attach | ||
| 21 | ; A009 - PTM 2249 Autoattach must set isifs bit in cds | ||
| 22 | ; A010 - PTM 2827 Error proc problems 1/88 RMG | ||
| 23 | ; A011 - PTM 3334 put back reset environment call 2/88 rmg | ||
| 24 | ; A012 - PTM 4140 dos ext error msg enhancement - semaphore processing 4/19/88 RMG | ||
| 25 | ; A013 - DCR 526 New INT 2FH Share interface not to trigger logic install 4/19/88 RMG | ||
| 26 | ; | ||
| 27 | ; LOC - | ||
| 28 | ; | ||
| 29 | ;*********************************************************************************** | ||
| 30 | ;AN000; | ||
| 31 | .xlist ;AN000; | ||
| 32 | .xcref ;AN000; | ||
| 33 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 34 | INCLUDE IFSSYM.INC ;AN000; | ||
| 35 | INCLUDE DOSSYM.INC ;AN000; | ||
| 36 | INCLUDE DEVSYM.INC ;AN000; | ||
| 37 | include sysmsg.inc ;AN000; | ||
| 38 | msg_utilname <IFSFUNC> ; resident msgret stuff ;AN000; | ||
| 39 | .cref ;AN000; | ||
| 40 | .list ;AN000; | ||
| 41 | .sall ;AN000; | ||
| 42 | ;AN000; | ||
| 43 | AsmVars <IBM, INSTALLED, DEBUG, PATHGEN> ;AN000; | ||
| 44 | ;AN000; | ||
| 45 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 46 | IFSSEG ENDS ;AN000; | ||
| 47 | ;AN000; | ||
| 48 | include dosseg.asm ;AN000; | ||
| 49 | ;AN000; | ||
| 50 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 51 | ; DOSGROUP data ;AN000; | ||
| 52 | extrn DataVersion:WORD ; version number of DOS data. ;AN000; | ||
| 53 | extrn SFTFCB:DWORD ; FCB SFT cache ;AN000; | ||
| 54 | extrn KeepCount:WORD ; FCB SFT cache ;AN000; | ||
| 55 | Extrn CDSAddr:DWORD ;AN000; | ||
| 56 | Extrn CDSCount:BYTE ;AN000; | ||
| 57 | Extrn DummyCDS:BYTE ;AN000; | ||
| 58 | Extrn CritPatch:WORD ;AN000; | ||
| 59 | DATA ENDS ;AN000; | ||
| 60 | ;AN000; | ||
| 61 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 62 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | ;IFS Data ;AN000; | ||
| 65 | ;AN000; | ||
| 66 | Extrn CDSAlt:DWORD ;AN000; | ||
| 67 | Extrn DFLAddr:DWORD ;AN000; | ||
| 68 | Extrn DFLCount:BYTE ;AN000; | ||
| 69 | ;;;aliasExtrn NLAddr:DWORD ;AN000; | ||
| 70 | ;;;aliasExtrn NLSIZE:WORD ;AN000; | ||
| 71 | Extrn INT_2F_5:BYTE ;AN000; | ||
| 72 | Extrn NEXT_2F_5:DWORD ;AN000; | ||
| 73 | Extrn IFSR:WORD ;AN000; | ||
| 74 | Extrn CD1:WORD ;AN000; | ||
| 75 | Extrn DF1:WORD ;AN000; | ||
| 76 | Extrn SFF1:WORD ;AN000; | ||
| 77 | Extrn THISIFS:DWORD ;AN000; | ||
| 78 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 79 | Extrn IFSFUNC_FLAGS:WORD ;AN000; | ||
| 80 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 81 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 82 | Extrn IFS_ATTRS:WORD | ||
| 83 | Extrn RODS_LABEL:BYTE ;AN000; | ||
| 84 | Extrn IFSSEM:BYTE | ||
| 85 | ;AN000; | ||
| 86 | PUBLIC CODESIZE ;AN000; | ||
| 87 | CODESIZE DB 'RMG' ;AN000; | ||
| 88 | DB 30H ;AN000; | ||
| 89 | DB 30H ;AN000; | ||
| 90 | DB 30H ;AN000; | ||
| 91 | DB 30H ;AN000; | ||
| 92 | DB 30H ;AN000; | ||
| 93 | DB 20H ;AN000; | ||
| 94 | PUBLIC TOTSIZE ;AN000; | ||
| 95 | TOTSIZE DB 30H ;AN000; | ||
| 96 | DB 30H ;AN000; | ||
| 97 | DB 30H ;AN000; | ||
| 98 | DB 30H ;AN000; | ||
| 99 | DB 30H ;AN000; | ||
| 100 | DB 20H ;AN000; | ||
| 101 | ;AN000; | ||
| 102 | ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | Break <INT 2F handler> ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | IF DEBUG ;AN000; | ||
| 107 | Procedure NetPointers,NEAR ;AN000; | ||
| 108 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 109 | LDS SI,[DFLAddr] ;AN000; | ||
| 110 | ;;;aliasLES DI,[NLAddr] ;AN000; | ||
| 111 | return ;AN000; | ||
| 112 | EndProc NetPointers ;AN000; | ||
| 113 | ;AN000; | ||
| 114 | Procedure NetPointers2,NEAR ;AN000; | ||
| 115 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 116 | PUSH CS ;AN000; | ||
| 117 | POP DS ;AN000; | ||
| 118 | ASSUME DS:IFSSEG ;AN000; | ||
| 119 | MOV CX,[DFLCount] ;AN000; | ||
| 120 | ;;;aliasMOV DX,[NLSIZE] ;AN000; | ||
| 121 | return ;AN000; | ||
| 122 | EndProc NetPointers2 ;AN000; | ||
| 123 | ENDIF ;AN000; | ||
| 124 | ;AN000; | ||
| 125 | IF PATHGEN ;AN000; | ||
| 126 | Procedure GetIFSFCSinES,NEAR ;AN000; | ||
| 127 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 128 | PUSH CS ;AN000; | ||
| 129 | POP ES ;AN000; | ||
| 130 | return ;AN000; | ||
| 131 | EndProc GetIFSFCSinES ;AN000; | ||
| 132 | ENDIF ;AN000; | ||
| 133 | ;AN000; | ||
| 134 | Procedure UnusedFunc,NEAR ;AN000; | ||
| 135 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 136 | fmt <>,<>,<"Unused IFSFUNC function issued\n"> ;AN000; | ||
| 137 | MOV AX,error_invalid_function ;AN000; | ||
| 138 | STC ;AN000; | ||
| 139 | return ;AN000; | ||
| 140 | EndProc UnusedFunc ;AN000; | ||
| 141 | ;AN000; | ||
| 142 | ; the following multiplex functions are implemented: ;AN000; | ||
| 143 | ;AN000; | ||
| 144 | retn1 DD ? ;AN000; | ||
| 145 | DMY DW ? ;AN000; | ||
| 146 | CONT DD ? ;AN000; | ||
| 147 | FOO DW Leave2F ;AN000; | ||
| 148 | ;AN000; | ||
| 149 | INT2F PROC FAR ;AN000; | ||
| 150 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; | ||
| 151 | CMP AH,multIFS ;AN000; | ||
| 152 | JZ IDispatch ;AN000; | ||
| 153 | JMP CONT ;AN000; | ||
| 154 | Leave2F: ;AN000; | ||
| 155 | RET ;AN000; | ||
| 156 | INT2F ENDP ;AN000; | ||
| 157 | ;AN000; | ||
| 158 | Procedure IDispatch,NEAR ;AN000; | ||
| 159 | POP WORD PTR retn1 ; remove long return ;AN000; | ||
| 160 | POP WORD PTR retn1+2 ;AN000; | ||
| 161 | POP DMY ; remove flags ;AN000; | ||
| 162 | XCHG AX,BX ; save bx/move index to index reg ;AN000; | ||
| 163 | SHL BL,1 ; convert byte to word index ;AN000; | ||
| 164 | XOR BH,BH ; convert to word index ;AN000; | ||
| 165 | POP DMY ; save fictitious AX ;AN000; | ||
| 166 | PUSH DMY ; restore spot on stack ;AN000; | ||
| 167 | PUSH WORD PTR retn1+2 ; restore long return ;AN000; | ||
| 168 | PUSH WORD PTR retn1 ;AN000; | ||
| 169 | PUSH FOO ; place near address of far return ;AN000; | ||
| 170 | PUSH CS:IFStable[BX] ; place destination routine ;AN000; | ||
| 171 | XCHG AX,BX ; restore BX ;AN000; | ||
| 172 | MOV AX,DMY ; restore AX ;AN000; | ||
| 173 | STI ; let Mani see Clock ticks ;AN000; | ||
| 174 | ShortReturn: ;AN000; | ||
| 175 | return ; go to routine (dispatch for Aaron) ;AN000; | ||
| 176 | ;AN000; | ||
| 177 | EDW MACRO name ;AN000; | ||
| 178 | extrn name:near ;AN000; | ||
| 179 | DW name ;AN000; | ||
| 180 | ENDM ;AN000; | ||
| 181 | ;AN000; | ||
| 182 | IFSTable LABEL WORD ;AN000; | ||
| 183 | DW IFSInstall ;AN000; | ||
| 184 | EDW IFS_RMDIR ; 1 IFS_RMDIR ;AN000; | ||
| 185 | EDW IFS_SEQ_RMDIR ; 2 IFS_SEQ_RMDIR ;AN000; | ||
| 186 | EDW IFS_MKDIR ; 3 IFS_MKDIR ;AN000; | ||
| 187 | EDW IFS_SEQ_MKDIR ; 4 IFS_SEQ_MKDIR ;AN000; | ||
| 188 | EDW IFS_CHDIR ; 5 IFS_CHDIR ;AN000; | ||
| 189 | EDW IFS_CLOSE ; 6 IFS_CLOSE ;AN000; | ||
| 190 | EDW IFS_COMMIT ; 7 IFS_COMMIT ;AN000; | ||
| 191 | EDW IFS_READ ; 8 IFS_READ ;AN000; | ||
| 192 | EDW IFS_WRITE ; 9 IFS_WRITE ;AN000; | ||
| 193 | EDW IFS_XLOCK ; 10 IFS_XLOCK ;AN000; | ||
| 194 | DW UnusedFunc ; 11 ;AN000; | ||
| 195 | EDW IFS_DISK_INFO ; 12 IFS_DISK_INFO ;AN000; | ||
| 196 | EDW IFS_SET_FILE_ATTRIBUTE ; 13 IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 197 | EDW IFS_SEQ_SET_FILE_ATTRIBUTE ; 14 IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 198 | EDW IFS_GET_FILE_INFO ; 15 IFS_GET_FILE_INFO ;AN000; | ||
| 199 | EDW IFS_SEQ_GET_FILE_INFO ; 16 IFS_SEQ_GET_FILE_INFO ;AN000; | ||
| 200 | EDW IFS_RENAME ; 17 IFS_RENAME ;AN000; | ||
| 201 | EDW IFS_SEQ_RENAME ; 18 IFS_SEQ_RENAME ;AN000; | ||
| 202 | EDW IFS_DELETE ; 19 IFS_DELETE ;AN000; | ||
| 203 | EDW IFS_SEQ_DELETE ; 20 IFS_SEQ_DELETE ;AN000; | ||
| 204 | EDW IFS_OPEN ; 21 IFS_OPEN ;AN000; | ||
| 205 | EDW IFS_SEQ_OPEN ; 22 IFS_SEQ_OPEN ;AN000; | ||
| 206 | EDW IFS_CREATE ; 23 IFS_CREATE ;AN000; | ||
| 207 | EDW IFS_SEQ_CREATE ; 24 IFS_SEQ_CREATE ;AN000; | ||
| 208 | EDW IFS_SEQ_SEARCH_FIRST ; 25 IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 209 | EDW IFS_SEQ_SEARCH_NEXT ; 26 IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 210 | EDW IFS_SEARCH_FIRST ; 27 IFS_SEARCH_FIRST ;AN000; | ||
| 211 | EDW IFS_SEARCH_NEXT ; 28 IFS_SEARCH_NEXT ;AN000; | ||
| 212 | EDW IFS_ABORT ; 29 IFS_ABORT ;AN000; | ||
| 213 | EDW IFS_ASSOPER ; 30 IFS_ASSOPER ;AN000; | ||
| 214 | EDW Printer_GETSET_STRING ; 31 Printer_GETSET_STRING ;AN000; | ||
| 215 | EDW IFSFlushBuf ; 32 IFS_Flush_Buf ;AN000; | ||
| 216 | EDW IFS_LSEEK ; 33 IFS_LSEEK ;AN000; | ||
| 217 | EDW IFS_RESET_ENVIRONMENT ; 34 IFS_RESET_ENVIRONMENT ;AN000; | ||
| 218 | EDW IFS_DEVICE_CHECK ; 35 IFSDeviceCheck ;AN000; | ||
| 219 | EDW IFS_DEVICE_CLOSE ; 36 IFSDeviceClose ;AN000; | ||
| 220 | EDW IFS_DEVICE_OPER ; 37 IFSDeviceOper ;AN000; | ||
| 221 | EDW IFS_SPOOL_ECHO_CHECK ; 38 IFSSpoolEchoCheck ;AN000; | ||
| 222 | DW UnusedFunc ; 39 ;AN000; | ||
| 223 | DW UnusedFunc ; 40 ;AN000; | ||
| 224 | DW UnusedFunc ; 41 ;AN000; | ||
| 225 | EDW SERVER_DOSCALL_CLOSEFILES_FOR_UID ; 42 util ;AN000; | ||
| 226 | EDW DEVICE_IOCTL ; 43 dev ;AN001; | ||
| 227 | EDW IFS_UPDATE_CB ; 44 UPDATECB util ;AN000; | ||
| 228 | EDW IFS_FILE_XATTRIBUTES ; 45 hand ;AN000; | ||
| 229 | EDW IFS_XOPEN ; 46 XOPEN file ;AN000; | ||
| 230 | EDW IFS_DEPENDENT_IOCTL ; 47 util ;AN000; | ||
| 231 | ;AN000; | ||
| 232 | IF DEBUG ;AN000; | ||
| 233 | DW NetPointers ; 47 NetPointers ;AN000; | ||
| 234 | DW NetPointers2 ; 48 NetPointers2 ;AN000; | ||
| 235 | ENDIF ;AN000; | ||
| 236 | ;AN000; | ||
| 237 | IF PATHGEN ;AN000; | ||
| 238 | DW GetIFSFCSinES ; 49 (if debug) GetRedirCSinES ;AN000; | ||
| 239 | ; 47 (if NOT debug) GetRedirCSinES ;AN000; | ||
| 240 | ENDIF ;AN000; | ||
| 241 | ;AN000; | ||
| 242 | IFSInstall: ;AN000; | ||
| 243 | MOV AL,0FFh ;AN000; | ||
| 244 | MOV BX,IFS_ATTRS | ||
| 245 | return ;AN000; | ||
| 246 | EndProc IDispatch ;AN000; | ||
| 247 | ;AN000; | ||
| 248 | Procedure EcritNet,NEAR ;AN000; | ||
| 249 | ASSUME SS:NOTHING ;AN000; | ||
| 250 | PUSHF ;AN000; | ||
| 251 | CLI ;AN000; | ||
| 252 | PUSH AX ;AN000; | ||
| 253 | MOV AX,8000h+CritNet ;AN000; | ||
| 254 | INT int_ibm ;AN000; | ||
| 255 | POP AX ;AN000; | ||
| 256 | IF DEBUG ;AN000; | ||
| 257 | JNC NoCarry ;AN000; | ||
| 258 | fmt <>,<>,<"$p: ECritNet overflowed semaphore\n"> ;AN000; | ||
| 259 | NoCarry: ;AN000; | ||
| 260 | ENDIF ;AN000; | ||
| 261 | STI ;AN000; | ||
| 262 | POPF ;AN000; | ||
| 263 | return ;AN000; | ||
| 264 | EndProc EcritNet ;AN000; | ||
| 265 | ;AN000; | ||
| 266 | ; ;AN000; | ||
| 267 | ; Leave critical section for network. Note that the first instruction (PUSH ;AN000; | ||
| 268 | ; AX) here is used as the patch byte to enable the DOS critical section ;AN000; | ||
| 269 | ; routines... ;AN000; | ||
| 270 | ; ;AN000; | ||
| 271 | ; NOTE!!! On a 286, this instruction issues POPF!!! ;AN000; | ||
| 272 | ; ;AN000; | ||
| 273 | Procedure LcritNet,NEAR ;AN000; | ||
| 274 | PUSH AX ;AN000; | ||
| 275 | PUSHF ;AN000; | ||
| 276 | CLI ;AN000; | ||
| 277 | IF DEBUG ;AN000; | ||
| 278 | JGE NoWrap ;AN000; | ||
| 279 | fmt <>,<>,<"$p: LCritNet decrementing semaphore through zero\n"> ;AN000; | ||
| 280 | NoWrap: ;AN000; | ||
| 281 | ENDIF ;AN000; | ||
| 282 | ;AN000; | ||
| 283 | MOV AX,8100h+critNet ;AN000; | ||
| 284 | INT int_ibm ;AN000; | ||
| 285 | STI ;AN000; | ||
| 286 | POPF ; NOTE that this restores entry ;AN000; | ||
| 287 | POP AX ;AN000; | ||
| 288 | return ;AN000; | ||
| 289 | EndProc LcritNet ;AN000; | ||
| 290 | ;AN000; | ||
| 291 | ;AN000; | ||
| 292 | Procedure EcritIFS,NEAR ;AN000; | ||
| 293 | ASSUME SS:NOTHING ;AN000; | ||
| 294 | PUSHF ;AN000; | ||
| 295 | CLI ;AN000; | ||
| 296 | PUSH AX ;AN000; | ||
| 297 | MOV AX,8000h+CritIFS ;AN000; | ||
| 298 | INT int_ibm ;AN000; | ||
| 299 | POP AX ;AN000; | ||
| 300 | STI ;AN000; | ||
| 301 | POPF ;AN000; | ||
| 302 | return ;AN000; | ||
| 303 | EndProc EcritIFS ;AN000; | ||
| 304 | ;AN000; | ||
| 305 | Procedure LcritIFS,NEAR ;AN000; | ||
| 306 | PUSH AX ;AN000; | ||
| 307 | PUSHF ;AN000; | ||
| 308 | CLI ;AN000; | ||
| 309 | MOV AX,8100h+critIFS ;AN000; | ||
| 310 | INT int_ibm ;AN000; | ||
| 311 | STI ;AN000; | ||
| 312 | POPF ; NOTE that this restores entry ;AN000; | ||
| 313 | POP AX ;AN000; | ||
| 314 | return ;AN000; | ||
| 315 | EndProc LcritIFS ;AN000; | ||
| 316 | ;AN000; | ||
| 317 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; | ||
| 318 | ;AN000; | ||
| 319 | INTERR: ;AN000; | ||
| 320 | INTERRL:jmp INTERRL ; hang here - we're sick ;AN000; | ||
| 321 | ;AN000; | ||
| 322 | ;AN000; | ||
| 323 | PUBLIC TEMPBUF ;AN000; | ||
| 324 | TEMPBUF LABEL BYTE ;AN000; | ||
| 325 | ; THE SPACE FROM HERE TO NETEND CONSTITUTES THE TEMP AREA OF IFSFUNC. ;AN000; | ||
| 326 | ; WARNING DANGER!!!!!!!!! ;AN000; | ||
| 327 | ; DO NOT reduce the size of this area without first checking ;AN000; | ||
| 328 | ; all users of it. It is OK to make it BIGGER without checking. ;AN000; | ||
| 329 | ; Current size: ?? ;AN000; | ||
| 330 | ;AN000; | ||
| 331 | Break <General IFSFUNC INIT> ;AN000; | ||
| 332 | ;************************************************************************************ ;AN000; | ||
| 333 | ; ;AN000; | ||
| 334 | ; map: Resident: ;AN000; | ||
| 335 | ; IF_40 - (contifsinit) 2nd half of ifsfinit procedure = tempbuf area ;AN000; | ||
| 336 | ; allocate: DFL_LIST, altcds, sftfcb, ;AN000; | ||
| 337 | ; set TOTALSIZE ;AN000; | ||
| 338 | ; IFSFUNCINIT start ;AN000; | ||
| 339 | ; I_700 - INIT: 2nd half of IFSFUNCINIT ;AN000; | ||
| 340 | ; INT 23,24 stuff ;AN000; | ||
| 341 | ; call IFSFINIT ;AN000; | ||
| 342 | ; close std handles ;AN000; | ||
| 343 | ; enable critical section ;AN000; | ||
| 344 | ; terms & stays ;AN000; | ||
| 345 | ; tempbuf ends ;AN000; | ||
| 346 | ; Transient: ;AN000; | ||
| 347 | ; IFSFINIT procedure ;AN000; | ||
| 348 | ; Set interrupt vectors - 2F ;AN000; | ||
| 349 | ; Call AUTO_ATTACH ;AN000; | ||
| 350 | ; allocate stuff (write over code) ;AN000; | ||
| 351 | ; jumps up to 2nd half ;AN000; | ||
| 352 | ; IFSFUNCINIT init code ;AN000; | ||
| 353 | ; version checks ;AN000; | ||
| 354 | ; error msg processing ;AN000; | ||
| 355 | ; free environment ;AN000; | ||
| 356 | ; parsing ;AN000; | ||
| 357 | ; move stack ;AN000; | ||
| 358 | ; check size for everything ;AN000; | ||
| 359 | ; ifsfunc code size calculation ;AN000; | ||
| 360 | ; ifsfunc total size calculation ;AN000; | ||
| 361 | ; jmps to I_700 ;AN000; | ||
| 362 | ; AutoAttach ;AN000; | ||
| 363 | ; CheckUNCpresence ;AN000; | ||
| 364 | ; ;AN000; | ||
| 365 | ;************************************************************************************ ;AN000; | ||
| 366 | ;AN000; | ||
| 367 | ; This Code must be protected from overwrite when the structures are ;AN000; | ||
| 368 | ; initialized ;AN000; | ||
| 369 | ;AN000; | ||
| 370 | ;AN000; | ||
| 371 | IF_40: ; CONTIFSINIT ;AN000; | ||
| 372 | ASSUME DS:IFSSEG,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 373 | ;AN000; | ||
| 374 | ; ;AN000; | ||
| 375 | ; Allocate and init DFL_LIST ;AN000; | ||
| 376 | ; ;AN000; | ||
| 377 | MOV WORD PTR DFLAddr,DI ;AN000; | ||
| 378 | MOV WORD PTR DFLAddr+2,ES ;AN000; | ||
| 379 | MOV AL,DFLCount ;AN000; | ||
| 380 | XOR AH,AH ;AN000; | ||
| 381 | MOV BX,SIZE DFLL_LIST ;AN000; | ||
| 382 | MUL BX ;AN000; | ||
| 383 | MOV CX,AX ;AN000; | ||
| 384 | XOR AX,AX ;AN000; | ||
| 385 | REP STOSB ;AN000; | ||
| 386 | ;AN000; | ||
| 387 | ;;;aliasMOV WORD PTR NLAddr,DI ;AN000; | ||
| 388 | ;;; MOV WORD PTR NLAddr+2,ES ;AN000; | ||
| 389 | ;;; MOV AX,NLSIZE ;AN000; | ||
| 390 | ;;; STOSW ;AN000; | ||
| 391 | ;;; XOR AX,AX ;AN000; | ||
| 392 | ;;; STOSW ;AN000; | ||
| 393 | ;;;aliasADD DI,NLSIZE-4 ;AN000; | ||
| 394 | ; ;AN000; | ||
| 395 | ; Allocate alt CDSs area ;AN000; | ||
| 396 | ; ;AN000; | ||
| 397 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 398 | JZ IF_50 ;AN000; | ||
| 399 | MOV WORD PTR CDSAlt,DI ;AN000; | ||
| 400 | MOV WORD PTR CDSAlt+2,ES ;AN000; | ||
| 401 | PUSH DS ;AN000; | ||
| 402 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 403 | INT 2FH ;AN000; | ||
| 404 | ASSUME DS:DOSGROUP ;AN000; | ||
| 405 | MOV AL,CDSCount ; Alt = Alloc ((sizeof(CDS)+1)*CDSCount); ;AN000; | ||
| 406 | XOR AH,AH ;AN000; | ||
| 407 | INC AX ;AN000; | ||
| 408 | MOV BX,SIZE curdir_list ;AN000; | ||
| 409 | MUL BX ;AN000; | ||
| 410 | ADD DI,AX ;AN000; | ||
| 411 | JMP SHORT IF_55 ;AN000; | ||
| 412 | IF_50: ;AN000; | ||
| 413 | PUSH DS ;AN000; | ||
| 414 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 415 | INT 2FH ;AN000; | ||
| 416 | ASSUME DS:DOSGROUP ;AN000; | ||
| 417 | ; ;AN000; | ||
| 418 | ; Allocate new FCB cache if appropriate ;AN000; | ||
| 419 | ; ;AN000; | ||
| 420 | IF_55: ;AN000; | ||
| 421 | CMP BYTE PTR CS:NEWFCBCACHE,0 ; Damn forward reference ;AN000; | ||
| 422 | JZ IF_80 ; JZ NO_FCB_CACHE ;AN000; | ||
| 423 | ; ;AN000; | ||
| 424 | ; We need to allocate (NewNumFCB * size of SF_entry) + size of sfTable. ;AN000; | ||
| 425 | ; ;AN000; | ||
| 426 | CLI ; Diddling a DOS table, make sure ;AN000; | ||
| 427 | ; ;AN000; | ||
| 428 | ; Make dos point to new table ;AN000; | ||
| 429 | ; ;AN000; | ||
| 430 | MOV WORD PTR SFTFCB,DI ;AN000; | ||
| 431 | MOV WORD PTR SFTFCB+2,ES ;AN000; | ||
| 432 | ; ;AN000; | ||
| 433 | ; Initialize table parts, next link and size ;AN000; | ||
| 434 | ; ;AN000; | ||
| 435 | MOV WORD PTR ES:[DI.sfLink],-1 ;AN000; | ||
| 436 | MOV WORD PTR ES:[DI.sfLink+2],-1 ;AN000; | ||
| 437 | MOV CX,NewNumFCB ;AN000; | ||
| 438 | MOV ES:[DI.sfcount],CX ;AN000; | ||
| 439 | ; ;AN000; | ||
| 440 | ; Set up keepcount ;AN000; | ||
| 441 | ; ;AN000; | ||
| 442 | MOV KeepCount,NewKeepVal ;AN000; | ||
| 443 | ; ;AN000; | ||
| 444 | ; Clean out the new FCB Cache ;AN000; | ||
| 445 | ; ;AN000; | ||
| 446 | LEA DI,[DI].SFTable ; Point to the FCB SFTs ;AN000; | ||
| 447 | IF_60: ; CleanScan: ;AN000; | ||
| 448 | MOV ES:[DI.sf_ref_count],0 ;AN000; | ||
| 449 | MOV WORD PTR ES:[DI.sf_position],0 ;AN000; | ||
| 450 | MOV WORD PTR ES:[DI.sf_position+2],0 ;AN000; | ||
| 451 | ADD DI,SIZE sf_entry ;AN000; | ||
| 452 | LOOP IF_60 ;AN000; | ||
| 453 | STI ;AN000; | ||
| 454 | IF_80: ; NO_FCB_CACHE: ;AN000; | ||
| 455 | POP DS ;AN000; | ||
| 456 | ASSUME DS:IFSSEG ;AN000; | ||
| 457 | ;AN000; | ||
| 458 | MOV [TOTALSIZE],DI ; Offset of 1st free byte ;AN000; | ||
| 459 | POP AX ;AN000; | ||
| 460 | POP BX ;AN000; | ||
| 461 | POP CX ;AN000; | ||
| 462 | POP DX ;AN000; | ||
| 463 | POP DI ;AN000; | ||
| 464 | POP SI ;AN000; | ||
| 465 | POP ES ;AN000; | ||
| 466 | POP DS ;AN000; | ||
| 467 | return ;AN000; | ||
| 468 | ;AN000; | ||
| 469 | ;AN000; | ||
| 470 | ;AN000; | ||
| 471 | ASSUME CS:IFSSEG,DS:IFSSEG,ES:NOTHING,SS:STACK ;AN000; | ||
| 472 | ;AN000; | ||
| 473 | .xlist ;AN000; | ||
| 474 | .xcref ;AN000; | ||
| 475 | msg_services <MSGDATA> ;AN007; | ||
| 476 | PUBLIC SYSGETMSG | ||
| 477 | msg_services <GETmsg> | ||
| 478 | .cref ;AN000; | ||
| 479 | .list ;AN000; | ||
| 480 | ;AN000; | ||
| 481 | Break <Installable Network INIT> ;AN000; | ||
| 482 | ;AN000; | ||
| 483 | Totalsize DW ? ;AN000; | ||
| 484 | ;AN000; | ||
| 485 | NEWFCBCACHE DB 0 ;AN000; | ||
| 486 | ;AN000; | ||
| 487 | INT_24: ; INT 24 handler used during INIT. ;AN000; | ||
| 488 | MOV AL,3 ; FAIL any INT 24s ;AN000; | ||
| 489 | INT_23: ; ^C handler used during INIT. ;AN000; | ||
| 490 | IRET ; ignores any ^C. ;AN000; | ||
| 491 | ;AN000; | ||
| 492 | I_700: ; Init ;AN000; | ||
| 493 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 494 | ; ;AN000; | ||
| 495 | ; We are now going to set lots of INT vectors and other stuff. We need ;AN000; | ||
| 496 | ; to make ourselves immune to INT 24 and ^C ;AN000; | ||
| 497 | ; ;AN000; | ||
| 498 | PUSH CS ;AN000; | ||
| 499 | POP DS ;AN000; | ||
| 500 | MOV DX,OFFSET INT_23 ;AN000; | ||
| 501 | MOV AX,(Set_Interrupt_Vector SHL 8) + 23H ;AN000; | ||
| 502 | INT 21H ;AN000; | ||
| 503 | MOV DX,OFFSET INT_24 ;AN000; | ||
| 504 | MOV AX,(Set_Interrupt_Vector SHL 8) + 24H ;AN000; | ||
| 505 | INT 21H ;AN000; | ||
| 506 | invoke IFSFINIT ; Do general INIT ;AN000; | ||
| 507 | ;AN000; | ||
| 508 | XOR BX,BX ;AN000; | ||
| 509 | MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN ;AN000; | ||
| 510 | I_720: ; Close STD handles before ;AN000; | ||
| 511 | ; keep process ;AN000; | ||
| 512 | MOV AH,CLOSE ;AN000; | ||
| 513 | INT 21H ;AN000; | ||
| 514 | INC BX ;AN000; | ||
| 515 | LOOP I_720 ;AN000; | ||
| 516 | ;AN000; | ||
| 517 | ; ;AN000; | ||
| 518 | ; Enable the critical section code. This consists of replacing the RETs at ;AN000; | ||
| 519 | ; the beginning of each critical section routine with a PUSH AX ;AN000; | ||
| 520 | ; ;AN000; | ||
| 521 | PUSH CS ;AN000; | ||
| 522 | POP DS ; ds - ifsseg ;AN000; | ||
| 523 | ;AN000; | ||
| 524 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ; 1st check if unc fs loaded ;AN000; | ||
| 525 | JZ I_800 ; only do this for unc ;AN000; | ||
| 526 | MOV AH,Get_In_Vars ; do crit patch ;AN000; | ||
| 527 | INT 21h ;AN000; | ||
| 528 | cld ;AN000; | ||
| 529 | ASSUME ES:DOSGroup ;AN000; | ||
| 530 | MOV AL,BYTE PTR LCritNet ;AN000; | ||
| 531 | MOV BX,OFFSET DOSGROUP:CritPatch ;AN000; | ||
| 532 | CLI ;AN000; | ||
| 533 | I_760: ; Scan ;AN000; | ||
| 534 | MOV DI,ES:[BX] ;AN000; | ||
| 535 | ADD BX,2 ;AN000; | ||
| 536 | OR DI,DI ;AN000; | ||
| 537 | JZ I_780 ;AN000; | ||
| 538 | stosb ;AN000; | ||
| 539 | JMP I_760 ;AN000; | ||
| 540 | I_780: ;AN000; | ||
| 541 | STI ;AN000; | ||
| 542 | I_800: ;AC012;moved | ||
| 543 | MOV CS:IFSSEM,0 ; initialize ifs semaphores ;AN012; | ||
| 544 | ; ;AN000; | ||
| 545 | ; Compute total size for residency. ;AN000; | ||
| 546 | ; ;AN000; | ||
| 547 | MOV DX,TotalSize ; size of code and structs ;AN000; | ||
| 548 | ADD DX,100H+0Fh ; Add size of header ;AN000; | ||
| 549 | RCR DX,1 ;AN000; | ||
| 550 | MOV CL,3 ;AN000; | ||
| 551 | SHR DX,CL ;AN000; | ||
| 552 | MOV AX,(Keep_Process SHL 8) + 0 ;AN000; | ||
| 553 | INT 21h ;AN000; | ||
| 554 | MOV AX,(EXIT SHL 8) + 1 ;AN000; | ||
| 555 | INT 21h ;AN000; | ||
| 556 | ;AN000; | ||
| 557 | ;AN000; | ||
| 558 | ; %%%% CODE/DATA BELOW IS OVERLAYED WHEN STRUCTURES ARE SET UP ;AN000; | ||
| 559 | ;AN000; | ||
| 560 | NETEND LABEL BYTE ;AN000; | ||
| 561 | ;AN000; | ||
| 562 | procedure IFSFINIT,NEAR ;AN000; | ||
| 563 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 564 | ;AN000; | ||
| 565 | ; Perform initialization at DOSINIT time ;AN000; | ||
| 566 | ;AN000; | ||
| 567 | PUSH DS ;AN000; | ||
| 568 | PUSH ES ;AN000; | ||
| 569 | PUSH SI ;AN000; | ||
| 570 | PUSH DI ;AN000; | ||
| 571 | PUSH DX ;AN000; | ||
| 572 | PUSH CX ;AN000; | ||
| 573 | PUSH BX ;AN000; | ||
| 574 | PUSH AX ;AN000; | ||
| 575 | PUSH CS ;AN000; | ||
| 576 | POP DS ;AN000; | ||
| 577 | ;AN000; | ||
| 578 | ASSUME DS:IFSSEG ;AN000; | ||
| 579 | ;AN000; | ||
| 580 | ; SET INTERRUPT VECTORS ;AN000; | ||
| 581 | ;AN000; | ||
| 582 | MOV AL,2FH ;AN000; | ||
| 583 | PUSH AX ;AN000; | ||
| 584 | MOV AX,(multDOS SHL 8) OR 2 ;AN000; | ||
| 585 | INT 2FH ;AN000; | ||
| 586 | POP AX ; no know contents ;AN000; | ||
| 587 | ;AN000; | ||
| 588 | PUSH ES ;AN000; | ||
| 589 | PUSH BX ;AN000; | ||
| 590 | LES BX,DWORD PTR ES:[BX] ; setting int 2f mult 5 ;AN000; | ||
| 591 | MOV WORD PTR [NEXT_2F_5],BX ;AN000; | ||
| 592 | MOV WORD PTR [NEXT_2F_5+2],ES ;AN000; | ||
| 593 | POP BX ;AN000; | ||
| 594 | POP ES ;AN000; | ||
| 595 | ;AN000; | ||
| 596 | MOV DX,OFFSET INT_2F_5 ;AN000; | ||
| 597 | MOV ES:[BX],DX ;AN000; | ||
| 598 | MOV ES:[BX+2],DS ;AN000; | ||
| 599 | ;AN000; | ||
| 600 | MOV AX,(Get_Interrupt_Vector SHL 8) + 2Fh ;AN000; | ||
| 601 | INT 21h ;AN000; | ||
| 602 | MOV WORD PTR CONT,BX ;AN000; | ||
| 603 | MOV WORD PTR CONT+2,ES ;AN000; | ||
| 604 | MOV AX,(Set_Interrupt_Vector SHL 8) + 2Fh ;AN000; | ||
| 605 | MOV DX,OFFSET INT2F ; multIFS handler ;AN000; | ||
| 606 | INT 21h ;AN000; | ||
| 607 | ; ;AN000; | ||
| 608 | ; auto - attach ;AN000; | ||
| 609 | ; ;AN000; | ||
| 610 | CALL AUTO_ATTACH ;AN000; | ||
| 611 | ; ;AN000; | ||
| 612 | ; call swap setup ;AN000; | ||
| 613 | ; ;AN000; | ||
| 614 | PUSH DS ;AN000; | ||
| 615 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 616 | INT 2FH ;AN000; | ||
| 617 | ASSUME DS:DOSGROUP ;AN000; | ||
| 618 | invoke SERVER_IFSFUNC_DATA_AREA ;AN000; | ||
| 619 | POP DS ;AN000; | ||
| 620 | invoke SET_IFS_DOSCALL@ ;AN003; | ||
| 621 | ;AN000; | ||
| 622 | PUSH CS ;AN000; | ||
| 623 | POP ES ;AN000; | ||
| 624 | ; ;AN007; | ||
| 625 | ; Prep error messages ;AN007; | ||
| 626 | ; ;AN007; | ||
| 627 | LEA DI,Rods_label ;AN007; | ||
| 628 | SaveReg <CS> ;AN007; | ||
| 629 | RestoreReg <ES> ;AN007; | ||
| 630 | MOV AX,DOS_GET_EXT_PARSE_ADD ;AN007; | ||
| 631 | MOV DL,7 ; set msg addr ;AN007; | ||
| 632 | INT 2FH ;AN007; | ||
| 633 | ; ;AN000; | ||
| 634 | ; Now start clobbering code ;AN000; | ||
| 635 | ; ;AN000; | ||
| 636 | MOV DI,OFFSET NETEND ; Start strucs here ;AN000; | ||
| 637 | TEST DI,1 ; Word aligned? ;AN000; | ||
| 638 | JZ IF_20 ; Yes, ok ;AN000; | ||
| 639 | INC DI ; Bump to word align ;AN000; | ||
| 640 | IF_20: ; NOADJ1 ;AN000; | ||
| 641 | JMP IF_40 ; jmp CONTIFSINIT ;AN000; | ||
| 642 | ;AN000; | ||
| 643 | EndProc IFSFINIT ;AN000; | ||
| 644 | ;AN000; | ||
| 645 | ;************* ifsfuncinit transient portion ****************************** ;AN000; | ||
| 646 | AA_PARMS_BUF DB 6 DUP(0) ; temp storage used by auto-attach ;AN000; | ||
| 647 | S_SIZE1 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; | ||
| 648 | DB 0 ; Reserved ;AN000; | ||
| 649 | DD SUB_IFSFUNC ; Ptr to substituted string ;AN000; | ||
| 650 | DB 1 ; n of %n ;AN000; | ||
| 651 | DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; | ||
| 652 | DB 7 ; Maximum field width ;AN000; | ||
| 653 | DB 5 ; Minimum field width ;AN000; | ||
| 654 | DB " " ; Character for Pad field ;AN000; | ||
| 655 | S_SIZE2 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; | ||
| 656 | DB 0 ; Reserved ;AN000; | ||
| 657 | DD SUB_SHARE ; Ptr to substituted string ;AN000; | ||
| 658 | DB 1 ; n of %n ;AN000; | ||
| 659 | DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; | ||
| 660 | DB 7 ; Maximum field width ;AN000; | ||
| 661 | DB 5 ; Minimum field width ;AN000; | ||
| 662 | DB " " ; Character for Pad field ;AN000; | ||
| 663 | ;AN000; | ||
| 664 | SUB_IFSFUNC DB "IFSFUNC",0 ;AN000; | ||
| 665 | SUB_SHARE DB "SHARE",0 ;AN000; | ||
| 666 | ;AN000; | ||
| 667 | DEFAULT_DFLCount DB 4 ;AN000; | ||
| 668 | ;;;alias DEFAULT_NLSize DW 172 ; 4 * 43 ;AN000; | ||
| 669 | ;AN000; | ||
| 670 | ASSUME CS:IFSSEG,DS:NOTHING ;AN000; | ||
| 671 | .xlist ;AN000; | ||
| 672 | .xcref ;AN000; | ||
| 673 | INCLUDE IFSPARSE.INC ;AN000; | ||
| 674 | msg_services <DISPLAYmsg,CHARmsg,LOADmsg> ;AN000; | ||
| 675 | msg_services <ifsfunc.cla,ifsfunc.cl2> ; parse/install msgs ;AN000; | ||
| 676 | .cref ;AN000; | ||
| 677 | .list ;AN000; | ||
| 678 | ;AN000; | ||
| 679 | ;****************************************************************************** ;AN000; | ||
| 680 | ; !!!!!!! IFSFUNC starts here !!!!!!! (see END statement) ;AN000; | ||
| 681 | ;****************************************************************************** ;AN000; | ||
| 682 | ;AN000; | ||
| 683 | IFSFUNCINIT: ;AN000; | ||
| 684 | ;AN000; | ||
| 685 | CALL SYSLOADMSG ;AN000; | ||
| 686 | JNC I_20 ;AN000; | ||
| 687 | SaveReg <CS> ;AN006; | ||
| 688 | RestoreReg <DS> ;AN006; | ||
| 689 | CALL SYSDISPMSG ;AN000; | ||
| 690 | ;AN000; | ||
| 691 | Badver_msg proc far ;AN000; | ||
| 692 | MOV AL,0FFh ;AN000; | ||
| 693 | SaveReg <CS> ;AN000; | ||
| 694 | RestoreReg <DS> ;AN000; | ||
| 695 | MOV AH,EXIT ;AN000; | ||
| 696 | INT 21h ;AN000; | ||
| 697 | PUSH ES ;AN000; | ||
| 698 | XOR AX,AX ;AN000; | ||
| 699 | PUSH AX ;AN000; | ||
| 700 | RET ;AN000; | ||
| 701 | badver_msg ENDP ;AN000; | ||
| 702 | ;AN000; | ||
| 703 | Badmes proc far ;AN000; | ||
| 704 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 705 | MOV BX,STDERR ;AN000; | ||
| 706 | XOR DL,DL ;AN000; | ||
| 707 | CALL SYSDISPMSG ;AN000; | ||
| 708 | MOV AX,(EXIT SHL 8) + 0FFH ;AN000; | ||
| 709 | INT 21h ;AN000; | ||
| 710 | badmes ENDP ;AN000; | ||
| 711 | ;AN000; | ||
| 712 | ;AN000; | ||
| 713 | I_20: ; Version OK ;AN000; | ||
| 714 | MOV AX,(multIFS SHL 8)+0 ; Check if IFSFUNC already installed ;AN000; | ||
| 715 | INT 2Fh ;AN000; | ||
| 716 | CMP AL,0 ;AN000; | ||
| 717 | JE I_40 ;AN000; | ||
| 718 | MOV AX,COMMON_ERR_2 ; yes - already installed - error 2 ;AN000; | ||
| 719 | PUSH CS ;AN000; | ||
| 720 | POP DS ;AN000; | ||
| 721 | MOV SI,OFFSET S_SIZE1 ; prep for sysdispmsg call ;AN000; | ||
| 722 | MOV CX,1 ;AN000; | ||
| 723 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 724 | I_30: ;AN005; | ||
| 725 | PUSH CS ;AN000; | ||
| 726 | POP DS ;AN000; | ||
| 727 | JMP BADMES ;AN000; | ||
| 728 | ; no error on install check, ;AN000; | ||
| 729 | I_40: ; free environment - no longer needed ;AN000; | ||
| 730 | MOV AX,DS:[PDB_ENVIRON] ;AN000; | ||
| 731 | OR AX,AX ;AN000; | ||
| 732 | JZ I_60 ;AN000; | ||
| 733 | PUSH ES ;AN000; | ||
| 734 | MOV ES,AX ;AN000; | ||
| 735 | MOV AH,DEALLOC ;AN000; | ||
| 736 | INT 21H ;AN000; | ||
| 737 | POP ES ;AN000; | ||
| 738 | I_60: ;AN000; | ||
| 739 | ;************************************************************************************ ;AN000; | ||
| 740 | ; Parse IFSFUNC parameter : ;AN000; | ||
| 741 | ; NAMES = n ;;;alias[n | (n {m})] ;AN000; | ||
| 742 | ;************************************************************************************ ;AN000; | ||
| 743 | ; Set default n and m ;AN000; | ||
| 744 | MOV AL,DEFAULT_DFLCount ;AN000; | ||
| 745 | MOV [DFLCount],AL ; 4 (n) ;AN000; | ||
| 746 | ;;;aliasMOV AX,DEFAULT_NLSize ;AN000; | ||
| 747 | ;;;aliasMOV NLSize,AX ; 4 * 43 (m) ;AN000; | ||
| 748 | ;AN000; | ||
| 749 | MOV SI,81h ; ds:si -> cmd parameter ;AN000; | ||
| 750 | XOR CX,CX ; no operands parsed yet ;AN000; | ||
| 751 | PUSH CS ;AN000; | ||
| 752 | POP ES ;AN000; | ||
| 753 | ASSUME ES:IFSSEG ;AN000; | ||
| 754 | MOV DI,OFFSET IFSF_PARMS ; es:di -> parse control blocks ;AN000; | ||
| 755 | XOR DX,DX ; reserved ;AN000; | ||
| 756 | ;AN000; | ||
| 757 | CALL SYSPARSE ; call parser ;AN000; | ||
| 758 | ;AN000; | ||
| 759 | CMP AX,-1 ; End of cmd? ;AN000; | ||
| 760 | JNE I_70 ;AN000; | ||
| 761 | JMP I_160 ; if so continue w/init ;AN000; | ||
| 762 | I_70: ;AN000; | ||
| 763 | CMP AX,0 ; Error? ;AN000; | ||
| 764 | JNE I_140 ; yes - go display parse error ;AN000; | ||
| 765 | ;AN000; | ||
| 766 | ;;;aliasCMP IFSF_RESULT,COMPLEX ; complex? ;AN000; | ||
| 767 | ;;;aliasJE I_80 ;AN000; | ||
| 768 | CMP IFSF_TAG,"N" ; no - n only ;AN000; | ||
| 769 | MOV AX,PARSE_ERR_6 ;AN002; | ||
| 770 | JNE I_140 ;AN000; | ||
| 771 | ;AN000; | ||
| 772 | MOV AL,IFSF_NM ;AN000; | ||
| 773 | MOV [DFLCount],AL ;AN000; | ||
| 774 | ;AN000; | ||
| 775 | CALL SYSPARSE ;AN000; | ||
| 776 | CMP AX,-1 ;AN000; | ||
| 777 | JE I_160 ;AN000; | ||
| 778 | MOV AX,PARSE_ERR_1 ;AN000; | ||
| 779 | ;;;aliasJMP I_140 ; go display parse error ;AN000; | ||
| 780 | ;;; ;AN000; | ||
| 781 | ;;;aliasI_80: ; process complex (n,m) ;AN000; | ||
| 782 | ;;; XOR CX,CX ; prep for new parse call ;AN000; | ||
| 783 | ;;; XOR DX,DX ;AN000; | ||
| 784 | ;;; CALL SYSPARSE ;AN000; | ||
| 785 | ;;; CMP AX,-1 ; End of cmd? ;AN000; | ||
| 786 | ;;; JE I_160 ; if so continue w/init ;AN000; | ||
| 787 | ;;; CMP AX,0 ; Error? ;AN000; | ||
| 788 | ;;; JNE I_140 ; if so go display error ;AN000; | ||
| 789 | ;;; CMP IFSF_TAG,"N" ; check if n or m parm ;AN000; | ||
| 790 | ;;; JNE I_100 ;AN000; | ||
| 791 | ;;; MOV AL,IFSF_NM ; n parm ;AN000; | ||
| 792 | ;;; MOV DFLCount,AL ;AN000; | ||
| 793 | ;;; CALL SYSPARSE ; go back for m ;AN000; | ||
| 794 | ;;; CMP AX,-1 ; End of cmd? ;AN000; | ||
| 795 | ;;; JE I_160 ; if so continue w/init ;AN000; | ||
| 796 | ;;; CMP AX,0 ; Error? ;AN000; | ||
| 797 | ;;; JNE I_140 ; if so go display error ;AN000; | ||
| 798 | ;;; ;AN000; | ||
| 799 | ;;;00: ;AN000; | ||
| 800 | ;;; CMP IFSF_TAG,"M" ; check if m parm ;AN000; | ||
| 801 | ;;; JE I_120 ;AN000; | ||
| 802 | ;;; MOV AX,PARSE_ERR_7 ; not m - error ;AN002; | ||
| 803 | ;;; JMP I_140 ;AN000; | ||
| 804 | ;;;20: ;AN000; | ||
| 805 | ;;; MOV AX,WORD PTR IFSF_NM ; m parm ;AN000; | ||
| 806 | ;;; MOV NLSize,AX ;AN000; | ||
| 807 | ;;; ;AN000; | ||
| 808 | ;;; CALL SYSPARSE ; call parser again to check for ;AN000; | ||
| 809 | ;;; CMP AX,-1 ; possible garbage ;AN000; | ||
| 810 | ;;; JE I_160 ;AN000; | ||
| 811 | ;;; MOV AX,PARSE_ERR_1 ;AN000; | ||
| 812 | ;;;alias ;AN000; | ||
| 813 | I_140: ; display parse error ;AN000; | ||
| 814 | MOV DH,PARSE_ERR_CLASS ; then continue w/defaults ;AN000; | ||
| 815 | XOR CX,CX ;AN000; | ||
| 816 | ;;; MOV BX,STDERR ;AD005; | ||
| 817 | ;;; XOR DL,DL ;AD005; | ||
| 818 | ;;; CALL SYSDISPMSG ;AD005; | ||
| 819 | JMP I_30 ;AN005; | ||
| 820 | ;AN000; | ||
| 821 | I_160: ;AN000; | ||
| 822 | ; doinit ;AN000; | ||
| 823 | MOV AX,DS ; Move the stack so it doesn't ;AN000; | ||
| 824 | ; get blasted by structure init ;AN000; | ||
| 825 | MOV SS,AX ; Set stack in the PSP overlaying ;AN000; | ||
| 826 | MOV SP,100H ; parms just processed ;AN000; | ||
| 827 | ; ;AN000; | ||
| 828 | ; We must now do some computation. We have to check if there is enough room ;AN000; | ||
| 829 | ; for everything. We must do this here BEFORE we start overlaying this ;AN000; | ||
| 830 | ; code ;AN000; | ||
| 831 | ; ;AN000; | ||
| 832 | PUSH CS ;AN000; | ||
| 833 | POP DS ;AN000; | ||
| 834 | ASSUME DS:IFSSEG ;AN000; | ||
| 835 | ;AN000; | ||
| 836 | MOV DI,OFFSET NETEND ; We have this much code ;AN000; | ||
| 837 | TEST DI,1 ; Word aligned? ;AN000; | ||
| 838 | JZ I_180 ; Yes, OK. ;AN000; | ||
| 839 | INC DI ; Make word aligned ;AN000; | ||
| 840 | I_180: ; no adjust 5 label ;AN000; | ||
| 841 | ;AN000; | ||
| 842 | ; This code is added to make it easy to determine the code size ;AN000; | ||
| 843 | ; of IFSFUNC for debug purposes. It is overlayed, so does not use extra ;AN000; | ||
| 844 | ; storage. ;AN000; | ||
| 845 | PUSH DI ; ;AN000; | ||
| 846 | PUSH SI ; ;AN000; | ||
| 847 | LEA SI,CODESIZE+3 ; ;AN000; | ||
| 848 | I_200: ; TENT ;AN000; | ||
| 849 | SUB DI,10000 ; ;AN000; | ||
| 850 | JC I_220 ; ;AN000; | ||
| 851 | INC BYTE PTR [SI] ; ;AN000; | ||
| 852 | JMP I_200 ; ;AN000; | ||
| 853 | I_220: ; NEG1 ;AN000; | ||
| 854 | ADD DI,10000 ; ;AN000; | ||
| 855 | INC SI ; ;AN000; | ||
| 856 | I_240: ; THOU ;AN000; | ||
| 857 | SUB DI,1000 ; ;AN000; | ||
| 858 | JC I_260 ; ;AN000; | ||
| 859 | INC BYTE PTR [SI] ; ;AN000; | ||
| 860 | JMP I_240 ; ;AN000; | ||
| 861 | I_260: ; NEG2 ;AN000; | ||
| 862 | ADD DI,1000 ; ;AN000; | ||
| 863 | INC SI ; ;AN000; | ||
| 864 | I_280: ; HUND ;AN000; | ||
| 865 | SUB DI,100 ; ;AN000; | ||
| 866 | JC I_300 ; ;AN000; | ||
| 867 | INC BYTE PTR [SI] ; ;AN000; | ||
| 868 | JMP I_280 ; ;AN000; | ||
| 869 | I_300: ; NEG3 ;AN000; | ||
| 870 | ADD DI,100 ; ;AN000; | ||
| 871 | INC SI ; ;AN000; | ||
| 872 | I_320: ; TENS ;AN000; | ||
| 873 | SUB DI,10 ; ;AN000; | ||
| 874 | JC I_340 ; ;AN000; | ||
| 875 | INC BYTE PTR [SI] ; ;AN000; | ||
| 876 | JMP I_320 ; ;AN000; | ||
| 877 | I_340: ; NEG4 ;AN000; | ||
| 878 | ADD DI,10 ; ;AN000; | ||
| 879 | INC SI ; ;AN000; | ||
| 880 | I_360: ; ONES ;AN000; | ||
| 881 | SUB DI,1 ; ;AN000; | ||
| 882 | JC I_380 ; ;AN000; | ||
| 883 | INC BYTE PTR [SI] ; ;AN000; | ||
| 884 | JMP I_360 ; ;AN000; | ||
| 885 | I_380: ; DONE ;AN000; | ||
| 886 | POP SI ; ;AN000; | ||
| 887 | POP DI ; ;AN000; | ||
| 888 | ; ;AN000; | ||
| 889 | ; Allocate the DFL ;AN000; | ||
| 890 | ; ;AN000; | ||
| 891 | MOV AL,DFLCount ;AN000; | ||
| 892 | XOR AH,AH ;AN000; | ||
| 893 | MOV CX,SIZE DFLL_LIST ;AN000; | ||
| 894 | MUL CX ;AN000; | ||
| 895 | OR DX,DX ;AN000; | ||
| 896 | JZ I_402 ;AN000; | ||
| 897 | JMP I_640 ; out of memp ;AN000; | ||
| 898 | I_402: ;AN000; | ||
| 899 | ADD DI,AX ;AN000; | ||
| 900 | JNC I_403 ;AN000; | ||
| 901 | JMP I_640 ; out of memp ;AN000; | ||
| 902 | I_403: ;AN000; | ||
| 903 | ;;;aliasADD DI,NLSIZE ;AN000; | ||
| 904 | ;;;aliasJNC I_404 ;AN000; | ||
| 905 | ;;;aliasJMP I_640 ; out of memp ;AN000; | ||
| 906 | I_404: ;AN000; | ||
| 907 | CALL CHECK_UNC_PRESENCE ; check if unc present, if not, ;AN000; | ||
| 908 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 909 | JZ I_415 ; no need to allocate altcds ;AN000; | ||
| 910 | ; ;AN000; | ||
| 911 | ; Allocate the TEMP CDS area ;AN000; | ||
| 912 | ; ;AN000; | ||
| 913 | PUSH DS ;AN000; | ||
| 914 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 915 | INT 2FH ;AN000; | ||
| 916 | ASSUME DS:DOSGROUP ;AN000; | ||
| 917 | MOV CL,CDSCount ;AN000; | ||
| 918 | XOR CH,CH ;AN000; | ||
| 919 | INC CX ;AN000; | ||
| 920 | MOV AX,SIZE curdir_list ;AN000; | ||
| 921 | MUL CX ;AN000; | ||
| 922 | OR DX,DX ;AN000; | ||
| 923 | JZ I_410 ;AN000; | ||
| 924 | JMP I_640 ;AN000; | ||
| 925 | I_410: ;AN000; | ||
| 926 | ADD DI,AX ; Temp CDS area ;AN000; | ||
| 927 | JNC I_417 ;AN000; | ||
| 928 | JMP I_640 ;AN000; | ||
| 929 | I_415: ;AN000; | ||
| 930 | ; ;AN000; | ||
| 931 | ; Determine if need new FCB cache and Allocate it if appropriate ;AN000; | ||
| 932 | ; ;AN000; | ||
| 933 | PUSH DS ; get addressability to DOSGROUP ;AN000; | ||
| 934 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 935 | INT 2FH ;AN000; | ||
| 936 | ASSUME DS:DOSGROUP ;AN000; | ||
| 937 | I_417: ;AN000; | ||
| 938 | CMP KeepCount,DefKeepVal ;AN000; | ||
| 939 | JNZ I_420 ;AN000; | ||
| 940 | LDS SI,SFTFCB ;AN000; | ||
| 941 | ASSUME DS:NOTHING ;AN000; | ||
| 942 | CMP [SI].sfCount,DefNumFCB ;AN000; | ||
| 943 | JNZ I_420 ;AN000; | ||
| 944 | INC NEWFCBCACHE ; Flag ourselves ;AN000; | ||
| 945 | ADD DI,((SIZE sf_entry) * NewNumFCB)+((SIZE sf)-2) ; New cache ;AN000; | ||
| 946 | JC I_640 ; out of memp ;AN000; | ||
| 947 | I_420: ; no fcb ;AN000; | ||
| 948 | POP DS ;AN000; | ||
| 949 | ASSUME DS:IFSSEG ;AN000; | ||
| 950 | ;AN000; | ||
| 951 | ; This code is added to make it easy to determine the total size @A1A ;AN000; | ||
| 952 | ; of IFSFUNC. It is overlayed, so does not use extra storage. @A1A ;AN000; | ||
| 953 | ; @A1A ;AN000; | ||
| 954 | PUSH DI ; @A1A ;AN000; | ||
| 955 | PUSH SI ; @A1A ;AN000; | ||
| 956 | LEA SI,TOTSIZE ; @A1A ;AN000; | ||
| 957 | I_440: ; TENT2 @A1A ;AN000; | ||
| 958 | SUB DI,10000 ; @A1A ;AN000; | ||
| 959 | JC I_460 ; @A1A ;AN000; | ||
| 960 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 961 | JMP I_440 ; @A1A ;AN000; | ||
| 962 | I_460: ; NEG5 @A1A ;AN000; | ||
| 963 | ADD DI,10000 ; @A1A ;AN000; | ||
| 964 | INC SI ; @A1A ;AN000; | ||
| 965 | I_480: ; THOU2 @A1A ;AN000; | ||
| 966 | SUB DI,1000 ; @A1A ;AN000; | ||
| 967 | JC I_500 ; @A1A ;AN000; | ||
| 968 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 969 | JMP I_480 ; @A1A ;AN000; | ||
| 970 | I_500: ; NEG6 @A1A ;AN000; | ||
| 971 | ADD DI,1000 ; @A1A ;AN000; | ||
| 972 | INC SI ; @A1A ;AN000; | ||
| 973 | I_520: ; HUND2 @A1A ;AN000; | ||
| 974 | SUB DI,100 ; @A1A ;AN000; | ||
| 975 | JC I_540 ; @A1A ;AN000; | ||
| 976 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 977 | JMP I_520 ; @A1A ;AN000; | ||
| 978 | I_540: ; NEG7 @A1A ;AN000; | ||
| 979 | ADD DI,100 ; @A1A ;AN000; | ||
| 980 | INC SI ; @A1A ;AN000; | ||
| 981 | I_560: ; TENS2 @A1A ;AN000; | ||
| 982 | SUB DI,10 ; @A1A ;AN000; | ||
| 983 | JC I_580 ; @A1A ;AN000; | ||
| 984 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 985 | JMP I_560 ; @A1A ;AN000; | ||
| 986 | I_580: ; NEG8 @A1A ;AN000; | ||
| 987 | ADD DI,10 ; @A1A ;AN000; | ||
| 988 | INC SI ; @A1A ;AN000; | ||
| 989 | I_600: ; ONES2 @A1A ;AN000; | ||
| 990 | SUB DI,1 ; @A1A ;AN000; | ||
| 991 | JC I_620 ; @A1A ;AN000; | ||
| 992 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 993 | JMP I_600 ; @A1A ;AN000; | ||
| 994 | I_620: ; DONE2 @A1A ;AN000; | ||
| 995 | POP SI ; @A1A ;AN000; | ||
| 996 | POP DI ; @A1A ;AN000; | ||
| 997 | ;AN000; | ||
| 998 | ;AN000; | ||
| 999 | JMP I_700 ;AN000; | ||
| 1000 | ;AN000; | ||
| 1001 | I_640: ; OUT_OF_MEMP ;AN000; | ||
| 1002 | POP DS ;AN000; | ||
| 1003 | I_660: ; OUT_OF_MEM ;AN000; | ||
| 1004 | MOV AX,PARSE_ERR_10 ;AN000; | ||
| 1005 | XOR CX,CX ;AN000; | ||
| 1006 | JMP BADMES ;AN000; | ||
| 1007 | ;AN000; | ||
| 1008 | ASSUME DS:NOTHING ;AN000; | ||
| 1009 | ;AN000; | ||
| 1010 | ;AN000; | ||
| 1011 | BREAK <AUTO_ATTACH -- Attempt attaches of non-FAT physical drives> ;AN000; | ||
| 1012 | ;AN000; | ||
| 1013 | ;************************************************************************************ ;AN000; | ||
| 1014 | ; ;AN000; | ||
| 1015 | ; AUTO_ATTACH ;AN000; | ||
| 1016 | ; ;AN000; | ||
| 1017 | ; Called by: init ;AN000; | ||
| 1018 | ; ;AN000; | ||
| 1019 | ; Routines called: CALL_IFS ;AN000; | ||
| 1020 | ; CDS_TO_CD ;AN000; | ||
| 1021 | ; CD_TO_CDS ;AN000; | ||
| 1022 | ; FIND_IFS_DRIVER ;AN000; | ||
| 1023 | ; Inputs: ;AN000; | ||
| 1024 | ; None ;AN000; | ||
| 1025 | ; ;AN000; | ||
| 1026 | ; Function: ;AN000; | ||
| 1027 | ; Get addressability to CDS structure (SYSVARS - IBMDOS/BIO) ;AN000; | ||
| 1028 | ; FOR I = 1 to # CDS ;AN000; | ||
| 1029 | ; DO ;AN000; | ||
| 1030 | ; ³ Drive = I - 1 (0-A,1-B,...) ;AN000; | ||
| 1031 | ; ³ IF (curdir_inuse == 0 & curdir_devptr .NOT. 0) THEN ;AN000; | ||
| 1032 | ; ³ DO ;AN000; | ||
| 1033 | ; ³ ³ Get pointer to 1st IFS header ;AN000; | ||
| 1034 | ; ³ ³ WHILE pointer .NOT. 0FFFFH ;AN000; | ||
| 1035 | ; ³ ³ DO ;AN000; | ||
| 1036 | ; ³ ³ START ATTACH ;AN000; | ||
| 1037 | ; ³ ³ (IFSR_TYPE = 2 ;AN000; | ||
| 1038 | ; ³ ³ IFSR_PARMS@ -> IFS name, 0 parms) ;AN000; | ||
| 1039 | ; ³ ³ IF Attach successful THEN ;AN000; | ||
| 1040 | ; ³ ³ DO ;AN000; | ||
| 1041 | ; ³ ³ IF IFSUSESHARE set THEN ;AN000; | ||
| 1042 | ; ³ ³ Set share flag ;AN000; | ||
| 1043 | ; ³ ³ ENDIF ;AN000; | ||
| 1044 | ; ³ ³ LEAVE While ;AN000; | ||
| 1045 | ; ³ ³ ENDDO ;AN000; | ||
| 1046 | ; ³ ³ ELSE ;AN000; | ||
| 1047 | ; ³ ³ Get pointer to next IFS header ;AN000; | ||
| 1048 | ; ³ ³ ENDIF ;AN000; | ||
| 1049 | ; ³ ³ ENDDO ;AN000; | ||
| 1050 | ; ³ ³ ENDWHILE ;AN000; | ||
| 1051 | ; ³ ENDDO ;AN000; | ||
| 1052 | ; ³ ENDIF ;AN000; | ||
| 1053 | ; ENDDO ;AN000; | ||
| 1054 | ; IF Share flag set THEN ;AN000; | ||
| 1055 | ; DO ;AN000; | ||
| 1056 | ; IF SHARE .NOT. loaded THEN ;AN000; | ||
| 1057 | ; issue warning msg: "SHARE not loaded" using msg retriever ;AN000; | ||
| 1058 | ; END ;AN000; | ||
| 1059 | ; ENDIF ;AN000; | ||
| 1060 | ; ;AN000; | ||
| 1061 | ; Outputs: Successful auto-attachments in effect ;AN000; | ||
| 1062 | ; ;AN000; | ||
| 1063 | ;************************************************************************************ ;AN000; | ||
| 1064 | ;AN000; | ||
| 1065 | Procedure AUTO_ATTACH,NEAR ;AN000; | ||
| 1066 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1067 | ;AN000; | ||
| 1068 | TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; | ||
| 1069 | JZ AA_05 ;AN000; | ||
| 1070 | JMP AA_1000 ;AN000; | ||
| 1071 | ;AN000; | ||
| 1072 | AA_05: ;AN000; | ||
| 1073 | SaveReg <DS,ES,DI> ; preserve ds - psp,es di storage ;AN000; | ||
| 1074 | ifsr_fcn_def ATTSTART ;AN000; | ||
| 1075 | MOV CS:IFSPROC_FLAGS,THISIFS_SET+IsInit ; set this so that cds_to_cd doesn't ;AC010; | ||
| 1076 | ; set thisifs ;AN000; | ||
| 1077 | ;AN000; | ||
| 1078 | MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; | ||
| 1079 | INT 21h ; es:bx -> sysinitvars ;AN000; | ||
| 1080 | LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; | ||
| 1081 | ;AN000; | ||
| 1082 | MOV AX,(multDOS SHL 8) OR 3 ; get addressability to dosgroup ;AN000; | ||
| 1083 | INT 2FH ;AN000; | ||
| 1084 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1085 | ;AN000; | ||
| 1086 | MOV CL,[CDSCount] ; prep cds loop ;AN000; | ||
| 1087 | XOR CH,CH ;AN000; | ||
| 1088 | MOV DX,SIZE CURDIR_LIST ;AN000; | ||
| 1089 | LDS SI,[CDSAddr] ; ds:si -> CDS list ;AN000; | ||
| 1090 | ASSUME DS:NOTHING ;AN000; | ||
| 1091 | ;AN000; | ||
| 1092 | AA_10: ; ** Loop here on cds entries ;AN000; | ||
| 1093 | |||
| 1094 | TEST DS:[SI.CURDIR_FLAGS],CURDIR_INUSE ; check for ifs-able drive ;AN000; | ||
| 1095 | JZ AA_13 ;AN000; | ||
| 1096 | JMP AA_120 ; cds already inuse, try next cds ;AN000; | ||
| 1097 | AA_13: ;AN000; | ||
| 1098 | CMP WORD PTR DS:[SI.CURDIR_DEVPTR],0 ;AN000; | ||
| 1099 | JNZ AA_16 ;AN000; | ||
| 1100 | CMP WORD PTR DS:[SI.CURDIR_DEVPTR+2],0 ;AN000; | ||
| 1101 | JNZ AA_16 ;AN000; | ||
| 1102 | JMP AA_120 ; cds not real, try next cds ;AN000; | ||
| 1103 | AA_16: ;AN000; | ||
| 1104 | MOV AX,SI ; attempt ;AN000; | ||
| 1105 | SaveReg <DS,AX> ; cds seg, offset ;AN000; | ||
| 1106 | MOV AX,(multDOS SHL 8) OR 3 ; get dosgroup in ds to access cdsaddr ;AN000; | ||
| 1107 | INT 2FH ;AN000; | ||
| 1108 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1109 | RestoreReg <AX> ; cds offset ;AN000; | ||
| 1110 | SUB AX,WORD PTR [CDSADDR] ; get drive # (0-based) in al ;AN000; | ||
| 1111 | MOV BL,SIZE CurDir_list ;AN000; | ||
| 1112 | DIV BL ;AN000; | ||
| 1113 | RestoreReg <DS> ; cds segment ;AN000; | ||
| 1114 | SaveReg <AX> ; drive # (0-based 0=A) ;AN000; | ||
| 1115 | MOV BL,AL ;AN000; | ||
| 1116 | INC BL ; change to 1-based (1=A) ;AN000; | ||
| 1117 | MOV AX,CHECK_REMOVABLE ; 4408H (device ioctl) ;AN000; | ||
| 1118 | INT 21H ;AN000; | ||
| 1119 | OR AX,AX ; ax 0 - drive removable ;AN000; | ||
| 1120 | RestoreReg <AX> ; drive # (0-based) ;AN000; | ||
| 1121 | JNZ AA_19 ;AN000; | ||
| 1122 | JMP AA_120 ; drive removable, don't auto-attach ;AN000; | ||
| 1123 | ;AN000; | ||
| 1124 | AA_19: ; cds ok, proceed with autoattach ;AN000; | ||
| 1125 | CBW ; convert al to word (ax) ;AN000; | ||
| 1126 | MOV BL,10 ;AN000; | ||
| 1127 | DIV BL ; convert number (ex.14) to char ;AN000; | ||
| 1128 | ADD AX,3030H ; (3134) (ah-remain,al-quot) ;AN000; | ||
| 1129 | ;AN000; | ||
| 1130 | SaveReg <ES,DI> ; Save 1st ifs driver ;AN000; | ||
| 1131 | MOV CS:WORD PTR [THISIFS],DI ; Send attach start request ;AN000; | ||
| 1132 | MOV CS:WORD PTR [THISIFS+2],ES ; to all fs drivers. Stop when ;AN000; | ||
| 1133 | ; one clicks. ;AN000; | ||
| 1134 | AA_20: ;AN000; | ||
| 1135 | SaveReg <ES,DI,CX,DX,DS,SI> ; ifs ptr, cds count-size-ptr ;AN000; | ||
| 1136 | ;AN000; | ||
| 1137 | SaveReg <AX,DS> ; get ES -> dosgroup (save char drv#) ;AN000; | ||
| 1138 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 1139 | INT 2FH ;AN000; | ||
| 1140 | SaveReg <DS> ;AN000; | ||
| 1141 | RestoreReg <ES> ;AN000; | ||
| 1142 | ASSUME DS:DOSGROUP,ES:DOSGROUP ;AN000; | ||
| 1143 | ; do attach w/dummy cds so as not ;AN000; | ||
| 1144 | MOV DI,OFFSET DOSGROUP:DummyCDS ; to ruin valid cds ;AN000; | ||
| 1145 | RestoreReg <DS> ;AN000; | ||
| 1146 | ASSUME DS:NOTHING ;AN000; | ||
| 1147 | PUSH DI ;AN000; | ||
| 1148 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1149 | REP MOVSB ;AN000; | ||
| 1150 | PUSH ES ;AN000; | ||
| 1151 | POP DS ;AN000; | ||
| 1152 | POP SI ; DS:SI -> dummy CDS ;AN000; | ||
| 1153 | MOV [SI.curdir_flags],curdir_isifs + curdir_inuse ;AN000; | ||
| 1154 | MOV [SI.curdir_type],type_drive ;AN000; | ||
| 1155 | MOV AX,WORD PTR CS:[THISIFS] ;AN000; | ||
| 1156 | MOV WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; | ||
| 1157 | MOV AX,WORD PTR CS:[THISIFS+2] ;AN000; | ||
| 1158 | MOV WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; | ||
| 1159 | RestoreReg <AX> ; char drive # ;AN000; | ||
| 1160 | SaveReg <DS,SI> ; dummy cds ptr ;AN000; | ||
| 1161 | ;AN000; | ||
| 1162 | invoke PREP_IFSR ; sets es:bx -> ifsr, 0s fields, ;AN000; | ||
| 1163 | ; ds - ifsseg ;AN000; | ||
| 1164 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1165 | invoke CDS_TO_CD ; sets ifsr_device_cb@ ;AN000; | ||
| 1166 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; | ||
| 1167 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; | ||
| 1168 | MOV ES:[BX.IFSR_TYPE],TYPE_DRIVE ;AN000; | ||
| 1169 | ;AN000; | ||
| 1170 | MOV SI,OFFSET AA_PARMS_BUF ; set up attach parameter buffer ;AN000; | ||
| 1171 | MOV WORD PTR DS:[SI],1 ; in tempbuf = dw 1 ;AN000; | ||
| 1172 | MOV WORD PTR DS:[SI+2],AX ; db 3134,0 ;AN000; | ||
| 1173 | XOR AL,AL ;AN000; | ||
| 1174 | MOV BYTE PTR DS:[SI+4],AL ; asciiz ;AN000; | ||
| 1175 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000; | ||
| 1176 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000; | ||
| 1177 | ;AN000; | ||
| 1178 | AA_40: ; ** Loop here on ifs drivers ;AN000; | ||
| 1179 | invoke CALL_IFS ; call ifs driver w/attach start req ;AN000; | ||
| 1180 | ;AN000; | ||
| 1181 | JC AA_60 ; jmp on no click ;AN000; | ||
| 1182 | ; click: ;AN000; | ||
| 1183 | RestoreReg <DI,ES> ; restore cds ptr to es:di ;AN000; | ||
| 1184 | invoke CD_TO_CDS ; update cds entry ;AN000; | ||
| 1185 | SaveReg <ES> ; move dummy cds ptr back to ds:si ;AN000; | ||
| 1186 | RestoreReg <DS> ;AN000; | ||
| 1187 | MOV SI,DI ; ds:si -> dummy cds ;AN000; | ||
| 1188 | RestoreReg <DI,ES> ; es:di -> real cds ;AN000; | ||
| 1189 | MOV CX,SIZE CURDIR_LIST ; copy dummy into real - ok to ;AN000; | ||
| 1190 | SaveReg <DI> ;AN000; | ||
| 1191 | OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; set this cds as ifs ;AN009; | ||
| 1192 | REP MOVSB ; clobber now ;AN000; | ||
| 1193 | RestoreReg <SI> ; move real cds ptr back to ds:si ;AN000; | ||
| 1194 | SaveReg <ES> ;AN000; | ||
| 1195 | RestoreReg <DS> ;AN000; | ||
| 1196 | RestoreReg <DX,CX,DI,ES> ; restore cds size, count, ;AN000; | ||
| 1197 | ; ifs ptr ;AN000; | ||
| 1198 | TEST CS:IFSPROC_FLAGS,ISSHARE ; check if share checked ;AN000; | ||
| 1199 | JNZ AA_100 ; go process next cds ;AN000; | ||
| 1200 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUSESHARE ;AN000; | ||
| 1201 | JZ AA_100 ; ifs driver needs share ;AN000; | ||
| 1202 | ;; D526 CallInstall SHAREInstall,multSHARE,0 ; check that share loaded ;AN000; | ||
| 1203 | CallInstall SHAREInstall,multSHARE,40H ; check that share loaded ;AN013; | ||
| 1204 | CMP AL,INSTALLED ; if not generate warning ;AN000; | ||
| 1205 | JE AA_50 ;AN000; | ||
| 1206 | SaveReg <DS,SI,CX,DX> ;AN000; | ||
| 1207 | MOV AX,COMMON_ERR_3 ; "SHARE not installed" ;AN000; | ||
| 1208 | PUSH CS ;AN000; | ||
| 1209 | POP DS ;AN000; | ||
| 1210 | MOV SI,OFFSET S_SIZE2 ;AN000; | ||
| 1211 | MOV CX,1 ;AN000; | ||
| 1212 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 1213 | MOV BX,STDERR ;AN000; | ||
| 1214 | XOR DL,DL ;AN000; | ||
| 1215 | CALL SYSDISPMSG ;AN000; | ||
| 1216 | RestoreReg <DX,CX,SI,DS> ;AN000; | ||
| 1217 | ;AN000; | ||
| 1218 | AA_50: ;AN000; | ||
| 1219 | OR CS:IFSPROC_FLAGS,ISSHARE ; set this so won't check share again ;AN000; | ||
| 1220 | JMP AA_100 ;AN000; | ||
| 1221 | ;AN000; | ||
| 1222 | AA_60: ; ** Next driver ;AN000; | ||
| 1223 | RestoreReg <AX,BX> ; dummy cds ptr ;AN000; | ||
| 1224 | RestoreReg <SI,DS,DX,CX,DI,ES> ; restore: ifs and cds ptrs, ;AN000; | ||
| 1225 | ; cds count and size ;AN000; | ||
| 1226 | LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000; | ||
| 1227 | CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000; | ||
| 1228 | JNE AA_80 ;AN000; | ||
| 1229 | PUSH AX ; dummy cds offset ;AN000; | ||
| 1230 | MOV AX,ES ;AN000; | ||
| 1231 | CMP AX,NULL_PTR ;AN000; | ||
| 1232 | POP AX ; dummy cds offset ;AN000; | ||
| 1233 | JE AA_100 ; go process next cds if no more ifs ;AN000; | ||
| 1234 | AA_80: ;AN000; | ||
| 1235 | MOV CS:WORD PTR [THISIFS],DI ; prep next ifs driver ;AN000; | ||
| 1236 | MOV CS:WORD PTR [THISIFS+2],ES ;AN000; | ||
| 1237 | SaveReg <ES,DI,CX,DX,DS,SI> ; Save regs ;AN000; | ||
| 1238 | SaveReg <AX,BX> ; dummy cds ptr ;AN000; | ||
| 1239 | SaveReg <CS,CS> ; get esdi back to ifsrh ;AN008; | ||
| 1240 | RestoreReg <ES,DS> ; and ds-ifsseg ;AN008; | ||
| 1241 | MOV BX,OFFSET IFSR ;AN008; | ||
| 1242 | XOR AX,AX ;AN008; | ||
| 1243 | MOV ES:[BX.IFSR_RETCODE],AX ; restore error fields ;AN008; | ||
| 1244 | MOV ES:[BX.IFSR_RETCLASS],AL ;AN008; | ||
| 1245 | JMP AA_40 ; go process next ifs driver ;AN000; | ||
| 1246 | ;AN000; | ||
| 1247 | AA_100: ;AN000; | ||
| 1248 | RestoreReg <DI,ES> ; restore 1st ifs driver ;AN000; | ||
| 1249 | AA_120: ;AN000; | ||
| 1250 | ADD SI,DX ; ** Next CDS ;AN000; | ||
| 1251 | DEC CX ;AN000; | ||
| 1252 | JZ AA_990 ;AC004; | ||
| 1253 | JMP AA_10 ;AN000; | ||
| 1254 | ;AN000; | ||
| 1255 | ;AN000; | ||
| 1256 | AA_990: ;AC004; | ||
| 1257 | RestoreReg <DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000; | ||
| 1258 | AA_1000: ;AN004; | ||
| 1259 | AND CS:IFSPROC_FLAGS,NOT IsInit ; reset isinit ;AN010; | ||
| 1260 | return ;AN000; | ||
| 1261 | ;AN000; | ||
| 1262 | EndProc AUTO_ATTACH ;AN000; | ||
| 1263 | ;AN000; | ||
| 1264 | ;AN000; | ||
| 1265 | BREAK <CHECK_UNC_PRESENCE -- check if UNC file system driver ifs'ed> ;AN000; | ||
| 1266 | ;AN000; | ||
| 1267 | ;************************************************************************************ ;AN000; | ||
| 1268 | ; ;AN000; | ||
| 1269 | ; CHECK_UNC_PRESENCE ;AN000; | ||
| 1270 | ; ;AN000; | ||
| 1271 | ; Called by: init - general ;AN000; | ||
| 1272 | ; ;AN000; | ||
| 1273 | ; Routines called: SYSDISPMSG ;AN000; | ||
| 1274 | ; ;AN000; | ||
| 1275 | ; Inputs: ;AN000; | ||
| 1276 | ; None ;AN000; | ||
| 1277 | ; ;AN000; | ||
| 1278 | ; Function: ;AN000; | ||
| 1279 | ; Get pointer to 1st IFS header ;AN000; | ||
| 1280 | ; IF no file systems THEN ;AN000; | ||
| 1281 | ; Display warning ;AN000; | ||
| 1282 | ; ELSE DO ;AN000; | ||
| 1283 | ; BX=0 | ||
| 1284 | ; WHILE pointer .NOT. 0FFFFH ;AN000; | ||
| 1285 | ; DO ;AN000; | ||
| 1286 | ; OR BX,IFS_ATTRIBUTES | ||
| 1287 | ; IF file system driver has unc bit set THEN ;AN000; | ||
| 1288 | ; DO ;AN000; | ||
| 1289 | ; Set unc_installed flag in IFSFUNC_FLAGS ;AN000; | ||
| 1290 | ; Set UNC_FS_HDR = unc file system driver header ;AN000; | ||
| 1291 | ; Set unc_found ;AN000; | ||
| 1292 | ; ENDDO ;AN000; | ||
| 1293 | ; ENDDO ;AN000; | ||
| 1294 | ; ENDWHILE ;AN000; | ||
| 1295 | ; IF unc not found THEN ;AN000; | ||
| 1296 | ; Set UNC_FS_HDR = null ptr ;AN000; | ||
| 1297 | ; ENDIF ;AN000; | ||
| 1298 | ; IFS_ATTRS=BX | ||
| 1299 | ; ENDDO ;AN000; | ||
| 1300 | ; ENDIF ;AN000; | ||
| 1301 | ; ;AN000; | ||
| 1302 | ; Outputs: unc_installed flag set in ifsfunc_flags in unc present ;AN000; | ||
| 1303 | ; IFS_ATTRS set | ||
| 1304 | ; ;AN000; | ||
| 1305 | ;************************************************************************************ ;AN000; | ||
| 1306 | ;AN000; | ||
| 1307 | Procedure CHECK_UNC_PRESENCE,NEAR ;AN000; | ||
| 1308 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1309 | ;AN000; | ||
| 1310 | SaveReg <DS,ES,DI,BX> ; preserve ds - psp,es di storage ;AN000; | ||
| 1311 | MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; | ||
| 1312 | INT 21h ; es:bx -> sysinitvars ;AN000; | ||
| 1313 | LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; | ||
| 1314 | XOR BX,BX ;AN000; | ||
| 1315 | CMP DI,NULL_PTR ; if 1st null, then no drivers ;AN000; | ||
| 1316 | JNE CUP_20 ; must display no driver msg ;AN000; | ||
| 1317 | MOV AX,ES ;AN000; | ||
| 1318 | CMP AX,NULL_PTR ;AN000; | ||
| 1319 | JNE CUP_20 ;AN000; | ||
| 1320 | ;AN000; | ||
| 1321 | MOV AX,UTIL_ERR_4 ; def 4 "No IFS drivers found",CR,LF ;AN000; | ||
| 1322 | MOV BX,STDERR ;AN000; | ||
| 1323 | XOR CX,CX ;AN000; | ||
| 1324 | MOV DL,NO_INPUT ;AN000; | ||
| 1325 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 1326 | PUSH CS ;AN000; | ||
| 1327 | POP DS ;AN000; | ||
| 1328 | CALL SYSDISPMSG ;AN000; | ||
| 1329 | MOV CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; | ||
| 1330 | ;AN000; | ||
| 1331 | JMP SHORT CUP_1000 ;AN000; | ||
| 1332 | ;AN000; | ||
| 1333 | CUP_20: ;AN000; | ||
| 1334 | OR BX,ES:[DI.IFS_ATTRIBUTE] | ||
| 1335 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ; now set UNC_FS_HDR ;AN000; | ||
| 1336 | JNZ CUP_40 ;AN000; | ||
| 1337 | CUP_30: | ||
| 1338 | LES DI,ES:[DI.IFS_NEXT] ;AN000; | ||
| 1339 | CMP DI,NULL_PTR ;AN000; | ||
| 1340 | JNE CUP_20 ;AN000; | ||
| 1341 | MOV AX,ES ;AN000; | ||
| 1342 | CMP AX,NULL_PTR ;AN000; | ||
| 1343 | JNE CUP_20 ;AN000; | ||
| 1344 | TEST IFSFUNC_FLAGS,UNC_INSTALLED | ||
| 1345 | JNZ CUP_1000 | ||
| 1346 | MOV WORD PTR [UNC_FS_HDR],NULL_PTR ; no unc - set unc ptr null ;AN000; | ||
| 1347 | MOV WORD PTR [UNC_FS_HDR+2],NULL_PTR ;AN000; | ||
| 1348 | JMP SHORT CUP_1000 ;AN000; | ||
| 1349 | ;AN000; | ||
| 1350 | CUP_40: ; found unc - set unc ptr ;AN000; | ||
| 1351 | MOV WORD PTR [UNC_FS_HDR],DI ; and unc flag ;AN000; | ||
| 1352 | MOV WORD PTR [UNC_FS_HDR+2],ES ;AN000; | ||
| 1353 | OR IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 1354 | JMP SHORT CUP_30 ;AN000; | ||
| 1355 | ;AN000; | ||
| 1356 | ;AN000; | ||
| 1357 | CUP_1000: ;AN000; | ||
| 1358 | RestoreReg <BX,DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000; | ||
| 1359 | return ;AN000; | ||
| 1360 | |||
| 1361 | include msgdcl.inc | ||
| 1362 | ;AN000; | ||
| 1363 | EndProc CHECK_UNC_PRESENCE ;AN000; | ||
| 1364 | ;AN000; | ||
| 1365 | ;AN000; | ||
| 1366 | IFSSEG ENDS ;AN000; | ||
| 1367 | ;AN000; | ||
| 1368 | STACK SEGMENT STACK ;AN000; | ||
| 1369 | DB 278 + 128 DUP (?) ; 278 == IBM's ROM requirements ;AN000; | ||
| 1370 | STACK ENDS ;AN000; | ||
| 1371 | ;AN000; | ||
| 1372 | END IFSFUNCinit ;AN000; | ||
| 1373 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC new file mode 100644 index 0000000..d986ca9 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC | |||
| @@ -0,0 +1,92 @@ | |||
| 1 | ;****************************************************************************** ;AN000; | ||
| 2 | ; IFSFUNC Parse Symbol File ;AN000; | ||
| 3 | ; ;AN000; | ||
| 4 | ; Parsing: NAMES = n ;;;alias[n | (n {m})] ;AN000; | ||
| 5 | ; ;AN000; | ||
| 6 | ; Modification history: ;AN000; | ||
| 7 | ; Created: May 30 1987 ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; LOD - 35 ;AN000; | ||
| 10 | ; ;AN000; | ||
| 11 | ;****************************************************************************** ;AN000; | ||
| 12 | ;AN000; | ||
| 13 | IFSF_PARMS LABEL WORD ; IFSFUNC parms input block ;AN000; | ||
| 14 | DW IFSF_PARMSX ; offset of ifsfunc parms extension block ;AN000; | ||
| 15 | DB 0 ; No extra delimeters or eol chars ;AN000; | ||
| 16 | ;AN000; | ||
| 17 | IFSF_PARMSX LABEL BYTE ; IFSFUNC parm extension block ;AN000; | ||
| 18 | DB 0,0,0 ; 0 positionals, 0 switches ;AN000; | ||
| 19 | DB 1 ; 1 keyword (NAMES=) ;AN000; | ||
| 20 | DW IFSF_K1 ;AN000; | ||
| 21 | ;AN000; | ||
| 22 | IFSF_K1 LABEL WORD ; IFSFUNC 1 keyword ;AN000; | ||
| 23 | DW 8001h ; Numeric/optional(NAMES= ok) ;AN000; | ||
| 24 | DW 0 ; no function ;AN000; | ||
| 25 | DW IFSF_RESULT ; Result buffer ;AN000; | ||
| 26 | DW IFSF_K1_VAL ; value list ;AN000; | ||
| 27 | DB 1 ; 1 keyword ;AN000; | ||
| 28 | DB "NAMES=",0 ;AN000; | ||
| 29 | ;AN000; | ||
| 30 | IFSF_K1_VAL LABEL BYTE ; value definition ;AN000; | ||
| 31 | DB 1 ; # value defns: get one: n or (n,m) ;AN000; | ||
| 32 | DB 1 ; # ranges ;AN000; | ||
| 33 | DB "N" ; value to return if n in range ;AN000; | ||
| 34 | DD 0,255 ; range ;AN000; | ||
| 35 | ;AN000; | ||
| 36 | ;AN000; | ||
| 37 | ;;;alias Complex control blocks ;AN000; | ||
| 38 | ; ;AN000; | ||
| 39 | ; IFSF_COMPLEX_PARMS LABEL WORD ;AN000; | ||
| 40 | ; DW IFSF_COMPLEX_PARMSX ;AN000; | ||
| 41 | ; DB 0 ; No extra delimeters or eol chars ;AN000; | ||
| 42 | ; ;AN000; | ||
| 43 | ; IFSF_COMPLEX_PARMSX LABEL BYTE ; ;AN000; | ||
| 44 | ; DB 1,2 ; Min 1, Max 2 positionals ;AN000; | ||
| 45 | ; DW IFSF_COMPLEX_POS1 ;AN000; | ||
| 46 | ; DW IFSF_COMPLEX_POS2 ;AN000; | ||
| 47 | ; DB 0,0 ; 0 switches, 0 keywords ;AN000; | ||
| 48 | ; ;AN000; | ||
| 49 | ; IFSF_COMPLEX_POS1 LABEL WORD ; ;AN000; | ||
| 50 | ; DW 8001h ; N - optional ;AN000; | ||
| 51 | ; DW 0 ; no function ;AN000; | ||
| 52 | ; DW IFSF_RESULT ; Result buffer ;AN000; | ||
| 53 | ; DW IFSF_POS_VAL ; value list ;AN000; | ||
| 54 | ; DB 0 ; no switches/keywords ;AN000; | ||
| 55 | ; ;AN000; | ||
| 56 | ; IFSF_COMPLEX_POS2 LABEL WORD ; ;AN000; | ||
| 57 | ; DW 8001H ; Numeric value, optional ;AN000; | ||
| 58 | ; DW 0 ; no function ;AN000; | ||
| 59 | ; DW IFSF_RESULT ; Result value buffer ;AN000; | ||
| 60 | ; DW IFSF_POS_VAL ; value list ;AN000; | ||
| 61 | ;;;alias DB 0 ; no switches/keywords ;AN000; | ||
| 62 | ; ;AN000; | ||
| 63 | ;FSF_POS_VAL LABEL BYTE ; value definition ;AN000; | ||
| 64 | ; DB 2 ; N and M ;AN000; | ||
| 65 | ; DB 2 ; 2 ranges ;AN000; | ||
| 66 | ; DB "N" ; item tag for N ;AN000; | ||
| 67 | ; DD 0,255 ; range of N ;AN000; | ||
| 68 | ; DB "M" ; item tag for M ;AN000; | ||
| 69 | ;;;aliasDD 0,8160 ; range of M ;AN000; | ||
| 70 | ;AN000; | ||
| 71 | IFSF_RESULT LABEL BYTE ;AN000; | ||
| 72 | DB ? ; type - 1=number, 4=complex ;AN000; | ||
| 73 | IFSF_TAG DB ? ; item tag returned: N,M or FF ;AN000; | ||
| 74 | DW ? ;AN000; | ||
| 75 | IFSF_NM DB ? ; actual n or m value ;AN000; | ||
| 76 | DB ? ;AN000; | ||
| 77 | DB ? ;AN000; | ||
| 78 | DB ? ;AN000; | ||
| 79 | ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | ; parser assemble switches ;AN000; | ||
| 82 | DateSW equ 0 ;AN000; | ||
| 83 | TimeSW equ 0 ;AN000; | ||
| 84 | FileSW equ 0 ;AN000; | ||
| 85 | CAPSW equ 0 ;AN000; | ||
| 86 | DrvSW equ 0 ;AN000; | ||
| 87 | QusSW equ 0 ;AN000; | ||
| 88 | SwSW equ 0 ;AN000; | ||
| 89 | Val3SW equ 0 ;AN000; | ||
| 90 | ;AN000; | ||
| 91 | ;AN000; | ||
| 92 | include PARSE.ASM ;together with PSDATA.INC ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM new file mode 100644 index 0000000..8eba357 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM | |||
| @@ -0,0 +1,2187 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC SESSION ROUTINES - IFS Attach Routines ;AN000; | ||
| 4 | NAME IFSSESS ;AN000; | ||
| 5 | ;************************************************************************************ | ||
| 6 | ; | ||
| 7 | ; IFSSESS | ||
| 8 | ; | ||
| 9 | ; Session related IFS calls (Session = attachment) | ||
| 10 | ; | ||
| 11 | ; IFS_ASSOPER | ||
| 12 | ; RETURN_ASSIGN_MODE | ||
| 13 | ; SET_ASSIGN_MODE | ||
| 14 | ; GET_IFSFUNC_ITEM | ||
| 15 | ; ATTACH_START | ||
| 16 | ; ATTACH_END | ||
| 17 | ; IFS_RESET_ENVIRONMENT | ||
| 18 | ; IFS_ABORT | ||
| 19 | ; GET_IFS_DRIVER_NAME | ||
| 20 | ; FIND_IFS_DRIVER | ||
| 21 | ; AssignOn/AssignOff | ||
| 22 | ; PrintOn/PrintOff | ||
| 23 | ; GET_UNC_ITEM_INFO | ||
| 24 | ; | ||
| 25 | ; REVISION HISTORY: | ||
| 26 | ; A000 Original version 4.00 May 1987 | ||
| 27 | ; A001 DCR 158 - merge unc info in attach start/status requests 8/87 RGAZZIA | ||
| 28 | ; A002 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA | ||
| 29 | ; A003 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA | ||
| 30 | ; A004 PTM 764 - Printer attach problems 8/87 RGAZZIA | ||
| 31 | ; A005 DCR 213 - SFT Serial Number 9/87 RGazzia | ||
| 32 | ; A006 PTM 849 - Printer open problems 9/87 RGazzia | ||
| 33 | ; A007 P242 - IFSFUNC hangs on 2nd install. 8/87 rg | ||
| 34 | ; A008 P1244- Net Print problems 8/87 rg | ||
| 35 | ; A009 P1411- Net Use erroneous pause 10/87 rg | ||
| 36 | ; A010 P2270- Filesys network drive problems 11/87 RG | ||
| 37 | ; A011 P2312- Allow Net Use status to show FILESYSed network devices 11/87 RG | ||
| 38 | ; Do this via user word: 0001 without password | ||
| 39 | ; 8001 with password | ||
| 40 | ; A012 P2307- Critical error problems 11/87 RG | ||
| 41 | ; A013 P2379- Filesys status fails without network installed 11/87 RGazzia | ||
| 42 | ; A014 P2952- dfl problem 1/88 RG | ||
| 43 | ; A015 P3251- net trans problem (library.exe) 1/88 RG | ||
| 44 | ; A016 P3334- new abort subfunc - reset environment 2/88 RMG | ||
| 45 | ; A017 P3673- Filesys problems again. A010 not fixed right....3/14/88 RMG | ||
| 46 | ; A018 Austin deviceless attach problems 3/29/88 RMG | ||
| 47 | ; A019 P4188- names=0 problems 4/08/88 RMG | ||
| 48 | ; A020 Austin garbage attach problem 4/11/88 RMG | ||
| 49 | ; A021 P4140 dos ext err msgs enhancement 4/19/88 RMG | ||
| 50 | ; A022 P4249 filesys problems related to gii bx ret on user stack 4/21/88 RMG | ||
| 51 | ; A023 P4540 fAssign,fPrint out of swappable area 4/28/88 RMG | ||
| 52 | ; A024 P4731 find ifs driver must check for none 5/4/88 RMG | ||
| 53 | ; A025 P4839 ctrl ptrsc problems 5/13/88 RMG | ||
| 54 | ; A026 P4789 message problems w/no ifs drivers loaded 5/18/88 RMG | ||
| 55 | ; A027 P4791 Don't overwrite ax on error 5/19/88 RMG | ||
| 56 | ; A028 Error code problems w/no ifs drivers 5/20/88 RMG | ||
| 57 | ; A029 GII error path fixup 5/24/88 RMG | ||
| 58 | ; A030 P5005 Print stream problems 6/1/88 RMG | ||
| 59 | ; | ||
| 60 | ; LOC - 871 | ||
| 61 | ; LOD - 63 | ||
| 62 | ; | ||
| 63 | ;************************************************************************************ | ||
| 64 | ;AN000; | ||
| 65 | .xlist ;AN000; | ||
| 66 | .xcref ;AN000; | ||
| 67 | INCLUDE IFSSYM.INC ;AN000; | ||
| 68 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 69 | INCLUDE DOSSYM.INC ;AN000; | ||
| 70 | INCLUDE DEVSYM.INC ;AN000; | ||
| 71 | .cref ;AN000; | ||
| 72 | .list ;AN000; | ||
| 73 | ;AN000; | ||
| 74 | AsmVars <IBM, Installed, DEBUG> ;AN000; | ||
| 75 | ;AN000; | ||
| 76 | ; define the base code segment of the network support first ;AN000; | ||
| 77 | ;AN000; | ||
| 78 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 79 | IFSSEG ENDS ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | ; ;AN000; | ||
| 82 | ; NOTE: We cannot include DOSSEG here because the START seg is not declared ;AN000; | ||
| 83 | ; as PARA aligned in DOSSEG. ;AN000; | ||
| 84 | ; ;AN000; | ||
| 85 | ;AN000; | ||
| 86 | START SEGMENT PARA PUBLIC 'START' ;AN000; | ||
| 87 | START ENDS ;AN000; | ||
| 88 | ;AN000; | ||
| 89 | CONSTANTS SEGMENT WORD PUBLIC 'CONST' ;AN000; | ||
| 90 | CONSTANTS ENDS ;AN000; | ||
| 91 | ;AN000; | ||
| 92 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 93 | DATA ENDS ;AN000; | ||
| 94 | ;AN000; | ||
| 95 | TABLE SEGMENT BYTE PUBLIC 'TABLE' ;AN000; | ||
| 96 | TABLE ENDS ;AN000; | ||
| 97 | ;AN000; | ||
| 98 | CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000; | ||
| 99 | CODE ENDS ;AN000; | ||
| 100 | ;AN000; | ||
| 101 | LAST SEGMENT PARA PUBLIC 'LAST' ;AN000; | ||
| 102 | LAST ENDS ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | DOSGROUP GROUP START,CONSTANTS,DATA,TABLE,CODE,LAST ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | ;AN000; | ||
| 107 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 108 | ;DOSGROUP Data ;AN000; | ||
| 109 | Extrn CurrentPDB:WORD ;AN000; | ||
| 110 | Extrn THISCDS:DWORD ;AN000; | ||
| 111 | Extrn CDSAddr:DWORD ;AN000; | ||
| 112 | Extrn CDSCount:BYTE ;AN000; | ||
| 113 | Extrn MYNAME:BYTE ;AN000; | ||
| 114 | Extrn DummyCDS:BYTE ;AN000; | ||
| 115 | Extrn sftFCB:DWORD ;AN000; | ||
| 116 | Extrn THISSFT:DWORD ;AN000; | ||
| 117 | Extrn SysInitTable:BYTE ;AN000; | ||
| 118 | Extrn EXIT_TYPE:BYTE ;AN000; | ||
| 119 | Extrn IFS_HEADER:DWORD ;AN000; | ||
| 120 | if debug ;AN000; | ||
| 121 | Extrn BugLev:WORD ;AN000; | ||
| 122 | Extrn BugTyp:WORD ;AN000; | ||
| 123 | include bugtyp.asm ;AN000; | ||
| 124 | endif ;AN000; | ||
| 125 | DATA ENDS ;AN000; | ||
| 126 | ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | ; define our own code segment ;AN000; | ||
| 129 | ;AN000; | ||
| 130 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 131 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 132 | ;AN000; | ||
| 133 | ;IFS Data - external ;AN000; | ||
| 134 | Extrn TEMPBUF:BYTE ;AN000; | ||
| 135 | ;AN000; | ||
| 136 | ;IFS Data - public - *** IFSFUNC SWAPPABLE DATA AREA *** ;AN000; | ||
| 137 | ;AN000; | ||
| 138 | PUBLIC IFSF_SWAP_START ;AN000; | ||
| 139 | IFSF_SWAP_START LABEL BYTE ;AN000; | ||
| 140 | ;AN000; | ||
| 141 | PUBLIC THISIFS ;AN000; | ||
| 142 | THISIFS DD -1 ;AN000; | ||
| 143 | |||
| 144 | PUBLIC THISDFL ;AN000; | ||
| 145 | THISDFL DD -1 ;AN000; | ||
| 146 | |||
| 147 | PUBLIC IFSR ;AN000; | ||
| 148 | IFSR DB 72 DUP (0) ;AN000; | ||
| 149 | |||
| 150 | PUBLIC SFF1 ;AN000; | ||
| 151 | SFF1 DB 62 DUP (0) ;AN000; | ||
| 152 | |||
| 153 | PUBLIC CD1 ;AN000; | ||
| 154 | CD1 DW 84 DUP (0) ;AN000; | ||
| 155 | |||
| 156 | PUBLIC DF1 ;AN000; | ||
| 157 | DF1 DW 18 DUP (0) ;AN000; | ||
| 158 | |||
| 159 | PUBLIC IFSPROC_FLAGS ;AN000; | ||
| 160 | IFSPROC_FLAGS DW 0 ;AN000; | ||
| 161 | |||
| 162 | ; Number of net drive (0=A) for use on net I 24 ;AN000; | ||
| 163 | PUBLIC IFSDRV ;AN000; | ||
| 164 | IFSDRV DB -1 ;AN000; | ||
| 165 | |||
| 166 | PUBLIC DEVICE_CB@_OFFSET ;AN000; | ||
| 167 | ; This used to set offset of ifsr_device_cb@ in common routine cds_to_cd ;AN000; | ||
| 168 | ; in ifsutil. If not used, offset always 1EH since that's what it is at ;AN000; | ||
| 169 | ; ifsutil assembly time. This not good for control fcns (attstart,attstat). ;AN000; | ||
| 170 | DEVICE_CB@_OFFSET DW 0 ; offset in ifsrh of device cb@ ;AN000; | ||
| 171 | |||
| 172 | PUBLIC SAVE_CB@ ;AN000; | ||
| 173 | ; This used by SFT_TO_SFF and SFF_TO_SFT routines in IFSUTIL to save cds ptr. ;AN000; | ||
| 174 | SAVE_CB@ DD -1 ;AN000; | ||
| 175 | |||
| 176 | PUBLIC IFSSEM ;AN021; | ||
| 177 | ; This used as byte of semaphores. ;AN021; | ||
| 178 | IFSSEM DB 0 ;AN021; | ||
| 179 | |||
| 180 | IFSF_SWAP_END LABEL BYTE ;AN000; | ||
| 181 | PUBLIC IFSF_SWAP_END ;AN000; | ||
| 182 | ;AN000; | ||
| 183 | ;IFS Data - public ;AN000; | ||
| 184 | ;AN000; | ||
| 185 | PUBLIC DFLAddr ;AN000; | ||
| 186 | DFLAddr DD -1 ;AN000; | ||
| 187 | |||
| 188 | PUBLIC DFLCount ;AN000; | ||
| 189 | DFLCount DB 0 ;AN000; | ||
| 190 | |||
| 191 | ;;;aliasPUBLIC NLAddr ;AN000; | ||
| 192 | ;;;aliasNLAddr DD -1 ;AN000; | ||
| 193 | |||
| 194 | ;;;aliasPUBLIC NLSIZE ;AN000; | ||
| 195 | ;;;aliasNLSIZE DW 0 ;AN000; | ||
| 196 | |||
| 197 | PUBLIC CDSAlt ;AN000; | ||
| 198 | CDSAlt DD -1 ;AN000; | ||
| 199 | |||
| 200 | PUBLIC UNC_FS_HDR ;AN000; | ||
| 201 | UNC_FS_HDR DD -1 ;AN000; | ||
| 202 | |||
| 203 | PUBLIC IFSFUNC_FLAGS ;AN000; | ||
| 204 | IFSFUNC_FLAGS DW 0 ;AN000; | ||
| 205 | |||
| 206 | PUBLIC IFS_ATTRS ;AN000; | ||
| 207 | IFS_ATTRS DW 0 ; all ifs_attribute words from ifs ;AN000; | ||
| 208 | ; headers or'ed together (ifsinit) ;AN000; | ||
| 209 | PUBLIC DOSCALL@ ;AN000; | ||
| 210 | DOSCALL@ DD 0 ; IFS_DOSCALL@ set by ibmbio ;AN000; | ||
| 211 | |||
| 212 | PUBLIC SFT_SERIAL_NUMBER ;AN005; | ||
| 213 | SFT_SERIAL_NUMBER DW 0 ; to get sfts unique for fcb reasons ;AN005; | ||
| 214 | |||
| 215 | PUBLIC fAssign ;AC023; | ||
| 216 | fAssign DB -1 ;AC023; | ||
| 217 | |||
| 218 | PUBLIC fPrint ;AC023; | ||
| 219 | fPrint DB -1 ;AC023; | ||
| 220 | |||
| 221 | PUBLIC TRUNCATE_FLAG ;AC030;moved out of swap | ||
| 222 | TRUNCATE_FLAG DB 0 ;AC030; " " | ||
| 223 | |||
| 224 | |||
| 225 | ;IFS Data - local ;AN000; | ||
| 226 | ;AN000; | ||
| 227 | ;SetBP DB 0 ; flag indicates whether to return ;AD003; | ||
| 228 | ; LSN on getuncitem call (GII) ;AN000; | ||
| 229 | ;ERROR_STATUS DW 1 ; Status returned on error return ;AD029; | ||
| 230 | ERROR_STATUS DB "ERROR",0 ; from fs (GII) ;AC029; | ||
| 231 | ;AN000; | ||
| 232 | ;AN000; | ||
| 233 | BREAK <IFS_ASSOPER -- Do the $Assignoper call> ;AN000; | ||
| 234 | ;AN000; | ||
| 235 | copyright db " IFSFUNC.EXE " ;AN000; | ||
| 236 | INCLUDE copyrigh.inc | ||
| 237 | |||
| 238 | ;************************************************************************************ ;AN000; | ||
| 239 | ; ;AN000; | ||
| 240 | ; IFS_ASSOPER ;AN000; | ||
| 241 | ; ;AN000; | ||
| 242 | ; Called by: IFSFUNC dispatcher ;AN000; | ||
| 243 | ; ;AN000; | ||
| 244 | ; Routines called: ;AN000; | ||
| 245 | ; RETURN_ASSIGN_MODE ;AN000; | ||
| 246 | ; SET_ASSIGN_MODE ;AN000; | ||
| 247 | ; GET_IFSFUNC_ITEM ;AN000; | ||
| 248 | ; ATTACH_START ;AN000; | ||
| 249 | ; ATTACH_END ;AN000; | ||
| 250 | ; ;AN000; | ||
| 251 | ; Inputs: ;AN000; | ||
| 252 | ; AL = 00 get / 01 set - redir assign mode (Return/Set Mode) ;AN000; | ||
| 253 | ; AL = 02 get attach list entry (Get ifsfunc item) ;AN000; | ||
| 254 | ; AL = 03 Define Macro (attach start) ;AN000; | ||
| 255 | ; AL = 04 Cancel Attach (attach end) ;AN000; | ||
| 256 | ; AL = 05 Revised get assign list entry (Getifsfuncitem2) ;AN000; | ||
| 257 | ; AL = 06 Get IFSFUNC Item (Getifsfuncitem3) ;AN003; | ||
| 258 | ; Function: ;AN000; | ||
| 259 | ; IF AL=0 call RETURN_ASSIGN_MODE ;AN000; | ||
| 260 | ; ELSE IF AL=1 call SET_ASSIGN_MODE ;AN000; | ||
| 261 | ; ELSE IF AL=2 call GET_IFSFUNC_ITEM ;AN000; | ||
| 262 | ; ELSE IF AL=3 call ATTACH_START ;AN000; | ||
| 263 | ; ELSE IF AL=4 call ATTACH_END ;AN000; | ||
| 264 | ; ;AN000; | ||
| 265 | ; Outputs: ;AN000; | ||
| 266 | ; see subroutines ;AN000; | ||
| 267 | ; ;AN000; | ||
| 268 | ;************************************************************************************ ;AN000; | ||
| 269 | ;AN000; | ||
| 270 | AO_TABLE LABEL WORD ;AN000; | ||
| 271 | DW RETURN_ASSIGN_MODE ;AN000; | ||
| 272 | DW SET_ASSIGN_MODE ;AN000; | ||
| 273 | DW GET_IFSFUNC_ITEM ;AN000; | ||
| 274 | DW ATTACH_START ;AN000; | ||
| 275 | DW ATTACH_END ;AN000; | ||
| 276 | DW GET_IFSFUNC_ITEM2 ;AN000; | ||
| 277 | DW GET_IFSFUNC_ITEM3 ;AN003; | ||
| 278 | ;AN000; | ||
| 279 | Procedure IFS_ASSOPER,NEAR ;AN000; | ||
| 280 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 281 | ;AN000; | ||
| 282 | TEST CS:IFSFUNC_FLAGS,no_ifs_drivers | ||
| 283 | JZ AO_20 | ||
| 284 | AO_10: | ||
| 285 | MOV AX,error_not_supported | ||
| 286 | transfer ifs_980 | ||
| 287 | AO_20: | ||
| 288 | CMP AL,0 | ||
| 289 | JNE AO_40 | ||
| 290 | CMP AL,1 | ||
| 291 | JNE AO_40 | ||
| 292 | TEST CS:IFSFUNC_FLAGS,unc_installed | ||
| 293 | JZ AO_10 | ||
| 294 | AO_40: | ||
| 295 | MOV CS:IFSPROC_FLAGS,ZERO ;AN000; | ||
| 296 | PUSH BX ; save macro type ;AN000; | ||
| 297 | XOR AH,AH ;AN000; | ||
| 298 | SHL AL,1 ; AL x 2 ;AN000; | ||
| 299 | MOV BX,AX ;AN000; | ||
| 300 | JMP CS:AO_TABLE[BX] ;AN000; | ||
| 301 | ;AN000; | ||
| 302 | EndProc IFS_ASSOPER ;AN000; | ||
| 303 | ;AN000; | ||
| 304 | BREAK <RETURN_ASSIGN_MODE -- Return Assign Mode> ;AN000; | ||
| 305 | ;AN000; | ||
| 306 | ;************************************************************************************ ;AN000; | ||
| 307 | ; ;AN000; | ||
| 308 | ; RETURN_ASSIGN_MODE ;AN000; | ||
| 309 | ; ;AN000; | ||
| 310 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 311 | ; ;AN000; | ||
| 312 | ; Routines called: DOS: Get_User_Stack ;AN000; | ||
| 313 | ; ;AN000; | ||
| 314 | ; Inputs: ;AN000; | ||
| 315 | ; BL = macro type ;AN000; | ||
| 316 | ; Function: ;AN000; | ||
| 317 | ; If macro type = 3 (network printer) THEN ;AN000; | ||
| 318 | ; BX = fPrint .AND. 1 ;AN000; | ||
| 319 | ; Elseif macro type = 4 (network disk) THEN ;AN000; | ||
| 320 | ; BX = fAssign .AND. 1 ;AN000; | ||
| 321 | ; Else set error_invalid_function ;AN000; | ||
| 322 | ; ;AN000; | ||
| 323 | ; Output: ;AN000; | ||
| 324 | ; IF AL==0 BX value on user stack ;AN000; | ||
| 325 | ; ;AN000; | ||
| 326 | ; Notes: This routine is used only for UNC file system. This is the ;AN000; | ||
| 327 | ; only FS that supports pause. ;AN000; | ||
| 328 | ; ;AN000; | ||
| 329 | ;************************************************************************************ ;AN000; | ||
| 330 | ;AN000; | ||
| 331 | Procedure RETURN_ASSIGN_MODE,NEAR ;AN000; | ||
| 332 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 333 | ;AN000; | ||
| 334 | POP BX ; macro type ;AN000; | ||
| 335 | CMP BL,3 ; if (type == drive) ;AN000; | ||
| 336 | JZ GAM_20 ;AN000; | ||
| 337 | CMP BL,4 ;AN000; | ||
| 338 | JNZ GAM_60 ;AN000; | ||
| 339 | MOV BH,fAssign ; t = fAssign; ;AN000; | ||
| 340 | JMP Short GAM_40 ; else ;AN000; | ||
| 341 | ;AN000; | ||
| 342 | GAM_20: ; if (type == print) ;AN000; | ||
| 343 | MOV BH,fPrint ; t = fPrint; ;AN000; | ||
| 344 | GAM_40: ;AN000; | ||
| 345 | AND BH,1 ; return t&1; ;AN000; | ||
| 346 | CallInstall Get_User_Stack,multDOS,24 ;AN000; | ||
| 347 | MOV [SI].User_BX,BX ;AN000; | ||
| 348 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 349 | ;AN000; | ||
| 350 | GAM_60: ;AN000; | ||
| 351 | MOV AL,error_invalid_function ;AN000; | ||
| 352 | transfer ifs_980 ; go to general bad ret in util ;AN000; | ||
| 353 | ;AN000; | ||
| 354 | ;AN000; | ||
| 355 | EndProc RETURN_ASSIGN_MODE ;AN000; | ||
| 356 | ;AN000; | ||
| 357 | BREAK <SET_ASSIGN_MODE -- set assign mode> ;AN000; | ||
| 358 | ;AN000; | ||
| 359 | ;************************************************************************************ ;AN000; | ||
| 360 | ; ;AN000; | ||
| 361 | ; SET_ASSIGN_MODE ;AN000; | ||
| 362 | ; ;AN000; | ||
| 363 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 364 | ; ;AN000; | ||
| 365 | ; Routines called: ;AN000; | ||
| 366 | ; ;AN000; | ||
| 367 | ; Inputs: ;AN000; | ||
| 368 | ; BL = macro type ;AN000; | ||
| 369 | ; BH = assign mode (0 = off - pause, 1 = on - no pause) ;AN000; | ||
| 370 | ; ;AN000; | ||
| 371 | ; Function: ;AN000; | ||
| 372 | ; ;AN000; | ||
| 373 | ; Output: ;AN000; | ||
| 374 | ; ;AN000; | ||
| 375 | ;************************************************************************************ ;AN000; | ||
| 376 | ;AN000; | ||
| 377 | Procedure SET_ASSIGN_MODE,NEAR ;AN000; | ||
| 378 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 379 | ;AN000; | ||
| 380 | POP BX ; restore macro type (3 or 4) ;AN000; | ||
| 381 | ;AN000; | ||
| 382 | CMP BL,3 ; check if printer or drive ;AN000; | ||
| 383 | JNZ SAM_40 ; ;AN000; | ||
| 384 | OR BH,BH ; printer - check mode ;AN000; | ||
| 385 | JZ SAM_20 ; off - go pause ;AN000; | ||
| 386 | CMP BH,1 ;AN000; | ||
| 387 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 388 | CALL PrintOn ; turn print on ;AN000; | ||
| 389 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 390 | ;AN000; | ||
| 391 | SAM_20: ; print off - pause ;AN000; | ||
| 392 | CALL PrintOff ;AN000; | ||
| 393 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 394 | ;AN000; | ||
| 395 | SAM_40: ; Drive ;AN000; | ||
| 396 | CMP BL,4 ;AN000; | ||
| 397 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 398 | OR BH,BH ;AN000; | ||
| 399 | JZ SAM_60 ;AN000; | ||
| 400 | CMP BH,1 ;AN000; | ||
| 401 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 402 | CALL AssignOn ; drive on ;AN000; | ||
| 403 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 404 | ;AN000; | ||
| 405 | SAM_60: ; drive off ;AN000; | ||
| 406 | invoke AssignOff ; turn drives off (pause) ;AN000; | ||
| 407 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 408 | ;AN000; | ||
| 409 | ;AN000; | ||
| 410 | SAM_80: ;AN000; | ||
| 411 | MOV AX,error_invalid_parameter ;AN000; | ||
| 412 | invoke SET_EXTERR_INFO ;AN000; | ||
| 413 | transfer ifs_980 ; go to general bad ret in util ;AN000; | ||
| 414 | ;AN000; | ||
| 415 | ;AN000; | ||
| 416 | EndProc SET_ASSIGN_MODE ;AN000; | ||
| 417 | ;AN000; | ||
| 418 | BREAK <GET_IFSFUNC_ITEM -- for get attach list > ;AN000; | ||
| 419 | ;AN000; | ||
| 420 | ;************************************************************************************ ;AN000; | ||
| 421 | ; ;AN000; | ||
| 422 | ; GET_IFSFUNC_ITEM ;AN000; | ||
| 423 | ; ;AN000; | ||
| 424 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 425 | ; ;AN000; | ||
| 426 | ; Routines called: ;AN000; | ||
| 427 | ; GET_IFS_DRIVER_NAME DOS: STRCPY ;AN000; | ||
| 428 | ; CDS_TO_CD GET_USER_STACK ;AN000; | ||
| 429 | ; DFL_TO_DF ;AN000; | ||
| 430 | ; CALL_IFS ;AN000; | ||
| 431 | ; ;AN000; | ||
| 432 | ; Inputs: ;AN000; | ||
| 433 | ; BL = redirection index ;AN000; | ||
| 434 | ; DS:SI -> Device name buffer ;AN000; | ||
| 435 | ; ES:DI -> Target buffer: old - net path string ;AN000; | ||
| 436 | ; new - dw file system driver name | ||
| 437 | ; dw # parms | ||
| 438 | ; db parms | ||
| 439 | ; Function: ;AN000; | ||
| 440 | ; STRUCTURE = 1st CDS ;AN000; | ||
| 441 | ; INDEX = 0 ;AN000; | ||
| 442 | ; WHILE CDS structures ;AN000; | ||
| 443 | ; DO ;AN000; | ||
| 444 | ; IF curdir_isIFS TRUE THEN ;AN000; | ||
| 445 | ; DO ;AN000; | ||
| 446 | ; IF INDEX = BL THEN ;AN000; | ||
| 447 | ; DO ;AN000; | ||
| 448 | ; DS:SI = Letter version of Index (0=A:, 1=B:, ...) ;AN000; | ||
| 449 | ; IF IFS .NOT. UNC THEN ;AN000; | ||
| 450 | ; DO ;AN000; | ||
| 451 | ; ES:[DI] = IFS name (retrieved from CURDIR_IFSR_HDR) ;AN000; | ||
| 452 | ; Send ATTACH_STAT request to IFS for parms ;AN000; | ||
| 453 | ; ES:DI+2 = IFS parms ;AN000; | ||
| 454 | ; FOUND = true ;AN000; | ||
| 455 | ; TYPE = 2 ;AN000; | ||
| 456 | ; LEAVE WHILE ;AN000; | ||
| 457 | ; ENDDO ;AN000; | ||
| 458 | ; ELSE DO ;AN000; | ||
| 459 | ; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; | ||
| 460 | ; Move parms into one buffer and point with ES:DI ;AN000; | ||
| 461 | ; FOUND = true ;AN000; | ||
| 462 | ; TYPE = 4 ;AN000; | ||
| 463 | ; LEAVE WHILE ;AN000; | ||
| 464 | ; ENDDO ;AN000; | ||
| 465 | ; ELSE DO ;AN000; | ||
| 466 | ; IF IFS UNC THEN ;AN000; | ||
| 467 | ; DO ;AN000; | ||
| 468 | ; INDEX=INDEX+1 ;AN000; | ||
| 469 | ; IF INDEX = BL THEN ;AN000; | ||
| 470 | ; DO ;AN000; | ||
| 471 | ; DS:SI = Letter version of Index (0=A:, 1=B:, ;AN000; | ||
| 472 | ; ES:DI = "REDIR" ;AN000; | ||
| 473 | ; FOUND = true ;AN000; | ||
| 474 | ; TYPE = 2 ;AN000; | ||
| 475 | ; LEAVE WHILE ;AN000; | ||
| 476 | ; ENDDO ;AN000; | ||
| 477 | ; ENDIF ;AN000; | ||
| 478 | ; ENDDO ;AN000; | ||
| 479 | ; ENDIF ;AN000; | ||
| 480 | ; ENDDO ;AN000; | ||
| 481 | ; ENDIF ;AN000; | ||
| 482 | ; ENDDO ;AN000; | ||
| 483 | ; ENDIF ;AN000; | ||
| 484 | ; Get next CDS structure ;AN000; | ||
| 485 | ; ENDDO ;AN000; | ||
| 486 | ; ENDWHILE ;AN000; | ||
| 487 | ; IF FOUND = false THEN ;AN000; | ||
| 488 | ; DO ;AN000; | ||
| 489 | ; STRUCTURE = 1st DFL ;AN000; | ||
| 490 | ; WHILE DFL structures ;AN000; | ||
| 491 | ; DO ;AN000; | ||
| 492 | ; IF INDEX = BL THEN ;AN000; | ||
| 493 | ; DO ;AN000; | ||
| 494 | ; DS:SI = name pointed to by DFLL_NAME_PTR ;AN000; | ||
| 495 | ; IF IFS .NOT. UNC THEN ;AN000; | ||
| 496 | ; DO ;AN000; | ||
| 497 | ; ES:[DI] = IFS name (retrieved from DFLL_IFSR_HDR) ;AN000; | ||
| 498 | ; Send ATTACH_STAT request to IFS for parms ;AN000; | ||
| 499 | ; ES:DI+2 = IFS parms ;AN000; | ||
| 500 | ; FOUND = true ;AN000; | ||
| 501 | ; TYPE = 1 ;AN000; | ||
| 502 | ; LEAVE WHILE ;AN000; | ||
| 503 | ; ENDDO ;AN000; | ||
| 504 | ; ELSE DO ;AN000; | ||
| 505 | ; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; | ||
| 506 | ; Move parms into one buffer and point with ES:DI ;AN000; | ||
| 507 | ; FOUND = true ;AN000; | ||
| 508 | ; TYPE = 3 ;AN000; | ||
| 509 | ; LEAVE WHILE ;AN000; | ||
| 510 | ; ENDDO ;AN000; | ||
| 511 | ; ELSE DO ;AN000; | ||
| 512 | ; IF IFS UNC THEN ;AN000; | ||
| 513 | ; DO ;AN000; | ||
| 514 | ; INDEX=INDEX+1 ;AN000; | ||
| 515 | ; IF INDEX = BL THEN ;AN000; | ||
| 516 | ; DO ;AN000; | ||
| 517 | ; ES:DI = "REDIR" ;AN000; | ||
| 518 | ; FOUND = true ;AN000; | ||
| 519 | ; TYPE = 3 ;AN000; | ||
| 520 | ; LEAVE WHILE ;AN000; | ||
| 521 | ; ENDDO ;AN000; | ||
| 522 | ; ENDIF ;AN000; | ||
| 523 | ; ENDDO ;AN000; | ||
| 524 | ; ENDIF ;AN000; | ||
| 525 | ; ENDDO ;AN000; | ||
| 526 | ; ENDIF ;AN000; | ||
| 527 | ; Get next DFL structure ;AN000; | ||
| 528 | ; ENDWHILE ;AN000; | ||
| 529 | ; ENDDO ;AN000; | ||
| 530 | ; ENDIF ;AN000; | ||
| 531 | ; IF FOUND = FALSE THEN ;AN000; | ||
| 532 | ; DO ;AN000; | ||
| 533 | ; Set carry ;AN000; | ||
| 534 | ; AX = 18 ;AN000; | ||
| 535 | ; ENDDO ;AN000; | ||
| 536 | ; ELSE Clear carry ;AN000; | ||
| 537 | ; ENDIF ;AN000; | ||
| 538 | ; | ||
| 539 | ; IFSRH for Attach Start: | ||
| 540 | ; * IFSR_LENGTH DW 32 ; Request length | ||
| 541 | ; * IFSR_FUNCTION DB 3 ; Attach Start | ||
| 542 | ; + IFSR_RETCODE DW 0 | ||
| 543 | ; + IFSR_RETCLASS DB ? | ||
| 544 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 545 | ; + IFSR_TYPE DB ? ; BL (1,2,3,or 4) | ||
| 546 | ; IFSR_RESV2 DB ? | ||
| 547 | ; *+ IFSR_PARMS@ DD PARMS ; See below | ||
| 548 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) | ||
| 549 | ; + IFSR_USER_WORD DW ? | ||
| 550 | ; + IFSR_MAX_XMITT_SIZE DW ? | ||
| 551 | ; + IFSR_NET_NAME_ID DW ? | ||
| 552 | ; + IFSR_LSN DW ? | ||
| 553 | ; + IFSR_DEVICE_STATUS DB ? | ||
| 554 | ; IFSR_RESV3 DB ? | ||
| 555 | ; | ||
| 556 | ; | ||
| 557 | ; | ||
| 558 | ; *+ PARMS LABEL WORD | ||
| 559 | ; DW PARMCOUNT ; Number of parms. (only for new style) | ||
| 560 | ; DB ASCIIZ,...; Parms | ||
| 561 | ; | ||
| 562 | ; ;AN000; | ||
| 563 | ; Outputs: ;AN000; | ||
| 564 | ; No Carry - BH = device status flag ;AN000; | ||
| 565 | ; bit 0=0 is device valid ;AN000; | ||
| 566 | ; 1 if device invalid ;AN000; | ||
| 567 | ; BL = device type ;AN000; | ||
| 568 | ; DS:SI = ASCIIZ local device name ;AN000; | ||
| 569 | ; ES:DI = ASCIIZ network name ;AN000; | ||
| 570 | ; For old style call: | ||
| 571 | ; CX = user word ;AN000; | ||
| 572 | ; DX = max xmitt size | ||
| 573 | ; BP = Low 8 bits has LSN from NCB_LIST if input AL ^=0 | ||
| 574 | ; AX = Net name ID | ||
| 575 | ; | ||
| 576 | ; Carry - AX = Error code ;AN000; | ||
| 577 | ; 18 - end of list ;AN000; | ||
| 578 | ; Regs: ;AN000; | ||
| 579 | ; ;AN000; | ||
| 580 | ;************************************************************************************ ;AN000; | ||
| 581 | USER_WORD DW 0 ; i give in - temp storage | ||
| 582 | ;AN000; | ||
| 583 | Procedure GET_IFSFUNC_ITEM ;AC003; | ||
| 584 | ASSUME DS:NOTHING,ES:NOTHING ;AC003; | ||
| 585 | ; get_ifsfunc_item and get_ifsfunc_item2 ;AC003; | ||
| 586 | MOV CS:IFSPROC_FLAGS,ZERO ; are old style - types 3,4 only ;AC003; | ||
| 587 | JMP SHORT GII_20 ;AC003; | ||
| 588 | ;AC003; | ||
| 589 | entry GET_IFSFUNC_ITEM2 ;AC003; | ||
| 590 | MOV CS:IFSPROC_FLAGS,SetBP ; set this to get lsn ;AC003; | ||
| 591 | JMP SHORT GII_20 ;AC003; | ||
| 592 | ;AC003; | ||
| 593 | entry GET_IFSFUNC_ITEM3 ; new style get ifsfunc item ;AC003; | ||
| 594 | MOV CS:IFSPROC_FLAGS,Filesys_Status ; gets types 1,2,3,4 ;AC003; | ||
| 595 | ;AC003; | ||
| 596 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 597 | ; drive loop ;AC003; | ||
| 598 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 599 | ;AC003; | ||
| 600 | GII_20: ;AC003; | ||
| 601 | ifsr_fcn_def ATTSTAT ; define ifsr for attach status ;AC003; | ||
| 602 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN006; | ||
| 603 | ;AC003; | ||
| 604 | POP BX ; index ;AC003; | ||
| 605 | XOR AX,AX ; ax will be counter through CDSs ;AC003; | ||
| 606 | SaveReg <DS,SI> ; save device/drive name buffer ;AC003; | ||
| 607 | GII_40: ;AC003; | ||
| 608 | CMP AL,SS:[CDSCount] ; if run out of CDSs, ;AC003; | ||
| 609 | JB GII_60 ; go to devices ;AC003; | ||
| 610 | XOR AL,AL ; reset for dfl count ;AC003; | ||
| 611 | JMP GII_400 ;AC003; | ||
| 612 | GII_60: ;AC003; | ||
| 613 | SaveReg <BX,AX> ; save ax-cds count, bx-index ;AC003; | ||
| 614 | ;AC003; | ||
| 615 | LDS SI,[CDSAddr] ; Point ds:si to correct CDS entry ;AC003; | ||
| 616 | CMP [fAssign],ZERO ; if pause in effect, must use ;AC003; | ||
| 617 | JNZ GII_80 ; alternate cds list ;AC003; | ||
| 618 | LDS SI,[CDSAlt] ;AC003; | ||
| 619 | ;AC003; | ||
| 620 | GII_80: ;AC003; | ||
| 621 | MOV BL,SIZE CurDir_list ; size in convenient spot ;AC003; | ||
| 622 | MUL BL ; get net offset ;AC003; | ||
| 623 | ADD SI,AX ; convert to true pointer ;AC003; | ||
| 624 | RestoreReg <AX,BX> ;AC003; | ||
| 625 | TEST [SI].curdir_flags,curdir_isnet ; make sure ifs drive ;AC003; | ||
| 626 | JNZ GII_100 ;AC003; | ||
| 627 | JMP GII_280 ; next drive ;AC003; | ||
| 628 | GII_100: ;AC003; | ||
| 629 | SUB BX,1 ; jae jumps if CF=0, CF=1 when ;AC003; | ||
| 630 | ; index hit ;AC003; | ||
| 631 | JB GII_120 ;AC003; | ||
| 632 | JMP GII_280 ; next drive ;AC003; | ||
| 633 | GII_120: ;AC003; | ||
| 634 | TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; | ||
| 635 | JNZ GII_140 ;AC003; | ||
| 636 | CMP [SI.CURDIR_TYPE],TYPE_NET_DRIVE ; old style: check for type 4 ;AC003; | ||
| 637 | JE GII_140 ;AC003; | ||
| 638 | JMP GII_280 ; not type 4, go get next one ;AC003; | ||
| 639 | GII_140: ;AC003; | ||
| 640 | RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003; | ||
| 641 | SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003; | ||
| 642 | SaveReg <ES,DI> ; while preserving es:di - target ;AC003; | ||
| 643 | MOV ES,CX ;AC003; | ||
| 644 | MOV DI,DX ;AC003; | ||
| 645 | ADD AL,'A' ; storing d:0 in devname buffer ;AC003; | ||
| 646 | STOSB ;AC003; | ||
| 647 | MOV AX,(0 SHL 8) + ':' ;AC003; | ||
| 648 | STOSW ;AC003; | ||
| 649 | RestoreReg <DI,ES> ; restore target ptr ;AC003; | ||
| 650 | ;AC003; | ||
| 651 | MOV BL,[SI.CURDIR_TYPE] ; set bx=type (1,2,3,4) ;AC003; | ||
| 652 | XOR BH,BH ;AC003; | ||
| 653 | TEST CS:IFSPROC_FLAGS,Filesys_status ; target different for new style ;AC003; | ||
| 654 | JNZ GII_150 ;AC003; | ||
| 655 | PUSH [SI.CURDIR_USER_WORD] ;AC003; | ||
| 656 | POP CS:[USER_WORD] ;AC003; | ||
| 657 | JMP GII_160 ;AC003; | ||
| 658 | GII_150: ;AC003; | ||
| 659 | PUSH DI ; ifs drive; save target offset ;AC003; | ||
| 660 | MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; | ||
| 661 | OR IFSPROC_FLAGS,ISCDS ; get ifs driver name into target ;AC003; | ||
| 662 | CALL GET_IFS_DRIVER_NAME ;AC003; | ||
| 663 | ;AC003; | ||
| 664 | POP DI ; retrieve target offset from stack ;AC003; | ||
| 665 | PUSH DI ;AC003; | ||
| 666 | INC DI ; es:di -> parm buffer ;AC003; | ||
| 667 | INC DI ;AC003; | ||
| 668 | ;AC003; | ||
| 669 | GII_160: ;AC003; | ||
| 670 | SaveReg <ES,BX> ; save target segment, type ;AC003; | ||
| 671 | ; go to IFS to fill in rest of tgt ;AC003; | ||
| 672 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 673 | ;AC003; | ||
| 674 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC003; | ||
| 675 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AC003; | ||
| 676 | ; ES:BX -> IFSRH ;AC003; | ||
| 677 | ; IFSR_DEVICE_CB@ ;AC003; | ||
| 678 | ; ds - IFSSEG ;AC003; | ||
| 679 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; | ||
| 680 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; | ||
| 681 | POP AX ; type (BX) ;AC003; | ||
| 682 | MOV ES:[BX.IFSR_TYPE],AL ;AC003; | ||
| 683 | POP DX ; target segment (ES) ;AC003; | ||
| 684 | ;AC003; | ||
| 685 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 686 | JNZ GII_180 ;AC003; | ||
| 687 | PUSH CS ;AC003; | ||
| 688 | POP DS ;AC003; | ||
| 689 | ASSUME DS:IFSSEG ;AC003; | ||
| 690 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 691 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; | ||
| 692 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; | ||
| 693 | PUSH DI ; push tgt offset here for later pop ;AC003; | ||
| 694 | JMP GII_200 ;AC003; | ||
| 695 | GII_180: ;AC003; | ||
| 696 | MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; | ||
| 697 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; | ||
| 698 | GII_200: ;AC003; | ||
| 699 | PUSH AX ; push type back (BX) ;AC003; | ||
| 700 | ;AC003; | ||
| 701 | ;*********************************************************************************************** | ||
| 702 | invoke CALL_IFS ; call fs with attach status request ;AC003; | ||
| 703 | ;*********************************************************************************************** | ||
| 704 | ;AC003; | ||
| 705 | JNC GII_220 ;AC003; | ||
| 706 | ; attach status error: ;AC003; | ||
| 707 | RestoreReg <BX,DI> ; type,target offset ;AC003; | ||
| 708 | MOV ES,DX ;AC003; | ||
| 709 | SaveReg <DI> ; put "ERROR" in parms display ;AC003; | ||
| 710 | TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; | ||
| 711 | JZ GII_210 ;AN029; | ||
| 712 | ADD DI,2 ;AC003; | ||
| 713 | MOV AX,1 ;AC003; | ||
| 714 | STOSW ;AC003; | ||
| 715 | GII_210: ;AN029; | ||
| 716 | PUSH CS ;AC003; | ||
| 717 | POP DS ;AC003; | ||
| 718 | ASSUME DS:IFSSEG ;AC003; | ||
| 719 | MOV SI,OFFSET ERROR_STATUS ;AC003; | ||
| 720 | MOV CX,4 ;AC003; | ||
| 721 | REP MOVSW ;AC003; | ||
| 722 | RestoreReg <DI,SI,DS> ;AC003;;AC029; | ||
| 723 | transfer ifs_1000 ; go to general ret in util ;AC003; | ||
| 724 | ;AC003; | ||
| 725 | GII_220: ;AC003; | ||
| 726 | RestoreReg <AX,DI> ; device type, target offset ;AC003; | ||
| 727 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 728 | JZ GII_240 ;AC003; | ||
| 729 | ;;;;;;;;RestoreReg <SI,DS> ; IFS drive - devname ptr ;AC003;;AD022; | ||
| 730 | ; MOV ES,DX ; target ;AC003;;AD022; | ||
| 731 | ; MOV BX,AX ;AC003;;AD022; | ||
| 732 | ;;;;;;;;transfer ifs_1000 ;AC003;;AD022; | ||
| 733 | JMP GII_630 ; want user bx set ;AN022; | ||
| 734 | ;AC003; | ||
| 735 | GII_240: ; NET drive: ;AC003; | ||
| 736 | JMP GII_640 ; go down to net device processing- ;AC003; | ||
| 737 | ; does the same thing ;AC003; | ||
| 738 | GII_280: ;AC003; | ||
| 739 | INC AX ; next drive ;AC003; | ||
| 740 | JMP GII_40 ;AC003; | ||
| 741 | ;AC003; | ||
| 742 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 743 | ; device loop ;AC003; | ||
| 744 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 745 | ;AC003; | ||
| 746 | GII_400: ; Device loop ;AC003; | ||
| 747 | CMP AL,CS:[DFLCount] ; if run out of devices ;AC003; | ||
| 748 | JB GII_460 ;AC003; | ||
| 749 | JMP GII_800 ; go set no_more error ;AC003; | ||
| 750 | GII_460: ;AC003; | ||
| 751 | SaveReg <BX,AX> ; save ax-dfl count, bx-index ;AC003; | ||
| 752 | LDS SI,CS:[DFLAddr] ; Point ds:si to correct DFL entry ;AC003; | ||
| 753 | MOV BL,SIZE DFLL_list ; size in convenient spot ;AC003; | ||
| 754 | MUL BL ; get net offset ;AC003; | ||
| 755 | ADD SI,AX ; convert to true pointer ;AC003; | ||
| 756 | RestoreReg <AX,BX> ;AC003; | ||
| 757 | TEST [SI.DFLL_FLAGS],DFL_INUSE ; is dfl active??? ;AC003; | ||
| 758 | JNZ GII_480 ;AC003; | ||
| 759 | JMP GII_680 ;AC003; | ||
| 760 | GII_480: ;AC003; | ||
| 761 | TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; | ||
| 762 | JNZ GII_520 ;AC003; | ||
| 763 | CMP [SI.DFLL_TYPE],TYPE_NET_DEVICE ; old style: check for type 3 ;AC003; | ||
| 764 | JE GII_520 ;AC003; | ||
| 765 | JMP GII_680 ; not type 4, go get next one ;AC003; | ||
| 766 | GII_520: ;AC003; | ||
| 767 | SUB BX,1 ;AC003; | ||
| 768 | JB GII_540 ;AC003; | ||
| 769 | JMP GII_680 ; next device ;AC003; | ||
| 770 | GII_540: ;AC003; | ||
| 771 | MOV WORD PTR CS:[THISDFL],SI ; set thisdfl = dssi ;AN014; | ||
| 772 | PUSH DS ;AN014; | ||
| 773 | POP WORD PTR CS:[THISDFL+2] ;AN014; | ||
| 774 | RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003; | ||
| 775 | SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003; | ||
| 776 | SaveReg <ES,DI> ; while preserving es:di - target ;AC003; | ||
| 777 | MOV ES,CX ;AC003; | ||
| 778 | MOV DI,DX ;AC003; | ||
| 779 | PUSH SI ; save DFL offset ;AC003; | ||
| 780 | ADD SI,DFLL_DEV_NAME ;AC003; | ||
| 781 | MOV CX,8 ;AC003; | ||
| 782 | GII_545: ; store device name in asciiz format ;AC003; | ||
| 783 | LODSB ;AC003; | ||
| 784 | CMP AL," " ;AC003; | ||
| 785 | JE GII_550 ;AC003; | ||
| 786 | STOSB ;AC003; | ||
| 787 | LOOP GII_545 ;AC003; | ||
| 788 | GII_550: ;AC003; | ||
| 789 | XOR AL,AL ;AC003; | ||
| 790 | STOSB ;AC003; | ||
| 791 | RestoreReg <SI,DI,ES> ; restore target ptr & DFL offset ;AC003; | ||
| 792 | ;AC003; | ||
| 793 | MOV BL,[SI.DFLL_TYPE] ;AC003; | ||
| 794 | XOR BH,BH ;AC003; | ||
| 795 | TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 796 | JNZ GII_555 ;AC003; | ||
| 797 | PUSH [SI.DFLL_USER_WORD] ;AC003; | ||
| 798 | POP [USER_WORD] ;AC003; | ||
| 799 | JMP GII_560 ;AC003; | ||
| 800 | GII_555: ;AC003; | ||
| 801 | PUSH DI ; ifs device; save target offset ;AC003; | ||
| 802 | MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; | ||
| 803 | invoke GET_IFS_DRIVER_NAME ;AC003; | ||
| 804 | ;AC003; | ||
| 805 | POP DI ; retrieve target offset from stack ;AC003; | ||
| 806 | PUSH DI ;AC003; | ||
| 807 | INC DI ; es:di -> parm buffer ;AC003; | ||
| 808 | INC DI ;AC003; | ||
| 809 | ;AC003; | ||
| 810 | GII_560: ;AC003; | ||
| 811 | SaveReg <ES,BX> ; save target segment, type ;AC003; | ||
| 812 | ; now go to IFS to fill in rest of target;AC003; | ||
| 813 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 814 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AC003; | ||
| 815 | ; ES:BX -> IFSRH ;AC003; | ||
| 816 | ; IFSR_DEVICE_CB@ ;AC003; | ||
| 817 | ; ds - IFSSEG ;AC003; | ||
| 818 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; | ||
| 819 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; | ||
| 820 | POP AX ; type (BX) ;AC003; | ||
| 821 | MOV ES:[BX.IFSR_TYPE],AL ;AC003; | ||
| 822 | POP DX ; target segment (ES) ;AC003; | ||
| 823 | ;AC003; | ||
| 824 | TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 825 | JNZ GII_580 ;AC003; | ||
| 826 | PUSH CS ;AC003; | ||
| 827 | POP DS ;AC003; | ||
| 828 | ASSUME DS:IFSSEG ;AC003; | ||
| 829 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 830 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; | ||
| 831 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; | ||
| 832 | PUSH DI ; push tgt offset here for later pop ;AC003; | ||
| 833 | JMP GII_600 ;AC003; | ||
| 834 | GII_580: ;AC003; | ||
| 835 | MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; | ||
| 836 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; | ||
| 837 | GII_600: ;AC003; | ||
| 838 | PUSH AX ; push type back (BX) ;AC003; | ||
| 839 | ;AC003; | ||
| 840 | ;*********************************************************************************************** | ||
| 841 | invoke CALL_IFS ; call fs with attach status request ;AC003; | ||
| 842 | ;*********************************************************************************************** | ||
| 843 | ;AC003; | ||
| 844 | JNC GII_620 ;AC003; | ||
| 845 | RestoreReg <BX,DI> ; type,target offset,devname ptr ;AC003; | ||
| 846 | MOV ES,DX ; target ;AC003; | ||
| 847 | SaveReg <DI> ; put "ERROR" in parms display ;AC003; | ||
| 848 | TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; | ||
| 849 | JZ GII_610 ;AN029; | ||
| 850 | ADD DI,2 ;AC003; | ||
| 851 | MOV AX,1 ;AC003; | ||
| 852 | STOSW ;AC003; | ||
| 853 | GII_610: ;AN029; | ||
| 854 | PUSH CS ;AC003; | ||
| 855 | POP DS ;AC003; | ||
| 856 | ASSUME DS:IFSSEG ;AC003; | ||
| 857 | MOV SI,OFFSET ERROR_STATUS ;AC003; | ||
| 858 | MOV CX,4 ;AC003; | ||
| 859 | REP MOVSW ;AC003; | ||
| 860 | RestoreReg <DI,SI,DS> ;AC003;;AC027; | ||
| 861 | transfer ifs_1000 ; go to general ret in util ;AC003; | ||
| 862 | ;AC003; | ||
| 863 | GII_620: ;AC003; | ||
| 864 | RestoreReg <AX,DI> ; device type, target offset ;AC003; | ||
| 865 | TEST IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 866 | JZ GII_640 ; IFS device: ;AC003; | ||
| 867 | GII_630: ;AN022; | ||
| 868 | CallInstall Get_User_Stack,MULTdos,24,<AX>,<AX> ;AN022; | ||
| 869 | MOV AH,ES:[BX.IFSR_DEVICE_STATUS] ;AN022; | ||
| 870 | MOV [SI].USER_BX,AX ;AN022; | ||
| 871 | RestoreReg <SI,DS> ; target offset,devname ptr ;AC003; | ||
| 872 | MOV ES,DX ; target ;AC003; | ||
| 873 | ;;;;;;;;MOV BX,AX ;AC003;;AD022; | ||
| 874 | transfer ifs_1000 ;AC003; | ||
| 875 | ;AC003; | ||
| 876 | GII_640: ; NET device: ;AC003; | ||
| 877 | CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003; | ||
| 878 | PUSH CS:[USER_WORD] ;AC003; | ||
| 879 | POP [SI].User_CX ; User Word ;AC003; | ||
| 880 | PUSH ES:[BX.IFSR_MAX_XMITT_SIZE] ;AC003; | ||
| 881 | POP [SI].User_DX ; Max Xmitt size ;AC003; | ||
| 882 | PUSH ES:[BX.IFSR_NET_NAME_ID] ;AC003/AC008/AC009 | ||
| 883 | PUSH ES:[BX.IFSR_NET_NAME_ID] ; leave this on stack for later pop into ax ;AC009; | ||
| 884 | POP [SI].User_AX ; Net name ID ;AC003/AC008; | ||
| 885 | ;;;;;;;;PUSH AX ;AN008/AD009; | ||
| 886 | |||
| 887 | MOV CH,ES:[BX.IFSR_DEVICE_STATUS] ;AC003; | ||
| 888 | MOV CL,AL ;AC003; | ||
| 889 | MOV [SI].User_BX,CX ; Bits and macro type ;AC003; | ||
| 890 | TEST CS:IFSPROC_FLAGS,SetBP ;AC003; | ||
| 891 | JZ GII_660 ;AC003; | ||
| 892 | PUSH ES:[BX.IFSR_LSN] ;AC003; | ||
| 893 | POP [SI].User_BP ; LSN ;AC003; | ||
| 894 | GII_660: ;AC003; | ||
| 895 | MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AC003; | ||
| 896 | MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AC003; | ||
| 897 | INC SI ; ds:si -> parms returned by redir ;AC003; | ||
| 898 | INC SI ;AC003; | ||
| 899 | MOV ES,DX ; es:di -> input target buffer ;AC003; | ||
| 900 | SaveReg <DI> ; save offset ;AC003; | ||
| 901 | CallInstall StrCpy,MultDOS,17 ;AC003; | ||
| 902 | RestoreReg <DI,AX,SI,DS> ; tgt offset,netpath id,devname ptr ;AC003/AC008; | ||
| 903 | transfer ifs_990 ;AC003; | ||
| 904 | ;AC003; | ||
| 905 | GII_680: ;AC003; | ||
| 906 | INC AX ; next drive ;AC003; | ||
| 907 | JMP GII_400 ;AC003; | ||
| 908 | ;AC003; | ||
| 909 | ;AC003; | ||
| 910 | GII_800: ; end of CDSs & devices ;AC003; | ||
| 911 | ; now check deviceless attaches ;AC003; | ||
| 912 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 913 | ; deviceless loop ;AC003; | ||
| 914 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 915 | ;AC003; | ||
| 916 | CALL GET_UNC_ITEM_INFO ;AC003; | ||
| 917 | JC GII_820 ;AC003; | ||
| 918 | RestoreReg <SI,DS> ; set dev ptr null ;AC003; | ||
| 919 | MOV BYTE PTR DS:[SI],ZERO ;AC003; | ||
| 920 | transfer ifs_990 ;AC003; | ||
| 921 | GII_820: ;AC003; | ||
| 922 | MOV AX,error_no_more_files ;AC003; | ||
| 923 | RestoreReg <SI,DI> ; restore regs ;AC003; | ||
| 924 | ;AC003; | ||
| 925 | return ;AC003; | ||
| 926 | ;AC003; | ||
| 927 | EndProc GET_IFSFUNC_ITEM ;AC003; | ||
| 928 | ;AN000; | ||
| 929 | ;AN000; | ||
| 930 | BREAK <ATTACH_START -- Attach drive/device to IFS> ;AN000; | ||
| 931 | ;AN000; | ||
| 932 | ;************************************************************************************ ;AN000; | ||
| 933 | ; ;AN000; | ||
| 934 | ; ATTACH_START ;AN000; | ||
| 935 | ; ;AN000; | ||
| 936 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 937 | ; ;AN000; | ||
| 938 | ; Routines called: CALL_IFS DOS: GetCDSFromDrv ;AN000; | ||
| 939 | ; CDS_TO_CD ;AN000; | ||
| 940 | ; CD_TO_CDS ;AN000; | ||
| 941 | ; CREATE_DFL_ENTRY ;AN000; | ||
| 942 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 943 | ; DFL_MATCH ;AN000; | ||
| 944 | ; DFL_TO_DF ;AN000; | ||
| 945 | ; DF_TO_DFL ;AN000; | ||
| 946 | ; CALL_IFS ;AN000; | ||
| 947 | ; FIND_IFS_DRIVER ;AN000; | ||
| 948 | ;;; alias PROCESS_ALIAS ;AN000; | ||
| 949 | ; ;AN000; | ||
| 950 | ; Inputs: ;AN000; | ||
| 951 | ; BL = Macro type ;AN000; | ||
| 952 | ;;; alias = 0 alias ;AN000; | ||
| 953 | ; = 1 device/file ;AN000; | ||
| 954 | ; = 2 drive ;AN000; | ||
| 955 | ; = 3 Char device -> network ;AN000; | ||
| 956 | ; = 4 File device -> network ;AN000; | ||
| 957 | ; DS:SI -> ASCIIZ source name ;AN000; | ||
| 958 | ; ES:DI -> Target driver to attach to and parms. ;AN000; | ||
| 959 | ; DW ASCIIZ - asciiz name of driver ;AN000; | ||
| 960 | ; DW n - number of parms ;AN000; | ||
| 961 | ; DW ASCIIZ,... parms ;AN000; | ||
| 962 | ; ;AN000; | ||
| 963 | ; CX is reserved (user word for REDIR) ;AN000; | ||
| 964 | ; ;AN000; | ||
| 965 | ; Function: ;AN000; | ||
| 966 | ; IF BL > 0 THEN ;AN000; | ||
| 967 | ; DO ;AN000; | ||
| 968 | ; Check that IFS driver exists ;AN000; | ||
| 969 | ; IF found, set IFS header to that found ;AN000; | ||
| 970 | ; ELSE set error_file_system_not_found ;AN000; | ||
| 971 | ; ENDDO ;AN000; | ||
| 972 | ; IF (BL=2 .OR. BL=4) & no error THEN ;AN000; | ||
| 973 | ; DO ;AN000; | ||
| 974 | ; Find CDS for this drive ;AN000; | ||
| 975 | ; IF none exists, then set error_invalid_parameter ;AN000; | ||
| 976 | ; ELSE Call CDS_TO_CD ;AN000; | ||
| 977 | ; END ;AN000; | ||
| 978 | ; ELSE DO ;AN000; | ||
| 979 | ; IF source name not in DFL THEN ;AN000; | ||
| 980 | ; Call CREATE_DFL_ENTRY ;AN000; | ||
| 981 | ; ELSE Set error_device_already_attached ;AN000; | ||
| 982 | ; ENDIF ;AN000; | ||
| 983 | ; ENDDO ;AN000; | ||
| 984 | ; IF no error THEN ;AN000; | ||
| 985 | ; DO ;AN000; | ||
| 986 | ; Prep IFSRH for Attach Start: ;AN000; | ||
| 987 | ; * IFSR_LENGTH DW 34 ; Request length ;AN000; | ||
| 988 | ; * IFSR_FUNCTION DB 2 ; Attach Start ;AN000; | ||
| 989 | ; IFSR_RETCODE DW 0 ;AN000; | ||
| 990 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 991 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 992 | ; * IFSR_TYPE DB ? ; BL (0,1,2,3,or 4) ;AN000; | ||
| 993 | ; IFSR_RESV2 DB ? ; | ||
| 994 | ; * IFSR_PARMS@ DD PARMS ; See below ;AN000; | ||
| 995 | ; * IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) ;AN000; | ||
| 996 | ; * IFSR_USER_WORD DW ? ; for deviceless attach ;AN000; | ||
| 997 | ; ;AN000; | ||
| 998 | ; * PARMS LABEL WORD ;AN000; | ||
| 999 | ; DW PARMCOUNT ; Number of parms. May be 0. ;AN000; | ||
| 1000 | ; DB ASCIIZ,...; Parms ;AN000; | ||
| 1001 | ; ENDDO ;AN000; | ||
| 1002 | ; IF no error THEN ;AN000; | ||
| 1003 | ; DO ;AN000; | ||
| 1004 | ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; | ||
| 1005 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 1006 | ; DO ;AN000; | ||
| 1007 | ; IF DFL flag set THEN ;AN000; | ||
| 1008 | ; DO ;AN000; | ||
| 1009 | ; Call DF_TO_DFL ;AN000; | ||
| 1010 | ; Set DFLL_PTR to IFS header ;AN000; | ||
| 1011 | ; ENDDO ;AN000; | ||
| 1012 | ; ELSE DO ;AN000; | ||
| 1013 | ; Call CD_TO_CDS ;AN000; | ||
| 1014 | ; Set CDS_IFSR_PTR to IFS header ;AN000; | ||
| 1015 | ; ENDDO ;AN000; | ||
| 1016 | ; ENDIF ;AN000; | ||
| 1017 | ; Clear carry ;AN000; | ||
| 1018 | ; ENDDO ;AN000; | ||
| 1019 | ; ELSE DO ;AN000; | ||
| 1020 | ; IF DFL flag set THEN ;AN000; | ||
| 1021 | ; Call DELETE_DFL_ENTRY ;AN000; | ||
| 1022 | ; Set carry ;AN000; | ||
| 1023 | ; ENDDO ;AN000; | ||
| 1024 | ; ENDIF ;AN000; | ||
| 1025 | ; ENDDO ;AN000; | ||
| 1026 | ; ELSE Set carry ;AN000; | ||
| 1027 | ; ENDIF ;AN000; | ||
| 1028 | ; ;AN000; | ||
| 1029 | ;************************************************************************************ ;AN000; | ||
| 1030 | ;AN000; | ||
| 1031 | Procedure ATTACH_START,NEAR ;AN000; | ||
| 1032 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1033 | ;AN000; | ||
| 1034 | ifsr_fcn_def ATTSTART ;AN000; | ||
| 1035 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1036 | ;AN000; | ||
| 1037 | POP BX ;AN000; | ||
| 1038 | XOR BH,BH ; not interested in bh, but should ;AN000; | ||
| 1039 | ; be 0 since later move type as word ;AN000; | ||
| 1040 | AS_10: ;AN000; | ||
| 1041 | CMP BL,TYPE_DRIVE ; check ifs vs. network ;AN000; | ||
| 1042 | JLE AS_20 ;AN000; | ||
| 1043 | CMP BL,TYPE_NET_DRIVE ;AN000; | ||
| 1044 | JLE AS_30 ;AN000; | ||
| 1045 | ;AN000; | ||
| 1046 | AS_15: ;AN000; | ||
| 1047 | MOV AX,error_invalid_function ; invalid fcn type ;AN000; | ||
| 1048 | transfer ifs_980 ; go ret w/carry ;AN000; | ||
| 1049 | ;AN000; | ||
| 1050 | AS_20: ; IFS device/drive ;AN000; | ||
| 1051 | SaveReg <ES,DI> ; save target ptr for parms@ ;AN000; | ||
| 1052 | MOV DI,ES:[DI] ; set ES:DI -> driver name ;AN000; | ||
| 1053 | invoke FIND_IFS_DRIVER ; sets [THISIFS] ;AN000; | ||
| 1054 | JC AS_25 ;AN000; | ||
| 1055 | SaveReg <CX> ; save cx since next destroys ;AN000; | ||
| 1056 | invoke SET_CATEGORY ; do this to determine unc or not ;AN000; | ||
| 1057 | OR CL,CL ; cl=1 unc else ifs ;AN000; | ||
| 1058 | RestoreReg <CX> ; restore before branch - zf preserved ;AN000; | ||
| 1059 | JZ AS_50 ; jmp if not unc ;AN000; | ||
| 1060 | ADD BL,2 ; change type from 1/2 to 3/4 ;AN000; | ||
| 1061 | RestoreReg <DI,ES> ; retrieve orig target ptr ;AN010; | ||
| 1062 | ;;;;;;;;OR CS:IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; | ||
| 1063 | CMP WORD PTR ES:[DI+2],2 ; if # parms=2 then have password ;AN011; | ||
| 1064 | JE AS_22 ;AN011; | ||
| 1065 | MOV CX,0001H ; User word without password ;AN011; | ||
| 1066 | JMP SHORT AS_23 ; go process as unc ;AN011;;AC017; | ||
| 1067 | AS_22: ;AN011; | ||
| 1068 | MOV CX,8001H ; User word with password ;AN011; | ||
| 1069 | AS_23: ;AN017; | ||
| 1070 | ADD DI,4 ; skip over ifs name offset & #parms ;AN017; | ||
| 1071 | JMP SHORT AS_33 ; go process as unc ;AN000; | ||
| 1072 | |||
| 1073 | AS_25: ; ifs driver not found ;AN000; | ||
| 1074 | POP DI ; error, restore stack and return ;AN000; | ||
| 1075 | POP ES ;AN000; | ||
| 1076 | transfer ifs_1000 ;AN000; | ||
| 1077 | ;AN000; | ||
| 1078 | AS_30: ; NETWORK device/drive ;AN000; | ||
| 1079 | TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; check that unc installed ;AN000; | ||
| 1080 | JZ AS_15 ;AN000; | ||
| 1081 | AS_33: ; this label for unc already checked ;AN000; | ||
| 1082 | OR IFSPROC_FLAGS,IsNetwork ; set network bit ;AN000; | ||
| 1083 | CMP BL,TYPE_NET_DRIVE ; check pause status ;AN000; | ||
| 1084 | JNE AS_35 ;AN000; | ||
| 1085 | CMP CS:fAssign,-1 ;AN000; | ||
| 1086 | JMP SHORT AS_37 ;AN000; | ||
| 1087 | AS_35: ;AN000; | ||
| 1088 | CMP CS:fPrint,-1 ;AN000; | ||
| 1089 | AS_37: ;AN000; | ||
| 1090 | JE AS_40 ; bad pause status ;AN000; | ||
| 1091 | MOV AX,72 ; set error and ret w/carry ;AN000; | ||
| 1092 | AS_38: ;AN020; | ||
| 1093 | PUSH CS ;AN000; | ||
| 1094 | POP DS ;AN000; | ||
| 1095 | ASSUME DS:IFSSEG ;AN000; | ||
| 1096 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1097 | transfer ifs_980 ;AN000; | ||
| 1098 | ;AN000; | ||
| 1099 | AS_40: ;AN000; | ||
| 1100 | invoke SET_THISIFS_UNC ;AN000; | ||
| 1101 | SaveReg <CX> ;AN004;;AC015; | ||
| 1102 | invoke NET_TRANS ;AN000; | ||
| 1103 | RestoreReg <CX> ;AN004;;AC015; | ||
| 1104 | JNC SHORT AS_55 ;AC020; | ||
| 1105 | MOV AX,error_path_not_found ; net trans failure = path not found ;AN020; | ||
| 1106 | JMP AS_38 ;AN020; | ||
| 1107 | ;AN000; | ||
| 1108 | AS_50: ;AN000; | ||
| 1109 | RestoreReg <DI,ES> ; restore target parm ptr ;AN000; | ||
| 1110 | AS_55: ;AN000; | ||
| 1111 | OR CS:IFSPROC_FLAGS,THISIFS_SET ; do this so wont do in CDS_TO_CD ;AN000; | ||
| 1112 | ; or DFL_TO_DF ;AN000; | ||
| 1113 | CMP BL,TYPE_DEVICE ;AN000; | ||
| 1114 | JNE AS_55_0 ;AN000; | ||
| 1115 | JMP AS_200 ;AN000; | ||
| 1116 | AS_55_0: ;AN000; | ||
| 1117 | CMP BL,TYPE_NET_DEVICE ;AN000; | ||
| 1118 | JNE AS_55_1 ;AN000; | ||
| 1119 | JMP AS_200 ;AN000; | ||
| 1120 | AS_55_1: ;AN000; | ||
| 1121 | CMP BL,TYPE_NET_DRIVE ; deviceless attach check ;AN000; | ||
| 1122 | JNE AS_56 ; jmp if no ;AN000; | ||
| 1123 | CMP BYTE PTR [SI],0 ; DEVICELESS ATTACH ;AN000; | ||
| 1124 | JNZ AS_56 ; Set dummy CDS and flag ;AN000; | ||
| 1125 | Context DS ;AN000; | ||
| 1126 | MOV SI,OFFSET DOSGROUP:DummyCDS ;AN000; | ||
| 1127 | MOV WORD PTR [THISCDS+2],DS ;AN000; | ||
| 1128 | MOV WORD PTR [THISCDS],SI ;AN000; | ||
| 1129 | OR IFSPROC_FLAGS,ISDUMMYCDS ;AN000; | ||
| 1130 | JMP SHORT AS_100 ;AN000; | ||
| 1131 | ;AN000; | ||
| 1132 | AS_56: ; DRIVE ATTACH ;AN000; | ||
| 1133 | CMP WORD PTR [SI+1],ICOLON ; if 2nd char not ":" - error ;AN000; | ||
| 1134 | JE AS_60 ; else - find CDS ;AN000; | ||
| 1135 | AS_57: ;AN000; | ||
| 1136 | MOV AX,error_invalid_drive ;AN000; | ||
| 1137 | transfer ifs_980 ;AN000; | ||
| 1138 | ;AN000; | ||
| 1139 | AS_60: ;AN000; | ||
| 1140 | LODSB ;AN000; | ||
| 1141 | Context DS ; get addressability to DOSGROUP ;AN000; | ||
| 1142 | OR AL,20H ;AN000; | ||
| 1143 | SUB AL,"a" ; 0=A,1=B,... ;AN000; | ||
| 1144 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; | ||
| 1145 | ASSUME DS:NOTHING ;AN000; | ||
| 1146 | JC AS_57 ; no cds - error ;AN000; | ||
| 1147 | TEST [SI.curdir_flags],curdir_inuse ; DS:SI -> CDS ;AN000; | ||
| 1148 | JZ AS_100 ;AN000; | ||
| 1149 | TEST [SI.curdir_flags],curdir_isnet + curdir_splice + curdir_local ;AN000; | ||
| 1150 | JZ AS_100 ;AN000; | ||
| 1151 | MOV AX,error_already_assigned ; error - CDS already assigned ;AN000; | ||
| 1152 | transfer ifs_980 ; go return with carry ;AN000; | ||
| 1153 | ;AN000; | ||
| 1154 | AS_100: ;AN000; | ||
| 1155 | SaveReg <DS,SI,ES,DI> ; save real cds and target parm ptr ;AN000; | ||
| 1156 | ; If all goes OK this will be the "REAL" CDS ;AN000; | ||
| 1157 | Context ES ;AN000; | ||
| 1158 | MOV DI,OFFSET DOSGROUP:DummyCDS ;AN000; | ||
| 1159 | SaveReg <DI,CX> ; dummy cds offset, input user word ;AC001; | ||
| 1160 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1161 | REP MOVSB ;AN000; | ||
| 1162 | RestoreReg <CX> ; input user word ;AN001; | ||
| 1163 | PUSH ES ;AN000; | ||
| 1164 | POP DS ;AN000; | ||
| 1165 | POP SI ; DS:SI -> dummy CDS ;AN000; | ||
| 1166 | MOV [SI.curdir_flags],curdir_isnet + curdir_inuse ;AN000; | ||
| 1167 | ;AN000; | ||
| 1168 | MOV AX,WORD PTR [THISIFS] ; set ifs ptr in cds ;AN000; | ||
| 1169 | MOV DS:WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; | ||
| 1170 | MOV AX,WORD PTR [THISIFS+2] ;AN000; | ||
| 1171 | MOV DS:WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; | ||
| 1172 | ;AN000; | ||
| 1173 | MOV DS:[SI.CURDIR_TYPE],BL ; set CDS type ;AN000; | ||
| 1174 | MOV DS:[SI.CURDIR_USER_WORD],CX ; set CDS user word ;AN001; | ||
| 1175 | MOV AX,CX | ||
| 1176 | ;AN000; | ||
| 1177 | RestoreReg <DX,CX> ; get target parm ptr off stack ;AN000; | ||
| 1178 | SaveReg <DS,SI,BX> ; save type and dummy cds ptr ;AN000; | ||
| 1179 | invoke PREP_IFSR ; clear ifsrh ;AN000; | ||
| 1180 | invoke CDS_TO_CD ; CDS: sets ES:BX -> IFSRH ;AN000; | ||
| 1181 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1182 | ; ds - IFSSEG ;AN000; | ||
| 1183 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1184 | TEST IFSPROC_FLAGS,ISDUMMYCDS | ||
| 1185 | JZ AS_120 | ||
| 1186 | MOV ES:[BX.IFSR_USER_WORD],AX | ||
| 1187 | AS_120: | ||
| 1188 | POP AX ; restore type in AL ;AN000; | ||
| 1189 | MOV ES:[BX.IFSR_TYPE],AL ;AC002; | ||
| 1190 | SaveReg <CX,DX> ; put target parm ptr back on stack ;AN000; | ||
| 1191 | JMP SHORT AS_400 ; go prep IFSRH ;AN000; | ||
| 1192 | ;AN000; | ||
| 1193 | AS_200: ; DEVICE ATTACH: ;AN000; | ||
| 1194 | invoke DFL_MATCH ; check if device already assigned ;AN000; | ||
| 1195 | JC AS_220 ; cf-0 match, cf-set no match ;AN000; | ||
| 1196 | MOV AX,error_already_assigned ;AN000; | ||
| 1197 | transfer ifs_980 ; go return with carry ;AN000; | ||
| 1198 | ;AN000; | ||
| 1199 | AS_220: ;AN000; | ||
| 1200 | SaveReg <ES,DI,BX> ; save target parm ptr & type ;AN000; | ||
| 1201 | invoke CREATE_DFL_ENTRY ; DFL: sets ES:BX -> IFSRH ;AN000; | ||
| 1202 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1203 | ; ds - IFSSEG ;AN000; | ||
| 1204 | JNC AS_240 ;AN000; | ||
| 1205 | RestoreReg <BX,DI,ES> ; restore stack ;AC019; | ||
| 1206 | invoke CONSIST_SFT ;AN000; | ||
| 1207 | transfer ifs_980 ; error ret ;AC019; | ||
| 1208 | AS_240: ;AN000; | ||
| 1209 | POP AX ; restore type in AL ;AN000;moved ;AM019; | ||
| 1210 | MOV ES:[BX.IFSR_TYPE],AL ;AC002; | ||
| 1211 | ;AN000; | ||
| 1212 | ;AN000; | ||
| 1213 | AS_400: ; prep IFSRH ;AN000; | ||
| 1214 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; | ||
| 1215 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; | ||
| 1216 | POP AX ; old target DI ;AN000; | ||
| 1217 | ;;;;;;;;TEST IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; | ||
| 1218 | ; JZ AS_405 ;AN010;;AD017; | ||
| 1219 | ; ADD AX,4 ; filesys-net skip name offset ;AN010;;AD017; | ||
| 1220 | ;;;;;;;;JMP SHORT AS_410 ; and # parms - just want net path;AN010;;AD017; | ||
| 1221 | ;AS_405: ;AN010;;AD017; | ||
| 1222 | TEST IFSPROC_FLAGS,IsNetwork ;AN000; | ||
| 1223 | JNZ AS_410 ;AN000; | ||
| 1224 | INC AX ;AN000; | ||
| 1225 | INC AX ;AN000; | ||
| 1226 | AS_410: | ||
| 1227 | MOV ES:WORD PTR [BX.IFSR_PARMS@],AX ;AN000; | ||
| 1228 | POP AX ; old target ES ;AN000; | ||
| 1229 | MOV ES:WORD PTR [BX.IFSR_PARMS@+2],AX ;AN000; | ||
| 1230 | |||
| 1231 | ;*********************************************************************************************** | ||
| 1232 | invoke CALL_IFS ;AN000; | ||
| 1233 | ;*********************************************************************************************** | ||
| 1234 | |||
| 1235 | JNC AS_440 ;AN000; | ||
| 1236 | ;AN000; | ||
| 1237 | ;AN000; | ||
| 1238 | TEST IFSPROC_FLAGS,ISCDS ; ifs error: ;AN000; | ||
| 1239 | JZ AS_420 ;AN000; | ||
| 1240 | RestoreReg <DS,SI,DS,SI> ; pop dummy & real cds ;AN000; | ||
| 1241 | transfer ifs_980 ;AN000; | ||
| 1242 | AS_420: ;AN000; | ||
| 1243 | SaveReg <AX> ; preserve error code ;AN027; | ||
| 1244 | invoke DELETE_DFL_ENTRY ;AN000; | ||
| 1245 | invoke CONSIST_SFT ;AN025; | ||
| 1246 | RestoreReg <AX> ;AN027; | ||
| 1247 | transfer ifs_980 ;AN000; | ||
| 1248 | ;AN000; | ||
| 1249 | AS_440: ; successful attach ;AN000; | ||
| 1250 | TEST IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1251 | JZ AS_460 ;AN000; | ||
| 1252 | RestoreReg <DI,ES> ; restore ES:DI -> dummy cds ;AN000; | ||
| 1253 | invoke CD_TO_CDS ;AN000; | ||
| 1254 | RestoreReg <SI,DS> ; ds:si - real cds ;AN000; | ||
| 1255 | invoke XCHGP ;AN000; | ||
| 1256 | MOV CX,SIZE CURDIR_LIST ;AN000; | ||
| 1257 | OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; make sure this flag set ;AN000; | ||
| 1258 | REP MOVSB ;AN000; | ||
| 1259 | transfer ifs_990 ;AN000; | ||
| 1260 | ;AN000; | ||
| 1261 | AS_460: ;AN000; | ||
| 1262 | invoke DF_TO_DFL ;AN000; | ||
| 1263 | invoke CONSIST_SFT ;AN025; | ||
| 1264 | transfer ifs_990 ;AN000; | ||
| 1265 | ;AN000; | ||
| 1266 | ;AN000; | ||
| 1267 | EndProc ATTACH_START ;AN000; | ||
| 1268 | ;AN000; | ||
| 1269 | ;AN000; | ||
| 1270 | BREAK <ATTACH_END -- break attachment> ;AN000; | ||
| 1271 | ;AN000; | ||
| 1272 | ;************************************************************************************ ;AN000; | ||
| 1273 | ; ;AN000; | ||
| 1274 | ; ATTACH_END ;AN000; | ||
| 1275 | ; ;AN000; | ||
| 1276 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 1277 | ; ;AN000; | ||
| 1278 | ; Routines called: DFL_MATCH DOS: StrCpy ;AN000; | ||
| 1279 | ; DFL_TO_DF DriveFromText ;AN000; | ||
| 1280 | ; DF_TO_DFL GetThisDrv ;AN000; | ||
| 1281 | ; CDS_TO_CD InitCDS ;AN000; | ||
| 1282 | ; CD_TO_CDS ;AN000; | ||
| 1283 | ; SET_EXTERR_INFO ;AN000; | ||
| 1284 | ; CALL_IFS ;AN000; | ||
| 1285 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 1286 | ; ;AN000; | ||
| 1287 | ; Inputs: ;AN000; | ||
| 1288 | ; DS:SI -> ASCIZ source name ;AN000; | ||
| 1289 | ; Function: ;AN000; | ||
| 1290 | ; Prep IFSRH: ;AN000; | ||
| 1291 | ; * IFSR_LENGTH DW 30 ; Request length ;AN000; | ||
| 1292 | ; * IFSR_FUNCTION DB 4 ; End Attach ;AN000; | ||
| 1293 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 1294 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 1295 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 1296 | ; * IFSR_DEVICE_CB@ DD ? ; CD or DF ;AN000; | ||
| 1297 | ; * IFSR_NAME@ DD ? ; for deviceless detach (unc) ;AN000; | ||
| 1298 | ; ;AN000; | ||
| 1299 | ; ;AN000; | ||
| 1300 | ;************************************************************************************ ;AN000; | ||
| 1301 | ;AN000; | ||
| 1302 | Procedure ATTACH_END,NEAR ;AN000; | ||
| 1303 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1304 | ;AN000; | ||
| 1305 | ifsr_fcn_def ATTEND ;AN000; | ||
| 1306 | ;AN000; | ||
| 1307 | POP BX ;AN000; | ||
| 1308 | ;AN000; | ||
| 1309 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1310 | MOV CS:IFSPROC_FLAGS,0 ;AN000; | ||
| 1311 | invoke PREP_IFSR ;AN000; | ||
| 1312 | ;AN000; | ||
| 1313 | PUSH DS ;AN000; | ||
| 1314 | POP ES ;AN000; | ||
| 1315 | MOV DI,SI ; ES:DI=DS:SI=source name ;AN000; | ||
| 1316 | PUSH SI ; Save SI ;AN000; | ||
| 1317 | CallInstall StrCpy,multDOS,17 ; "Beautify" input string ;AN000; | ||
| 1318 | ; (converts to uppercase & ;AN000; | ||
| 1319 | ; / to \) ;AN000; | ||
| 1320 | POP SI ; Recover string pointer ;AN000; | ||
| 1321 | CMP WORD PTR [SI],"\\" ; Special Case - ;AN000; | ||
| 1322 | JZ AE_300 ; deviceless detach ;AN000; | ||
| 1323 | CMP WORD PTR [SI+1],":" ; check for drive ;AN000; | ||
| 1324 | JNZ AE_200 ; no, go to device check ;AN000; | ||
| 1325 | CMP fAssign,-1 ; BREAK DRIVE ATTACH ;AN000; | ||
| 1326 | JZ AE_20 ;AN000; | ||
| 1327 | AE_10: ;AN000; | ||
| 1328 | MOV AX,72 ; pause error ;AN000; | ||
| 1329 | PUSH CS ;AN000; | ||
| 1330 | POP DS ;AN000; | ||
| 1331 | ASSUME DS:IFSSEG ;AN000; | ||
| 1332 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1333 | transfer ifs_980 ;AN000; | ||
| 1334 | AE_20: ;AN000; | ||
| 1335 | CallInstall DriveFromText,multDOS,26 ; AL = drive # (0-not drive ;AN000; | ||
| 1336 | context DS ; -1=a,1=b,2=c,...) ;AN000; | ||
| 1337 | CallInstall GetThisDrv,multDOS,25,AX,BX ; ES:DI->CDS ;AN000; | ||
| 1338 | JNC AE_40 ;AN000; | ||
| 1339 | MOV AX,error_invalid_drive ;AN000; | ||
| 1340 | transfer ifs_1000 ;AN000; | ||
| 1341 | AE_40: ;AN000; | ||
| 1342 | LES DI,[THISCDS] ;AN000; | ||
| 1343 | TEST ES:[DI.curdir_flags],curdir_isnet ;AN000; | ||
| 1344 | JNZ AE_60 ;AN000; | ||
| 1345 | MOV AX,error_invalid_drive ; not redirected ;AN000; | ||
| 1346 | transfer ifs_980 ;AN000; | ||
| 1347 | AE_60: ;AN000; | ||
| 1348 | PUSH AX ; drive # ;AN000; | ||
| 1349 | PUSH ES ;AN000; | ||
| 1350 | POP DS ;AN000; | ||
| 1351 | MOV SI,DI ; move cds ptr to ds:si ;AN000; | ||
| 1352 | invoke CDS_TO_CD ;AN000; | ||
| 1353 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1354 | JMP SHORT AE_400 ;AN000; | ||
| 1355 | ;AN000; | ||
| 1356 | AE_200: ; BREAK DEVICE ATTACH ;AN000; | ||
| 1357 | CMP fPrint,-1 ; check for pause error ;AN000; | ||
| 1358 | JZ AE_210 ;AN000; | ||
| 1359 | JMP AE_10 ;AN000; | ||
| 1360 | AE_210: ;AN000; | ||
| 1361 | CALL DFL_MATCH ;AN000; | ||
| 1362 | JNC AE_220 ;AN000; | ||
| 1363 | MOV AX,device_not_attached ;AN000; | ||
| 1364 | transfer ifs_1000 ;AN000; | ||
| 1365 | AE_220: ;AN000; | ||
| 1366 | MOV SI,WORD PTR [THISDFL] ;AN000; | ||
| 1367 | MOV DS,WORD PTR [THISDFL+2] ;AN000; | ||
| 1368 | ;AN000; | ||
| 1369 | TEST DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000; | ||
| 1370 | ; ???????????? check with baf on what reverting to ... ;AN000; | ||
| 1371 | ;AN000; | ||
| 1372 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; | ||
| 1373 | ; ES:BX -> IFSRH ;AN000; | ||
| 1374 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1375 | ; ds - IFSSEG ;AN000; | ||
| 1376 | JMP SHORT AE_400 ;AN000; | ||
| 1377 | ;AN000; | ||
| 1378 | AE_300: ; deviceless detach ;AN000; | ||
| 1379 | SaveReg <CS> ; restore es to ifsr & set seq flag ;AN018; | ||
| 1380 | RestoreReg <ES> ;AN018; | ||
| 1381 | OR CS:IFSPROC_FLAGS,IsSeq ;AN018; | ||
| 1382 | CMP fAssign,-1 ;AN000; | ||
| 1383 | JZ AE_320 ;AN000; | ||
| 1384 | JMP AE_10 ; jump to pause error ;AN000; | ||
| 1385 | AE_320: ;AN000; | ||
| 1386 | SaveReg <ES,BX,DS> ; ifsr ptr ;AC004; | ||
| 1387 | RestoreReg <ES> ; set esdi = dssi = net path ;AC004; | ||
| 1388 | ASSUME ES:NOTHING ;AC004; | ||
| 1389 | MOV DI,SI ;AC004; | ||
| 1390 | invoke NET_TRANS ;AC004; | ||
| 1391 | SaveReg <ES> ;AC004; | ||
| 1392 | RestoreReg <AX> ; name string segment ;AC004; | ||
| 1393 | MOV SI,DI ; name string offset ;AC004; | ||
| 1394 | RestoreReg <BX,ES> ; ifsr pointer ;AC004; | ||
| 1395 | ASSUME ES:IFSSEG ;AC004; | ||
| 1396 | MOV WORD PTR ES:[BX.IFSR_NAME@],DI ;AC004; | ||
| 1397 | MOV WORD PTR ES:[BX.IFSR_NAME@+2],AX ;AC004; | ||
| 1398 | SaveReg <CS> ;AC004; | ||
| 1399 | RestoreReg <DS> ;AN000; | ||
| 1400 | ASSUME DS:IFSSEG ;AN000; | ||
| 1401 | ;AN000; | ||
| 1402 | AE_400: ; call ifs ;AN000; | ||
| 1403 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTEND ;AN000; | ||
| 1404 | MOV ES:[BX.IFSR_FUNCTION],IFSATTEND ;AN000; | ||
| 1405 | ;AN000; | ||
| 1406 | ;*********************************************************************************************** | ||
| 1407 | invoke CALL_IFS ;AN000; | ||
| 1408 | ;*********************************************************************************************** | ||
| 1409 | ;AN000; | ||
| 1410 | JNC AE_410 ;AN000; | ||
| 1411 | TEST IFSPROC_FLAGS,ISCDS ; att end error: ;AN000; | ||
| 1412 | JZ AE_405 ;AN000; | ||
| 1413 | ADD SP,2 ; clear ax (drive #) off stack ;AN000; | ||
| 1414 | AE_405: ;AN000; | ||
| 1415 | transfer ifs_980 ;AN000; | ||
| 1416 | AE_410: ;AN000; | ||
| 1417 | TEST CS:IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1418 | JZ AE_420 ;AN000; | ||
| 1419 | ;AN000; | ||
| 1420 | POP AX ; drive ;AN000; | ||
| 1421 | ADD AL,'A' ;AN000; | ||
| 1422 | CallInstall InitCDS,multDOS,31,AX,AX ;AN000; | ||
| 1423 | transfer ifs_990 ;AN000; | ||
| 1424 | AE_420: ;AN000; | ||
| 1425 | TEST CS:IFSPROC_FLAGS,IsSeq ;AN018; | ||
| 1426 | JNZ AE_440 ;AN018; | ||
| 1427 | CALL DELETE_DFL_ENTRY ;AN000; | ||
| 1428 | AE_440: ;AN018; | ||
| 1429 | transfer ifs_990 ;AN000; | ||
| 1430 | ;AN000; | ||
| 1431 | ;AN000; | ||
| 1432 | EndProc ATTACH_END ;AN000; | ||
| 1433 | ;AN000; | ||
| 1434 | |||
| 1435 | BREAK <IFS_RESET_ENVIRONMENT -- reset IFS environment> ;AN016; | ||
| 1436 | |||
| 1437 | ;*********************************************************************************** | ||
| 1438 | ; | ||
| 1439 | ; IFS_RESET_ENVIRONMENT | ||
| 1440 | ; | ||
| 1441 | ; Called by: IFSFUNC Dispatcher | ||
| 1442 | ; | ||
| 1443 | ; Routines called: | ||
| 1444 | ; jumps into ifs_abort | ||
| 1445 | ; | ||
| 1446 | ; Inputs: | ||
| 1447 | ; [CurrentPDB] set to PID of process aborting | ||
| 1448 | ; | ||
| 1449 | ; Function: | ||
| 1450 | ; Get address of IFS driver chain. | ||
| 1451 | ; FOR I = 1 to last IFS driver | ||
| 1452 | ; Send request below to IFS driver | ||
| 1453 | ; | ||
| 1454 | ; IFSRH: | ||
| 1455 | ; * IFSR_LENGTH DW 42 ; Request length | ||
| 1456 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1457 | ; IFSR_RETCODE DW ? | ||
| 1458 | ; IFSR_RETCLASS DB ? | ||
| 1459 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1460 | ; * IFSR_APIFUNC DB 18 ; End of Process | ||
| 1461 | ; IFSR_ERROR_CLASS DB ? | ||
| 1462 | ; IFSR_ERROR_ACTION DB ? | ||
| 1463 | ; IFSR_ERROR_LOCUS DB ? | ||
| 1464 | ; IFSR_ALLOWED DB ? | ||
| 1465 | ; IFSR_I24_RETRY DB ? | ||
| 1466 | ; IFSR_I24_RESP DB ? | ||
| 1467 | ; IFSR_RESV2 DB ? | ||
| 1468 | ; IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1469 | ; IFSR_OPEN_CB@ DD ? | ||
| 1470 | ; * IFSR_PID DW ? ; process ID | ||
| 1471 | ; * IFSR_SUBFUNC DB 2 ; 0=normal exit 1=abort exit | ||
| 1472 | ; ; 2=reset environment | ||
| 1473 | ; IFSR_RESV3 DB ? | ||
| 1474 | ; | ||
| 1475 | ; Call all IFSs with this info. | ||
| 1476 | ; Scan through SFTFCB | ||
| 1477 | ; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN | ||
| 1478 | ; Call SF_IFS_HDR with close request | ||
| 1479 | ; ENDIF | ||
| 1480 | ; | ||
| 1481 | ; Outputs: None | ||
| 1482 | ; DS Preserved, All others destroyed | ||
| 1483 | ; | ||
| 1484 | ;************************************************************************************ | ||
| 1485 | |||
| 1486 | procedure IFS_RESET_ENVIRONMENT,NEAR ;AN016; | ||
| 1487 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN016; | ||
| 1488 | |||
| 1489 | ifsr_fcn_def EXECAPI ;AN016; | ||
| 1490 | ifsr_api_def EOP ;AN016; | ||
| 1491 | |||
| 1492 | MOV CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; | ||
| 1493 | Context DS ; make sure ds=ss=dosgroup ;AN016; | ||
| 1494 | JMP IA_70 ;AN016; | ||
| 1495 | |||
| 1496 | EndProc IFS_RESET_ENVIRONMENT ;AN016; | ||
| 1497 | |||
| 1498 | |||
| 1499 | BREAK <IFS_ABORT -- Send CLOSE all files for process> ;AN016; | ||
| 1500 | ;AN016; | ||
| 1501 | ;************************************************************************************ | ||
| 1502 | ; | ||
| 1503 | ; IFS_ABORT | ||
| 1504 | ; | ||
| 1505 | ; Called by: IFSFUNC Dispatcher | ||
| 1506 | ; | ||
| 1507 | ; Routines called: | ||
| 1508 | ; CALL_IFS | ||
| 1509 | ; IFS_CLOSE | ||
| 1510 | ; | ||
| 1511 | ; Inputs: | ||
| 1512 | ; [CurrentPDB] set to PID of process aborting | ||
| 1513 | ; | ||
| 1514 | ; Function: | ||
| 1515 | ; Get address of IFS driver chain. | ||
| 1516 | ; FOR I = 1 to last IFS driver | ||
| 1517 | ; Send request below to IFS driver | ||
| 1518 | ; | ||
| 1519 | ; IFSRH: | ||
| 1520 | ; * IFSR_LENGTH DW 42 ; Request length | ||
| 1521 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1522 | ; IFSR_RETCODE DW ? | ||
| 1523 | ; IFSR_RETCLASS DB ? | ||
| 1524 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1525 | ; * IFSR_APIFUNC DB 18 ; End of Process | ||
| 1526 | ; IFSR_ERROR_CLASS DB ? | ||
| 1527 | ; IFSR_ERROR_ACTION DB ? | ||
| 1528 | ; IFSR_ERROR_LOCUS DB ? | ||
| 1529 | ; IFSR_ALLOWED DB ? | ||
| 1530 | ; IFSR_I24_RETRY DB ? | ||
| 1531 | ; IFSR_I24_RESP DB ? | ||
| 1532 | ; IFSR_RESV2 DB ? | ||
| 1533 | ; IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1534 | ; IFSR_OPEN_CB@ DD ? | ||
| 1535 | ; * IFSR_PID DW ? ; process ID | ||
| 1536 | ; * IFSR_SUBFUNC DB ? ; 0=normal exit 1=abort exit | ||
| 1537 | ; ; 2=reset environment | ||
| 1538 | ; IFSR_RESV3 DB ? | ||
| 1539 | ; | ||
| 1540 | ; Call all IFSs with this info. | ||
| 1541 | ; Scan through SFTFCB | ||
| 1542 | ; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN | ||
| 1543 | ; Call SF_IFS_HDR with close request | ||
| 1544 | ; ENDIF | ||
| 1545 | ; | ||
| 1546 | ; Outputs: None | ||
| 1547 | ; DS Preserved, All others destroyed | ||
| 1548 | ; | ||
| 1549 | ;************************************************************************************ | ||
| 1550 | |||
| 1551 | procedure IFS_ABORT,NEAR ;AN000; | ||
| 1552 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1553 | ;AN000; | ||
| 1554 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 1555 | ifsr_api_def EOP ;AN000; | ||
| 1556 | |||
| 1557 | MOV CS:IFSPROC_FLAGS,ZERO | ||
| 1558 | ;AN000; | ||
| 1559 | ; Scan the FCB Cache and close any NET FCBs ;AN000; | ||
| 1560 | ; belonging to this process. The reason we must do this is that ;AN000; | ||
| 1561 | ; NET FCBs are well behaved and must be closed on EXIT. ;AN000; | ||
| 1562 | ;AN000; | ||
| 1563 | LES DI,[SFTFCB] ;AN000; | ||
| 1564 | MOV CX,ES:[DI].sfCount ;AN000; | ||
| 1565 | LEA DI,[DI].sfTable ;AN000; | ||
| 1566 | JCXZ IA_70 ;AN000; | ||
| 1567 | IA_20: ; Loop through sftfcb's ;AN000; | ||
| 1568 | CMP ES:[DI].sf_ref_count,0 ;AN000; | ||
| 1569 | JZ IA_60 ; Ignore Free ones ;AN000; | ||
| 1570 | CMP ES:[DI].sf_ref_count,sf_busy ;AN000; | ||
| 1571 | JZ IA_60 ; Ignore busy ones ;AN000; | ||
| 1572 | TEST ES:[DI].sf_flags,sf_isnet ;AN000; | ||
| 1573 | JZ IA_60 ; Ignore non NET ones ;AN000; | ||
| 1574 | MOV AX,[CurrentPDB] ;AN000; | ||
| 1575 | CMP AX,ES:[DI].sf_PID ;AN000; | ||
| 1576 | JNZ IA_60 ; Ignore FCBs not for this proc ;AN000; | ||
| 1577 | MOV WORD PTR [THISSFT],DI ;AN000; | ||
| 1578 | MOV WORD PTR [THISSFT+2],ES ;AN000; | ||
| 1579 | PUSH CX ;AN000; | ||
| 1580 | IA_40: ; CLOSE ;AN000; | ||
| 1581 | invoke IFS_CLOSE ; IGNORE ANY ERRORS ON THIS. ;AN000; | ||
| 1582 | CMP ES:[DI].sf_ref_count,0 ; Make sure it gets closed ;AN000; | ||
| 1583 | JNE IA_40 ; Loop until closed ;AN000; | ||
| 1584 | POP CX ;AN000; | ||
| 1585 | IA_60: ;AN000; | ||
| 1586 | ADD DI,size sf_entry ;AN000; | ||
| 1587 | LOOP IA_20 ;AN000; | ||
| 1588 | ; ;AN000; | ||
| 1589 | ; Now loop through all ifs drivers with end of process request ;AN000; | ||
| 1590 | ; ;AN000; | ||
| 1591 | IA_70: ;AN000; | ||
| 1592 | LDS SI,IFS_HEADER ;AN000; | ||
| 1593 | ASSUME DS:NOTHING ;AN000; | ||
| 1594 | JMP SHORT IA_100 ; go check if null ;AN007; | ||
| 1595 | ;AN000; | ||
| 1596 | IA_80: ;AN000; | ||
| 1597 | MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000; | ||
| 1598 | MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000; | ||
| 1599 | invoke PREP_IFSR ; sets esbx -> ifsrh ;AN000; | ||
| 1600 | MOV ES:[BX.IFSR_LENGTH],LENGTH_EOP ;AN000; | ||
| 1601 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1602 | MOV ES:[BX.IFSR_APIFUNC],IFSEOP ;AN000; | ||
| 1603 | MOV AX,[CurrentPDB] ;AN000; | ||
| 1604 | MOV ES:[BX.IFSR_PID],AX ; ????? ;AN000; | ||
| 1605 | MOV AL,[EXIT_TYPE] ;AN000; | ||
| 1606 | MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; | ||
| 1607 | TEST CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; | ||
| 1608 | JZ IA_90 ;AN016; | ||
| 1609 | MOV ES:[BX.IFSR_SUBFUNC],RESET_ENVIRONMENT ;AN016; | ||
| 1610 | IA_90: ;AN016; | ||
| 1611 | SaveReg <DS,SI,CS> ; dssi - ifs driver ;AC012; | ||
| 1612 | RestoreReg <DS> ; ds - ifsseg ;AN000; | ||
| 1613 | ;AN000; | ||
| 1614 | ;*********************************************************************************************** | ||
| 1615 | invoke CALL_IFS ;AN000; | ||
| 1616 | ;*********************************************************************************************** | ||
| 1617 | ;AN000; | ||
| 1618 | RestoreReg <SI,DS> ; dssi - ifs driver ;AC012; | ||
| 1619 | LDS SI,[SI.IFS_NEXT] ; check next fs driver ;AN000; | ||
| 1620 | IA_100: ;AN007; | ||
| 1621 | CMP SI,NULL_PTR ; if ptr null, no more ;AN000; | ||
| 1622 | JNE IA_80 ;AN000; | ||
| 1623 | PUSH DS ;AN000; | ||
| 1624 | POP AX ;AN000; | ||
| 1625 | CMP AX,NULL_PTR ;AN000; | ||
| 1626 | JNE IA_80 ;AN000; | ||
| 1627 | ;AN000; | ||
| 1628 | ;AN000; | ||
| 1629 | IA_1000: ;AN000; | ||
| 1630 | SaveReg <SS> ; dosgroup ;AN000; | ||
| 1631 | RestoreReg <DS> ;AN000; | ||
| 1632 | return ;????????? may need redir ioctl to ;AN000; | ||
| 1633 | ; consist_refs ;AN000; | ||
| 1634 | ;AN000; | ||
| 1635 | EndProc IFS_ABORT ;AN000; | ||
| 1636 | ;AN000; | ||
| 1637 | ;AN000; | ||
| 1638 | BREAK <GET_IFS_DRIVER_NAME -- get IFS driver name> ;AN000; | ||
| 1639 | ;AN000; | ||
| 1640 | ;************************************************************************************ ;AN000; | ||
| 1641 | ; ;AN000; | ||
| 1642 | ; GET_IFS_DRIVER_NAME ;AN000; | ||
| 1643 | ; ;AN000; | ||
| 1644 | ; Called by: GET_IFSFUNC_ITEM ;AN000; | ||
| 1645 | ; ;AN000; | ||
| 1646 | ; Routines called: ;AN000; | ||
| 1647 | ; ;AN000; | ||
| 1648 | ; Inputs: ;AN000; | ||
| 1649 | ; DS:SI -> CDS/DFL ;AN000; | ||
| 1650 | ; ES:DI = buffer to place name ;AN000; | ||
| 1651 | ; Function: ;AN000; | ||
| 1652 | ; Find FS name in IFS header pointed to by CDS or DFL ;AN000; | ||
| 1653 | ; Place name in buffer pointed to by ES:DI ;AN000; | ||
| 1654 | ; Output: ;AN000; | ||
| 1655 | ; buffer filled, hopefully with ifs name ;AN000; | ||
| 1656 | ; pointer not checked for valid ifs driver hdr ptr ;AN000; | ||
| 1657 | ; Regs: all preserved ;AN000; | ||
| 1658 | ; ;AN000; | ||
| 1659 | ;************************************************************************************ ;AN000; | ||
| 1660 | ;AN000; | ||
| 1661 | Procedure GET_IFS_DRIVER_NAME,NEAR ;AN000; | ||
| 1662 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1663 | ;AN000; | ||
| 1664 | SaveReg <DS,SI,CX,DI> ; preserve cds/dfl ptr, cx, buffer ;AN000; | ||
| 1665 | ; offset ;AN000; | ||
| 1666 | TEST CS:IFSPROC_FLAGS,ISCDS ; get ifs hdr ptr from ;AN000; | ||
| 1667 | JZ GIDN_20 ;AN000; | ||
| 1668 | LDS SI,[SI.CURDIR_IFS_HDR] ; cds ;AN000; | ||
| 1669 | JMP GIDN_40 ;AN000; | ||
| 1670 | GIDN_20: ;AN000; | ||
| 1671 | LDS SI,[SI.DFLL_IFS_HDR] ; dfl ;AN000; | ||
| 1672 | GIDN_40: ;AN000; | ||
| 1673 | invoke MOVE_DRIVER_NAME ; move ifs driver name into buffer ;AN000; | ||
| 1674 | ;AN000; | ||
| 1675 | RestoreReg <DI,CX,SI,DS> ; restore cds/dfl ptr, cx, buffer ;AN000; | ||
| 1676 | ; offset ;AN000; | ||
| 1677 | return ;AN000; | ||
| 1678 | ;AN000; | ||
| 1679 | EndProc GET_IFS_DRIVER_NAME ;AN000; | ||
| 1680 | ;AN000; | ||
| 1681 | BREAK <FIND_IFS_DRIVER -- get IFS driver> ;AN000; | ||
| 1682 | ;AN000; | ||
| 1683 | ;************************************************************************************ | ||
| 1684 | ; | ||
| 1685 | ; FIND_IFS_DRIVER | ||
| 1686 | ; | ||
| 1687 | ; Called by: ATTACH_START | ||
| 1688 | ; | ||
| 1689 | ; Routines called: CHECK_END_SPACE | ||
| 1690 | ; | ||
| 1691 | ; Inputs: | ||
| 1692 | ; ES:DI -> IFS driver name | ||
| 1693 | ; Function: | ||
| 1694 | ; Loop through IFS driver chain until name match. | ||
| 1695 | ; If match found - set [THISIFS] and clear carry | ||
| 1696 | ; Else set carry. | ||
| 1697 | ; Output: | ||
| 1698 | ; carry clear - match found,[THISIFS] set | ||
| 1699 | ; carry set - no match found | ||
| 1700 | ; | ||
| 1701 | ; Regs: all but ax preserved | ||
| 1702 | ; | ||
| 1703 | ;************************************************************************************ | ||
| 1704 | ;AN000; | ||
| 1705 | Procedure FIND_IFS_DRIVER ;AN000; | ||
| 1706 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1707 | ;AN000; | ||
| 1708 | SaveReg <DS,SI,BX,ES,DI> ; save registers (except ax for error) ;AC026; | ||
| 1709 | ;AN000; | ||
| 1710 | TEST CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ; check for no drivers first ;AN024; | ||
| 1711 | JZ FID_10 ;AN024; | ||
| 1712 | JMP FID_30 ;AN024; | ||
| 1713 | FID_10: ;AN024; | ||
| 1714 | |||
| 1715 | SaveReg <SS> ; get addressability to dosgroup ;AN000; | ||
| 1716 | RestoreReg <DS> ; to get ifs driver chain ;AN000; | ||
| 1717 | LDS SI,IFS_HEADER ;AN000; | ||
| 1718 | ASSUME DS:NOTHING ; ds:si -> 1st ifs driver ;AN000; | ||
| 1719 | ;AN000; | ||
| 1720 | FID_20: ;AN000; | ||
| 1721 | SaveReg <DS,SI,ES,DI,CS> ; save ds,si,es,di ;AN000; | ||
| 1722 | RestoreReg <ES> ; set es=cs ;AN000; | ||
| 1723 | ASSUME ES:IFSSEG ;AN000; | ||
| 1724 | MOV DI,OFFSET TEMPBUF ; move ifs driver name into tempbuf ;AN000; | ||
| 1725 | SaveReg <SI,DI> ; so that can be asciiz form before ;AN000; | ||
| 1726 | invoke MOVE_DRIVER_NAME ; strcmp ;AN000; | ||
| 1727 | RestoreReg <SI,DI> ; dssi -> tempbuf (ifs driver asciiz ;AN000; | ||
| 1728 | SaveReg <ES> ; name) ;AN000; | ||
| 1729 | RestoreReg <DS,DI,ES> ; esdi -> ifs driver name (input) ;AN000; | ||
| 1730 | CALL CHECK_END_SPACE ; make sure ^ has no blanks ;AN000; | ||
| 1731 | |||
| 1732 | CallInstall StrCmp,multDOS,30 ; check for match (regs preserved) ;AN000; | ||
| 1733 | RestoreReg <SI,DS> ; (ifs driver) ;AN000; | ||
| 1734 | JZ FID_40 ; if match, go set thisifs & return ;AN000; | ||
| 1735 | LDS SI,[SI.IFS_NEXT] ; else check next fs driver ;AN000; | ||
| 1736 | CMP SI,MINUS_ONE ; if ptr null, no more = error ;AN000; | ||
| 1737 | JNE FID_20 ;AN000; | ||
| 1738 | PUSH DS ;AN000; | ||
| 1739 | POP AX ;AN000; | ||
| 1740 | CMP AX,MINUS_ONE ;AN000; | ||
| 1741 | JNE FID_20 ;AN000; | ||
| 1742 | FID_30: ;AN024; | ||
| 1743 | MOV AX,fs_driver_not_found ;AN000; | ||
| 1744 | JMP SHORT FID_980 ;AN000; | ||
| 1745 | FID_40: ;AN000; | ||
| 1746 | MOV WORD PTR CS:[THISIFS],SI ; match. Set [THISIFS] to this ;AN000; | ||
| 1747 | MOV WORD PTR CS:[THISIFS+2],DS ; driver ;AN000; | ||
| 1748 | JMP FID_990 ;AN000; | ||
| 1749 | ;AN000; | ||
| 1750 | ;AN000; | ||
| 1751 | FID_980: ; Return area ;AN000; | ||
| 1752 | STC ;AN000; | ||
| 1753 | JMP SHORT FID_1000 ;AN000; | ||
| 1754 | FID_990: ;AN000; | ||
| 1755 | CLC ;AN000; | ||
| 1756 | FID_1000: ;AN000; | ||
| 1757 | RestoreReg <DI,ES,BX,SI,DS> ; restore registers ;AC026; | ||
| 1758 | return ;AN000; | ||
| 1759 | ;AN000; | ||
| 1760 | EndProc FIND_IFS_DRIVER ;AN000; | ||
| 1761 | ;AN000; | ||
| 1762 | ;AN000; | ||
| 1763 | BREAK <ASSIGN_MODE_FUNCTIONS -- drive/print on/off> ;AN000; | ||
| 1764 | ;AN000; | ||
| 1765 | ;************************************************************************************ ;AN000; | ||
| 1766 | ; ;AN000; | ||
| 1767 | ; AssignOn/AssignOff ;AN000; | ||
| 1768 | ; ;AN000; | ||
| 1769 | ; Called by: SET_ASSIGN_MODE ;AN000; | ||
| 1770 | ; ;AN000; | ||
| 1771 | ; AssignOn and AssignOFF copied from Network Redirector code ;AN000; | ||
| 1772 | ; PrintOn and PrintOff IFSFUNC new code ;AN000; | ||
| 1773 | ; ;AN000; | ||
| 1774 | ; Inputs: ;AN000; | ||
| 1775 | ; ;AN000; | ||
| 1776 | ; Function: ;AN000; | ||
| 1777 | ; ;AN000; | ||
| 1778 | ; Output: ;AN000; | ||
| 1779 | ; ;AN000; | ||
| 1780 | ; Regs: none preserved ;AN000; | ||
| 1781 | ; ;AN000; | ||
| 1782 | ;************************************************************************************ ;AN000; | ||
| 1783 | ;AN000; | ||
| 1784 | Procedure AssignOn,Near ;AN000; | ||
| 1785 | ASSUME ES:NOTHING, DS:NOTHING ;AN000; | ||
| 1786 | EnterCrit CritNet ;AN000; | ||
| 1787 | CMP fAssign,-1 ; if (fAssign) ;AN000; | ||
| 1788 | JZ CrLvA ; return; ;AN000; | ||
| 1789 | MOV fAssign,-1 ; fAssign = TRUE; ;AN000; | ||
| 1790 | LDS SI,CDSAlt ; s = CDSAlt; ;AN000; | ||
| 1791 | LES DI,CDSAddr ; d = CDSAddr; ;AN000; | ||
| 1792 | MOV AL,CDSCount ;AN000; | ||
| 1793 | MOV DX,SIZE curdir_list ;AN000; | ||
| 1794 | OnLoop: ;AN000; | ||
| 1795 | TEST [SI].curdir_flags,curdir_isnet ;AN000; | ||
| 1796 | JNZ RestCDS ; Restore this NET guy ;AN000; | ||
| 1797 | ADD SI,DX ; Skip to next CDS ;AN000; | ||
| 1798 | ADD DI,DX ;AN000; | ||
| 1799 | NextCDS: ;AN000; | ||
| 1800 | DEC AL ;AN000; | ||
| 1801 | JNZ OnLoop ;AN000; | ||
| 1802 | CrLvA: ;AN000; | ||
| 1803 | LeaveCrit CritNet ;AN000; | ||
| 1804 | return ;AN000; | ||
| 1805 | ;AN000; | ||
| 1806 | RestCDS: ;AN000; | ||
| 1807 | MOV CX,DX ;AN000; | ||
| 1808 | REP MOVSB ; strcpy (d, s); ;AN000; | ||
| 1809 | JMP NextCDS ;AN000; | ||
| 1810 | EndProc AssignOn ;AN000; | ||
| 1811 | ;AN000; | ||
| 1812 | Procedure AssignOff,Near ;AN000; | ||
| 1813 | ASSUME ES:NOTHING, DS:NOTHING ;AN000; | ||
| 1814 | EnterCrit CritNet ;AN000; | ||
| 1815 | CMP fAssign,0 ; if (!fAssign) ;AN000; | ||
| 1816 | JZ CrLvB ; return; ;AN000; | ||
| 1817 | LES DI,CDSAlt ; d = CDSAlt; ;AN000; | ||
| 1818 | LDS SI,CDSAddr ; s = CDSAddr; ;AN000; | ||
| 1819 | MOV AL,CDSCount ;AN000; | ||
| 1820 | CBW ; always less or = 26 ;AN000; | ||
| 1821 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1822 | MUL CX ;AN000; | ||
| 1823 | MOV CX,AX ;AN000; | ||
| 1824 | REP MOVSB ; Save current CDS state ;AN000; | ||
| 1825 | XOR AL,AL ;AN000; | ||
| 1826 | OffLoop: ; for (i=0; p1=getcds(i); i++) ;AN000; | ||
| 1827 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ; Set THISCDS for possible ;AN000; | ||
| 1828 | ; call to InitCDS ;AN000; | ||
| 1829 | JC OffDone ; ;AN000; | ||
| 1830 | TEST [SI].curdir_flags,curdir_isnet ;AN000; | ||
| 1831 | JZ OffInc ;AN000; | ||
| 1832 | SaveReg <AX> ;AN000; | ||
| 1833 | ADD AX,'A' ;AN000; | ||
| 1834 | CallInstall InitCDS,multDOS,31,AX,AX ; initcds (p1); ;AN000; | ||
| 1835 | RestoreReg <AX> ;AN000; | ||
| 1836 | OffInc: INC AL ;AN000; | ||
| 1837 | JMP OffLoop ;AN000; | ||
| 1838 | ;AN000; | ||
| 1839 | OffDone: ;AN000; | ||
| 1840 | MOV fAssign,0 ; fAssign = FALSE; ;AN000; | ||
| 1841 | CrLvB: ;AN000; | ||
| 1842 | LeaveCrit CritNet ;AN000; | ||
| 1843 | return ;AN000; | ||
| 1844 | EndProc AssignOff ;AN000; | ||
| 1845 | ;AN000; | ||
| 1846 | ;****************************************************************************** ;AN000; | ||
| 1847 | ; ;AN000; | ||
| 1848 | ; PrintOn/PrintOff ;AN000; | ||
| 1849 | ; ;AN000; | ||
| 1850 | ; Called by: SET_ASSIGN_MODE ;AN000; | ||
| 1851 | ; ;AN000; | ||
| 1852 | ; Routines called: CALL_IFS ;AN000; | ||
| 1853 | ; ;AN000; | ||
| 1854 | ; Inputs: ;AN000; | ||
| 1855 | ; ;AN000; | ||
| 1856 | ; Function: ;AN000; | ||
| 1857 | ; Print on - loop through dfl entries resetting pause flag to zero ;AN000; | ||
| 1858 | ; Print off- loop through dfl entries, set pause flag if unc ;AN000; | ||
| 1859 | ; ;AN000; | ||
| 1860 | ; Prep IFSRH: ;AN000; | ||
| 1861 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 1862 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 1863 | ; IFSR_RETCODE DB ? ;AN000; | ||
| 1864 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 1865 | ; IFSR_RESV1 DB 17 DUP(0) ;AN000; | ||
| 1866 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; | ||
| 1867 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 1868 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 1869 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 1870 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 1871 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 1872 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 1873 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 1874 | ; IFSR_DEVICE_CB@ DD ? ;AN000; | ||
| 1875 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 1876 | ; * IFSR_FUNC DB 0 ; 0 generic ioctl ;AN000; | ||
| 1877 | ; IFSR_RESV2 DB 0 ;AN000; | ||
| 1878 | ; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000; | ||
| 1879 | ; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000; | ||
| 1880 | ; * IFSR_CATEGORY DB 1 ; 1 for UNC ;AN000; | ||
| 1881 | ; * IFSR_CTLFUNC DB ? ; x - print on, y - print off ;AN000; | ||
| 1882 | ; ;AN000; | ||
| 1883 | ; ;AN000; | ||
| 1884 | ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; | ||
| 1885 | ; ;AN000; | ||
| 1886 | ; Outputs: none ;AN000; | ||
| 1887 | ; ;AN000; | ||
| 1888 | ; Regs: nothing preserved ;AN000; | ||
| 1889 | ; ;AN000; | ||
| 1890 | ;****************************************************************************** ;AN000; | ||
| 1891 | ;AN000; | ||
| 1892 | Procedure PrintOn,Near ;AN000; | ||
| 1893 | ASSUME DS:NOTHING, ES:NOTHING ;AN000; | ||
| 1894 | ;AN000; | ||
| 1895 | EnterCrit CritNet ;AN000; | ||
| 1896 | CMP fPrint,-1 ; if (fPrint) ;AN000; | ||
| 1897 | JNE PON_20 ;AN000; | ||
| 1898 | JMP POF_1000 ; return; ;AN000; | ||
| 1899 | PON_20: ;AN000; | ||
| 1900 | MOV fPrint,-1 ; fPrint = TRUE; ;AN000; | ||
| 1901 | MOV CS:IFSPROC_FLAGS,PRINT_ON ;AN000; | ||
| 1902 | JMP POF_20 ; finish in printoff routine ;AN000; | ||
| 1903 | ;AN000; | ||
| 1904 | ;AN000; | ||
| 1905 | EndProc PrintOn ;AN000; | ||
| 1906 | ;AN000; | ||
| 1907 | Procedure PrintOff,NEAR ;AN000; | ||
| 1908 | ASSUME DS:NOTHING, ES:NOTHING ;AN000; | ||
| 1909 | ;AN000; | ||
| 1910 | EnterCrit CritNet ;AN000; | ||
| 1911 | CMP fPrint,0 ; quit if already off ;AN000; | ||
| 1912 | JZ POF_1000 ; return ;AN000; | ||
| 1913 | MOV fPrint,0 ; set off ;AN000; | ||
| 1914 | MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000; | ||
| 1915 | ;AN000; | ||
| 1916 | POF_20: ; (welcome print on) ;AN000; | ||
| 1917 | PUSH CS ; get addressability to IFSSEG ;AN000; | ||
| 1918 | POP DS ;AN000; | ||
| 1919 | ASSUME DS:IFSSEG,ES:NOTHING ;AN000; | ||
| 1920 | ;AN000; | ||
| 1921 | MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000; | ||
| 1922 | XOR CH,CH ; For all unc devices, set pause ;AN000; | ||
| 1923 | XOR DH,DH ; flag ;AN000; | ||
| 1924 | MOV DL,SIZE DFLL_LIST ;AN000; | ||
| 1925 | LDS SI,[DFLAddr] ;AN000; | ||
| 1926 | POF_40: ; *** loop on setting pause flag ;AN000; | ||
| 1927 | TEST IFSPROC_FLAGS,PRINT_ON ; on print on, just reset all ;AN000; | ||
| 1928 | JNZ POF_50 ;AN000; | ||
| 1929 | LES DI,DS:[SI.DFLL_IFS_HDR] ; only set pause on unc devices ;AN000; | ||
| 1930 | OR DI,DI ; make sure this dfl taken ;AN000; | ||
| 1931 | JNZ POF_45 ;AN000; | ||
| 1932 | SaveReg <AX,ES> ;AN000; | ||
| 1933 | RestoreReg <AX> ;AN000; | ||
| 1934 | OR AX,AX ;AN000; | ||
| 1935 | RestoreReg <AX> ;AN000; | ||
| 1936 | JZ POF_60 ;AN000; | ||
| 1937 | POF_45: ;AN000; | ||
| 1938 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ;AN000; | ||
| 1939 | JZ POF_60 ;AN000; | ||
| 1940 | OR DS:[SI.DFLL_FLAGS],DFL_PAUSED ;AN000; | ||
| 1941 | JMP SHORT POF_60 ;AN000; | ||
| 1942 | POF_50: ;AN000; | ||
| 1943 | AND DS:[SI.DFLL_FLAGS],NOT DFL_PAUSED ;AN000; | ||
| 1944 | POF_60: ;AN000; | ||
| 1945 | ADD SI,DX ; prep for next dfl ;AN000; | ||
| 1946 | LOOP POF_40 ; go process next dfl ;AN000; | ||
| 1947 | ; now go tell unc, device pause ;AN000; | ||
| 1948 | ; is in effect ;AN000; | ||
| 1949 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 1950 | ;AN000; | ||
| 1951 | ifsr_fcn_def EXECAPI ; define ifsr for dep ioctl ;AN000; | ||
| 1952 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 1953 | ;AN000; | ||
| 1954 | invoke SET_DEPIOCTL_IFSR ;AN000; | ||
| 1955 | TEST IFSPROC_FLAGS,PRINT_ON ;AN000; | ||
| 1956 | JZ POF_80 ;AN000; | ||
| 1957 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_ON ;AN000; | ||
| 1958 | JMP SHORT POF_100 ;AN000; | ||
| 1959 | POF_80: ;AN000; | ||
| 1960 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_OFF ;AN000; | ||
| 1961 | POF_100: ;AN000; | ||
| 1962 | MOV ES:[BX.IFSR_CATEGORY],1 ;AN000; | ||
| 1963 | invoke SET_THISIFS_UNC ;AN000; | ||
| 1964 | |||
| 1965 | ;*********************************************************************************************** | ||
| 1966 | invoke CALL_IFS ; call ifs driver w/request ;AN000; | ||
| 1967 | ;*********************************************************************************************** | ||
| 1968 | |||
| 1969 | invoke CONSIST_SFT ;AN000; | ||
| 1970 | ;AN000; | ||
| 1971 | POF_1000: ;AN000; | ||
| 1972 | LeaveCrit CritNet ;AN000; | ||
| 1973 | return ;AN000; | ||
| 1974 | ;AN000; | ||
| 1975 | EndProc PrintOff ;AN000; | ||
| 1976 | ;AN000; | ||
| 1977 | ;AN000; | ||
| 1978 | BREAK <GET_UNC_ITEM_INFO -- resv bits, net name id, user word, max xmitt sz> ;AC000; | ||
| 1979 | |||
| 1980 | ;****************************************************************************** | ||
| 1981 | ; | ||
| 1982 | ; GET_UNC_ITEM_INFO | ||
| 1983 | ; | ||
| 1984 | ; Called by: GET_IFSFUNC_ITEM | ||
| 1985 | ; | ||
| 1986 | ; Routines called: CALL_IFS | ||
| 1987 | ; | ||
| 1988 | ; Inputs: | ||
| 1989 | ; BL = redirection index | ||
| 1990 | ; ES:DI -> Target buffer: old - net path string ;AN00 | ||
| 1991 | ; new - dw file system driver name | ||
| 1992 | ; dw # parms | ||
| 1993 | ; db parms | ||
| 1994 | ; | ||
| 1995 | ; Function: | ||
| 1996 | ; | ||
| 1997 | ; Prep IFSRH: | ||
| 1998 | ; * IFSR_LENGTH DW 48 ; Request length | ||
| 1999 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 2000 | ; IFSR_RETCODE DB ? | ||
| 2001 | ; IFSR_RETCLASS DB ? | ||
| 2002 | ; IFSR_RESV1 DB 17 DUP(0) | ||
| 2003 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL | ||
| 2004 | ; IFSR_ERROR_CLASS DB ? | ||
| 2005 | ; IFSR_ERROR_ACTION DB ? | ||
| 2006 | ; IFSR_ERROR_LOCUS DB ? | ||
| 2007 | ; IFSR_ALLOWED DB ? | ||
| 2008 | ; IFSR_I24_RETRY DB ? | ||
| 2009 | ; IFSR_I24_RESP DB ? | ||
| 2010 | ; IFSR_RESV2 DB ? | ||
| 2011 | ; IFSR_DEVICE_CB@ DD ? | ||
| 2012 | ; IFSR_OPEN_CB@ DD ? | ||
| 2013 | ; * IFSR_FUNC DB 0 ; 0 generic ioctl | ||
| 2014 | ; IFSR_RESV2 DB 0 | ||
| 2015 | ; * IFSR_BUFFER@ DD ? ; unc item info buffer | ||
| 2016 | ; IFSR_BUFSIZE DW 10 | ||
| 2017 | ; * IFSR_CATEGORY DB 1 ; 1 for UNC | ||
| 2018 | ; * IFSR_CTLFUNC DB ? ; 4 - get unc item | ||
| 2019 | ; | ||
| 2020 | ; buffer: dw index (bx) | ||
| 2021 | ; dw user word | ||
| 2022 | ; dw max xmitt size | ||
| 2023 | ; dw net name ID | ||
| 2024 | ; dw lower 8 bits lsn from ncb_list | ||
| 2025 | ; db redir reserved bits | ||
| 2026 | ; db net path...(asciiz) | ||
| 2027 | ; | ||
| 2028 | ; | ||
| 2029 | ; CALL routine, CALL_IFS, with pointer to IFS header | ||
| 2030 | ; | ||
| 2031 | ; Outputs: user stack contains info | ||
| 2032 | ; cx - user word | ||
| 2033 | ; bx - bits and macro type | ||
| 2034 | ; dx - max xmitt size | ||
| 2035 | ; ax - net name id | ||
| 2036 | ; bp - lsn (if specified) | ||
| 2037 | ; | ||
| 2038 | ; Regs: nothing preserved | ||
| 2039 | ; | ||
| 2040 | ;****************************************************************************** | ||
| 2041 | ;AC003; | ||
| 2042 | Procedure GET_UNC_ITEM_INFO,NEAR ;AC003; | ||
| 2043 | ;AC003; | ||
| 2044 | TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ;AN013; | ||
| 2045 | JNZ GUI_05 ;AN013; | ||
| 2046 | transfer ifs_980 ;AN013; | ||
| 2047 | |||
| 2048 | GUI_05: ;AN013; | ||
| 2049 | SaveReg <ES,DI,BX> ; target ptr and index ;AC003; | ||
| 2050 | ;AC003; | ||
| 2051 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 2052 | SaveReg <CS> ; prep ds for call ifs call ;AC003; | ||
| 2053 | RestoreReg <DS> ;AC003; | ||
| 2054 | ASSUME DS:IFSSEG ;AC003; | ||
| 2055 | ;AC003; | ||
| 2056 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AC003; | ||
| 2057 | invoke SET_THISIFS_UNC ; prep IFSRH ;AC003; | ||
| 2058 | MOV ES:[BX.IFSR_CATEGORY],1 ;AC003; | ||
| 2059 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_GET_UNC_ITEM ;AC003; | ||
| 2060 | ;AC003; | ||
| 2061 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 2062 | MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ;AC003; | ||
| 2063 | MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ;AC003; | ||
| 2064 | RestoreReg <AX> ; index ;AN003; | ||
| 2065 | MOV WORD PTR DS:[SI],AX ;AN003; | ||
| 2066 | |||
| 2067 | ;*********************************************************************************************** | ||
| 2068 | invoke CALL_IFS ; call redir w/get unc item request ;AC003; | ||
| 2069 | ;*********************************************************************************************** | ||
| 2070 | |||
| 2071 | ;AC003; | ||
| 2072 | JNC GUI_10 ;AC003; | ||
| 2073 | RestoreReg <DI,ES> ;AC003; | ||
| 2074 | return ;AC003; | ||
| 2075 | GUI_10: ;AC003; | ||
| 2076 | MOV SI,WORD PTR ES:[BX.IFSR_BUFFER@] ;AC003; | ||
| 2077 | MOV DS,WORD PTR ES:[BX.IFSR_BUFFER@+2] ;AC003; | ||
| 2078 | SaveReg <SI> | ||
| 2079 | ADD SI,2 ; space to user word (skip index) ;AN018; | ||
| 2080 | LODSW ; user word ;AC003; | ||
| 2081 | MOV CX,AX ;AC003; | ||
| 2082 | LODSW ; max xmitt size ;AC003; | ||
| 2083 | MOV DX,AX ;AC003; | ||
| 2084 | LODSW ; net name id ;AC003; | ||
| 2085 | PUSH AX ;AC003; | ||
| 2086 | LODSW ; lsn ;AC003; | ||
| 2087 | MOV BP,AX ;AC003; | ||
| 2088 | LODSB ; redir bits ;AC003; | ||
| 2089 | MOV BH,AL ;AC003; | ||
| 2090 | MOV BL,4 ;AC003; | ||
| 2091 | POP AX ; net name id ;AC003; | ||
| 2092 | SaveReg <DS,SI> ;AC003; | ||
| 2093 | CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003; | ||
| 2094 | MOV [SI].User_CX,CX ; User Word ;AC003; | ||
| 2095 | MOV [SI].User_BX,BX ; Bits and macro type ;AC003; | ||
| 2096 | MOV [SI].User_DX,DX ; Max Xmitt size ;AC003; | ||
| 2097 | MOV [SI].User_AX,AX ; Net name ID ;AC003; | ||
| 2098 | TEST CS:IFSPROC_FLAGS,SetBP ;AC003; | ||
| 2099 | JZ GUI_15 ;AC003; | ||
| 2100 | MOV [SI].User_BP,BP ; LSN ;AC003; | ||
| 2101 | GUI_15: ;AN003; | ||
| 2102 | RestoreReg <SI,DS> | ||
| 2103 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 2104 | JNZ GUI_20 ;AC003; | ||
| 2105 | ADD SP,2 ; old si | ||
| 2106 | RestoreReg <DI,ES> ; buffer/target ptr (dssi - 18) ;AC003;;AC018; | ||
| 2107 | SaveReg <AX,DI> ;AC003;;AC008; | ||
| 2108 | JMP SHORT GUI_40 ;AC003; | ||
| 2109 | ;AC003; | ||
| 2110 | GUI_20: ; new style ;AC003; | ||
| 2111 | RestoreReg <SI> ; offset path | ||
| 2112 | ADD SI,11 ;AC003; | ||
| 2113 | RestoreReg <DI,ES> ; target - dw fsname ;AC003; | ||
| 2114 | ; dw # parms ;AC003; | ||
| 2115 | ; db asciiz,... ;AC003; | ||
| 2116 | SaveReg <DI> ;AC003; | ||
| 2117 | MOV DI,ES:[DI] ;AC003; | ||
| 2118 | invoke GET_UNC_FS_NAME ;AC003; | ||
| 2119 | RestoreReg <DI> ;AC003; | ||
| 2120 | SaveReg <AX,DI> ;AC003; | ||
| 2121 | INC DI ;AC003; | ||
| 2122 | INC DI ;AC003; | ||
| 2123 | MOV WORD PTR ES:[DI],1 ;AC003; | ||
| 2124 | INC DI ;AC003; | ||
| 2125 | INC DI ;AC003; | ||
| 2126 | ;AC003; | ||
| 2127 | GUI_40: ;AC003; | ||
| 2128 | CallInstall StrCpy,MultDOS,17 ;AC003; | ||
| 2129 | RestoreReg <DI> ;AC003; | ||
| 2130 | ;;;;;;;;TEST CS:IFSPROC_FLAGS,FILESYS_STATUS ;AN008;;AD018; | ||
| 2131 | ;;;;;;;;JZ GUI_1000 ;AN008;;AD018; | ||
| 2132 | RestoreReg <AX> ;AN008; | ||
| 2133 | |||
| 2134 | GUI_1000: | ||
| 2135 | return ;AC003; | ||
| 2136 | ;AC003; | ||
| 2137 | ;AC003; | ||
| 2138 | EndProc GET_UNC_ITEM_INFO ;AC003; | ||
| 2139 | ;AN000; | ||
| 2140 | |||
| 2141 | BREAK <CHECK_END_SPACE -- check esdi string for blanks> ;AN000; | ||
| 2142 | ;AN000; | ||
| 2143 | ;************************************************************************************ ;AN000; | ||
| 2144 | ; ;AN000; | ||
| 2145 | ; CHECK_END_SPACE ;AN000; | ||
| 2146 | ; ;AN000; | ||
| 2147 | ; Called by: FIND_IFS_DRIVER ;AN000; | ||
| 2148 | ; ;AN000; | ||
| 2149 | ; Routines called: | ||
| 2150 | ; ;AN000; | ||
| 2151 | ; Inputs: ;AN000; | ||
| 2152 | ; ES:DI -> IFS driver name ;AN000; | ||
| 2153 | ; Function: ;AN000; | ||
| 2154 | ; Replace any blanks in asciiz ifs driver name with 0's. ;AN000; | ||
| 2155 | ; Output: ;AN000; | ||
| 2156 | ; none | ||
| 2157 | ; ;AN000; | ||
| 2158 | ; Regs: all preserved ;AN000; | ||
| 2159 | ; ;AN000; | ||
| 2160 | ;************************************************************************************ ;AN000; | ||
| 2161 | ;AN000; | ||
| 2162 | Procedure CHECK_END_SPACE ;AN000; | ||
| 2163 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2164 | ;AN000; | ||
| 2165 | SaveReg <AX,DS,SI,ES> ; save registers ;AN000; | ||
| 2166 | RestoreReg <DS> ; set dssi -> asciiz ifs name ;AN000; | ||
| 2167 | MOV SI,DI ;AN000; | ||
| 2168 | CLD ; clear dir flag to count forward ;AN000; | ||
| 2169 | CES_20: ; search LOOP ;AN000; | ||
| 2170 | LODSB ; put char in al ;AN000; | ||
| 2171 | OR AL,AL ; check for end of string ;AN000; | ||
| 2172 | JZ CES_1000 ; if so go quit ;AN000; | ||
| 2173 | CMP AL," " ; check for blank ;AN000; | ||
| 2174 | JNE CES_20 ; cont loop if not ;AN000; | ||
| 2175 | MOV BYTE PTR DS:[SI-1],0 ; replace blank with zero ;AN000; | ||
| 2176 | ;AN000; | ||
| 2177 | ;AN000; | ||
| 2178 | CES_1000: ;AN000; | ||
| 2179 | RestoreReg <SI,DS,AX> ; restore registers ;AN000; | ||
| 2180 | return ;AN000; | ||
| 2181 | ;AN000; | ||
| 2182 | EndProc CHECK_END_SPACE ;AN000; | ||
| 2183 | |||
| 2184 | ;AN000; | ||
| 2185 | ;AN000; | ||
| 2186 | IFSSEG ENDS ;AN000; | ||
| 2187 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM new file mode 100644 index 0000000..7c9e303 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM | |||
| @@ -0,0 +1,2739 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsutil.asm 1.0 87/05/05 ;AN000; | ||
| 3 | TITLE IFSFUNC UTILITY ROUTINES - Routines for IFSFUNC ;AN000; | ||
| 4 | NAME IFSUTIL ;AN000; | ||
| 5 | ;************************************************************************************ ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; Miscellaneous routines ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; IFSFlushBuf ;AN000; | ||
| 10 | ; IFS_UPDATE_CB (Part II) ;AN000; | ||
| 11 | ; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; | ||
| 12 | ; SERVER_IFSFUNC_DATA_AREA ;AN000; | ||
| 13 | ; DRIVE_FROM_CDS ;AN000; | ||
| 14 | ; DRIVE_FROM_SFT ;AN000; | ||
| 15 | ; PREP_IFSR ;AN000; | ||
| 16 | ; CALL_IFS ;AN000; | ||
| 17 | ; CREATE_DFL_ENTRY ;AN000; | ||
| 18 | ;;;alias ENTER_NAMES_LIST ;AN000; | ||
| 19 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 20 | ;;;alias EXIT_NAMES_LIST ;AN000; | ||
| 21 | ; DFL_MATCH ;AN000; | ||
| 22 | ; DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 23 | ;;;alias PROCESS_ALIAS ;AN000; | ||
| 24 | ; CDS_TO_CD ;AN000; | ||
| 25 | ; CD_TO_CDS ;AN000; | ||
| 26 | ; DFL_TO_DF ;AN000; | ||
| 27 | ; DF_TO_DFL ;AN000; | ||
| 28 | ; SFT_TO_SFF ;AN000; | ||
| 29 | ; SF_TO_SFT ;AN000; | ||
| 30 | ; XCHGP ;AN000; | ||
| 31 | ; CONSIST_SFT ;AN000; | ||
| 32 | ; CONSIST_DFL ;AN000; | ||
| 33 | ; PRN_CHECK ;AN000; | ||
| 34 | ; IFSDrvFromCDS ;AN000; | ||
| 35 | ; SET_THISIFS_UNC ;AN000; | ||
| 36 | ; SET_CATEGORY ;AN000; | ||
| 37 | ; SET_DEPIOCTL_IFSR ;AN000; | ||
| 38 | ; GET_UNC_FS_NAME | ||
| 39 | ; MOVE_DRIVER_NAME ;AN000; | ||
| 40 | ; CONVERT_NAME_ASCIIZ ;AN000; | ||
| 41 | ; CHECK_SEQ ;AN000; | ||
| 42 | ; CHECK_REAL_DEVICE ;AN000; | ||
| 43 | ; NET_TRANS ;AN000; | ||
| 44 | ; STRIP_WFP_START | ||
| 45 | ; CHECK_IFS_ATTRIBUTE | ||
| 46 | ; CHECK_IFS_SUPPORT | ||
| 47 | ; ;AN000; | ||
| 48 | ; REVISION HISTORY: ;AN000; | ||
| 49 | ; A000 Original version 4.00 May 1987 ;AN000; | ||
| 50 | ; A001 P453 - Correct $NameTrans processing on connect part of string ;AN000; | ||
| 51 | ; RGazzia Aug 25,1987 | ||
| 52 | ; A002 D158 - merge redir info into attach stuff 8/87 RGazzia | ||
| 53 | ; A003 P635 - read problem - sff-to-sft problem 8/87 RGazzia | ||
| 54 | ; A004 P764 - printer attach problem 8/87 RGazzia | ||
| 55 | ; A005 P845 - Disk reset infinitely calls 8/87 RGazzia | ||
| 56 | ; A006 P868 - Lock problems 8/87 RGazzia | ||
| 57 | ; A007 P849 - Printer open problems 8/87 RGazzia | ||
| 58 | ; A008 P2307- Critical error problems 11/87 RGazzia | ||
| 59 | ; A009 P2364- Chkdsk fails if afs loaded 11/87 RGazzia | ||
| 60 | ; due to losing cx in flush buf loop | ||
| 61 | ; A010 P2385- check for ifs support of multifile/device fcns 11/87 RGazzia | ||
| 62 | ; A011 P2827- ifs driver error mapping 12/87 RGazzia | ||
| 63 | ; A012 P3225- prn to lpt1 problems 1/88 RGazzia | ||
| 64 | ; A013 P3251- Net trans buffer problems 1/88 RGazzia | ||
| 65 | ; A014 P3692- detach of attached ptr problem 3/88 RGazzia | ||
| 66 | ; A015 P3745- commit problem due to sft flags problem 3/88 RGazzia | ||
| 67 | ; A016 P3810- new sff field - sft entry id 3/88 RGazzia | ||
| 68 | ; A017 P3680- sft changes 3/88 RGazzia | ||
| 69 | ; A018 P3883- Share violation problems 3/16/88 RMG | ||
| 70 | ; A019 P3971- pause problems 3/24/88 RMG | ||
| 71 | ; A020 P4055 Make sure THISDFL reset to null 3/30/88 RMG | ||
| 72 | ; A021 P4172 share violation fail - wrong dos extended error 4/08/88 RMG | ||
| 73 | ; A022 P4188 names=0 problems 4/08/88 RMG | ||
| 74 | ; A023 P4227 Austin garbage attach problem 4/11/88 RMG | ||
| 75 | ; A024 P4392 Yet another sft change 4/18/88 RMG | ||
| 76 | ; A025 P4751 retry logic fix 5/05/88 RMG | ||
| 77 | ; A026 P4802 NET821 retry hang/ fail hang 5/10/88 RMG | ||
| 78 | ; A027 P4839 ctrl-prtsc problems (consist_sft) 5/13/88 RMG | ||
| 79 | ; A028 P4863 criter/parms problem 5/14/88 RMG | ||
| 80 | ; A029 P4968 I24 DI not set right 5/25/88 RMG | ||
| 81 | ; A030 P5004 Cap of device name corrupted 6/01/88 RMG | ||
| 82 | ; A031 P5006 ctrl prtsc problems - pause back to real 6/02/88 RMG | ||
| 83 | ; consist_sft | ||
| 84 | ; | ||
| 85 | ; LOC - 696 | ||
| 86 | ;************************************************************************************ ;AN000; | ||
| 87 | ;AN000; | ||
| 88 | .xlist ;AN000; | ||
| 89 | .xcref ;AN000; | ||
| 90 | INCLUDE IFSSYM.INC ;AN000; | ||
| 91 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 92 | INCLUDE DOSSYM.INC ;AN000; | ||
| 93 | INCLUDE DEVSYM.INC ;AN000; | ||
| 94 | .cref ;AN000; | ||
| 95 | .list ;AN000; | ||
| 96 | ;AN000; | ||
| 97 | AsmVars <IBM, Installed, DEBUG> ;AN000; | ||
| 98 | ;AN000; | ||
| 99 | ; define the base code segment of the network support first ;AN000; | ||
| 100 | ;AN000; | ||
| 101 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 102 | IFSSEG ENDS ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | ; include the rest of the segment definitions for normal MSDOS ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | include dosseg.asm ;AN000; | ||
| 107 | ;AN000; | ||
| 108 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 109 | ;DOSGROUP Data ;AN000; | ||
| 110 | Extrn sft_addr:DWORD ;AN000; | ||
| 111 | Extrn sftFCB:DWORD ;AN000; | ||
| 112 | Extrn WFP_START:WORD ;AN000; | ||
| 113 | Extrn THISCDS:DWORD ;AN000; | ||
| 114 | Extrn THISSFT:DWORD ;AN000; | ||
| 115 | Extrn CDSADDR:DWORD ;AN000; | ||
| 116 | Extrn CDSCOUNT:BYTE ;AN000; | ||
| 117 | Extrn CurrentPDB:WORD ;AN000; | ||
| 118 | Extrn RetryCount:WORD ;AN000; | ||
| 119 | Extrn SysInitTable:BYTE ;AN000; | ||
| 120 | Extrn CurrentPDB:WORD ;AN000; | ||
| 121 | Extrn IFS_HEADER:DWORD ;AN000; | ||
| 122 | Extrn NULDEV:DWORD ;AN000; | ||
| 123 | Extrn SWAP_AREA_TABLE:BYTE ;AN000; | ||
| 124 | Extrn EXTERR:WORD ;AN011; | ||
| 125 | Extrn EXTERR_ACTION:BYTE ;AN011; | ||
| 126 | Extrn EXTERR_CLASS:BYTE ;AN011; | ||
| 127 | Extrn EXTERR_LOCUS:BYTE ;AN011; | ||
| 128 | Extrn ALLOWED:BYTE ;AN011; | ||
| 129 | Extrn ErrMap24End:BYTE | ||
| 130 | Extrn ErrMap24:BYTE | ||
| 131 | if debug ;AN000; | ||
| 132 | Extrn BugLev:WORD ;AN000; | ||
| 133 | Extrn BugTyp:WORD ;AN000; | ||
| 134 | include bugtyp.asm ;AN000; | ||
| 135 | endif ;AN000; | ||
| 136 | DATA ENDS ;AN000; | ||
| 137 | ;AN000; | ||
| 138 | ; define our own code segment ;AN000; | ||
| 139 | ;AN000; | ||
| 140 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 141 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 142 | ;AN000; | ||
| 143 | ;IFS Data ;AN000; | ||
| 144 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 145 | Extrn IFSFUNC_FLAGS:WORD ;AN000; | ||
| 146 | ;;;aliasExtrn NLAddr:DWORD ;AN000; | ||
| 147 | Extrn TEMPBUF:BYTE ;AN000; | ||
| 148 | Extrn DFLAddr:DWORD ;AN000; | ||
| 149 | Extrn DFLCount:BYTE ;AN000; | ||
| 150 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 151 | Extrn THISIFS:DWORD ;AN000; | ||
| 152 | Extrn THISDFL:DWORD ;AN000; | ||
| 153 | Extrn IFSR:WORD ;AN000; | ||
| 154 | Extrn CD1:WORD ;AN000; | ||
| 155 | Extrn DF1:WORD ;AN000; | ||
| 156 | Extrn SFF1:WORD ;AN000; | ||
| 157 | Extrn IFSDRV:BYTE ;AN000; | ||
| 158 | Extrn PHONEY_NAME:BYTE ;AN000; | ||
| 159 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 160 | Extrn SAVE_CB@:DWORD ;AN000; | ||
| 161 | Extrn IFSF_SWAP_START:BYTE ;AN000; | ||
| 162 | Extrn IFSF_SWAP_END:BYTE ;AN000; | ||
| 163 | ;AN000; | ||
| 164 | PUBLIC LPT1_NAME ;AN000; | ||
| 165 | LPT1_NAME DB "LPT1",0 ;AN000; | ||
| 166 | PRN_NAME DB "PRN",0 ;AN000; | ||
| 167 | ;AN000; | ||
| 168 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013; | ||
| 169 | ; The following buffer was created 1/88 to temporarily hold canonicalized ;AN013; | ||
| 170 | ; path name for $Nametrans call for Redir ;AN013; | ||
| 171 | ; Some area of TEMPBUF should be used instead for optimized storage space but ;AN013; | ||
| 172 | ; I didn't have time to research the best way to use it as time was short to ;AN013; | ||
| 173 | ; fix ptm ;AN013; | ||
| 174 | ; This buffer should later be taken out when time permits to do this right ;AN013; | ||
| 175 | ; | ||
| 176 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013; | ||
| 177 | NET_TRANS_BUFFER DB 128 DUP (0) ; temporary buffer used for $Nametrans ;AN013; | ||
| 178 | ; storage of canonicalized pathname ;AN013; | ||
| 179 | ;AN000; | ||
| 180 | BREAK <IFSFlushBuf -- Flush all Net Cache Buffers> ;AN000; | ||
| 181 | ;AN000; | ||
| 182 | ;************************************************************************************ ;AN000; | ||
| 183 | ; ;AN000; | ||
| 184 | ; IFSFlushBuf ;AN000; | ||
| 185 | ; ;AN000; | ||
| 186 | ; Called by: Dispatcher ;AN000; | ||
| 187 | ; ;AN000; | ||
| 188 | ; Routines called: CD_TO_CDS ;AN000; | ||
| 189 | ; CDS_TO_CD ;AN000; | ||
| 190 | ; CALL_IFS ;AN000; | ||
| 191 | ; ;AN000; | ||
| 192 | ; Input: AL = 0 Flush all Net buffers. ;AN000; | ||
| 193 | ; -1 " " " plus invalidate them. ;AN000; | ||
| 194 | ; ;AN000; | ||
| 195 | ; Function: ;AN000; | ||
| 196 | ; FOR I = 1 to # CDSs ;AN000; | ||
| 197 | ; DO ;AN000; | ||
| 198 | ; IF CURDIR_ISIFS = true THEN ;AN000; | ||
| 199 | ; DO ;AN000; | ||
| 200 | ; Prepare IFSRH: ;AN000; | ||
| 201 | ; * IFSR_LENGTH DW 40 ; Request length ;AN000; | ||
| 202 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 203 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 204 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 205 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 206 | ; * IFSR_APIFUNC DB 1 ; Drive Reset ;AN000; | ||
| 207 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 208 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 209 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 210 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 211 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 212 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 213 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 214 | ; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert ;AN000; | ||
| 215 | ; ; CDS to CD and set this as ;AN000; | ||
| 216 | ; ; pointer to it. ;AN000; | ||
| 217 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 218 | ; * IFSR_FUNC DB ? ; 0 IF AL=0. 1 IF AL=-1. ;AN000; | ||
| 219 | ; IFSR_RESV2 DB 0 ;AN000; | ||
| 220 | ; ;AN000; | ||
| 221 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 222 | ; ENDDO ;AN000; | ||
| 223 | ; ENDIF ;AN000; | ||
| 224 | ; ENDDO ;AN000; | ||
| 225 | ; ;AN000; | ||
| 226 | ; Output: None ;AN000; | ||
| 227 | ; ;AN000; | ||
| 228 | ; Notes: all destroyed ;AN000; | ||
| 229 | ; ;AN000; | ||
| 230 | ;************************************************************************************ ;AN000; | ||
| 231 | ;AN000; | ||
| 232 | procedure IFSFlushBuf,NEAR ;AN000; | ||
| 233 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 234 | ;AN000; | ||
| 235 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 236 | ifsr_api_def DRIVERESET ;AN000; | ||
| 237 | ;AN000; | ||
| 238 | MOV CL,CDSCount ; CX = # CDS's ;AN000; | ||
| 239 | MOV DX,SIZE curdir_list ; DX = size CDS entry ;AN000; | ||
| 240 | LDS SI,[CDSAddr] ; Get addr 1st CDS ;AN000; | ||
| 241 | ;AN000; | ||
| 242 | IFB_20: ;AN000; | ||
| 243 | TEST DS:[SI.curdir_flags],curdir_isnet ;AN000; | ||
| 244 | JZ IFB_60 ;AN000; | ||
| 245 | ; Is IFS. Send drive reset request ;AN000; | ||
| 246 | invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; | ||
| 247 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DRIVERESET ;AN000; | ||
| 248 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 249 | MOV ES:[BX.IFSR_APIFUNC],IFSDRIVERESET ;AN000; | ||
| 250 | SaveReg <DS,SI> ; save cds ptr ;AN000; | ||
| 251 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 252 | invoke CDS_TO_CD ;AN000; | ||
| 253 | MOV ES:[BX.IFSR_FUNC],AL ;AN000; | ||
| 254 | ;AN000; | ||
| 255 | SaveReg <CX> ; preserve loop count | ||
| 256 | invoke CALL_IFS ; Call IFS ;AN000; | ||
| 257 | RestoreReg <CX> ; retrieve loop count | ||
| 258 | JNC IFB_30 ;AN000; | ||
| 259 | RestoreReg <SI,DS> ; restore cds ptr ;AN000; | ||
| 260 | JMP SHORT IFB_60 ;AN000; | ||
| 261 | IFB_30: ;AN000; | ||
| 262 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 263 | CALL CD_TO_CDS ; update CDS if retcode ok ;AN000; | ||
| 264 | PUSH ES ; get cds ptr into ds:si ;AN000; | ||
| 265 | POP DS ;AN000; | ||
| 266 | MOV SI,DI ;AN000; | ||
| 267 | ;AN000; | ||
| 268 | IFB_60: ;AN000; | ||
| 269 | ADD SI,DX ; Skip to next CDS ;AN000; | ||
| 270 | LOOP IFB_20 ;AN000; | ||
| 271 | JMP IFS_990 ;AN000; | ||
| 272 | ;AN000; | ||
| 273 | ;*********************************************************************************** ;AN000; | ||
| 274 | ; ifs common return area ;AN000; | ||
| 275 | ;*********************************************************************************** ;AN000; | ||
| 276 | entry IFS_980 ;AN000; | ||
| 277 | STC ;AN000; | ||
| 278 | return ;AN000; | ||
| 279 | entry IFS_990 ;AN000; | ||
| 280 | CLC ;AN000; | ||
| 281 | entry IFS_1000 ;AN000; | ||
| 282 | return ;AN000; | ||
| 283 | ;AN000; | ||
| 284 | ;AN000; | ||
| 285 | EndProc IFSFlushBuf ;AN000; | ||
| 286 | ;AN000; | ||
| 287 | ;AN000; | ||
| 288 | BREAK <IFS_UPDATE_CB Update SFT entry> ;AN000; | ||
| 289 | ;AN000; | ||
| 290 | ;****************************************************************************** ;AN000; | ||
| 291 | ; ;AN000; | ||
| 292 | ; IFS_UPDATE_CB ;AN000; | ||
| 293 | ; ;AN000; | ||
| 294 | ; Called by: IFSFUNC Dispatcher (Share) ;AN000; | ||
| 295 | ; ;AN000; | ||
| 296 | ; Routines called: ;AN000; | ||
| 297 | ; SFT_TO_SFF ;AN000; | ||
| 298 | ; SF_TO_SFT ;AN000; | ||
| 299 | ; CALL_IFS ;AN000; | ||
| 300 | ; ;AN000; | ||
| 301 | ; Inputs: ;AN000; | ||
| 302 | ; DS:SI -> SFT ;AN000; | ||
| 303 | ; ;AN000; | ||
| 304 | ; Function: ;AN000; | ||
| 305 | ; Prep IFSRH: ;AN000; | ||
| 306 | ; * IFS_LENGTH DW 28 ; Request length ;AN000; | ||
| 307 | ; * IFS_FUNCTION DB 6 ; Control Block Update ;AN000; | ||
| 308 | ; IFS_RETCODE DW ? ;AN000; | ||
| 309 | ; IFS_RETCLASS DB ? ;AN000; | ||
| 310 | ; IFS_RESV1 DB 16 DUP(0) ;AN000; | ||
| 311 | ; * IFS_CB@ DD ? ; Control Block Address ;AN000; | ||
| 312 | ; * IFS_TYPE DB ? ; Control Block Type ;AN000; | ||
| 313 | ; IFSOPEN EQU 0 ; Open instnce (SFT) entry ;AN000; | ||
| 314 | ; IFSCB EQU -1 ; See CB Type Field ;AN000; | ||
| 315 | ; IFS_RESV2 DB 0 ;AN000; | ||
| 316 | ; ;AN000; | ||
| 317 | ; Call IFS specified in SFT ;AN000; | ||
| 318 | ; ;AN000; | ||
| 319 | ; Outputs: ;AN000; | ||
| 320 | ; Carry set on error. Error code in AX. ;AN000; | ||
| 321 | ; ;AN000; | ||
| 322 | ; Regs: ;AN000; | ||
| 323 | ; ;AN000; | ||
| 324 | ; Programming notes: ;AN000; | ||
| 325 | ; ;AN000; | ||
| 326 | ;****************************************************************************** ;AN000; | ||
| 327 | ;AN000; | ||
| 328 | procedure IFS_UPDATE_CB,NEAR ;AN000; | ||
| 329 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 330 | ;AN000; | ||
| 331 | ifsr_fcn_def UPDATECB ;AN000; | ||
| 332 | ; Reset ifsfunc processing flags ;AN000; | ||
| 333 | MOV CS:IFSPROC_FLAGS,ISCTLFCN+ISSFT ; Set this so SFT_TO_SFF sets ;AN000; | ||
| 334 | ; ifsr_cb@ instead of ifsr_open_cb@ ;AN000; | ||
| 335 | ; ISSFT set so sft_to_sff sets ;AN000; | ||
| 336 | ; thisifs ;AN000; | ||
| 337 | invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; | ||
| 338 | Context DS ;AN000; | ||
| 339 | invoke SFT_TO_SFF ; SFT: sets [THISIFS] ;AN000; | ||
| 340 | ; ES:BX -> IFSRH ;AN000; | ||
| 341 | ; IFSR_CB@ ;AN000; | ||
| 342 | ; ds - IFSSEG ;AN000; | ||
| 343 | MOV ES:[BX.IFSR_LENGTH],LENGTH_UPDATECB ; prep IFSRH ;AN000; | ||
| 344 | MOV ES:[BX.IFSR_FUNCTION],IFSUPDATECB ;AN000; | ||
| 345 | MOV ES:[BX.IFSR_TYPE],IFSOPEN ;AN000; | ||
| 346 | ;AN000; | ||
| 347 | invoke CALL_IFS ;AN000; | ||
| 348 | JC ifs_1000 ; cf already set ;AN000; | ||
| 349 | invoke SFF_TO_SFT ;AN000; | ||
| 350 | JMP ifs_990 ;AN000; | ||
| 351 | ;AN000; | ||
| 352 | EndProc IFS_UPDATE_CB ;AN000; | ||
| 353 | ;AN000; | ||
| 354 | ;AN000; | ||
| 355 | BREAK <SERVER_DOSCALL_CLOSEFILES_FOR_UID> ;AN000; | ||
| 356 | ;AN000; | ||
| 357 | ;************************************************************************************ ;AN000; | ||
| 358 | ; ;AN000; | ||
| 359 | ; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; | ||
| 360 | ; ;AN000; | ||
| 361 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 362 | ; ;AN000; | ||
| 363 | ; Routines called: ;AN000; | ||
| 364 | ; CALL_IFS ;AN000; | ||
| 365 | ; ;AN000; | ||
| 366 | ; Inputs: ;AN000; | ||
| 367 | ; [CurrentPDB] set to UID of user aborting ;AN000; | ||
| 368 | ; Function: ;AN000; | ||
| 369 | ; Get address of IFS driver chain. ;AN000; | ||
| 370 | ; FOR I = 1 to last IFS driver ;AN000; | ||
| 371 | ; Send request below to IFS driver ;AN000; | ||
| 372 | ; ;AN000; | ||
| 373 | ; IFSRH: ;AN000; | ||
| 374 | ; * IFSR_LENGTH DW 40 ; Request length ;AN000; | ||
| 375 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 376 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 377 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 378 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 379 | ; * IFSR_APIFUNC DB 19 ; End of Computer ID ;AN000; | ||
| 380 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 381 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 382 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 383 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 384 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 385 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 386 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 387 | ; IFSR_DEVICE_CB@ DD ? ; CD ;AN000; | ||
| 388 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 389 | ; * IFSR_UID DW ? ;AN000; | ||
| 390 | ; ;AN000; | ||
| 391 | ; Outputs: None ;AN000; | ||
| 392 | ; ;AN000; | ||
| 393 | ; Regs: All destroyed ;AN000; | ||
| 394 | ; ;AN000; | ||
| 395 | ;************************************************************************************ ;AN000; | ||
| 396 | ;AN000; | ||
| 397 | procedure SERVER_DOSCALL_CLOSEFILES_FOR_UID,NEAR ;AN000; | ||
| 398 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 399 | ;AN000; | ||
| 400 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 401 | ifsr_api_def EOCID ;AN000; | ||
| 402 | ;AN000; | ||
| 403 | LDS SI,IFS_HEADER ; get 1st ifs driver ;AN000; | ||
| 404 | ASSUME DS:NOTHING ;AN000; | ||
| 405 | ;AN000; | ||
| 406 | SDC_20: ; ** Loop here on ifs drivers ;AN000; | ||
| 407 | MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000; | ||
| 408 | MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000; | ||
| 409 | ; Set thisifs for call_ifs ;AN000; | ||
| 410 | invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; | ||
| 411 | MOV ES:[BX.IFSR_LENGTH],LENGTH_EOCID ;AN000; | ||
| 412 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 413 | MOV ES:[BX.IFSR_APIFUNC],IFSEOCID ;AN000; | ||
| 414 | MOV AX,[CurrentPDB] ;AN000; | ||
| 415 | MOV ES:[BX.IFSR_UID],AX ;AN000; | ||
| 416 | ;AN000; | ||
| 417 | SaveReg <DS,CS> ;AN000; | ||
| 418 | RestoreReg <DS> ;AN000; | ||
| 419 | ASSUME DS:IFSSEG ; ds - ifsseg ;AN000; | ||
| 420 | ;AN000; | ||
| 421 | invoke CALL_IFS ;AN000; | ||
| 422 | ;AN000; | ||
| 423 | RestoreReg <DS> ; ds - fs driver ;AN000; | ||
| 424 | LDS SI,[SI.IFS_NEXT] ; Do next fs driver ;AN000; | ||
| 425 | CMP SI,NULL_PTR ; if ptr null, no more ;AN000; | ||
| 426 | JNE SDC_20 ;AN000; | ||
| 427 | PUSH DS ;AN000; | ||
| 428 | POP AX ;AN000; | ||
| 429 | CMP AX,NULL_PTR ;AN000; | ||
| 430 | JNE SDC_20 ;AN000; | ||
| 431 | ;AN000; | ||
| 432 | jmp ifs_1000 ; go return ;AN000; | ||
| 433 | ;AN000; | ||
| 434 | ;AN000; | ||
| 435 | EndProc SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; | ||
| 436 | ;AN000; | ||
| 437 | ;AN000; | ||
| 438 | BREAK <SERVER_IFSFUNC_DATA_AREA - IFSFUNC swappable data area> ;AN000; | ||
| 439 | ;AN000; | ||
| 440 | ;************************************************************************************ ;AN000; | ||
| 441 | ; ;AN000; | ||
| 442 | ; SERVER_IFSFUNC_DATA_AREA ;AN000; | ||
| 443 | ; ;AN000; | ||
| 444 | ; Called by: Dispatcher ;AN000; | ||
| 445 | ; ;AN000; | ||
| 446 | ; Routines called: None ;AN000; | ||
| 447 | ; ;AN000; | ||
| 448 | ; Inputs: ;AN000; | ||
| 449 | ; DS - DOSGroup ;AN000; | ||
| 450 | ; ;AN000; | ||
| 451 | ; Function: ;AN000; | ||
| 452 | ; Put IFSFUNC swappable data area info in ibmdos's swap_area_table | ||
| 453 | ; ;AN000; | ||
| 454 | ; Outputs: ;AN000; | ||
| 455 | ; swap_area_table filled in: ;AN000; | ||
| 456 | ; dw num areas - 3 ;AN000; | ||
| 457 | ; dd ibmdos swap indos area address | ||
| 458 | ; dw ibmdos swap indos area length | ||
| 459 | ; dd ibmdos swap always area address | ||
| 460 | ; dw ibmdos swap always area length | ||
| 461 | ; dd ifsfunc swap indos area address | ||
| 462 | ; dw ifsfunc swap indos area length | ||
| 463 | ; ;AN000; | ||
| 464 | ; Regs: All preserved | ||
| 465 | ; ;AN000; | ||
| 466 | ;************************************************************************************ ;AN000; | ||
| 467 | ;AN000; | ||
| 468 | procedure SERVER_IFSFUNC_DATA_AREA,NEAR ;AN000; | ||
| 469 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 470 | ;AN000; | ||
| 471 | SaveReg <AX,ES,DI,DS,SI,DX,CS> ;AN000; | ||
| 472 | RestoreReg <ES> ;AN000; | ||
| 473 | MOV DI,OFFSET CS:IFSF_SWAP_START ;AN000; | ||
| 474 | MOV DX,OFFSET CS:IFSF_SWAP_END ;AN000; | ||
| 475 | SUB DX,DI ;AN000; | ||
| 476 | LEA SI,SWAP_AREA_TABLE ; get offset address of swap area table ;AN000; | ||
| 477 | |||
| 478 | MOV WORD PTR DS:[SI],3 ; number of data areas increased from 2 to 3 ;AN000; | ||
| 479 | ADD SI,14 ; skip to ifsfunc area ;AN000; | ||
| 480 | MOV WORD PTR DS:[SI],DI ; fill in ifsfunc data area address ;AN000; | ||
| 481 | MOV WORD PTR DS:[SI+2],ES ;AN000; | ||
| 482 | MOV WORD PTR DS:[SI+4],DX ; fill in ifsfunc data area length ;AN000; | ||
| 483 | ;AN000; | ||
| 484 | RestoreReg <DX,SI,DS,DI,ES,AX> ;AN000; | ||
| 485 | ;AN000; | ||
| 486 | return ;AN000; | ||
| 487 | ;AN000; | ||
| 488 | EndProc SERVER_IFSFUNC_DATA_AREA ;AN000; | ||
| 489 | ;AN000; | ||
| 490 | ;AN000; | ||
| 491 | BREAK <DRIVE_FROM_XXX -- Compute a drive index from a CDS or SFT> ;AN000; | ||
| 492 | ;AN000; | ||
| 493 | procedure DRIVE_FROM_CDS,NEAR ;AN000; | ||
| 494 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 495 | ;************************************************************************************ ;AN000; | ||
| 496 | ; ;AN000; | ||
| 497 | ; DRIVE_FROM_CDS ;AN000; | ||
| 498 | ; ;AN000; | ||
| 499 | ; Inputs: ;AN000; | ||
| 500 | ; [THISCDS] Set ;AN000; | ||
| 501 | ; DS - DOSGROUP ;AN000; | ||
| 502 | ; Function: ;AN000; | ||
| 503 | ; Compute drive letter from THISCDS ;AN000; | ||
| 504 | ; Outputs: ;AN000; | ||
| 505 | ; [IFSDRV] = Drive # (0=A) ;AN000; | ||
| 506 | ; No registers Revised ;AN000; | ||
| 507 | ;************************************************************************************ ;AN000; | ||
| 508 | ;AN000; | ||
| 509 | PUSH BX ;AN000; | ||
| 510 | PUSH AX ;AN000; | ||
| 511 | MOV [IFSDRV],0FEH ; Default to ?, 0FEH + 'A' = '?' ;AN000; | ||
| 512 | MOV AX,WORD PTR [THISCDS] ;AN000; | ||
| 513 | CMP AX,-1 ;AN000; | ||
| 514 | JZ DFC_20 ;AN000; | ||
| 515 | CALL IFSDrvFromCDS ;AN000; | ||
| 516 | DFC_20: ;AN000; | ||
| 517 | POP AX ;AN000; | ||
| 518 | POP BX ;AN000; | ||
| 519 | jmp ifs_1000 ; go return ;AN000; | ||
| 520 | ;AN000; | ||
| 521 | EndProc DRIVE_FROM_CDS ;AN000; | ||
| 522 | ;AN000; | ||
| 523 | ;************************************************************************************ ;AN000; | ||
| 524 | ; ;AN000; | ||
| 525 | ; DRIVE_FROM_SFT ;AN000; | ||
| 526 | ; ;AN000; | ||
| 527 | ; Inputs: ;AN000; | ||
| 528 | ; [THISSFT] Set DS-Dosgroup ;AN000; | ||
| 529 | ; Function: ;AN000; | ||
| 530 | ; Compute drive letter from THISSFT ;AN000; | ||
| 531 | ; Outputs: ;AN000; | ||
| 532 | ; [IFSDRV] = Drive # (0=A) ;AN000; | ||
| 533 | ; [IFSDRV] = -1 if printer ;AN000; | ||
| 534 | ; PHONEY_NAME ;AN000; | ||
| 535 | ; No registers Revised ;AN000; | ||
| 536 | ;************************************************************************************ ;AN000; | ||
| 537 | ;AN000; | ||
| 538 | procedure DRIVE_FROM_SFT,NEAR ;AN000; | ||
| 539 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 540 | ;AN000; | ||
| 541 | SaveReg <DS,BX,CX> ;AC006; | ||
| 542 | LDS BX,[THISSFT] ;AN000; | ||
| 543 | TEST [BX.sf_flags],sf_net_spool ;AN000; | ||
| 544 | JNZ DFS_100 ;AN000; | ||
| 545 | MOV BL,BYTE PTR [BX.sf_flags] ;AN000; | ||
| 546 | AND BL,devid_file_mask_drive ;AN000; | ||
| 547 | CMP BL,0FEH AND devid_file_mask_drive ; UNC ???? ;AN000; | ||
| 548 | JNZ DFS_20 ; No ;AN000; | ||
| 549 | MOV BL,0FEH ; Restore lost bits if UNC ;AN000; | ||
| 550 | DFS_20: ;AN000; | ||
| 551 | MOV [IFSDRV],BL ;AN000; | ||
| 552 | RestoreReg <CX,BX,DS> ;AC006; | ||
| 553 | JMP ifs_1000 ; go return ;AN000; | ||
| 554 | ;AN000; | ||
| 555 | DFS_100: ;AN000; | ||
| 556 | SaveReg <ES,DI,SI> ;AN000; | ||
| 557 | MOV DI,OFFSET CS:[PHONEY_NAME] ; Set name for I24 handler ;AN000; | ||
| 558 | PUSH CS ;AN000; | ||
| 559 | POP ES ;AN000; | ||
| 560 | MOV SI,BX ;AN000; | ||
| 561 | ADD SI,SF_NAME ;AN000; | ||
| 562 | MOV CX,8 ;AC007; | ||
| 563 | REP MOVSB ;AN000; | ||
| 564 | ;AN000; | ||
| 565 | RestoreReg <SI,DI,ES> ;AN000; | ||
| 566 | MOV BL,-1 ;AN000; | ||
| 567 | JMP DFS_20 ;AN000; | ||
| 568 | ;AN000; | ||
| 569 | EndProc DRIVE_FROM_SFT ;AN000; | ||
| 570 | ;AN000; | ||
| 571 | ;AN000; | ||
| 572 | BREAK <PREP_IFSR -- zero out ifsr> ;AN000; | ||
| 573 | ;AN000; | ||
| 574 | ;************************************************************************************ ;AN000; | ||
| 575 | ; ;AN000; | ||
| 576 | ; PREP_IFSR ;AN000; | ||
| 577 | ; ;AN000; | ||
| 578 | ; Called by: all function routines ;AN000; | ||
| 579 | ; ;AN000; | ||
| 580 | ; Inputs: none ;AN000; | ||
| 581 | ; ;AN000; | ||
| 582 | ; Function: ;AN000; | ||
| 583 | ; set all ifsrh fields to zero ;AN000; | ||
| 584 | ; ;AN000; | ||
| 585 | ; Outputs: ;AN000; | ||
| 586 | ; ES:BX -> IFSRH ;AN000; | ||
| 587 | ; ;AN000; | ||
| 588 | ; Regs: all except ES,BX saved ;AN000; | ||
| 589 | ; ;AN000; | ||
| 590 | ;************************************************************************************ ;AN000; | ||
| 591 | ;AN000; | ||
| 592 | procedure PREP_IFSR,NEAR ;AN000; | ||
| 593 | ;AN000; | ||
| 594 | SaveReg <DS,DI,AX,CX> ; save regs ;AN000; | ||
| 595 | ;AN000; | ||
| 596 | SaveReg <CS,CS> ; get ds,es -> ifsseg ;AN000; | ||
| 597 | RestoreReg <DS,ES> ;AN000; | ||
| 598 | ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 599 | ;AN000; | ||
| 600 | MOV DI,OFFSET IFSR ; es:di -> ifsrh ;AN000; | ||
| 601 | MOV BX,DI ; es:bx -> ifsrh ;AN000; | ||
| 602 | MOV CX,SIZE IFSRH /2 ;AN000; | ||
| 603 | XOR AX,AX ;AN000; | ||
| 604 | REP STOSW ; fill ifsr w/zeros ;AN000; | ||
| 605 | ;AN000; | ||
| 606 | RestoreReg <CX,AX,DI,DS> ; restore regs ;AN000; | ||
| 607 | ;AN000; | ||
| 608 | return ;AN000; | ||
| 609 | ;AN000; | ||
| 610 | EndProc PREP_IFSR ;AN000; | ||
| 611 | ;AN000; | ||
| 612 | ;AN000; | ||
| 613 | BREAK <CALL_IFS - call IFS Driver> ;AN000; | ||
| 614 | ;AN000; | ||
| 615 | ;************************************************************************************ ;AN000; | ||
| 616 | ; ;AN000; | ||
| 617 | ; CALL_IFS ;AN000; | ||
| 618 | ; ;AN000; | ||
| 619 | ; Called by: all function routines ;AN000; | ||
| 620 | ; ;AN000; | ||
| 621 | ; Inputs: ;AN000; | ||
| 622 | ; [THISIFS] set ;AN000; | ||
| 623 | ; ES:BX -> IFS request header ;AN000; | ||
| 624 | ; DS - IFSSEG ;AN000; | ||
| 625 | ; ;AN000; | ||
| 626 | ; Function: ;AN000; | ||
| 627 | ; Call file system function entry point ;AN000; | ||
| 628 | ; ;AN000; | ||
| 629 | ; Outputs: ;AN000; | ||
| 630 | ; Outputs of call ;AN000; | ||
| 631 | ; ;AN000; | ||
| 632 | ; Regs: none preserved ;AN000; | ||
| 633 | ; ;AN000; | ||
| 634 | ;************************************************************************************ ;AN000; | ||
| 635 | ;AN000; | ||
| 636 | procedure CALL_IFS,NEAR ;AN000; | ||
| 637 | ;AN000; | ||
| 638 | CALL CHECK_IFS_SUPPORT ; 1st check if this request ok for ifs ;AN010; | ||
| 639 | PUSH WORD PTR [THISIFS] ; save thisifs offset ;AN000; | ||
| 640 | |||
| 641 | CALL SET_CATEGORY ; do this to determine unc or ifs ;AN000; | ||
| 642 | OR CL,CL ; cl-1 for unc, 0 for ifs ;AN000; | ||
| 643 | JNZ CI_05 ;AN000; | ||
| 644 | invoke EcritIFS ; enter ifs critical section ;AN000; | ||
| 645 | JMP SHORT CI_10 ;AN000; | ||
| 646 | CI_05: ;AN000; | ||
| 647 | invoke EcritNET ; enter network critical section ;AN000; | ||
| 648 | |||
| 649 | CI_10: | ||
| 650 | LDS SI,[THISIFS] ; set thisifs=fs driver fcn entry pt ;AN000; | ||
| 651 | MOV AX,DS:[SI.IFS_CALL@] ; offset=contents of ifs_call@ ;AN000; | ||
| 652 | ;AN000; | ||
| 653 | PUSH CS ;AN000; | ||
| 654 | POP DS ;AN000; | ||
| 655 | ASSUME DS:IFSSEG ;AN000; | ||
| 656 | ;AN000; | ||
| 657 | MOV WORD PTR [THISIFS],AX ;AN000; | ||
| 658 | PUSH CX ; save this for later unc vs. ifs check ;AN000; | ||
| 659 | ;---------------------------------------------------------------------------- ;AN000; | ||
| 660 | CALL [THISIFS] ; call fs driver with request ;AN000; | ||
| 661 | ;---------------------------------------------------------------------------- ;AN000; | ||
| 662 | POP CX ; unc or ifs result ;AN000; | ||
| 663 | POP WORD PTR [THISIFS] ; restore thisifs offset ;AN000; | ||
| 664 | |||
| 665 | OR CL,CL ; again, determine whether to exit ifs ;AN000; | ||
| 666 | JNZ CI_15 ; or unc critical section ;AN000; | ||
| 667 | invoke LcritIFS ; leave ifs critical section ;AN000; | ||
| 668 | JMP SHORT CI_17 ;AN000; | ||
| 669 | CI_15: ;AN000; | ||
| 670 | invoke LcritNET ; leave network critical section ;AN000; | ||
| 671 | |||
| 672 | CI_17: ;AN000; | ||
| 673 | MOV AL,ES:[BX.IFSR_RETCLASS] ; check for error (class) ;AN000; | ||
| 674 | CMP AL,IFSR_NO_ERROR ; (any err must have class set) ;AN000; | ||
| 675 | JNE CI_20 ;AN000; | ||
| 676 | JMP ifs_990 ; no error, go ret no carry ;AN000; | ||
| 677 | ;AN000; | ||
| 678 | ;-----------------------------------------------; error processing ;AN000; | ||
| 679 | CI_20: ;AN000; | ||
| 680 | TEST IFSPROC_FLAGS,IsInit ; if in init code, skip error proc ;AN011; | ||
| 681 | JZ CI_22 ;AN011; | ||
| 682 | JMP ifs_980 ; init error- just go stc and quit ;AN011; | ||
| 683 | CI_22: ;AN011; | ||
| 684 | CMP AL,IFSR_INT21H_CRITER ; critical error? ;AN000; | ||
| 685 | JE CI_23 ;AN029; | ||
| 686 | JMP CI_30 ;AC029; | ||
| 687 | CI_23: ;AN029; | ||
| 688 | MOV AX,ES:[BX.IFSR_RETCODE] ; put retcode in al before condition ;AN000; | ||
| 689 | |||
| 690 | |||
| 691 | CMP AX,error_write_protect ;AN029; | ||
| 692 | JB NO_UNMAP ;AN029; | ||
| 693 | CMP AX,error_gen_failure ;AN029; | ||
| 694 | JA NO_UNMAP ;AN029; | ||
| 695 | SUB AX,error_write_protect ; BIAS old errors back down into 0-12 range ;AN029; | ||
| 696 | NO_UNMAP: ;AN029; | ||
| 697 | PUSH DS ;AN029; | ||
| 698 | Context DS ;AN029; | ||
| 699 | ASSUME DS:DOSGROUP ;AN029; | ||
| 700 | MOV DI,AX ;AN029; | ||
| 701 | MOV AX,OFFSET DOSGroup:ErrMap24End ;AN029; | ||
| 702 | SUB AX,OFFSET DOSGroup:ErrMap24 ;AN029; | ||
| 703 | ; ;AN029; | ||
| 704 | ; AX is the index of the first unavailable error. Do not translate if ;AN029; | ||
| 705 | ; greater or equal to AX. ;AN029; | ||
| 706 | ; ;AN029; | ||
| 707 | CMP DI,AX ;AN029; | ||
| 708 | MOV AX,DI ;AN029; | ||
| 709 | JAE NoTrans ;AN029; | ||
| 710 | MOV AL,ErrMap24[DI] ;AN029; | ||
| 711 | XOR AH,AH ;AN029; | ||
| 712 | NoTrans: ;AN029; | ||
| 713 | POP DS | ||
| 714 | invoke SET_EXTERR_INFO ; yes - set error info ;AN000; | ||
| 715 | |||
| 716 | CI_25: ;AN011; | ||
| 717 | SaveReg <DS,SI,ES,DI,CX,AX> ; temporarily save ifsr in tempbuf over ;AN008; | ||
| 718 | SaveReg <ES> ; next call ;AN008; | ||
| 719 | RestoreReg <DS> ; Set dssi -> ifsr (current esbx) ;AN008; | ||
| 720 | MOV SI,BX ;AN008; | ||
| 721 | MOV CX,36 ; half size of max ifsr ;AN008; | ||
| 722 | MOV DI,OFFSET TEMPBUF ; set esdi -> tempbuf ;AN008; | ||
| 723 | CLD ; next instr auto-increment ;AN008; | ||
| 724 | REP MOVSW ; copy the ifsr over (word move) ;AN008; | ||
| 725 | MOV AX,CS:IFSPROC_FLAGS ; preserve ifsproc_flags ;AN026; | ||
| 726 | STOSW ;AN026; | ||
| 727 | RestoreReg <AX,CX,DI,ES,SI,DS> ; restore regs ;AN008; | ||
| 728 | |||
| 729 | CMP DI,error_I24_gen_failure ;AN029; | ||
| 730 | JBE CI_26 ;AN029; | ||
| 731 | MOV DI,error_I24_gen_failure ;AN029; | ||
| 732 | CI_26: ;AN029; | ||
| 733 | SaveReg <AX> ; preserve dos ext err ;AN021; | ||
| 734 | invoke IFS_I24 ; do int 24h ;AN000; | ||
| 735 | |||
| 736 | SaveReg <DS,SI,ES,DI,CX,AX> ; restore original ifsr (over criter one);AN008; | ||
| 737 | SaveReg <CS,CS> ; set dssi -> tempbuf ;AN008; | ||
| 738 | RestoreReg <DS,ES> ; set esdi -> ifsr ;AN008; | ||
| 739 | MOV SI,OFFSET TEMPBUF ; ;AN008; | ||
| 740 | MOV DI,OFFSET IFSR ; ;AN008; | ||
| 741 | MOV CX,36 ; half size of max ifsr ;AN008; | ||
| 742 | CLD ; next instr auto-increment ;AN008; | ||
| 743 | REP MOVSW ; copy the ifsr over (word move) ;AN008; | ||
| 744 | LODSW ; restore ifsproc_flags ;AN026; | ||
| 745 | MOV CS:IFSPROC_FLAGS,AX ; ;AN026; | ||
| 746 | RestoreReg <AX,CX,DI,ES,SI,DS> ; restore regs ;AN008; | ||
| 747 | |||
| 748 | CMP AL,RETRY ; if retry, restart request ;AN000; | ||
| 749 | JE CI_27 ; else, go ret w/carry ;AC011; | ||
| 750 | RestoreReg <AX> ; retrieve dos ext err ;AN021;;AM025; | ||
| 751 | JMP ifs_980 ;AN000; | ||
| 752 | CI_27: ;AN011; | ||
| 753 | ADD SP,2 ; restore stack (dos ext error #) ;AN025; | ||
| 754 | JMP CI_80 ;AN011; | ||
| 755 | ;AN000; | ||
| 756 | CI_30: ; not critical error: ;AN000; | ||
| 757 | CMP AL,IFSR_BAD_FORMAT ; map ifsr bad format error to general ;AN011; | ||
| 758 | JNE CI_32 ; failure (12) critical error ;AN011; | ||
| 759 | MOV AL,12 | ||
| 760 | MOV SS:[EXTERR],31 ; set dos error variables for abort ;AN011; | ||
| 761 | MOV SS:[EXTERR_CLASS],4 ; (Internal) ;AN011; | ||
| 762 | MOV SS:[EXTERR_ACTION],4 ; (Abort) ;AN011; | ||
| 763 | MOV SS:[EXTERR_LOCUS],1 ; (Unknown) ;AN011; | ||
| 764 | MOV SS:[ALLOWED],08H ; allow only fail ;AN011; | ||
| 765 | MOV DI,AX ;AN029; | ||
| 766 | JMP CI_25 ; go back & treat as critical error ;AN011; | ||
| 767 | CI_32: ;AN011; | ||
| 768 | CMP AL,IFSR_DRIVER_ERROR ;AN011; | ||
| 769 | JNE CI_37 ;AC011; | ||
| 770 | MOV AX,ES:[BX.IFSR_RETCODE] ; *** driver error class *** ;AN011; | ||
| 771 | CMP AX,IFSR_NO_FCN_SUPPORT ;AN011; | ||
| 772 | JG CI_34 ;AN011; | ||
| 773 | MOV AX,50 ; request not supported by file system ;AN011; | ||
| 774 | JMP CI_100 ;AN011; | ||
| 775 | CI_34: ;AN011; | ||
| 776 | CMP AX,IFSR_ACCESS_DENIED ;AN011; | ||
| 777 | JNE CI_35 ;AN011; | ||
| 778 | MOV AX,65 ; access denied by file system ;AN011; | ||
| 779 | JMP CI_100 ;AN011; | ||
| 780 | CI_35: ;AN011; | ||
| 781 | CMP AX,IFSR_DEVICE_TYPE_MISMATCH ;AN011; | ||
| 782 | JNE CI_36 ;AN011; | ||
| 783 | MOV AX,66 ; file sytem device type incorrect ;AN011; | ||
| 784 | JMP CI_100 ;AN011; | ||
| 785 | CI_36: ;AN011; | ||
| 786 | MOV AX,59 ; fs experienced an unexpected error ;AN011; | ||
| 787 | JMP CI_100 ;AN011; | ||
| 788 | |||
| 789 | CI_37: ;AN011; | ||
| 790 | CMP AL,IFSR_DEVICE_ERROR ; fs got device error ;AN011; | ||
| 791 | JNE CI_38 ;AN011; | ||
| 792 | MOV AX,ES:[BX.IFSR_RETCODE] ;AN011; | ||
| 793 | invoke DEVICE2EXTERR ; convert device - ext error ;AN011; | ||
| 794 | JMP CI_100 ; go set class/action/locus ;AN011; | ||
| 795 | CI_38: ;AN011; | ||
| 796 | MOV AX,ES:[BX.IFSR_RETCODE] ;AN011; | ||
| 797 | CMP AX,error_sharing_violation ;AN000; | ||
| 798 | JNZ CI_100 ;AN000; | ||
| 799 | ;AN000; | ||
| 800 | SaveReg <DS> ; save ifsseg ;AN018; | ||
| 801 | Context DS ; Share error ;AN000; | ||
| 802 | invoke PHONEY_DPB ; Set phoney NET DPB for INT 24 ;AN000; | ||
| 803 | CMP ES:[BX.IFSR_APIFUNC],IFSOPENFILE ; on open/create - share error,no int24 ;AN018; | ||
| 804 | JNE CI_39 ;AN018; | ||
| 805 | CallInstall SHARE_ERROR,MultDOS,11 ;AN018; | ||
| 806 | JMP SHORT CI_39_20 ;AN018; | ||
| 807 | CI_39: ;AN018; | ||
| 808 | CallInstall SHARE_VIOLATION,MultDOS,10 ;AN000; | ||
| 809 | CI_39_20: ;AN018; | ||
| 810 | RestoreReg <DS> ;AN018; | ||
| 811 | ;AN000; | ||
| 812 | JNC CI_40 ;AN000; | ||
| 813 | MOV AX,error_sharing_violation ; carry set - quit w/error ;AN000; | ||
| 814 | invoke SET_EXTERR_INFO ;AN000; | ||
| 815 | JMP ifs_980 ;AN000; | ||
| 816 | ;AN000; | ||
| 817 | CI_40: ; carry clear - retry ;AN000; | ||
| 818 | MOV AL,RETRY ;AN000; | ||
| 819 | |||
| 820 | CI_80: ;AN000; | ||
| 821 | INC ES:[BX.IFSR_I24_COUNT] ; retry: inc retry count ;AN000; | ||
| 822 | MOV ES:[BX.IFSR_I24_RESP],AL ; store i24 response ;AN000; | ||
| 823 | MOV ES:[BX.IFSR_RETCODE],0 ; reset retcode and class ;AN008; | ||
| 824 | MOV ES:[BX.IFSR_RETCLASS],0 ;AN008; | ||
| 825 | MOV ES:[BX.IFSR_ERROR_CLASS],0 ; reset retcode and class ;AN025; | ||
| 826 | MOV ES:[BX.IFSR_ERROR_ACTION],0 ;AN025; | ||
| 827 | MOV ES:[BX.IFSR_ERROR_LOCUS],0 ; reset retcode and class ;AN025; | ||
| 828 | MOV ES:[BX.IFSR_ALLOWED],0 ;AN025; | ||
| 829 | SaveReg <CS> ; restore ds-ifsseg ;AN000; | ||
| 830 | RestoreReg <DS> ;AN000; | ||
| 831 | ASSUME DS:IFSSEG ;AN000; | ||
| 832 | JMP CALL_IFS ;AN000; | ||
| 833 | ;AN000; | ||
| 834 | CI_100: ; non-critical error ;AN000; | ||
| 835 | TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret call to int 2f-5 stack ;AN028; | ||
| 836 | JNZ CI_120 ; not dosgroup so can't call next ;AN028; | ||
| 837 | CALL SET_EXTERR_INFO ; set exterr info and ;AN000; | ||
| 838 | CI_120: ;AN028; | ||
| 839 | JMP ifs_980 ; go ret w/carry ;AN000; | ||
| 840 | ;AN000; | ||
| 841 | ;AN000; | ||
| 842 | EndProc CALL_IFS ;AN000; | ||
| 843 | ;AN000; | ||
| 844 | ;AN000; | ||
| 845 | BREAK <CREATE_DFL_ENTRY - fill in DFL entry, add to names list if alias> ;AN000; | ||
| 846 | ;AN000; | ||
| 847 | ;************************************************************************************ ;AN000; | ||
| 848 | ; ;AN000; | ||
| 849 | ; CREATE_DFL_ENTRY ;AN000; | ||
| 850 | ; ;AN000; | ||
| 851 | ; Routine called by: ATTACH_START ;AN000; | ||
| 852 | ; PROCESS_ALIAS ;AN000; | ||
| 853 | ; ;AN000; | ||
| 854 | ; Routines called: DFL_TO_DF ;AN000; | ||
| 855 | ; ENTER_NAMES_LIST ;AN000; | ||
| 856 | ; ;AN000; | ||
| 857 | ; Inputs: ;AN000; | ||
| 858 | ; [THISIFS] set ;AN000; | ||
| 859 | ; BL = macro type ;AN000; | ||
| 860 | ; CX = user word | ||
| 861 | ; DS:SI -> ASCIIZ device name ;AN000; | ||
| 862 | ; ES:DI -> Target driver to attach to and parms. ;AN000; | ||
| 863 | ; DW ASCIIZ - FS name ;AN000; | ||
| 864 | ; DW n - number of parms ;AN000; | ||
| 865 | ; DB ASCIIZ,... parms ;AN000; | ||
| 866 | ; ;AN000; | ||
| 867 | ; Function: ;AN000; | ||
| 868 | ; WHILE DFL entries ;AN000; | ||
| 869 | ; IF entry not in use THEN ;AN000; | ||
| 870 | ; DO ;AN000; | ||
| 871 | ; Set in progress flag for this entry ;AN000; | ||
| 872 | ; DFL_TYPE = BL ;AN000; | ||
| 873 | ; DFL_DEV_NAME = name pointed to by DS:SI ;AN000; | ||
| 874 | ; DFL_USER_WORD = CX | ||
| 875 | ; IF alias, Call ENTER_NAMES_LIST ;AN000; | ||
| 876 | ; DFL_IFS_HDR = [THISIFS] ;AN000; | ||
| 877 | ; Set in use flag ;AN000; | ||
| 878 | ; Reset in progress flag ;AN000; | ||
| 879 | ; Set [THISDFL] ;AN000; | ||
| 880 | ; Call DFL_TO_DF ;AN000; | ||
| 881 | ; LEAVE WHILE ;AN000; | ||
| 882 | ; ENDDO ;AN000; | ||
| 883 | ; ELSE DO ;AN000; | ||
| 884 | ; Get next DFL entry ;AN000; | ||
| 885 | ; IF no entry THEN ;AN000; | ||
| 886 | ; Set error_out_of_structures ;AN000; | ||
| 887 | ; ENDIF ;AN000; | ||
| 888 | ; ENDDO ;AN000; | ||
| 889 | ; ENDWHILE ;AN000; | ||
| 890 | ; ;AN000; | ||
| 891 | ; Outputs: ;AN000; | ||
| 892 | ; carry clear: ;AN000; | ||
| 893 | ; DFL entry created. Names list addition if alias. ;AN000; | ||
| 894 | ; [THISDFL] set ;AN000; | ||
| 895 | ; DS:SI -> DFL ;AN000; | ||
| 896 | ; If not alias: ;AN000; | ||
| 897 | ; DF loaded ;AN000; | ||
| 898 | ; ES:BX -> IFSRH ;AN000; | ||
| 899 | ; IFSR_DEVICE_CB@ -> DF ;AN000; | ||
| 900 | ; ;AN000; | ||
| 901 | ; carry set on error, ax - error ;AN000; | ||
| 902 | ; ;AN000; | ||
| 903 | ; Regs: DS:SI -> DFL, all others destroyed ;AN000; | ||
| 904 | ;************************************************************************************ ;AN000; | ||
| 905 | ;AN000; | ||
| 906 | procedure CREATE_DFL_ENTRY,NEAR ;AN000; | ||
| 907 | ;AN000; | ||
| 908 | SaveReg <DS,SI> ; save input DS:SI (devname) ;AN000; | ||
| 909 | MOV DX,CX ; save user word in dx ;AN002; | ||
| 910 | ;AN000; | ||
| 911 | LDS SI,CS:[DFLAddr] ; Set DS:SI -> 1st DFL entry ;AN000; | ||
| 912 | MOV CL,CS:DFLCount ; CX = # DFL entries ;AN000; | ||
| 913 | OR CL,CL ; check for available dfl structure ;AN022; | ||
| 914 | JZ CDE_30 | ||
| 915 | XOR CH,CH ;AN000; | ||
| 916 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 917 | ;AN000; | ||
| 918 | CALL CONSIST_DFL ; reset all in_prog flags ;AN000; | ||
| 919 | CDE_20: ;AN000; | ||
| 920 | TEST [SI.DFLL_FLAGS],DFL_INUSE ; look for unused DFL ;AN000; | ||
| 921 | JZ CDE_40 ; entry ;AN000; | ||
| 922 | ADD SI,SIZE DFLL_LIST ;AN000; | ||
| 923 | LOOP CDE_20 ;AN000; | ||
| 924 | CDE_30: | ||
| 925 | MOV AX,error_out_of_structures ;AN000; | ||
| 926 | RestoreReg <SI,DS> ; restore stack ;AN000; | ||
| 927 | JMP ifs_980 ; go return w/carry ;AN000; | ||
| 928 | CDE_40: ;AN000; | ||
| 929 | CALL INIT_DFL ; zero out dfl entry ;AN000; | ||
| 930 | OR [SI.DFLL_FLAGS],DFL_INPROG ; Found DFL entry - ;AN000; | ||
| 931 | ; Set in progress flag ;AN000; | ||
| 932 | MOV [SI.DFLL_TYPE],BL ; Store DFL_TYPE ;AN000; | ||
| 933 | MOV [SI.DFLL_USER_WORD],DX ; store user word ;AN002; | ||
| 934 | ;AN000; | ||
| 935 | RestoreReg <DI,ES> ; get dev name ptr off stack ;AN000; | ||
| 936 | CALL XCHGP ; Set DS:SI -> devname ;AN000; | ||
| 937 | PUSH DI ; ES:DI -> DFL ;AN000; | ||
| 938 | ; save dfl start offset ;AN000; | ||
| 939 | CDE_60: ;AN000; | ||
| 940 | INC DI ; mov di to dfl_dev_name ;AN000; | ||
| 941 | INC DI ;AN000; | ||
| 942 | MOV CX,8 ; Devs max of 8 ch and ':', and a NUL ;AN000; | ||
| 943 | CDE_70: ; dssi->source, esdi->dfl_dev_name ;AN000; | ||
| 944 | LODSB ; just store 1st 8 padded to right ;AN000; | ||
| 945 | CallInstall UCase,multDOS,19,<AX>,<BX> ; w/blanks ;AC030; ax chg to bx | ||
| 946 | OR AL,AL ; 0 . : signal end ;AN000; | ||
| 947 | JZ CDE_73 ;AN000; | ||
| 948 | CMP AL,'.' ;AN000; | ||
| 949 | JZ CDE_73 ;AN000; | ||
| 950 | CMP AL,':' ;AN000; | ||
| 951 | JZ CDE_73 ;AN000; | ||
| 952 | STOSB ;AN000; | ||
| 953 | LOOP CDE_70 ;AN000; | ||
| 954 | JMP SHORT CDE_80 ;AN000; | ||
| 955 | CDE_73: ;AN000; | ||
| 956 | MOV AL," " ;AN000; | ||
| 957 | CDE_76: ;AN000; | ||
| 958 | STOSB ;AN000; | ||
| 959 | LOOP CDE_76 ;AN000; | ||
| 960 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; | ||
| 961 | ;;;aliasCMP BL,TYPE_ALIAS ;AN000; | ||
| 962 | ;;;;;;;;JNE CDE_80 ;AN000; | ||
| 963 | ;;;;;;;;CALL ENTER_NAMES_LIST ; Store alias index ;AN000; | ||
| 964 | ;;;;;;;;JNC CDE_120 ;AN000; | ||
| 965 | ;;;;;;;;POP DI ; if error back out ;AN000; | ||
| 966 | ;;;;;;;;AND [SI.DFLL_FLAGS],NOT DFL_INPROG ; go exit with carry ;AN000; | ||
| 967 | ;;;aliasJMP ifs_980 ;AN000; | ||
| 968 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; | ||
| 969 | CDE_80: ;AN000; | ||
| 970 | ADD DI,4 ; skip alias index and user wd ;AC004; | ||
| 971 | ;;;; INC DI ;AD004; | ||
| 972 | CDE_100: ;AN000; | ||
| 973 | MOV AX,WORD PTR [THISIFS] ;AN000; | ||
| 974 | STOSW ; Set DFL_IFS_HDR to ;AN000; | ||
| 975 | MOV AX,WORD PTR [THISIFS+2] ; [THISIFS] ;AN000; | ||
| 976 | STOSW ;AN000; | ||
| 977 | CDE_120: ;AN000; | ||
| 978 | POP DI ; retrieve dfl start ;AN000; | ||
| 979 | MOV WORD PTR CS:[THISDFL],DI ; Set [thisdfl] ;AN000; | ||
| 980 | MOV WORD PTR CS:[THISDFL+2],ES ;AN000; | ||
| 981 | ;AN000; | ||
| 982 | PUSH ES ; Set DS:SI -> DFL ;AN000; | ||
| 983 | POP DS ;AN000; | ||
| 984 | MOV SI,DI ;AN000; | ||
| 985 | ;AN000; | ||
| 986 | CALL CHECK_REAL_DEVICE ; this will set dfl_dev_real ;AN000; | ||
| 987 | ;AN000; | ||
| 988 | OR [SI.DFLL_FLAGS],DFL_INUSE ;AN000; | ||
| 989 | AND [SI.DFLL_FLAGS],NOT DFL_INPROG ;AN000; | ||
| 990 | ;AN000; | ||
| 991 | ;;;aliasCMP BL,TYPE_ALIAS ;AN000; | ||
| 992 | ;;;aliasJNE CDE_140 ;AN000; | ||
| 993 | ;;;aliasJMP ifs_990 ; go ret no carry ;AN000; | ||
| 994 | CDE_140: ;AN000; | ||
| 995 | invoke PREP_IFSR ; init req hdr ;AN000; | ||
| 996 | invoke DFL_TO_DF ;AN000; | ||
| 997 | JMP ifs_990 ;AN000; | ||
| 998 | ;AN000; | ||
| 999 | EndProc CREATE_DFL_ENTRY ;AN000; | ||
| 1000 | ;AN000; | ||
| 1001 | BREAK <DELETE_DFL_ENTRY - Delete DFL entry, remove from names list if alias> ;AN000; | ||
| 1002 | ;AN000; | ||
| 1003 | ;************************************************************************************ ;AN000; | ||
| 1004 | ; ;AN000; | ||
| 1005 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 1006 | ; ;AN000; | ||
| 1007 | ; Routine called by: IFS_ASSOPER ;AN000; | ||
| 1008 | ; ;AN000; | ||
| 1009 | ; Routines called: ;AN000; | ||
| 1010 | ; ;AN000; | ||
| 1011 | ; Inputs: ;AN000; | ||
| 1012 | ; [THISDFL] set ;AN000; | ||
| 1013 | ; ;AN000; | ||
| 1014 | ; Function: ;AN000; | ||
| 1015 | ; ;AN000; | ||
| 1016 | ; Outputs: ;AN000; | ||
| 1017 | ; carry clear: ;AN000; | ||
| 1018 | ; DFL entry deleted. ;AN000; | ||
| 1019 | ; carry set on error, ax - error ;AN000; | ||
| 1020 | ; ;AN000; | ||
| 1021 | ; Regs: everything preserved ;AN000; | ||
| 1022 | ; ;AN000; | ||
| 1023 | ;************************************************************************************ ;AN000; | ||
| 1024 | ;AN000; | ||
| 1025 | procedure DELETE_DFL_ENTRY,NEAR ;AN000; | ||
| 1026 | ;AN000; | ||
| 1027 | LDS SI,[THISDFL] ; simply reset in_use bit ;AN000; | ||
| 1028 | AND DS:[SI.DFLL_FLAGS],NOT DFL_INUSE ;AN000; | ||
| 1029 | ;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ; if alias, must remove name ;AN000; | ||
| 1030 | ;;;aliasJE DDE_20 ; from names list, and reset ;AN000; | ||
| 1031 | JMP ifs_1000 ;AN000; | ||
| 1032 | ;;;aliasDDE_20: ;AN000; | ||
| 1033 | ;;;aliasCALL EXIT_NAMES_LIST ; all alias indicies ;AN000; | ||
| 1034 | ;;;aliasJMP ifs_1000 ;AN000; | ||
| 1035 | ;AN000; | ||
| 1036 | EndProc DELETE_DFL_ENTRY ;AN000; | ||
| 1037 | ;AN000; | ||
| 1038 | ;BREAK <ENTER_NAMES_LIST - add alias name to Names List> ;AN000; | ||
| 1039 | ;;;alias ;AN000; | ||
| 1040 | ;************************************************************************************ ;AN000; | ||
| 1041 | ; ;AN000; | ||
| 1042 | ; ENTER_NAMES_LIST ;AN000; | ||
| 1043 | ; ;AN000; | ||
| 1044 | ; Routine called by: CREATE_DFL_ENTRY ;AN000; | ||
| 1045 | ; ;AN000; | ||
| 1046 | ; Routines called: DOS: DStrLen ;AN000; | ||
| 1047 | ; ;AN000; | ||
| 1048 | ; Inputs: ;AN000; | ||
| 1049 | ; DS:SI -> DFL ;AN000; | ||
| 1050 | ; ES:DI -> Target driver to attach to and parms. ;AN000; | ||
| 1051 | ; DW ASCIIZ - FS name ;AN000; | ||
| 1052 | ; DW n - number of parms ;AN000; | ||
| 1053 | ; DB ASCIIZ,... parms ;AN000; | ||
| 1054 | ; Function: ;AN000; | ||
| 1055 | ; Place one and only parameter (alias) into names list. ;AN000; | ||
| 1056 | ; Outputs: ;AN000; | ||
| 1057 | ; carry clear: name added ;AN000; | ||
| 1058 | ; carry set: AX error ;AN000; | ||
| 1059 | ; ;AN000; | ||
| 1060 | ; Notes: all preserved except AX ;AN000; | ||
| 1061 | ; ;AN000; | ||
| 1062 | ;************************************************************************************ ;AN000; | ||
| 1063 | ; ;AN000; | ||
| 1064 | ; procedure ENTER_NAMES_LIST ;AN000; | ||
| 1065 | ;SSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1066 | ; ;AN000; | ||
| 1067 | ; SaveReg <ES,DI,CX,DX,DS,SI> ;AN000; | ||
| 1068 | ; PUSH ES ;AN000; | ||
| 1069 | ; POP DS ;AN000; | ||
| 1070 | ; MOV SI,DI ;AN000; | ||
| 1071 | ; ADD SI,4 ; ds:si -> alias name ;AN000; | ||
| 1072 | ; CallInstall DStrlen,multDOS,37 ; get size of alias name in cx ;AN000; | ||
| 1073 | ; LES DI,[NLAddr] ; get address of names list ;AN000; | ||
| 1074 | ; MOV DX,WORD PTR ES:[DI] ; DX=total size of names list ;AN000; | ||
| 1075 | ; INC DI ;AN000; | ||
| 1076 | ; INC DI ;AN000; | ||
| 1077 | ; MOV AX,WORD PTR ES:[DI] ; AX=used size of names list ;AN000; | ||
| 1078 | ; PUSH AX ; save used size for dfl_alias_index ;AN000; | ||
| 1079 | ; ADD AX,CX ; AX=hopefully new used size ;AN000; | ||
| 1080 | ; CMP DX,AX ; check that new string fits ;AN000; | ||
| 1081 | ; JAE ENL_20 ;AN000; | ||
| 1082 | ; MOV AX,error_out_of_structures ; error - doesn't fit ;AN000; | ||
| 1083 | ; JMP ENL_980 ; ret w/carry ;AN000; | ||
| 1084 | ;NL_20: ; ok - fits ;AN000; | ||
| 1085 | ; STOSW ; store new used size ;AN000; | ||
| 1086 | ; POP AX ; get index from stack ;AN000; | ||
| 1087 | ; PUSH AX ;AN000; | ||
| 1088 | ; INC DI ;AN000; | ||
| 1089 | ; INC DI ;AN000; | ||
| 1090 | ; ADD DI,AX ; Space to spot in list to put name ;AN000; | ||
| 1091 | ; REP MOVSB ;AN000; | ||
| 1092 | ; RestoreReg <SI,DS> ; Set dfl alias index to byte offset ;AN000; | ||
| 1093 | ; POP AX ; (+4) of name in list ;AN000; | ||
| 1094 | ; MOV DS:WORD PTR [SI.DFL_ALIAS_INDEX],AX ;AN000; | ||
| 1095 | ; JMP ENL_990 ; go ret no carry ;AN000; | ||
| 1096 | ; ;AN000; | ||
| 1097 | ; ;AN000; | ||
| 1098 | ;NL_980: ; Return area ;AN000; | ||
| 1099 | ; STC ; error ;AN000; | ||
| 1100 | ; RestoreReg <SI,DS,DX,CX,DI,ES> ;AN000; | ||
| 1101 | ; return ;AN000; | ||
| 1102 | ;NL_990: ;AN000; | ||
| 1103 | ; CLC ; no error ;AN000; | ||
| 1104 | ; RestoreReg <DX,CX,DI,ES> ;AN000; | ||
| 1105 | ;NL_1000: ;AN000; | ||
| 1106 | ; return ;AN000; | ||
| 1107 | ; ;AN000; | ||
| 1108 | ; ;AN000; | ||
| 1109 | ;ndProc ENTER_NAMES_LIST ;AN000; | ||
| 1110 | ; ;AN000; | ||
| 1111 | ; ;AN000; | ||
| 1112 | ;REAK <EXIT_NAMES_LIST - remove alias name from Names List> ;AN000; | ||
| 1113 | ; ;AN000; | ||
| 1114 | ;************************************************************************************ ;AN000; | ||
| 1115 | ; ;AN000; | ||
| 1116 | ; EXIT_NAMES_LIST ;AN000; | ||
| 1117 | ; ;AN000; | ||
| 1118 | ; Routine called by: DELETE_DFL_ENTRY ;AN000; | ||
| 1119 | ; ;AN000; | ||
| 1120 | ; Routines called: DOS: StrLen ;AN000; | ||
| 1121 | ; ;AN000; | ||
| 1122 | ; Inputs: ;AN000; | ||
| 1123 | ; DS:SI -> DFL ;AN000; | ||
| 1124 | ; ;AN000; | ||
| 1125 | ; Function: ;AN000; | ||
| 1126 | ; Remove alias name from Names List ;AN000; | ||
| 1127 | ; Outputs: ;AN000; | ||
| 1128 | ; name removed ;AN000; | ||
| 1129 | ; ;AN000; | ||
| 1130 | ; Notes: all preserved ;AN000; | ||
| 1131 | ; ;AN000; | ||
| 1132 | ;************************************************************************************ ;AN000; | ||
| 1133 | ; ;AN000; | ||
| 1134 | ; procedure EXIT_NAMES_LIST ;AN000; | ||
| 1135 | ;SSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1136 | ; ;AN000; | ||
| 1137 | ; MOV DX,DS:[SI.DFL_ALIAS_INDEX] ; DX=index ;AN000; | ||
| 1138 | ; LES DI,[NLAddr] ;AN000; | ||
| 1139 | ; MOV AX,ES:WORD PTR [DI+2] ; AX=used size ;AN000; | ||
| 1140 | ; SaveReg <ES,DI,AX> ;AN000; | ||
| 1141 | ; ADD DI,DX+4 ;AN000; | ||
| 1142 | ; CallInstall StrLen,multDOS,18 ; CX=size of alias name ;AN000; | ||
| 1143 | ; PUSH ES ;AN000; | ||
| 1144 | ; POP DS ;AN000; | ||
| 1145 | ; MOV SI,DI ;AN000; | ||
| 1146 | ; ADD SI,CX ;AN000; | ||
| 1147 | ; MOV BX,CX ;AN000; | ||
| 1148 | ; SUB AX,SI ; CX= #bytes to move = ;AN000; | ||
| 1149 | ; MOV CX,AX ; used size - index of next name ;AN000; | ||
| 1150 | ; REP MOVSB ; move names up ;AN000; | ||
| 1151 | ; ;AN000; | ||
| 1152 | ; RestoreReg <AX,DI,ES> ; adjust used size ;AN000; | ||
| 1153 | ; SUB AX,BX ;AN000; | ||
| 1154 | ; MOV ES:WORD PTR [DI+2],AX ;AN000; | ||
| 1155 | ; ;AN000; | ||
| 1156 | ; LDS SI,[DFLAddr] ; loop thru all dfl entries to ;AN000; | ||
| 1157 | ; MOV DI,SIZE DFL_LIST ; adjust alias indicies above ;AN000; | ||
| 1158 | ; MOV CL,[DFLCount] ; index removed ;AN000; | ||
| 1159 | ; XOR CH,CH ;AN000; | ||
| 1160 | ;XNL_20: ; ** Loop here on dfl entries ;AN000; | ||
| 1161 | ; TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000; | ||
| 1162 | ; JZ EXNL_40 ;AN000; | ||
| 1163 | ; MOV AX,DS:[SI.DFL_ALIAS_INDEX] ; 0 if not alias ;AN000; | ||
| 1164 | ; CMP AX,DX ;AN000; | ||
| 1165 | ; JB EXNL_40 ;AN000; | ||
| 1166 | ; SUB AX,BX ; adjust by size of name deleted ;AN000; | ||
| 1167 | ; MOV DS:[SI.DFL_ALIAS_INDEX],AX ;AN000; | ||
| 1168 | ;XNL_40: ;AN000; | ||
| 1169 | ; ADD SI,DX ;AN000; | ||
| 1170 | ; LOOP EXNL_20 ;AN000; | ||
| 1171 | ; ;AN000; | ||
| 1172 | ; JMP ifs_1000 ; go return ;AN000; | ||
| 1173 | ; ;AN000; | ||
| 1174 | ; ;AN000; | ||
| 1175 | ;ndProc EXIT_NAMES_LIST ;AN000; | ||
| 1176 | ;AN000; | ||
| 1177 | BREAK <DFL_SINGLE_FILE_CHECK - support single file check> ;AN000; | ||
| 1178 | ;AN000; | ||
| 1179 | ;************************************************************************************ ;AN000; | ||
| 1180 | ; ;AN000; | ||
| 1181 | ; DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 1182 | ; ;AN000; | ||
| 1183 | ; Routine called by: IFS_FILE_ATTRIBUTES ;AN000; | ||
| 1184 | ; ;AN000; | ||
| 1185 | ; Inputs: ;AN000; | ||
| 1186 | ; [THISDFL] ;AN000; | ||
| 1187 | ; [WFP_START] ;AN000; | ||
| 1188 | ; ;AN000; | ||
| 1189 | ; Function: ;AN000; | ||
| 1190 | ; IF [THISDFL] .NOT. NULL THEN ;AN000; | ||
| 1191 | ; DO ;AN000; | ||
| 1192 | ; Get IFS header from DFL_IFS_HDR ;AN000; | ||
| 1193 | ; IF IFSDEVICE true THEN ;AN000; | ||
| 1194 | ; DO ;AN000; | ||
| 1195 | ; Call DFL_TO_DF ;AN000; | ||
| 1196 | ; Clear carry ;AN000; | ||
| 1197 | ; ENDDO ;AN000; | ||
| 1198 | ; ELSE Set error - device doesn't support single file fcn ;AN000; | ||
| 1199 | ; ENDIF ;AN000; | ||
| 1200 | ; ENDDO ;AN000; | ||
| 1201 | ; ELSE DO ;AN000; | ||
| 1202 | ; CALL DFL_MATCH ;AN000; | ||
| 1203 | ; IF match found THEN ;AN000; | ||
| 1204 | ; DO ;AN000; | ||
| 1205 | ; Get IFS header from DFL_IFS_HDR ;AN000; | ||
| 1206 | ; IF IFSDEVICE true THEN ;AN000; | ||
| 1207 | ; DO ;AN000; | ||
| 1208 | ; Call DFL_TO_DF ;AN000; | ||
| 1209 | ; Clear carry ;AN000; | ||
| 1210 | ; ENDDO ;AN000; | ||
| 1211 | ; ELSE Set error - device doesn't support single file fcn ;AN000; | ||
| 1212 | ; ENDDO ;AN000; | ||
| 1213 | ; ELSE Set error - device not IFS ;AN000; | ||
| 1214 | ; ENDIF ;AN000; | ||
| 1215 | ; ENDDO ;AN000; | ||
| 1216 | ; ENDIF ;AN000; | ||
| 1217 | ; ;AN000; | ||
| 1218 | ; ;AN000; | ||
| 1219 | ; Outputs: ;AN000; | ||
| 1220 | ; no carry: carry: error ;AN000; | ||
| 1221 | ; [THISIFS] set ;AN000; | ||
| 1222 | ; ES:BX -> IFSRH ;AN000; | ||
| 1223 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1224 | ; ds - IFSSEG ;AN000; | ||
| 1225 | ; ;AN000; | ||
| 1226 | ;************************************************************************************ ;AN000; | ||
| 1227 | ;AN000; | ||
| 1228 | procedure DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 1229 | ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1230 | ;; assume thisdfl aready set up here ;AN000; | ||
| 1231 | ;; don't want to write another parse routine ;AN000; | ||
| 1232 | ;; CMP WORD PTR [THISDFL],MINUS_ONE ;AN000; | ||
| 1233 | ;; JNZ DSFC_20 ;AN000; | ||
| 1234 | ;; CALL DFL_MATCH ; check for dfl entry ;AN000; | ||
| 1235 | ;; JNC DSFC_20 ;AN000; | ||
| 1236 | ;; MOV AX,error_not_ifs_device ;AN000; | ||
| 1237 | ;; JMP ifs_1000 ;AN000; | ||
| 1238 | ;AN000; | ||
| 1239 | DSFC_20: ;AN000; | ||
| 1240 | LES DI,CS:[THISDFL] ;AN000; | ||
| 1241 | LES DI,ES:[DI.DFLL_IFS_HDR] ; check that ifs device supports ;AN000; | ||
| 1242 | TEST ES:[DI.IFS_ATTRIBUTE],IFSDEVICE ; single file function ;AN000; | ||
| 1243 | JNZ DSFC_60 ;AN000; | ||
| 1244 | MOV AX,error_file_not_found ; no - set error & go return w/carry ;AN000; | ||
| 1245 | JMP ifs_980 ;AN000; | ||
| 1246 | DSFC_60: ;AN000; | ||
| 1247 | invoke DFL_TO_DF ;AN000; | ||
| 1248 | JMP ifs_990 ;AN000; | ||
| 1249 | ;AN000; | ||
| 1250 | ;AN000; | ||
| 1251 | EndProc DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 1252 | ;AN000; | ||
| 1253 | ;BREAK <PROCESS_ALIAS -- add alias name> ;AN000; | ||
| 1254 | ; ;AN000; | ||
| 1255 | ;************************************************************************************ ;AN000; | ||
| 1256 | ; ;AN000; | ||
| 1257 | ; PROCESS_ALIAS ;AN000; | ||
| 1258 | ; ;AN000; | ||
| 1259 | ; Called by: ATTACH_START ;AN000; | ||
| 1260 | ; ;AN000; | ||
| 1261 | ; Routines called: DFL_MATCH ;AN000; | ||
| 1262 | ; CREATE_DFL_ENTRY ;AN000; | ||
| 1263 | ; ;AN000; | ||
| 1264 | ; Inputs: ;AN000; | ||
| 1265 | ; DS:SI -> ASCIIZ source name ;AN000; | ||
| 1266 | ; ES:DI -> ALIAS name ;AN000; | ||
| 1267 | ; ;AN000; | ||
| 1268 | ; Function: ;AN000; | ||
| 1269 | ; ;AN000; | ||
| 1270 | ; Regs: ;AN000; | ||
| 1271 | ; ;AN000; | ||
| 1272 | ;************************************************************************************ ;AN000; | ||
| 1273 | ; ;AN000; | ||
| 1274 | ; Procedure PROCESS_ALIAS,NEAR ;AN000; | ||
| 1275 | ;SSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1276 | ; ;AN000; | ||
| 1277 | ; CALL DFL_MATCH ;AN000; | ||
| 1278 | ; JC PA_20 ;AN000; | ||
| 1279 | ;;;??? match found, error or override??? ;AN000; | ||
| 1280 | ;A_20: ;AN000; | ||
| 1281 | ; CALL CREATE_DFL_ENTRY ;AN000; | ||
| 1282 | ; JMP ifs_1000 ;AN000; | ||
| 1283 | ; ;AN000; | ||
| 1284 | ; ;AN000; | ||
| 1285 | ;ndProc PROCESS_ALIAS ;AN000; | ||
| 1286 | ;AN000; | ||
| 1287 | ;AN000; | ||
| 1288 | BREAK <DFL_MATCH -- check for DFL entry> ;AN000; | ||
| 1289 | ;AN000; | ||
| 1290 | ;************************************************************************************ ;AN000; | ||
| 1291 | ; ;AN000; | ||
| 1292 | ; DFL_MATCH ;AN000; | ||
| 1293 | ; ;AN000; | ||
| 1294 | ; Called by: ATTACH_START CONSIST_SFT ;AN000; | ||
| 1295 | ; IFS_DELETE ;AN000; | ||
| 1296 | ; ;AN000; | ||
| 1297 | ; Routines called: ;AN000; | ||
| 1298 | ; ;AN000; | ||
| 1299 | ; Inputs: ;AN000; | ||
| 1300 | ; DS:SI -> Asciiz Device name ;AN000; | ||
| 1301 | ; ;AN000; | ||
| 1302 | ; Function: ;AN000; | ||
| 1303 | ; Search DFL for match on name ;AN000; | ||
| 1304 | ; If match found - set [THISDFL] and clear carry ;AN000; | ||
| 1305 | ; Else set carry ;AN000; | ||
| 1306 | ; ;AN000; | ||
| 1307 | ; Output: ;AN000; | ||
| 1308 | ; carry clear - match found, [THISDFL] set ;AN000; | ||
| 1309 | ; carry set - match not found ;AN000; | ||
| 1310 | ; ;AN000; | ||
| 1311 | ; Regs: all preserved ;AN000; | ||
| 1312 | ; ;AN000; | ||
| 1313 | ;************************************************************************************ ;AN000; | ||
| 1314 | ;AN000; | ||
| 1315 | Procedure DFL_MATCH ;AN000; | ||
| 1316 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1317 | ;AN000; | ||
| 1318 | SaveReg <DS,SI,ES,DI,AX,CX,BX> ; save registers ;AN000; | ||
| 1319 | ;AN000; | ||
| 1320 | SaveReg <CS> ; store canonicalized version of ;AN000; | ||
| 1321 | RestoreReg <ES> ; source asciiz dev name in ;AN000; | ||
| 1322 | MOV DI,OFFSET TEMPBUF+10 ; tempbuf+10 ;AN000; | ||
| 1323 | MOV CX,10 ; devs max of 8 ch and : and nul ;AN000; | ||
| 1324 | DM_20: ;AN000; | ||
| 1325 | LODSB ;AN000; | ||
| 1326 | CallInstall UCase,multDOS,19,<AX>,<BX> ;AN000; | ||
| 1327 | STOSB ;AN000; | ||
| 1328 | OR AL,AL ;AN000; | ||
| 1329 | JZ DM_60 ;AN000; | ||
| 1330 | CMP AL,"." ;AN000; | ||
| 1331 | JZ DM_40 ;AN000; | ||
| 1332 | LOOP DM_20 ;AN000; | ||
| 1333 | DM_40: ;AN000; | ||
| 1334 | XOR AL,AL ;AN000; | ||
| 1335 | MOV BYTE PTR ES:[DI-1],AL ;AN000; | ||
| 1336 | DM_60: ;AN000; | ||
| 1337 | CMP BYTE PTR ES:[DI-2],":" ;AN000; | ||
| 1338 | JNZ DM_80 ;AN000; | ||
| 1339 | MOV BYTE PTR ES:[DI-2],0 ;AN000; | ||
| 1340 | ;AN000; | ||
| 1341 | DM_80: ;AN000; | ||
| 1342 | XOR AX,AX ; ax is counter through DFL entries ;AN000; | ||
| 1343 | LDS SI,[DFLAddr] ; dssi -> dfl entry ;AN000; | ||
| 1344 | DM_100: ; <<<<< matching loop >>>>> ;AN000; | ||
| 1345 | CMP AL,CS:[DFLCount] ;AN000; | ||
| 1346 | JAE DM_980 ;AN000; | ||
| 1347 | TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000; | ||
| 1348 | JZ DM_160 ;AN000; | ||
| 1349 | SaveReg <SI> ; dfl entry offset ;AN000; | ||
| 1350 | ADD SI,DFL_DEV_NAME ;AN000; | ||
| 1351 | MOV DI,OFFSET TEMPBUF ;AN000; | ||
| 1352 | CALL CONVERT_NAME_ASCIIZ ; moves dev name into tempbuf ;AN000; | ||
| 1353 | ; in asciiz form - di preserved ;AN000; | ||
| 1354 | MOV SI,OFFSET TEMPBUF+10 ;AN000; | ||
| 1355 | Call PRN_CHECK ; if si->prn - chg si->lpt1 ;AN012; | ||
| 1356 | CallInstall StrCmp,multDOS,30,<AX>,<AX> ; check for match ;AN000; | ||
| 1357 | RestoreReg <SI> ; dfl entry offset ;AN000; | ||
| 1358 | JZ DM_990 ;AN000; | ||
| 1359 | DM_160: ;AN000; | ||
| 1360 | ADD SI,SIZE DFLL_LIST ;AN000; | ||
| 1361 | INC AL ;AN000; | ||
| 1362 | JMP SHORT DM_100 ; go up & try next entry ;AN000; | ||
| 1363 | ;AN000; | ||
| 1364 | DM_980: ;AN000; | ||
| 1365 | SaveReg <AX,CS> ; set thisdfl null on error ;AN020; | ||
| 1366 | RestoreReg <DS> ;AN020; | ||
| 1367 | MOV AX,NULL_PTR ;AN020; | ||
| 1368 | MOV WORD PTR [THISDFL],AX ;AN020; | ||
| 1369 | MOV WORD PTR [THISDFL+2],AX ;AN020; | ||
| 1370 | RestoreReg <AX> ;AN020; | ||
| 1371 | STC ;AN000; | ||
| 1372 | JMP SHORT DM_1000 ;AN000; | ||
| 1373 | DM_990: ;AN000; | ||
| 1374 | TEST DS:[SI.DFLL_FLAGS],dfl_paused ; if printer paused, no match ;AN019; | ||
| 1375 | JNZ DM_980 ;AN019; | ||
| 1376 | |||
| 1377 | MOV CS:WORD PTR [THISDFL],SI ;AN000; | ||
| 1378 | MOV CS:WORD PTR [THISDFL+2],DS ;AN000; | ||
| 1379 | CLC ; es:di -> dfl on match ;AN000; | ||
| 1380 | DM_1000: ;AN000; | ||
| 1381 | RestoreReg <BX,CX,AX,DI,ES,SI,DS> ; restore regs ;AN000; | ||
| 1382 | return ;AN000; | ||
| 1383 | ;AN000; | ||
| 1384 | EndProc DFL_MATCH ;AN000; | ||
| 1385 | ;AN000; | ||
| 1386 | BREAK <SFT_TO_SFF -- Convert SFT to SFF> ;AN000; | ||
| 1387 | ;AN000; | ||
| 1388 | ;************************************************************************************ ;AN000; | ||
| 1389 | ; ;AN000; | ||
| 1390 | ; SFT_TO_SFF ;AN000; | ||
| 1391 | ; ;AN000; | ||
| 1392 | ; Inputs: ;AN000; | ||
| 1393 | ; [THISSFT] set ;AN000; | ||
| 1394 | ; DS - DOSGROUP ;AN000; | ||
| 1395 | ; Function: ;AN000; | ||
| 1396 | ; Load SFF from SFT ;AN000; | ||
| 1397 | ; ;AN000; | ||
| 1398 | ; SFF_TYPE = 0 ;AN000; | ||
| 1399 | ; SFF_TYPE+1 = 0 ;AN000; | ||
| 1400 | ; SFF_FLAGS = SF_FLAGS ;AN000; | ||
| 1401 | ; SFF_MODE = SF_MODE ;AN000; | ||
| 1402 | ; SFF_RESV1 = 0 ;AN000; | ||
| 1403 | ; SFF_ATTR = SF_ATTR ;AN000; | ||
| 1404 | ; SFF_UID = SF_UID ;AN000; | ||
| 1405 | ; SFF_PID = SF_PID ;AN000; | ||
| 1406 | ; SFF_SIZE = SF_SIZE ;AN000; | ||
| 1407 | ; SFF_POSITION = SF_POSITION ;AN000; | ||
| 1408 | ; SFF_TIME = SF_TIME ;AN000; | ||
| 1409 | ; SFF_DATE = SF_DATE ;AN000; | ||
| 1410 | ; SFF_NAME = SF_NAME ;AN000; | ||
| 1411 | ; SFF_EXT = SF_NAME+8 ;AN000; | ||
| 1412 | ; SFF_RESV2 = 0 ;AN000; | ||
| 1413 | ; SFF_SF_ID = math on sft address | ||
| 1414 | ; SFF_FSDA = SF_CLUSPOS ;AN000; | ||
| 1415 | ; SFF_FSDA + 2 = SF_DIRSEC ;AN000; | ||
| 1416 | ; SFF_FSDA + 4 = SF_DIRSEC+2 ;AN000; | ||
| 1417 | ; SFF_FSDA + 6 = SF_LSTCLUS ;AN000; | ||
| 1418 | ; Outputs: ;AN000; | ||
| 1419 | ; SF loaded ;AN000; | ||
| 1420 | ; ES:BX -> IFSRH ;AN000; | ||
| 1421 | ; IFSR_OPEN_CB@ set ;AN000; | ||
| 1422 | ; If SetDeviceCB set then IFSR_DEVICE_CB@ set ;AN000; | ||
| 1423 | ; DS - IFSSEG ;AN000; | ||
| 1424 | ; ;AN000; | ||
| 1425 | ; notes: all except ES,BX,DS preserved ;AN000; | ||
| 1426 | ;************************************************************************************ ;AN000; | ||
| 1427 | ;AN000; | ||
| 1428 | procedure SFT_TO_SFF,NEAR ;AN000; | ||
| 1429 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1430 | ;AN000; | ||
| 1431 | SaveReg <DI,SI,AX,CX> ; save regs ;AN000; | ||
| 1432 | ;AN000; | ||
| 1433 | SaveReg <CS> ;AN000; | ||
| 1434 | RestoreReg <ES> ;AN000; | ||
| 1435 | ASSUME ES:IFSSEG ;AN000; | ||
| 1436 | MOV DI,OFFSET SFF1 ; DS:SI -> SFT ;AN000; | ||
| 1437 | LDS SI,[THISSFT] ; ES:DI -> SFF ;AN000; | ||
| 1438 | ;AN000; | ||
| 1439 | SaveReg <DI> ; save SFF offset ;AN000; | ||
| 1440 | MOV AH,CBTYPE_SFF ; sff_type ;AN000; | ||
| 1441 | XOR AL,AL ;AN000; | ||
| 1442 | STOSW ;AN000; | ||
| 1443 | ;AN000; | ||
| 1444 | MOV AX,WORD PTR [SI.SF_FLAGS] ; sff_flags ;AN000; | ||
| 1445 | STOSW ;AN015; | ||
| 1446 | MOV AX,WORD PTR [SI.SF_MODE] ; sff_mode ;AN000; | ||
| 1447 | ;;;;;;;;PUSH BX ;AD015; | ||
| 1448 | ;;;;;;;;AND BX,8000H ;AD015; | ||
| 1449 | ;;;;;;;;OR AX,BX ;AD015; | ||
| 1450 | STOSW ;AN000; | ||
| 1451 | ;;;;;;;;POP AX ;AD015; | ||
| 1452 | ;;;;;;;;AND AX,0EFFFH ;AD015; | ||
| 1453 | ;;;;;;;;STOSW ;AD015; | ||
| 1454 | ;;;;;;;;MOV AX,WORD PTR [SI.SF_IOMODE] ; sff_iomode ;AD024; | ||
| 1455 | XOR AX,AX ; just put zero in reserved area ;AN024; | ||
| 1456 | STOSW ;AN000; | ||
| 1457 | MOV AL,BYTE PTR [SI.SF_ATTR] ; sff_attr ;AN000; | ||
| 1458 | ;;;;;;;;MOV AH,BYTE PTR [SI.SF_ATTR_HI] ; sff_attr_hi - no longer exists ;AD024; | ||
| 1459 | STOSW ;AN000; | ||
| 1460 | MOV AX,WORD PTR [SI.SF_UID] ; sff_uid ;AN000; | ||
| 1461 | STOSW ;AN000; | ||
| 1462 | MOV AX,WORD PTR [SI.SF_PID] ; sff_pid ;AN000; | ||
| 1463 | STOSW ;AN000; | ||
| 1464 | SaveReg <SI> ;AN000; | ||
| 1465 | ADD SI,SF_SIZE ;AN000; | ||
| 1466 | MOV CX,4 ;AN000; | ||
| 1467 | REP MOVSW ; sff_size & position ;AN000; | ||
| 1468 | RestoreReg <SI> ;AN000; | ||
| 1469 | MOV AX,WORD PTR [SI.SF_TIME] ; sff_time ;AN000; | ||
| 1470 | STOSW ;AN000; | ||
| 1471 | MOV AX,WORD PTR [SI.SF_DATE] ; sff_date ;AN000; | ||
| 1472 | STOSW ;AN000; | ||
| 1473 | ;AN000; | ||
| 1474 | SaveReg <SI> ; sff_name/ext/cp ;AN000; | ||
| 1475 | ADD SI,SF_NAME ;AN000; | ||
| 1476 | MOV CX,11 ; (name - 11, cp - 2 bytes) cp out ;AC024; | ||
| 1477 | REP MOVSB ;AN000; | ||
| 1478 | XOR AX,AX ;AN024; | ||
| 1479 | STOSW ; just put zero in reserved area ;AN024; | ||
| 1480 | |||
| 1481 | RestoreReg <SI> ; sff_sf_id ;AN000; | ||
| 1482 | SaveReg <SI,DS,DS> ; calculate based on sft address ;AN016 | ||
| 1483 | RestoreReg <AX> ;AN016; | ||
| 1484 | MOV CL,4 ;AN016; | ||
| 1485 | SHL AX,CL ;AN016; | ||
| 1486 | ADD SI,AX ;AN016; | ||
| 1487 | RestoreReg <AX> ;AN016; | ||
| 1488 | AND AX,0F000H ;AN016; | ||
| 1489 | ADD AX,SI ;AN016; | ||
| 1490 | STOSW ;AN016; | ||
| 1491 | RestoreReg <SI> ;AN016; | ||
| 1492 | ;AN000; | ||
| 1493 | ADD DI,SIZE SFF_RESV ; sff_fsda 1st word ;AN000; | ||
| 1494 | SaveReg <SI> ; save si for issft case ;AN015; | ||
| 1495 | ADD SI,SF_CLUSPOS ;AN000; | ||
| 1496 | MOV CX,3 ;AC017; | ||
| 1497 | REP MOVSW ;AN000; | ||
| 1498 | ;;;;;;;;ADD SI,12 ;AN017;;AD024; | ||
| 1499 | ;;;;;;;;MOVSW ;AN017;;AD024; | ||
| 1500 | RestoreReg <SI> ;AN015; | ||
| 1501 | MOV AX,WORD PTR [SI.SF_LSTCLUS] ; manually put lstclus in fsda+6 ;AN024; | ||
| 1502 | STOSW ;AN024; | ||
| 1503 | ;AN000; | ||
| 1504 | TEST CS:[IFSPROC_FLAGS],ISSFT ;AN000; | ||
| 1505 | JZ SFT_20 ;AN000; | ||
| 1506 | MOV AX,WORD PTR [SI.SF_IFS_HDR] ; Set [THISIFS] only if ;AN000; | ||
| 1507 | MOV WORD PTR CS:[THISIFS],AX ; no yet set by cds_to_cd or ;AN000; | ||
| 1508 | MOV AX,WORD PTR [SI.SF_IFS_HDR+2] ; dfl_to_df ;AN000; | ||
| 1509 | MOV WORD PTR CS:[THISIFS+2],AX ;AN000; | ||
| 1510 | ;AN000; | ||
| 1511 | SFT_20: ;AN000; | ||
| 1512 | RestoreReg <DI> ; restore ES:DI -> start of SFF ;AN000; | ||
| 1513 | SaveReg <ES> ; set DS:DI -> SFF ;AN000; | ||
| 1514 | RestoreReg <DS> ;AN000; | ||
| 1515 | ASSUME DS:IFSSEG ;AN000; | ||
| 1516 | ;AN000; | ||
| 1517 | MOV BX,OFFSET IFSR ; set ES:BX -> IFSRH ;AN000; | ||
| 1518 | ;AN000; | ||
| 1519 | TEST CS:IFSPROC_FLAGS,ISCTLFCN ;AN000; | ||
| 1520 | JNZ SFT_40 ; API fcn - ;AN000; | ||
| 1521 | MOV WORD PTR ES:[BX.IFSR_OPEN_CB@],DI ; set IFSR_OPEN_CB@ ;AN000; | ||
| 1522 | MOV WORD PTR ES:[BX.IFSR_OPEN_CB@+2],DS ;AN000; | ||
| 1523 | JMP SFT_60 ;AN000; | ||
| 1524 | SFT_40: ; Ctl fcn - ;AN000; | ||
| 1525 | MOV WORD PTR ES:[BX.IFSR_CB@],DI ; set IFSR_CB@ ;AN000; | ||
| 1526 | MOV WORD PTR ES:[BX.IFSR_CB@+2],DS ;AN000; | ||
| 1527 | ;AN000; | ||
| 1528 | SFT_60: ;AN000; | ||
| 1529 | TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to set ;AN000; | ||
| 1530 | JZ SFT_1000 ; device cb or not ;AN000; | ||
| 1531 | LDS SI,[THISSFT] ;AN000; | ||
| 1532 | CMP WORD PTR DS:[SI.SF_DEVPTR],NULL_PTR ; null if seq ;AN000; | ||
| 1533 | JE SFT_1000 ;AN000; | ||
| 1534 | TEST DS:[SI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007; | ||
| 1535 | LDS SI,DS:[SI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AM007; | ||
| 1536 | JNZ SFT_100 ; jmp if dfl ;AN000; | ||
| 1537 | MOV WORD PTR CS:SAVE_CB@,SI ; CDS ;AN000; | ||
| 1538 | MOV WORD PTR CS:SAVE_CB@+2,DS ;AN000; | ||
| 1539 | TEST DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000; | ||
| 1540 | JZ SFT_1000 ;AN000; | ||
| 1541 | CALL CDS_TO_CD ;AN000; | ||
| 1542 | JMP SHORT SFT_1000 ;AN000; | ||
| 1543 | ;AN000; | ||
| 1544 | SFT_100: ;AN000; | ||
| 1545 | MOV WORD PTR CS:[THISDFL],SI ; DFL ;AN000; | ||
| 1546 | MOV WORD PTR CS:[THISDFL+2],DS ; set this cause dfl-df ;AN000; | ||
| 1547 | CALL DFL_TO_DF ; expects it ;AN000; | ||
| 1548 | ;AN000; | ||
| 1549 | ;AN000; | ||
| 1550 | SFT_1000: ;AN000; | ||
| 1551 | RestoreReg <CX,AX,SI,DI> ; restore regs ;AN000; | ||
| 1552 | SaveReg <CS> ;AN000; | ||
| 1553 | RestoreReg <DS> ; set ds -ifsseg ;AN000; | ||
| 1554 | ;AN000; | ||
| 1555 | return ;AN000; | ||
| 1556 | ;AN000; | ||
| 1557 | EndProc SFT_TO_SFF ;AN000; | ||
| 1558 | ;AN000; | ||
| 1559 | ;AN000; | ||
| 1560 | BREAK <SFF_TO_SFT -- Convert SFF to SFT> ;AN000; | ||
| 1561 | ;AN000; | ||
| 1562 | ;************************************************************************************ ;AN000; | ||
| 1563 | ; ;AN000; | ||
| 1564 | ; SFF_TO_SFT ;AN000; | ||
| 1565 | ; ;AN000; | ||
| 1566 | ; Inputs: ;AN000; | ||
| 1567 | ; [THISSFT] set ;AN000; | ||
| 1568 | ; Function: ;AN000; | ||
| 1569 | ; Update SFT with SFF ;AN000; | ||
| 1570 | ; SF_FLAGS = SFF_FLAGS ;AN000; | ||
| 1571 | ; SF_MODE = SFF_MODE ;AN000; | ||
| 1572 | ; SF_ATTR = SFF_ATTR ;AN000; | ||
| 1573 | ; SF_UID = SFF_UID ;AN000; | ||
| 1574 | ; SF_PID = SFF_PID ;AN000; | ||
| 1575 | ; SF_SIZE = SFF_SIZE ;AN000; | ||
| 1576 | ; SF_POSITION = SFF_POSITION ;AN000; | ||
| 1577 | ; SF_TIME = SFF_TIME ;AN000; | ||
| 1578 | ; SF_DATE = SFF_DATE ;AN000; | ||
| 1579 | ; SF_NAME = SFF_NAME ;AN000; | ||
| 1580 | ; SF_NAME+8 = SFF_EXT ;AN000; | ||
| 1581 | ; SF_CLUSPOS = SFF_FSDA ;AN000; | ||
| 1582 | ; SF_DIRSEC = SFF_FSDA + 2 ;AN000; | ||
| 1583 | ; SF_DIRSEC+2 = SFF_FSDA + 4 ;AN000; | ||
| 1584 | ; SF_LSTCLUS = SFF_FSDA + 6 ;AN000; | ||
| 1585 | ; ;AN000; | ||
| 1586 | ; Outputs: ;AN000; | ||
| 1587 | ; SFT loaded ;AN000; | ||
| 1588 | ; notes: all regs preserved ;AN000; | ||
| 1589 | ; ;AN000; | ||
| 1590 | ;************************************************************************************ ;AN000; | ||
| 1591 | ;AN000; | ||
| 1592 | procedure SFF_TO_SFT,NEAR ;AN000; | ||
| 1593 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1594 | ;AN000; | ||
| 1595 | SaveReg <ES,DI,DS,SI,AX,CX> ; save regs ;AC003; | ||
| 1596 | ;AN000; | ||
| 1597 | PUSH SS ;AN000; | ||
| 1598 | POP DS ;AN000; | ||
| 1599 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1600 | LES DI,[THISSFT] ; DS:SI -> SFF ;AN000; | ||
| 1601 | PUSH CS ;AN000; | ||
| 1602 | POP DS ;AN000; | ||
| 1603 | ASSUME DS:IFSSEG ;AN000; | ||
| 1604 | MOV SI,OFFSET SFF1 ; ES:DI -> SFT ;AN000; | ||
| 1605 | INC SI ;AN000; | ||
| 1606 | INC SI ;AN000; | ||
| 1607 | ;AN000; | ||
| 1608 | LODSW ; sff_flags ;AN000; | ||
| 1609 | ;;;;;;;;AND AX,0EFFFH ; (hi bit sft_flags - also mode ) ;AD015; | ||
| 1610 | MOV WORD PTR ES:[DI.SF_FLAGS],AX ; sft_flags ;AC015; | ||
| 1611 | LODSW ;AN000; | ||
| 1612 | ;;;;;;;;AND AX,0EFFFH ;AD015; | ||
| 1613 | MOV WORD PTR ES:[DI.SF_MODE],AX ; sft_mode ;AC015; | ||
| 1614 | LODSW ;AN000; | ||
| 1615 | ;;;;;;;;MOV WORD PTR ES:[DI.SF_IOMODE],AX ; sft_iomode ...no longer exists ;AD024; | ||
| 1616 | LODSW ;AN000; | ||
| 1617 | MOV BYTE PTR ES:[DI.SF_ATTR],AL ; sft_attr ;AN000; | ||
| 1618 | ;;;;;;;;MOV BYTE PTR ES:[DI.SF_ATTR_HI],AH ; no longer exists ;AD024; | ||
| 1619 | LODSW ;AN000; | ||
| 1620 | MOV WORD PTR ES:[DI.SF_UID],AX ; sft_uid ;AN000; | ||
| 1621 | LODSW ;AN000; | ||
| 1622 | MOV WORD PTR ES:[DI.SF_PID],AX ; sft_pid ;AN000; | ||
| 1623 | SaveReg <DI> ;AN000; | ||
| 1624 | ADD DI,SF_SIZE ;AN000; | ||
| 1625 | MOV CX,4 ;AN000; | ||
| 1626 | REP MOVSW ; sft_size & position ;AN000; | ||
| 1627 | RestoreReg <DI> ;AN000; | ||
| 1628 | LODSW ;AN000; | ||
| 1629 | MOV WORD PTR ES:[DI.SF_TIME],AX ; sft_time ;AN000; | ||
| 1630 | LODSW ;AN000; | ||
| 1631 | MOV WORD PTR ES:[DI.SF_DATE],AX ; sft_date ;AN000; | ||
| 1632 | ;AN000; | ||
| 1633 | ;AN000; | ||
| 1634 | PUSH DI ; sft_name/ext/cp ;AN000; | ||
| 1635 | ADD DI,SF_NAME ;AN000; | ||
| 1636 | MOV CX,11 ; (name - 11, cp - 2 bytes) ;AN000; | ||
| 1637 | REP MOVSB ;AN000; | ||
| 1638 | ;AN000; | ||
| 1639 | ADD SI,SIZE SFF_RESV ; sft_fsda 1st word ;AN000; | ||
| 1640 | ADD SI,4 ; for sff_sf_id ;AN016;;AC024; | ||
| 1641 | POP DI ;AN000; | ||
| 1642 | ;AN000; | ||
| 1643 | SaveReg <DI> ;AN003; | ||
| 1644 | ADD DI,SF_CLUSPOS ;AN000; | ||
| 1645 | MOV CX,3 ;AC017; | ||
| 1646 | REP MOVSW ;AN000; | ||
| 1647 | ;;;;;;;;ADD DI,12 ;AN017;;AD024; | ||
| 1648 | ;;;;;;;;MOVSW ;AN017;;AD024; | ||
| 1649 | LODSW ;AN024; | ||
| 1650 | RestoreReg <DI> ;AN003;;AM024; | ||
| 1651 | MOV WORD PTR ES:[DI.SF_LSTCLUS],AX ;AN024; | ||
| 1652 | ;AN000; | ||
| 1653 | TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to update ;AN000; | ||
| 1654 | JZ SFF_1000 ; device cb or not ;AN000; | ||
| 1655 | TEST IFSPROC_FLAGS,IsSeq ;AN000; | ||
| 1656 | JNZ SFF_1000 ;AN000; | ||
| 1657 | ;AN000; | ||
| 1658 | TEST ES:[DI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007; | ||
| 1659 | PUSHF ; save results of this test for later ;AN007; | ||
| 1660 | LES DI,ES:[DI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AN000; | ||
| 1661 | CMP DI,NULL_PTR ;AN000; | ||
| 1662 | JNE SFF_20 ;AN000; | ||
| 1663 | POPF ;AN000; | ||
| 1664 | JMP SFF_1000 ;AN000; | ||
| 1665 | |||
| 1666 | SFF_20: ;AN000; | ||
| 1667 | POPF ; retrieve cd/df test results ;AN000; | ||
| 1668 | JNZ SFF_100 ; jmp if dfl ;AN000; | ||
| 1669 | MOV DI,WORD PTR CS:SAVE_CB@ ; CDS ;AN000; | ||
| 1670 | PUSH WORD PTR CS:SAVE_CB@+2 ;AN000; | ||
| 1671 | POP ES ;AN000; | ||
| 1672 | TEST ES:[DI.CURDIR_FLAGS],CURDIR_ISIFS | ||
| 1673 | JZ SFF_1000 | ||
| 1674 | CALL CD_TO_CDS ;AN000; | ||
| 1675 | JMP SHORT SFF_1000 ;AN000; | ||
| 1676 | ;AN000; | ||
| 1677 | SFF_100: ;AN000; | ||
| 1678 | MOV WORD PTR CS:[THISDFL],DI ; DFL ;AN000; | ||
| 1679 | MOV WORD PTR CS:[THISDFL+2],ES ; set this cause DF_TO_DFL ;AN000; | ||
| 1680 | CALL DF_TO_DFL ; expects it ;AN000; | ||
| 1681 | ;AN000; | ||
| 1682 | SFF_1000: ;AN000; | ||
| 1683 | RestoreReg <CX,AX,SI,DS,DI,ES> ; restore regs ;AC003; | ||
| 1684 | ;AN000; | ||
| 1685 | return ;AN000; | ||
| 1686 | ;AN000; | ||
| 1687 | EndProc SFF_TO_SFT ;AN000; | ||
| 1688 | ;AN000; | ||
| 1689 | BREAK <CDS_TO_CD -- Convert CDS to CD> ;AN000; | ||
| 1690 | ;AN000; | ||
| 1691 | ;************************************************************************************ ;AN000; | ||
| 1692 | ; ;AN000; | ||
| 1693 | ; CDS_TO_CD ;AN000; | ||
| 1694 | ; ;AN000; | ||
| 1695 | ; Inputs: ;AN000; | ||
| 1696 | ; DS:SI -> CDS ;AN000; | ||
| 1697 | ; ;AN000; | ||
| 1698 | ; Function: ;AN000; | ||
| 1699 | ; Load CD from CDS ;AN000; | ||
| 1700 | ; CD_TYPE = 1 ;AN000; | ||
| 1701 | ; CD_TYPE+1 = 0 ;AN000; | ||
| 1702 | ; CD_END = CURDIR_END ;AN000; | ||
| 1703 | ; CD_TEXT = CURDIR_TEXT ;AN000; | ||
| 1704 | ; CD_FSDA = CURDIR_ID ;AN000; | ||
| 1705 | ; CD_FSDA+2 = CURDIR_ID+2 ;AN000; | ||
| 1706 | ; CD_FSDA+4 = CURDIR_USER_WORD ;AN000; | ||
| 1707 | ; CD_FSDA+6 = CURDIR_FSDA ;AN000; | ||
| 1708 | ; Outputs: ;AN000; | ||
| 1709 | ; CD loaded ;AN000; | ||
| 1710 | ; ES:BX -> IFSRH ;AN000; | ||
| 1711 | ; IFSR_DEVICE_CB@ -> CD ;AN000; | ||
| 1712 | ; [THISIFS] = CURDIR_IFS_HDR ;AN000; | ||
| 1713 | ; DS - IFSSEG ;AN000; | ||
| 1714 | ; ;AN000; | ||
| 1715 | ; Regs: all except DS,ES,BX saved ;AN000; | ||
| 1716 | ; ;AN000; | ||
| 1717 | ;************************************************************************************ ;AN000; | ||
| 1718 | ;AN000; | ||
| 1719 | procedure CDS_TO_CD,NEAR ;AN000; | ||
| 1720 | ;AN000; | ||
| 1721 | SaveReg <DI,SI,AX,CX> ; save regs ;AN000; | ||
| 1722 | ;AN000; | ||
| 1723 | PUSH CS ;AN000; | ||
| 1724 | POP ES ; DS:SI -> CDS ;AN000; | ||
| 1725 | ASSUME ES:IFSSEG ; ES:DI -> CD ;AN000; | ||
| 1726 | MOV DI,OFFSET CS:CD1 ;AN000; | ||
| 1727 | ;AN000; | ||
| 1728 | PUSH DI ; save cd offset ;AN000; | ||
| 1729 | MOV AL,CBTYPE_CD ; cd_type ;AN000; | ||
| 1730 | TEST CS:IFSPROC_FLAGS,ISDUMMYCDS ; check for dummy cd ;AN000; | ||
| 1731 | JZ CCD_10 ;AN000; | ||
| 1732 | MOV AL,CBTYPE_DUMMYCD ;AN000; | ||
| 1733 | CCD_10: ;AN000; | ||
| 1734 | XOR AH,AH ;AN000; | ||
| 1735 | STOSW ; move di down thru cd during store ;AN000; | ||
| 1736 | ;AN000; | ||
| 1737 | MOV AX,WORD PTR [SI.CURDIR_END] ; cd_end ;AN000; | ||
| 1738 | STOSW ;AN000; | ||
| 1739 | ;AN000; | ||
| 1740 | PUSH SI ; cd_text ;AN000; | ||
| 1741 | MOV CX,DIRSTRLEN ;AN000; | ||
| 1742 | REP MOVSB ;AN000; | ||
| 1743 | POP SI ;AN000; | ||
| 1744 | ;AN000; | ||
| 1745 | MOV AX,WORD PTR [SI.CURDIR_ID] ; cd_fsda ;AN000; | ||
| 1746 | ADD DI,SIZE CD_RESV ;AN000; | ||
| 1747 | STOSW ;AN000; | ||
| 1748 | MOV AX,WORD PTR [SI.CURDIR_ID+2] ;AN000; | ||
| 1749 | STOSW ;AN000; | ||
| 1750 | MOV AX,WORD PTR [SI.CURDIR_USER_WORD] ;AN000; | ||
| 1751 | STOSW ;AN000; | ||
| 1752 | MOV AX,WORD PTR [SI.CURDIR_FSDA] ;AN000; | ||
| 1753 | STOSW ;AN000; | ||
| 1754 | ;AN000; | ||
| 1755 | TEST CS:IFSPROC_FLAGS,THISIFS_SET ;AN000; | ||
| 1756 | JNZ CCD_20 ;AN000; | ||
| 1757 | MOV AX,WORD PTR [SI.CURDIR_IFS_HDR] ; Set [THISIFS] ;AN000; | ||
| 1758 | MOV WORD PTR CS:[THISIFS],AX ;AN000; | ||
| 1759 | MOV AX,WORD PTR [SI.CURDIR_IFS_HDR+2] ;AN000; | ||
| 1760 | MOV WORD PTR CS:[THISIFS+2],AX ;AN000; | ||
| 1761 | CCD_20: ;AN000; | ||
| 1762 | POP DI ; restore CD offset ;AN000; | ||
| 1763 | PUSH CS ; get DS -> IFSSEG ;AN000; | ||
| 1764 | POP DS ;AN000; | ||
| 1765 | ASSUME DS:IFSSEG ;AN000; | ||
| 1766 | ;AN000; | ||
| 1767 | MOV BX,OFFSET IFSR ; ES:BX -> IFSRH ;AN000; | ||
| 1768 | SaveReg <BX> ;AN000; | ||
| 1769 | ADD BX,DEVICE_CB@_OFFSET ;AN000; | ||
| 1770 | MOV WORD PTR ES:[BX],DI ; set IFSR_DEVICE_CB@ ;AN000; | ||
| 1771 | ADD BX,2 ;AN000; | ||
| 1772 | MOV WORD PTR ES:[BX],ES ;AN000; | ||
| 1773 | RestoreReg <BX> ;AN000; | ||
| 1774 | ;AN000; | ||
| 1775 | RestoreReg <CX,AX,SI,DI> ; restore regs ;AN000; | ||
| 1776 | ;AN000; | ||
| 1777 | return ;AN000; | ||
| 1778 | ;AN000; | ||
| 1779 | EndProc CDS_TO_CD ;AN000; | ||
| 1780 | ;AN000; | ||
| 1781 | ;AN000; | ||
| 1782 | BREAK <CD_TO_CDS -- Convert CD to CDS> ;AN000; | ||
| 1783 | ;AN000; | ||
| 1784 | ;************************************************************************************ ;AN000; | ||
| 1785 | ; ;AN000; | ||
| 1786 | ; CD_TO_CDS ;AN000; | ||
| 1787 | ; ;AN000; | ||
| 1788 | ; Inputs: ;AN000; | ||
| 1789 | ; ES:DI -> CDS ;AN000; | ||
| 1790 | ; DS -> IFSSEG ;AN000; | ||
| 1791 | ; Function: ;AN000; | ||
| 1792 | ; Update CDS with CD ;AN000; | ||
| 1793 | ; CURDIR_TEXT = CD_TEXT ;AN000; | ||
| 1794 | ; CURDIR_ID = CD_FSDA ;AN000; | ||
| 1795 | ; CURDIR_ID+2 = CD_FSDA+2 ;AN000; | ||
| 1796 | ; CURDIR_USER_WORD = CD_FSDA+4 ;AN000; | ||
| 1797 | ; CURDIR_END = CD_END ;AN000; | ||
| 1798 | ; CURDIR_FSDA = CD_FSDA+6 ;AN000; | ||
| 1799 | ; Outputs: ;AN000; | ||
| 1800 | ; CDS updated ;AN000; | ||
| 1801 | ; ;AN000; | ||
| 1802 | ; notes: all regs preserved ;AN000; | ||
| 1803 | ; ;AN000; | ||
| 1804 | ;************************************************************************************ ;AN000; | ||
| 1805 | ;AN000; | ||
| 1806 | procedure CD_TO_CDS,NEAR ;AN000; | ||
| 1807 | ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1808 | ;AN000; | ||
| 1809 | SaveReg <ES,DI,DS,SI,AX,CX> ; save regs ;AC005; | ||
| 1810 | ;AN000; | ||
| 1811 | MOV SI,OFFSET CD1 ; ES:DI -> CDS ;AN000; | ||
| 1812 | ; DS:SI -> CD ;AN000; | ||
| 1813 | INC SI ;AN000; | ||
| 1814 | INC SI ;AN000; | ||
| 1815 | ;AN000; | ||
| 1816 | LODSW ; curdir_end ;AN000; | ||
| 1817 | MOV ES:[DI.CURDIR_END],AX ;AN000; | ||
| 1818 | ;AN000; | ||
| 1819 | PUSH DI ;AN000; | ||
| 1820 | MOV CX,DIRSTRLEN ;AN000; | ||
| 1821 | REP MOVSB ;AN000; | ||
| 1822 | POP DI ;AN000; | ||
| 1823 | ;AN000; | ||
| 1824 | ADD SI,SIZE CD_RESV ; curdir_id ;AN000; | ||
| 1825 | LODSW ;AN000; | ||
| 1826 | MOV WORD PTR ES:[DI.CURDIR_ID],AX ;AN000; | ||
| 1827 | LODSW ;AN000; | ||
| 1828 | MOV WORD PTR ES:[DI.CURDIR_ID+2],AX ;AN000; | ||
| 1829 | LODSW ; curdir_user_word ;AN000; | ||
| 1830 | MOV WORD PTR ES:[DI.CURDIR_USER_WORD],AX ;AN000; | ||
| 1831 | LODSW ; curdir_fsda ;AN000; | ||
| 1832 | MOV WORD PTR ES:[DI.CURDIR_FSDA],AX ;AN000; | ||
| 1833 | ;AN000; | ||
| 1834 | RestoreReg <CX,AX,SI,DS,DI,ES> ; restore regs ;AC005; | ||
| 1835 | ;AN000; | ||
| 1836 | return ;AN000; | ||
| 1837 | ;AN000; | ||
| 1838 | EndProc CD_TO_CDS ;AN000; | ||
| 1839 | ;AN000; | ||
| 1840 | ;AN000; | ||
| 1841 | BREAK <DFL_TO_DF -- Convert DFL to DF> ;AN000; | ||
| 1842 | ;AN000; | ||
| 1843 | ;************************************************************************************ ;AN000; | ||
| 1844 | ; ;AN000; | ||
| 1845 | ; DFL_TO_DF ;AN000; | ||
| 1846 | ; ;AN000; | ||
| 1847 | ; Inputs: ;AN000; | ||
| 1848 | ; [THISDFL] ;AN000; | ||
| 1849 | ; Function: ;AN000; | ||
| 1850 | ; Load DF from DFL ;AN000; | ||
| 1851 | ; ;AN000; | ||
| 1852 | ; DF_TYPE = 2 ;AN000; | ||
| 1853 | ; DF_TYPE + 1 = 0 ;AN000; | ||
| 1854 | ; DF_DEV_NAME = DFL_DEV_NAME ;AN000; | ||
| 1855 | ; DF_FSDA = DFL_FSDA ;AN000; | ||
| 1856 | ; Outputs: ;AN000; | ||
| 1857 | ; DF loaded ;AN000; | ||
| 1858 | ; ES:BX -> IFSRH ;AN000; | ||
| 1859 | ; IFSR_DEVICE_CB@ -> DF ;AN000; | ||
| 1860 | ; [THISIFS] = DFL_IFS_HDR ;AN000; | ||
| 1861 | ; DS - IFSSEG ;AN000; | ||
| 1862 | ; ;AN000; | ||
| 1863 | ; notes: es,bx,ds Revised, others saved ;AN000; | ||
| 1864 | ; ;AN000; | ||
| 1865 | ;************************************************************************************ ;AN000; | ||
| 1866 | ;AN000; | ||
| 1867 | procedure DFL_TO_DF,NEAR ;AN000; | ||
| 1868 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1869 | ;AN000; | ||
| 1870 | SaveReg <DI,SI,AX> ; save regs ;AN000; | ||
| 1871 | ;AN000; | ||
| 1872 | PUSH CS ;AN000; | ||
| 1873 | POP ES ;AN000; | ||
| 1874 | ASSUME ES:IFSSEG ;AN000; | ||
| 1875 | MOV DI,OFFSET DF1 ; es:di -> df ;AN000; | ||
| 1876 | ;AN000; | ||
| 1877 | MOV BX,OFFSET IFSR ; set es:bx - ifsrh ;AN000; | ||
| 1878 | PUSH BX ; fill in device cb@ ;AN000; | ||
| 1879 | ADD BX,CS:DEVICE_CB@_OFFSET ;AN000; | ||
| 1880 | MOV WORD PTR ES:[BX],DI ;AN000; | ||
| 1881 | ADD BX,2 ;AN000; | ||
| 1882 | MOV WORD PTR ES:[BX],ES ;AN000; | ||
| 1883 | POP BX ;AN000; | ||
| 1884 | ;AN000; | ||
| 1885 | LDS SI,[THISDFL] ; ds:si -> dfl ;AN000; | ||
| 1886 | ;AN000; | ||
| 1887 | MOV AL,CBTYPE_DF ; df_type ;AN000; | ||
| 1888 | XOR AH,AH ;AN000; | ||
| 1889 | STOSW ;AN000; | ||
| 1890 | ;AN000; | ||
| 1891 | PUSH SI ; df_dev_name ;AN000; | ||
| 1892 | ADD SI,DFL_DEV_NAME ;AN000; | ||
| 1893 | MOV CX,8 ;AN000; | ||
| 1894 | REP MOVSB ;AN000; | ||
| 1895 | POP SI ;AN000; | ||
| 1896 | PUSH SI ;AN000; | ||
| 1897 | ADD SI,DFL_FSDA ; df_fsda ;AN000; | ||
| 1898 | |||
| 1899 | TEST CS:IFSPROC_FLAGS,SetDeviceCB ; if this flag set, i24 already taken ;AN004; | ||
| 1900 | JNZ DDF_20 ; care of, otherwise take care of it ;AN004; | ||
| 1901 | SaveReg <DI,SI> ; df, dfl dev name offsets ;AN004; | ||
| 1902 | MOV DI,OFFSET CS:[PHONEY_NAME] ; set phoney name and ifsdrv ;AN004; | ||
| 1903 | MOV CX,4 ;AN004; | ||
| 1904 | REP MOVSW ;AN004; | ||
| 1905 | MOV CS:[IFSDRV],-1 ;AN004; | ||
| 1906 | RestoreReg <SI,DI> ; dfl dev name, df offsets ;AN004; | ||
| 1907 | |||
| 1908 | DDF_20: ;AN004; | ||
| 1909 | MOV CX,SIZE DFL_FSDA ;AN000; | ||
| 1910 | REP MOVSB ;AN000; | ||
| 1911 | POP SI ;AN000; | ||
| 1912 | ;AN000; | ||
| 1913 | MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR] ; Set [THISIFS] ;AN000; | ||
| 1914 | MOV WORD PTR [THISIFS],AX ;AN000; | ||
| 1915 | MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR+2] ;AN000; | ||
| 1916 | MOV WORD PTR [THISIFS+2],AX ;AN000; | ||
| 1917 | ;AN000; | ||
| 1918 | PUSH CS ; set ds - ifsseg ;AN000; | ||
| 1919 | POP DS ;AN000; | ||
| 1920 | ;AN000; | ||
| 1921 | RestoreReg <AX,SI,DI> ; restore regs ;AN000; | ||
| 1922 | ;AN000; | ||
| 1923 | return ;AN000; | ||
| 1924 | ;AN000; | ||
| 1925 | EndProc DFL_TO_DF ;AN000; | ||
| 1926 | ;AN000; | ||
| 1927 | ;AN000; | ||
| 1928 | BREAK <DF_TO_DFL -- Convert DF to DFL> ;AN000; | ||
| 1929 | ;AN000; | ||
| 1930 | ;************************************************************************************ ;AN000; | ||
| 1931 | ; ;AN000; | ||
| 1932 | ; DF_TO_DFL ;AN000; | ||
| 1933 | ; ;AN000; | ||
| 1934 | ; Inputs: ;AN000; | ||
| 1935 | ; [THISDFL] set ;AN000; | ||
| 1936 | ; Function: ;AN000; | ||
| 1937 | ; Update DFL with DF ;AN000; | ||
| 1938 | ; DFL_DEV_NAME = DF_DEV_NAME ;AN000; | ||
| 1939 | ; DFL_FSDA = DF_FSDA ;AN000; | ||
| 1940 | ; Outputs: ;AN000; | ||
| 1941 | ; DFL updated ;AN000; | ||
| 1942 | ; ;AN000; | ||
| 1943 | ; notes: all regs preserved ;AN000; | ||
| 1944 | ; ;AN000; | ||
| 1945 | ;************************************************************************************ ;AN000; | ||
| 1946 | ;AN000; | ||
| 1947 | procedure DF_TO_DFL,NEAR ;AN000; | ||
| 1948 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1949 | ;AN000; | ||
| 1950 | SaveReg <ES,DI,DS,SI> ; save regs ;AN000; | ||
| 1951 | ;AN000; | ||
| 1952 | LES DI,[THISDFL] ; esdi -> dfl ;AN000; | ||
| 1953 | PUSH CS ;AN000; | ||
| 1954 | POP DS ;AN000; | ||
| 1955 | ASSUME DS:IFSSEG ;AN000; | ||
| 1956 | MOV SI,OFFSET DF1 ; dssi -> df ;AN000; | ||
| 1957 | ;AN000; | ||
| 1958 | INC SI ; space si,di to dev_name ;AN000; | ||
| 1959 | INC SI ;AN000; | ||
| 1960 | PUSH DI ;AN000; | ||
| 1961 | ADD DI,DFL_DEV_NAME ;AN000; | ||
| 1962 | MOV CX,8 ;AN000; | ||
| 1963 | REP MOVSB ; update dfl_dev_name for some reason ;AN000; | ||
| 1964 | ;AN000; | ||
| 1965 | POP DI ;AN000; | ||
| 1966 | ADD DI,DFL_FSDA ;AN000; | ||
| 1967 | MOV CX,SIZE DFL_FSDA ;AN000; | ||
| 1968 | REP MOVSB ; update dfl_fsda ;AN000; | ||
| 1969 | ;AN000; | ||
| 1970 | RestoreReg <SI,DS,DI,ES> ; restore regs ;AN000; | ||
| 1971 | ;AN000; | ||
| 1972 | return ;AN000; | ||
| 1973 | ;AN000; | ||
| 1974 | EndProc DF_TO_DFL ;AN000; | ||
| 1975 | ;AN000; | ||
| 1976 | ;AN000; | ||
| 1977 | BREAK <CONSIST_SFT -- Make SFT caches consistent with state of IFSFUNC> ;AN000; | ||
| 1978 | ;AN000; | ||
| 1979 | ;************************************************************************************ ;AN000; | ||
| 1980 | ; ;AN000; | ||
| 1981 | ; CONSIST_SFT ;AN000; | ||
| 1982 | ; ;AN000; | ||
| 1983 | ; Inputs: ;AN000; | ||
| 1984 | ; None ;AN000; | ||
| 1985 | ; ;AN000; | ||
| 1986 | ; Function: ;AN000; | ||
| 1987 | ; Make sure all device SFTs are consistent with current IFSFUNC state ;AN000; | ||
| 1988 | ; ;AN000; | ||
| 1989 | ; Outputs: ;AN000; | ||
| 1990 | ; None ;AN000; | ||
| 1991 | ; ;AN000; | ||
| 1992 | ; Regs: DS,ES,SI,DI preserved others destroyed ;AN000; | ||
| 1993 | ; ;AN000; | ||
| 1994 | ;************************************************************************************ ;AN000; | ||
| 1995 | ;AN000; | ||
| 1996 | procedure CONSIST_SFT,NEAR ;AN000; | ||
| 1997 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1998 | ;AN000; | ||
| 1999 | CMP CS:[DFLCount],0 ; if no dfl, forget it ;AN022; | ||
| 2000 | JE CS_20 | ||
| 2001 | SaveReg <DS,SI,ES,DI> ;AN000; | ||
| 2002 | CLI ; This scan of the SFT tables is ;AN000; | ||
| 2003 | ; a critical section we must protect ;AN000; | ||
| 2004 | ; with CLI and STI as CritNET must ;AN000; | ||
| 2005 | ; be disjoint from all other critical ;AN000; | ||
| 2006 | ; sections ;AN000; | ||
| 2007 | LDS SI,[SFTFCB] ;AN000; | ||
| 2008 | ASSUME DS:NOTHING ;AN000; | ||
| 2009 | MOV CX,[SI].sfCount ;AN000; | ||
| 2010 | LEA SI,[SI].sfTable ;AN000; | ||
| 2011 | JCXZ DONE_LOOK_FCB ;AN000; | ||
| 2012 | CALL LOOK_FIX ;AN000; | ||
| 2013 | DONE_LOOK_FCB: ;AN000; | ||
| 2014 | LDS SI,[SFT_Addr] ; get pointer to beginning of table ;AN000; | ||
| 2015 | ScanLoop: ;AN000; | ||
| 2016 | MOV CX,[SI].SFCount ;AN000; | ||
| 2017 | PUSH DS ;AN000; | ||
| 2018 | PUSH SI ;AN000; | ||
| 2019 | LEA SI,[SI].sfTable ;AN000; | ||
| 2020 | CALL LOOK_FIX ;AN000; | ||
| 2021 | POP SI ;AN000; | ||
| 2022 | POP DS ;AN000; | ||
| 2023 | LDS SI,[SI].SFLink ; get next table segment ;AN000; | ||
| 2024 | CMP SI,-1 ; end of tables? ;AN000; | ||
| 2025 | JNZ ScanLoop ; no, try again ;AN000; | ||
| 2026 | STI ;AN000; | ||
| 2027 | RestoreReg <DI,ES,SI,DS> ;AN000; | ||
| 2028 | CS_20: | ||
| 2029 | return ;AN000; | ||
| 2030 | ;AN000; | ||
| 2031 | LOOK_FIX: ;AN000; | ||
| 2032 | CMP [SI].sf_ref_count,0 ;AN000; | ||
| 2033 | JZ NEXT_SFT ; Ignore Free ones ;AN000; | ||
| 2034 | TEST [SI].sf_flags,devid_device ;AN000; | ||
| 2035 | JZ NEXT_SFT ; Only look at device SFTs ;AN000; | ||
| 2036 | TEST [SI].sf_flags,sf_isnet | ||
| 2037 | ;AN000; | ||
| 2038 | PUSH CX ; sft loop count ;AN000; | ||
| 2039 | PUSH DS ; sft ptr ;AN000; | ||
| 2040 | PUSH SI ;AN000; | ||
| 2041 | PUSHF ; Save result of above TEST ;AN000; | ||
| 2042 | ADD SI,sf_name ; put asciiz form of sf_name in tempbuf ;AN000; | ||
| 2043 | PUSH CS ; to call dfl_match with ;AN000; | ||
| 2044 | POP ES ;AN000; | ||
| 2045 | MOV DI,OFFSET TEMPBUF ;AN000; | ||
| 2046 | CALL CONVERT_NAME_ASCIIZ ;AN000; | ||
| 2047 | PUSH CS ;AN000; | ||
| 2048 | POP DS ;AN000; | ||
| 2049 | MOV SI,DI ;AN000; | ||
| 2050 | CALL DFL_MATCH ; is this sft attached? cf1-no,cf0-yes ;AN000; | ||
| 2051 | JC NOT_R_DEV ;AN000; | ||
| 2052 | PUSH CS ; IS ATTACHED - recover test for sf_isnet ;AN000; | ||
| 2053 | CALL PIRET ;AN000; | ||
| 2054 | JNZ NOT_REDIR ; jmp if marked attached - ok ;AN000; | ||
| 2055 | ; [THISDFL] dfl entry ;AN000; | ||
| 2056 | ; (TOS+2):(TOS) -> SFT ;AN000; | ||
| 2057 | ; (TOS+4) = CX loop count ;AN000; | ||
| 2058 | ; Not marked attached, but should & will be ;AN000; | ||
| 2059 | LES DI,[THISDFL] ;AN000; | ||
| 2060 | POP SI ;AN000; | ||
| 2061 | POP DS ; DS:SI -> SFT ;AN000; | ||
| 2062 | MOV AX,WORD PTR [SI.sf_devptr+2] ; save original devptr ;AN031; | ||
| 2063 | MOV WORD PTR ES:[DI.DFLL_DEVPTR+2],AX ;AN031; | ||
| 2064 | MOV AX,WORD PTR [SI.sf_devptr] ;AN031; | ||
| 2065 | MOV WORD PTR ES:[DI.DFLL_DEVPTR],AX ;AN031; | ||
| 2066 | MOV WORD PTR [SI.sf_devptr+2],ES ;AC027; | ||
| 2067 | MOV WORD PTR [SI.sf_devptr],DI ;AC027; | ||
| 2068 | MOV AX,WORD PTR ES:[DI.DFL_FSDA] ; put dfl fsda into sft fsda ;AN027; | ||
| 2069 | MOV WORD PTR [SI.sf_cluspos],AX ;AN027; | ||
| 2070 | MOV AX,WORD PTR ES:[DI.DFL_FSDA+2] ;AN027; | ||
| 2071 | MOV WORD PTR [SI.sf_dirsec],AX ;AN027; | ||
| 2072 | MOV AX,WORD PTR ES:[DI.DFL_FSDA+4] ;AN027; | ||
| 2073 | MOV WORD PTR [SI.sf_dirsec+2],AX ;AN027; | ||
| 2074 | MOV AX,WORD PTR ES:[DI.DFL_FSDA+6] ;AN027; | ||
| 2075 | MOV WORD PTR [SI.sf_lstclus],AX ;AN027; | ||
| 2076 | OR [SI.sf_flags],sf_isnet + sf_net_spool ; Turn on bits ;AC027; | ||
| 2077 | JMP SHORT CLEAN_CX ;AN000; | ||
| 2078 | ;AN000; | ||
| 2079 | PIRET: ;AN000; | ||
| 2080 | IRET ;AN000; | ||
| 2081 | ;AN000; | ||
| 2082 | NOT_R_DEV: ;AN000; | ||
| 2083 | PUSH CS ; NOT ATTACHED - recover test for sf_isnet ;AN000; | ||
| 2084 | CALL PIRET ;AN000; | ||
| 2085 | JNZ UNDO_BITS ; jmp if marked attached - problem ;AN000; | ||
| 2086 | NOT_REDIR: ;AN000; | ||
| 2087 | POP SI ;AN000; | ||
| 2088 | POP DS ;AN000; | ||
| 2089 | CLEAN_CX: ;AN000; | ||
| 2090 | POP CX ;AN000; | ||
| 2091 | NEXT_SFT: ;AN000; | ||
| 2092 | ADD SI,size sf_entry ;AN000; | ||
| 2093 | LOOP LOOK_FIX ;AN000; | ||
| 2094 | return ;AN000; | ||
| 2095 | ;AN000; | ||
| 2096 | ; [THISDFL] dfl entry ;AN000; | ||
| 2097 | ; (TOS+2):(TOS) -> SFT ;AN000; | ||
| 2098 | ; (TOS+4) = CX loop count ;AN000; | ||
| 2099 | UNDO_BITS: ; device not attached, but marked so ;AN000; | ||
| 2100 | POP SI ; unmark it, restore original devptr ;AN000; | ||
| 2101 | POP DS ; DS:SI -> SFT ;AN000; | ||
| 2102 | AND [SI.sf_flags],NOT (sf_isnet + sf_net_spool) ; Turn off bits ;AN000; | ||
| 2103 | MOV ES,WORD PTR [SI.sf_devptr+2] ; set esdi -> dfl ;AN031; | ||
| 2104 | MOV DI,WORD PTR [SI.sf_devptr] ;AN031; | ||
| 2105 | MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR+2] ; restore original devptr ;AN031; | ||
| 2106 | MOV WORD PTR [SI.sf_devptr+2],AX ;AN031; | ||
| 2107 | MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR] ;AN031; | ||
| 2108 | MOV WORD PTR [SI.sf_devptr],AX ;AN031; | ||
| 2109 | JMP SHORT CLEAN_CX ;AN000; | ||
| 2110 | ;AN000; | ||
| 2111 | EndProc CONSIST_SFT ;AN000; | ||
| 2112 | ;AN000; | ||
| 2113 | ;AN000; | ||
| 2114 | BREAK <CONSIST_DFL -- Reset all DFL in_prog flags> ;AN000; | ||
| 2115 | ;AN000; | ||
| 2116 | ;************************************************************************************ ;AN000; | ||
| 2117 | ; ;AN000; | ||
| 2118 | ; CONSIST_DFL ;AN000; | ||
| 2119 | ; ;AN000; | ||
| 2120 | ; Inputs: ;AN000; | ||
| 2121 | ; DS:SI -> 1st DFL entry ;AN000; | ||
| 2122 | ; CX = DFLCount ;AN000; | ||
| 2123 | ; Function: ;AN000; | ||
| 2124 | ; Set all dfl_inprog flags to zero ;AN000; | ||
| 2125 | ; Outputs: ;AN000; | ||
| 2126 | ; dfl_inprog flags all zero ;AN000; | ||
| 2127 | ; ;AN000; | ||
| 2128 | ; notes: all regs preserved ;AN000; | ||
| 2129 | ; ;AN000; | ||
| 2130 | ;************************************************************************************ ;AN000; | ||
| 2131 | ;AN000; | ||
| 2132 | procedure CONSIST_DFL,NEAR ;AN000; | ||
| 2133 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2134 | ;AN000; | ||
| 2135 | SaveReg <SI,DX,CX> ;AC023; | ||
| 2136 | MOV DX,SIZE DFLL_LIST ;AN000; | ||
| 2137 | CD_20: ; reset loop ;AN000; | ||
| 2138 | AND BYTE PTR DS:[SI],NOT DFL_INPROG ;AN000; | ||
| 2139 | ADD SI,DX ;AN000; | ||
| 2140 | LOOP CD_20 ;AN000; | ||
| 2141 | ;AN000; | ||
| 2142 | RestoreReg <CX,DX,SI> ;AC023; | ||
| 2143 | return ;AN000; | ||
| 2144 | ;AN000; | ||
| 2145 | EndProc CONSIST_DFL ;AN000; | ||
| 2146 | |||
| 2147 | |||
| 2148 | BREAK <PRN_CHECK -- change PRN to LPT1> | ||
| 2149 | |||
| 2150 | ;************************************************************************************ | ||
| 2151 | ; | ||
| 2152 | ; PRN_CHECK | ||
| 2153 | ; | ||
| 2154 | ; Inputs: | ||
| 2155 | ; DS -> IFSSEG | ||
| 2156 | ; SI -> asciiz canonicalized device name | ||
| 2157 | ; Function: | ||
| 2158 | ; IF DSSI-> "PRN",0 THEN | ||
| 2159 | ; Set SI -> LPT1_NAME | ||
| 2160 | ; ENDIF | ||
| 2161 | ; Outputs: | ||
| 2162 | ; SI possibly Revised | ||
| 2163 | ; | ||
| 2164 | ; notes: all but si preserved | ||
| 2165 | ; | ||
| 2166 | ;************************************************************************************ | ||
| 2167 | |||
| 2168 | procedure PRN_CHECK,NEAR ;AN012; | ||
| 2169 | ASSUME DS:IFSSEG,ES:NOTHING ;AN012; | ||
| 2170 | |||
| 2171 | SaveReg <ES,DI,AX,CS> ;AN012;;AC014; | ||
| 2172 | RestoreReg <ES> ;AN012; | ||
| 2173 | MOV DI,OFFSET PRN_NAME ;AN012; | ||
| 2174 | SaveReg <SI> ;AN012; | ||
| 2175 | CallInstall StrCmp,MultDOS,30 ;AN012; | ||
| 2176 | RestoreReg <SI> ;AN012; | ||
| 2177 | JNZ PC_20 ;AN012; | ||
| 2178 | MOV SI,OFFSET LPT1_NAME ;AN012; | ||
| 2179 | PC_20: ;AN012; | ||
| 2180 | RestoreReg <AX,DI,ES> ;AN012;;AC014; | ||
| 2181 | return ;AN012; | ||
| 2182 | |||
| 2183 | EndProc PRN_CHECK ;AN012; | ||
| 2184 | |||
| 2185 | |||
| 2186 | BREAK <CHECK_REAL_DEVICE -- Match dfl_dev_name to real device> ;AN000; | ||
| 2187 | ;AN000; | ||
| 2188 | ;************************************************************************************ | ||
| 2189 | ; | ||
| 2190 | ; CHECK_REAL_DEVICE | ||
| 2191 | ; | ||
| 2192 | ; Inputs: | ||
| 2193 | ; DS:SI -> DFL entry | ||
| 2194 | ; | ||
| 2195 | ; Function: | ||
| 2196 | ; Match device name to device driver chain names | ||
| 2197 | ; IF match found | ||
| 2198 | ; set dfl_dev_real | ||
| 2199 | ; IF device name = "prn" THEN | ||
| 2200 | ; set to "LPT1" | ||
| 2201 | ; Outputs: | ||
| 2202 | ; dfl_dev_real set | ||
| 2203 | ; device name changed to "LPT1" if "PRN" | ||
| 2204 | ; | ||
| 2205 | ; Regs: AX,CX destroyed. All others preserved. | ||
| 2206 | ; | ||
| 2207 | ;************************************************************************************ | ||
| 2208 | ;AN000; | ||
| 2209 | procedure CHECK_REAL_DEVICE,NEAR ;AN000; | ||
| 2210 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2211 | ;AN000; | ||
| 2212 | SaveReg <ES,DI,DS,SI,CS> ;AN000; | ||
| 2213 | RestoreReg <ES> ;AN000; | ||
| 2214 | ASSUME ES:IFSSEG ;AN000; | ||
| 2215 | MOV DI,OFFSET TEMPBUF+10 ; esdi-> tempbuf+10 ;AN000; | ||
| 2216 | ADD SI,DFL_DEV_NAME ; dssi -> dfl_dev_name ;AN000; | ||
| 2217 | CALL CONVERT_NAME_ASCIIZ ; asciiz form of dfl_dev_name ;AN000; | ||
| 2218 | ; at tempbuf+10 ;AN000; | ||
| 2219 | ; Use this to match real devnames ;AN000; | ||
| 2220 | ;AN000; | ||
| 2221 | Context DS ; get addressability to dosgroup ;AN000; | ||
| 2222 | ; to access device driver chain ;AN000; | ||
| 2223 | LDS SI,NULDEV ; dssi -> real device driver chain ;AN000; | ||
| 2224 | CRD_20: ; <<< matching loop on dev drvrs >>> ;AN000; | ||
| 2225 | SaveReg <DS,SI> ;AN000; | ||
| 2226 | ADD SI,SDEVNAME ; dssi -> real dev name ;AN000; | ||
| 2227 | MOV DI,OFFSET TEMPBUF ;AN000; | ||
| 2228 | CALL CONVERT_NAME_ASCIIZ ;AN000; | ||
| 2229 | SaveReg <ES> ;AN000; | ||
| 2230 | RestoreReg <DS> ;AN000; | ||
| 2231 | MOV SI,DI ; dssi -> tempbuf (real) ;AN000; | ||
| 2232 | ADD DI,10 ; esdi -> tempbuf+10 (dfl) ;AN000; | ||
| 2233 | CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000; | ||
| 2234 | RestoreReg <SI,DS> ; device driver chain ;AN000; | ||
| 2235 | JZ CRD_40 ;AN000; | ||
| 2236 | LDS SI,DS:[SI.SDEVNEXT] ;AN000; | ||
| 2237 | CMP SI,NULL_PTR ;AN000; | ||
| 2238 | JNE CRD_20 ;AN000; | ||
| 2239 | ;;;;;;;;SaveReg <DS> ; only offset null ;AD022; | ||
| 2240 | ; RestoreReg <AX> ;AD022; | ||
| 2241 | ; CMP AX,NULL_PTR ;AD022; | ||
| 2242 | ;;;;;;;;JNE CRD_20 ;AD022; | ||
| 2243 | RestoreReg <SI,DS> ; dfl entry ;AN000; | ||
| 2244 | JMP SHORT CRD_100 ; go check "prn" ;AN000; | ||
| 2245 | ;AN000; | ||
| 2246 | CRD_40: ; match found ;AN000; | ||
| 2247 | RestoreReg <SI,DS> ; dfl entry ;AN000; | ||
| 2248 | OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000; | ||
| 2249 | ;AN000; | ||
| 2250 | CRD_100: ;AN000; | ||
| 2251 | SaveReg <DS,SI> ; dfl entry ;AN000; | ||
| 2252 | SaveReg <CS> ;AN000; | ||
| 2253 | RestoreReg <DS> ;AN000; | ||
| 2254 | ASSUME DS:IFSSEG ;AN000; | ||
| 2255 | MOV SI,OFFSET PRN_NAME ; ds:si -> "prn",0 ;AN000; | ||
| 2256 | ; es:di -> tempbuf+10 (dfl) ;AN000; | ||
| 2257 | CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000; | ||
| 2258 | RestoreReg <SI,DS> ; dfl entry ;AN000; | ||
| 2259 | JNZ CRD_120 ;AN000; | ||
| 2260 | ; prn match ;AN000; | ||
| 2261 | CALL XCHGP ; after call: ds ifsseg ;AN000; | ||
| 2262 | ; esdi->dfl entry ;AN000; | ||
| 2263 | ASSUME DS:IFSSEG ;AN000; | ||
| 2264 | MOV SI,OFFSET LPT1_NAME ;AN000; | ||
| 2265 | SaveReg <ES,DI> ; dfl entry offset ;AN000; | ||
| 2266 | ADD DI,DFL_DEV_NAME ; make dfl_dev_name = "LPT1 " ;AN000; | ||
| 2267 | MOV CX,4 ;AN000; | ||
| 2268 | REP MOVSB ;AN000; | ||
| 2269 | RestoreReg <SI,DS> ; dfl entry offset ;AN000; | ||
| 2270 | OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN022; | ||
| 2271 | ;AN000; | ||
| 2272 | CRD_120: ;AN000; | ||
| 2273 | RestoreReg <DI,ES> ; restore es,di ;AN000; | ||
| 2274 | return ;AN000; | ||
| 2275 | ;AN000; | ||
| 2276 | EndProc CHECK_REAL_DEVICE ;AN000; | ||
| 2277 | ;AN000; | ||
| 2278 | ;AN000; | ||
| 2279 | Break <XCHGP - exchange source and destination pointers> ;AN000; | ||
| 2280 | ;AN000; | ||
| 2281 | ;************************************************************************************ ;AN000; | ||
| 2282 | ; ;AN000; | ||
| 2283 | ; XCHGP ;AN000; | ||
| 2284 | ; ;AN000; | ||
| 2285 | ; Inputs: ;AN000; | ||
| 2286 | ; DS:SI & ES:DI ;AN000; | ||
| 2287 | ; Function: ;AN000; | ||
| 2288 | ; Swap ds:si with es:di ;AN000; | ||
| 2289 | ; Outputs: ;AN000; | ||
| 2290 | ; ds<=>es, si<=>di ;AN000; | ||
| 2291 | ; ;AN000; | ||
| 2292 | ; notes: all preserved ;AN000; | ||
| 2293 | ; ;AN000; | ||
| 2294 | ;************************************************************************************ ;AN000; | ||
| 2295 | ;AN000; | ||
| 2296 | Procedure XCHGP,NEAR ;AN000; | ||
| 2297 | SaveReg <DS,ES> ;AN000; | ||
| 2298 | RestoreReg <DS,ES> ;AN000; | ||
| 2299 | XCHG SI,DI ;AN000; | ||
| 2300 | return ;AN000; | ||
| 2301 | EndProc XCHGP ;AN000; | ||
| 2302 | ;AN000; | ||
| 2303 | ;AN000; | ||
| 2304 | Break <IFSDrvFromCDS - convert an offset to a CDS into the 0-based drive> ;AN000; | ||
| 2305 | ;AN000; | ||
| 2306 | ;************************************************************************************ ;AN000; | ||
| 2307 | ; ;AN000; | ||
| 2308 | ; IFSDrvFromCDS - convert an offset to a CDS into a 0-based drive number. ;AN000; | ||
| 2309 | ; Sets IFSDrv also. ;AN000; | ||
| 2310 | ; ;AN000; | ||
| 2311 | ; Inputs: AX contains offset from the beginning of CDSAddr ;AN000; | ||
| 2312 | ; Outputs: AL contains the 0-based drive number ;AN000; | ||
| 2313 | ; IFSDrv is set ;AN000; | ||
| 2314 | ; Registers Revised: AH, BL ;AN000; | ||
| 2315 | ; ;AN000; | ||
| 2316 | ;************************************************************************************ ;AN000; | ||
| 2317 | ;AN000; | ||
| 2318 | Procedure IFSDrvFromCDS,NEAR ;AN000; | ||
| 2319 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2320 | SUB AX,WORD PTR [CDSADDR] ; AX is offset of THISCDS ;AN000; | ||
| 2321 | MOV BL,SIZE CurDir_list ; size in convenient spot ;AN000; | ||
| 2322 | DIV BL ; get drive number ;AN000; | ||
| 2323 | MOV CS:[IFSDRV],AL ;AN000; | ||
| 2324 | return ;AN000; | ||
| 2325 | EndProc IFSDrvFromCDS ;AN000; | ||
| 2326 | ;AN000; | ||
| 2327 | ;AN000; | ||
| 2328 | Break <SET_THISIFS_UNC - put UNC_FS_HDR into [THISIFS]> ;AN000; | ||
| 2329 | ;AN000; | ||
| 2330 | ;************************************************************************************ ;AN000; | ||
| 2331 | ; ;AN000; | ||
| 2332 | ; SET_THISIFS_UNC ;AN000; | ||
| 2333 | ; ;AN000; | ||
| 2334 | ; Inputs: DS - IFSSEG, UNC_FS_HDR set ;AN000; | ||
| 2335 | ; Outputs: [THISIFS] = UNC_FS_HDR ;AN000; | ||
| 2336 | ; ;AN000; | ||
| 2337 | ; Registers Revised: none ;AN000; | ||
| 2338 | ; ;AN000; | ||
| 2339 | ;************************************************************************************ ;AN000; | ||
| 2340 | ;AN000; | ||
| 2341 | Procedure SET_THISIFS_UNC,NEAR ;AN000; | ||
| 2342 | MOV AX,CS:WORD PTR [UNC_FS_HDR] ;AN000; | ||
| 2343 | MOV CS:WORD PTR [THISIFS],AX ;AN000; | ||
| 2344 | MOV AX,CS:WORD PTR [UNC_FS_HDR+2] ;AN000; | ||
| 2345 | MOV CS:WORD PTR [THISIFS+2],AX ;AN000; | ||
| 2346 | return ;AN000; | ||
| 2347 | EndProc SET_THISIFS_UNC ;AN000; | ||
| 2348 | ;AN000; | ||
| 2349 | ;AN000; | ||
| 2350 | Break <SET_CATEGORY - set category for ifs dependent ioctl request> ;AN000; | ||
| 2351 | ;AN000; | ||
| 2352 | ;************************************************************************************ | ||
| 2353 | ; | ||
| 2354 | ; SET_CATEGORY | ||
| 2355 | ; | ||
| 2356 | ; Inputs: DS - IFSSEG, ES:BX -> IFSR, THISIFS set | ||
| 2357 | ; Outputs: CL set to 1 for unc fs, 0 otherwize | ||
| 2358 | ; | ||
| 2359 | ; Registers Revised: CX | ||
| 2360 | ; | ||
| 2361 | ;************************************************************************************ | ||
| 2362 | ;AN000; | ||
| 2363 | Procedure SET_CATEGORY,NEAR ;AN000; | ||
| 2364 | SaveReg <AX> ; preserve used regs ;AN000; | ||
| 2365 | XOR CH,CH ;AN000; | ||
| 2366 | MOV CL,CATEGORY_FS ; set category: 0 - non-UNC ;AN000; | ||
| 2367 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ; check if unc fs installed ;AN000; | ||
| 2368 | JZ SC_20 ; no unc - go set category to fs ;AN000; | ||
| 2369 | MOV AX,WORD PTR [THISIFS] ; now must check if thisifs=unc ;AN000; | ||
| 2370 | CMP AX,WORD PTR [UNC_FS_HDR] ;AN000; | ||
| 2371 | JNE SC_20 ;AN000; | ||
| 2372 | MOV AX,WORD PTR [THISIFS+2] ;AN000; | ||
| 2373 | CMP AX,WORD PTR [UNC_FS_HDR+2] ;AN000; | ||
| 2374 | JNE SC_20 ;AN000; | ||
| 2375 | INC CL ; is unc - inc category to 1=unc ;AN000; | ||
| 2376 | SC_20: ;AN000; | ||
| 2377 | RestoreReg <AX> ;AN000; | ||
| 2378 | return ;AN000; | ||
| 2379 | EndProc SET_CATEGORY ;AN000; | ||
| 2380 | ;AN000; | ||
| 2381 | ;AN000; | ||
| 2382 | Break <SET_DEPIOCTL_IFSR - set length,function,apifunc,func ifsr fields> ;AN000; | ||
| 2383 | ;AN000; | ||
| 2384 | ;************************************************************************************ ;AN000; | ||
| 2385 | ; ;AN000; | ||
| 2386 | ; SET_DEPIOCTL_IFSR ;AN000; | ||
| 2387 | ; ;AN000; | ||
| 2388 | ; Inputs: ES:BX -> IFSR | ||
| 2389 | ; Outputs: IFSR_LENGTH, IFSR_FUNCTION, IFSR_APIFUNC, IFSR_FUNC set ;AN000; | ||
| 2390 | ; ;AN000; | ||
| 2391 | ; Registers Revised: none ;AN000; | ||
| 2392 | ; ;AN000; | ||
| 2393 | ;************************************************************************************ ;AN000; | ||
| 2394 | ;AN000; | ||
| 2395 | Procedure SET_DEPIOCTL_IFSR,NEAR ;AN000; | ||
| 2396 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 2397 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 2398 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DEPIOCTL ;AN000; | ||
| 2399 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 2400 | MOV ES:[BX.IFSR_APIFUNC],IFSDEPIOCTL ;AN000; | ||
| 2401 | MOV ES:[BX.IFSR_FUNC],GEN_IOCTL_BY_DEVNUM ;AN000; | ||
| 2402 | return ;AN000; | ||
| 2403 | EndProc SET_DEPIOCTL_IFSR ;AN000; | ||
| 2404 | ;AN000; | ||
| 2405 | |||
| 2406 | Break <GET_UNC_FS_NAME - put UNC ifs driver name into esdi> ;AN000; | ||
| 2407 | ;AN000; | ||
| 2408 | ;************************************************************************************ ;AN000; | ||
| 2409 | ; ;AN000; | ||
| 2410 | ; GET_UNC_FS_NAME ;AN000; | ||
| 2411 | ; ;AN000; | ||
| 2412 | ; Inputs: | ||
| 2413 | ; ES:DI -> BUFFER ;AN000; | ||
| 2414 | ; ;AN000; | ||
| 2415 | ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000; | ||
| 2416 | ; ;AN000; | ||
| 2417 | ; Registers Revised: none ;AN000; | ||
| 2418 | ; ;AN000; | ||
| 2419 | ;************************************************************************************ ;AN000; | ||
| 2420 | ;AN000; | ||
| 2421 | Procedure GET_UNC_FS_NAME,NEAR ;AN000; | ||
| 2422 | ;AN000; | ||
| 2423 | SaveReg <DS,SI,DI> | ||
| 2424 | LDS SI,CS:UNC_FS_HDR | ||
| 2425 | CALL MOVE_DRIVER_NAME | ||
| 2426 | RestoreReg <DI,SI,DS> ;AN000; | ||
| 2427 | return ;AN000; | ||
| 2428 | EndProc GET_UNC_FS_NAME ;AN000; | ||
| 2429 | |||
| 2430 | ;AN000; | ||
| 2431 | Break <MOVE_DRIVER_NAME - put ifs driver name into esdi> ;AN000; | ||
| 2432 | ;AN000; | ||
| 2433 | ;************************************************************************************ ;AN000; | ||
| 2434 | ; ;AN000; | ||
| 2435 | ; MOVE_DRIVER_NAME ;AN000; | ||
| 2436 | ; ;AN000; | ||
| 2437 | ; Inputs: DS:SI -> IFS DRIVER ;AN000; | ||
| 2438 | ; ES:DI -> BUFFER ;AN000; | ||
| 2439 | ; ;AN000; | ||
| 2440 | ; Outputs: Buffer contains asciiz form of ifs driver name ;AN000; | ||
| 2441 | ; ;AN000; | ||
| 2442 | ; Registers Revised: SI,DI ;AN000; | ||
| 2443 | ; ;AN000; | ||
| 2444 | ;************************************************************************************ ;AN000; | ||
| 2445 | ;AN000; | ||
| 2446 | Procedure MOVE_DRIVER_NAME,NEAR ;AN000; | ||
| 2447 | ;AN000; | ||
| 2448 | ADD SI,IFS_NAME ; space to name in ifs hdr ;AN000; | ||
| 2449 | MOV CX,8 ;AN000; | ||
| 2450 | MDN_20: ; move name into buffer ;AN000; | ||
| 2451 | LODSB ; move till 1st space or 8 chars ;AN000; | ||
| 2452 | CMP AL," " ; then add 0 ;AN000; | ||
| 2453 | JE MDN_40 ;AN000; | ||
| 2454 | STOSB ;AN000; | ||
| 2455 | LOOP MDN_20 ;AN000; | ||
| 2456 | MDN_40: ;AN000; | ||
| 2457 | XOR AL,AL ;AN000; | ||
| 2458 | STOSB ;AN000; | ||
| 2459 | ;AN000; | ||
| 2460 | return ;AN000; | ||
| 2461 | EndProc MOVE_DRIVER_NAME ;AN000; | ||
| 2462 | ;AN000; | ||
| 2463 | ;AN000; | ||
| 2464 | Break <CONVERT_NAME_ASCIIZ - put name into buffer in asciiz form> ;AN000; | ||
| 2465 | |||
| 2466 | ;************************************************************************************ | ||
| 2467 | ; | ||
| 2468 | ; CONVERT_NAME_ASCIIZ | ||
| 2469 | ; | ||
| 2470 | ; Inputs: DS:SI -> NAME | ||
| 2471 | ; ES:DI -> BUFFER | ||
| 2472 | ; | ||
| 2473 | ; Outputs: Buffer contains asciiz form of name | ||
| 2474 | ; | ||
| 2475 | ; Regs: All but SI preserved | ||
| 2476 | ; | ||
| 2477 | ;************************************************************************************ | ||
| 2478 | |||
| 2479 | Procedure CONVERT_NAME_ASCIIZ,NEAR ;AN000; | ||
| 2480 | SaveReg <DI,AX> ; esdi buffer offset ;AC014; | ||
| 2481 | CLD ; store name in asciiz format ;AN000; | ||
| 2482 | MOV CX,8 ; in esdi buffer ;AN000; | ||
| 2483 | CNA_20: ;AN000; | ||
| 2484 | LODSB ;AN000; | ||
| 2485 | CMP AL," " ;AN000; | ||
| 2486 | JE CNA_40 ;AN000; | ||
| 2487 | STOSB ;AN000; | ||
| 2488 | LOOP CNA_20 ;AN000; | ||
| 2489 | CNA_40: ;AN000; | ||
| 2490 | XOR AL,AL ;AN000; | ||
| 2491 | STOSB ;AN000; | ||
| 2492 | ;AN000; | ||
| 2493 | RestoreReg <AX,DI> ; esdi buffer offset ;AC014; | ||
| 2494 | ;AN000; | ||
| 2495 | return ;AN000; | ||
| 2496 | ;AN000; | ||
| 2497 | EndProc CONVERT_NAME_ASCIIZ ;AN000; | ||
| 2498 | ;AN000; | ||
| 2499 | ;AN000; | ||
| 2500 | Break <CHECK_SEQ - check for unc vs ifs device> ;AN000; | ||
| 2501 | ;AN000; | ||
| 2502 | ;************************************************************************************ | ||
| 2503 | ; | ||
| 2504 | ; CHECK_SEQ | ||
| 2505 | ; | ||
| 2506 | ; Inputs: [THISCDS],[THISDFL] | ||
| 2507 | ; DS - dosgroup | ||
| 2508 | ; | ||
| 2509 | ; Function: Check whether function has device_cb@ associated with it. | ||
| 2510 | ; (Rule out deviceless attach function) | ||
| 2511 | ; | ||
| 2512 | ; Outputs: cf = 0 seq (deviceless) | ||
| 2513 | ; cf = 1 device | ||
| 2514 | ; | ||
| 2515 | ; Registers Revised: none | ||
| 2516 | ; | ||
| 2517 | ;************************************************************************************ | ||
| 2518 | |||
| 2519 | Procedure CHECK_SEQ,NEAR ;AN000; | ||
| 2520 | ASSUME DS:DOSGROUP ;AN000; | ||
| 2521 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2522 | ; SaveReg <SI,AX> ; ;AD007; | ||
| 2523 | ; MOV SI,[WFP_START] ; ;AD007; | ||
| 2524 | ; LODSW ; ;AD007; | ||
| 2525 | ; CMP AX,"\\" ; ;AD007; | ||
| 2526 | ; JE CS_10 ; ;AD007; | ||
| 2527 | ; STC ; ;AD007; | ||
| 2528 | ; JMP SHORT CS_20 ; ;AD007; | ||
| 2529 | ;S_10: ; ;AD007; | ||
| 2530 | ; CLC ; ;AD007; | ||
| 2531 | ; ; ;AD007; | ||
| 2532 | ;S_20: ; ;AD007; | ||
| 2533 | ; RestoreReg <AX,SI> ; ;AD007; | ||
| 2534 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2535 | SaveReg <DS,SI> ; save used regs ;AN007; | ||
| 2536 | LDS SI,[THISCDS] ; check for cds ;AN007; | ||
| 2537 | CMP SI,NULL_PTR ;AN007; | ||
| 2538 | JNE CS_10 ;AN007; | ||
| 2539 | LDS SI,CS:[THISDFL] ; no cds, check dfl ;AN007; | ||
| 2540 | CMP SI,NULL_PTR ;AN007; | ||
| 2541 | JNE CS_10 ;AN007; | ||
| 2542 | CLC ; no cds, no dfl - is deviceless - clear carry ;AN007; | ||
| 2543 | JMP SHORT CS_1000 ;AN007; | ||
| 2544 | ;AN007; | ||
| 2545 | CS_10: ;AN007; | ||
| 2546 | STC ; has device - set carry ;AN007; | ||
| 2547 | ;AN007; | ||
| 2548 | CS_1000: ;AN007; | ||
| 2549 | RestoreReg <SI,DS> ; restore used regs ;AN007; | ||
| 2550 | return ;AN000; | ||
| 2551 | ;AN000; | ||
| 2552 | EndProc CHECK_SEQ ;AN000; | ||
| 2553 | ;AN000; | ||
| 2554 | ;AN000; | ||
| 2555 | Break <INIT_DFL - zero out dfl entry> ;AN000; | ||
| 2556 | ;AN000; | ||
| 2557 | ;************************************************************************************ ;AN000; | ||
| 2558 | ; ;AN000; | ||
| 2559 | ; INIT_DFL ;AN000; | ||
| 2560 | ; ;AN000; | ||
| 2561 | ; Inputs: DS:SI -> dfl entry ;AN000; | ||
| 2562 | ; ;AN000; | ||
| 2563 | ; Outputs: dfl entry zeroed out ;AN000; | ||
| 2564 | ; ;AN000; | ||
| 2565 | ; Registers Revised: none ;AN000; | ||
| 2566 | ; ;AN000; | ||
| 2567 | ;************************************************************************************ ;AN000; | ||
| 2568 | ;AN000; | ||
| 2569 | Procedure INIT_DFL,NEAR ;AN000; | ||
| 2570 | SaveReg <ES,DI,AX,CX,DS> ;AN000; | ||
| 2571 | RestoreReg <ES> ;AN000; | ||
| 2572 | MOV DI,SI ;AN000; | ||
| 2573 | MOV CX,SIZE DFLL_LIST / 2 ;AN000; | ||
| 2574 | XOR AX,AX ;AN000; | ||
| 2575 | CLD ;AN000; | ||
| 2576 | REP STOSW ;AN000; | ||
| 2577 | RestoreReg <CX,AX,DI,ES> ;AN000; | ||
| 2578 | ;AN000; | ||
| 2579 | return ;AN000; | ||
| 2580 | ;AN000; | ||
| 2581 | EndProc INIT_DFL ;AN000; | ||
| 2582 | ;AN000; | ||
| 2583 | ;AN000; | ||
| 2584 | BREAK <NET_TRANS -- A Routine which does NAMETRANS on session start strings> ;AN000; | ||
| 2585 | ;AN000; | ||
| 2586 | ;************************************************************************************ ;AN000; | ||
| 2587 | ; ;AN000; | ||
| 2588 | ; NET_TRANS ;AN000; | ||
| 2589 | ; ;AN000; | ||
| 2590 | ; Inputs: ;AN000; | ||
| 2591 | ; ES:DI -> Double string session start string for blockredir ;AC001; | ||
| 2592 | ; or printerredir. ;AN000; | ||
| 2593 | ; ;AN000; | ||
| 2594 | ; Function: ;AN000; | ||
| 2595 | ; Perform NAMETRANS DOS function on the connect part of the string ;AN000; | ||
| 2596 | ; ;AN000; | ||
| 2597 | ; Outputs: ;AN000; | ||
| 2598 | ; ES:DI points to NAMETRANSed REDIR string ;AC001; | ||
| 2599 | ; password, or extra 0, appended at end of string ;AC001; | ||
| 2600 | ; ;AN000; | ||
| 2601 | ; Registers Revised: ;AN000; | ||
| 2602 | ; ES,DI Revised, others preserved ;AC001; | ||
| 2603 | ; ;AN000; | ||
| 2604 | ;************************************************************************************ ;AN000; | ||
| 2605 | ;AN000; | ||
| 2606 | procedure NET_TRANS,NEAR ;AN000; | ||
| 2607 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2608 | ;AN000; | ||
| 2609 | SaveReg <DS,SI,AX,BX> ;AC001; | ||
| 2610 | ;AN000; | ||
| 2611 | SaveReg <ES> ; set ds:si -> string ;AN001; | ||
| 2612 | RestoreReg <DS> ; for nametrans input ;AN001; | ||
| 2613 | MOV SI,DI ;AN001; | ||
| 2614 | |||
| 2615 | PUSH CS ;AN000; | ||
| 2616 | POP ES ;AN000; | ||
| 2617 | MOV DI,OFFSET NET_TRANS_BUFFER ; name transed string will be placed ;AC013; | ||
| 2618 | ; in temporary buffer | ||
| 2619 | SaveReg <DI,DS,SI> ; $NAMETRANS zaps these ;AC013; | ||
| 2620 | CallInstall $Nametrans,MultDOS,33 ;AN000; | ||
| 2621 | RestoreReg <SI,DS> ;AN000; | ||
| 2622 | JNC NT_20 ;AN023; | ||
| 2623 | RestoreReg <DI> ; nametrans error - set carry & exit ;AN023; | ||
| 2624 | JMP SHORT NT_60 ;AN023; | ||
| 2625 | |||
| 2626 | ; dssi -> input target string | ||
| 2627 | NT_20: ; esdi -> nametrans version in nettranbuf;AC001;;AC013; | ||
| 2628 | LODSB ; move password or zero ;AC001; | ||
| 2629 | OR AL,AL ;AC001; | ||
| 2630 | JNZ NT_20 ; skip to password (or zero) ;AC001; | ||
| 2631 | ;;;;;;;;MOV DI,OFFSET TEMPBUF ; no need for this; ;AC001;;AD013; | ||
| 2632 | ; SaveReg <DI> ; nametrans already does it; ;AC001;;AD013; | ||
| 2633 | ;NT_40: ; ;AC001;;AD013; | ||
| 2634 | ; MOV AL,BYTE PTR ES:[DI] ; ;AC001;;AD013; | ||
| 2635 | ; INC DI ; ;AC001;;AD013; | ||
| 2636 | ; OR AL,AL ; ;AC001;;AD013; | ||
| 2637 | ;;;;;;;;;JNZ NT_40 ; Skip first part; ;AD013; | ||
| 2638 | CallInstall StrCpy,MultDOS,17 ; Copy password string ;AC001; | ||
| 2639 | RestoreReg <DI> ;AC001; | ||
| 2640 | CLC ;AN023; | ||
| 2641 | NT_60: ;AN023; | ||
| 2642 | RestoreReg <BX,AX,SI,DS> ;AC001; | ||
| 2643 | ;AN001; | ||
| 2644 | return ;AN000; | ||
| 2645 | ;AN000; | ||
| 2646 | EndProc NET_TRANS ;AN000; | ||
| 2647 | ;AN000; | ||
| 2648 | |||
| 2649 | Break <STRIP_WFP_START - strip leading d:\ > ;AN000; | ||
| 2650 | ;AN000; | ||
| 2651 | ;************************************************************************************ ;AN000; | ||
| 2652 | ; ;AN000; | ||
| 2653 | ; STRIP_WFP_START ;AN000; | ||
| 2654 | ; | ||
| 2655 | ; Called by: IFS_SEARCH_FIRST | ||
| 2656 | ; ;AN000; | ||
| 2657 | ; Inputs: DS:SI -> WFP_START ;AN000; | ||
| 2658 | ; ;AN000; | ||
| 2659 | ; Outputs: none ;AN000; | ||
| 2660 | ; ;AN000; | ||
| 2661 | ; Registers Revised: none ;AN000; | ||
| 2662 | ; ;AN000; | ||
| 2663 | ;************************************************************************************ ;AN000; | ||
| 2664 | ;AN000; | ||
| 2665 | Procedure STRIP_WFP_START,NEAR ;AN000; | ||
| 2666 | ;AN000; | ||
| 2667 | CMP BYTE PTR DS:[SI+1],":" ;AN000; | ||
| 2668 | JNE SW_1000 ;AN000; | ||
| 2669 | ADD SI,2 ;AN000; | ||
| 2670 | CMP BYTE PTR DS:[SI],"\" ;AN000; | ||
| 2671 | JE SW_20 ;AN000; | ||
| 2672 | CMP BYTE PTR DS:[SI],"/" ;AN000; | ||
| 2673 | JNE SW_1000 ;AN000; | ||
| 2674 | SW_20: ;AN000; | ||
| 2675 | INC SI ;AN000; | ||
| 2676 | ;AN000; | ||
| 2677 | SW_1000: ;AN000; | ||
| 2678 | return ;AN000; | ||
| 2679 | ;AN000; | ||
| 2680 | EndProc STRIP_WFP_START ;AN000; | ||
| 2681 | |||
| 2682 | |||
| 2683 | Break <CHECK_IFS_ATTRIBUTE - check if fs supports function in DX> | ||
| 2684 | |||
| 2685 | ;************************************************************************************ | ||
| 2686 | ; | ||
| 2687 | ; CHECK_IFS_ATTRIBUTE | ||
| 2688 | ; | ||
| 2689 | ; Called by: IFS_DEPENDENT_IOCTL | ||
| 2690 | ; | ||
| 2691 | ; Inputs: DX = ifs_attribute equate | ||
| 2692 | ; | ||
| 2693 | ; Outputs: ZF = attribute not supported | ||
| 2694 | ; NZ = attribute supported | ||
| 2695 | ; | ||
| 2696 | ; Registers Revised: none | ||
| 2697 | ; | ||
| 2698 | ;************************************************************************************ | ||
| 2699 | ;AN000; | ||
| 2700 | Procedure CHECK_IFS_ATTRIBUTE,NEAR ;AN000; | ||
| 2701 | ;AN000; | ||
| 2702 | SaveReg <ES,DI> | ||
| 2703 | |||
| 2704 | LES DI,[THISIFS] ; esdi -> ifs header | ||
| 2705 | TEST ES:[DI.IFS_ATTRIBUTE],DX ; test attribute | ||
| 2706 | |||
| 2707 | RestoreReg <DI,ES> | ||
| 2708 | ;AN000; | ||
| 2709 | return ;AN000; | ||
| 2710 | ;AN000; | ||
| 2711 | EndProc CHECK_IFS_ATTRIBUTE ;AN000; | ||
| 2712 | |||
| 2713 | |||
| 2714 | Break <CHECK_IFS_SUPPORT - check if IFS supports request> | ||
| 2715 | |||
| 2716 | ;************************************************************************************ | ||
| 2717 | ; | ||
| 2718 | ; CHECK_IFS_SUPPORT | ||
| 2719 | ; | ||
| 2720 | ; Called by: CALL_IFS | ||
| 2721 | ; | ||
| 2722 | ; Inputs: TBD | ||
| 2723 | ; | ||
| 2724 | ; Outputs: TBD | ||
| 2725 | ; | ||
| 2726 | ; | ||
| 2727 | ; Registers Revised: TBD | ||
| 2728 | ; | ||
| 2729 | ;************************************************************************************ | ||
| 2730 | ;AN000; | ||
| 2731 | Procedure CHECK_IFS_SUPPORT,NEAR ;AN000; | ||
| 2732 | |||
| 2733 | return ;AN010; | ||
| 2734 | |||
| 2735 | EndProc CHECK_IFS_SUPPORT ;AN010; | ||
| 2736 | |||
| 2737 | ;AN000; | ||
| 2738 | IFSSEG ENDS ;AN000; | ||
| 2739 | END ;AN000; | ||
diff --git a/v4.0/src/CMD/IFSFUNC/MAKEFILE b/v4.0/src/CMD/IFSFUNC/MAKEFILE new file mode 100644 index 0000000..3925be3 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/MAKEFILE | |||
| @@ -0,0 +1,127 @@ | |||
| 1 | #************************** makefile for cmd\... *************************** | ||
| 2 | |||
| 3 | msg =..\..\messages | ||
| 4 | dos =..\..\dos | ||
| 5 | inc =..\..\inc | ||
| 6 | hinc =..\..\h | ||
| 7 | here =..\cmd\ifsfunc | ||
| 8 | make =nmake -i | ||
| 9 | |||
| 10 | # | ||
| 11 | ####################### dependencies begin here. ######################### | ||
| 12 | # | ||
| 13 | |||
| 14 | all: ifsfunc.exe | ||
| 15 | |||
| 16 | msdos.cl1: $(dos)\msdos.skl \ | ||
| 17 | $(msg)\$(COUNTRY).msg \ | ||
| 18 | $(dos)\makefile | ||
| 19 | copy $(dos)\msdos.skl | ||
| 20 | nosrvbld msdos.skl $(msg)\$(COUNTRY).msg | ||
| 21 | |||
| 22 | ifsfunc.ctl: ifsfunc.skl $(msg)\$(COUNTRY).msg makefile | ||
| 23 | |||
| 24 | $(inc)\dossym.inc: $(inc)\versiona.inc $(inc)\dosmac.inc \ | ||
| 25 | $(inc)\bpb.inc $(inc)\buffer.inc $(inc)\sysvar.inc \ | ||
| 26 | $(inc)\vector.inc $(inc)\mult.inc $(inc)\dirent.inc \ | ||
| 27 | $(inc)\dpb.inc $(inc)\curdir.inc $(inc)\cpmfcb.inc \ | ||
| 28 | $(inc)\find.inc $(inc)\pdb.inc $(inc)\exe.inc \ | ||
| 29 | $(inc)\sf.inc $(inc)\arena.inc $(inc)\intnat.inc \ | ||
| 30 | $(inc)\mi.inc $(inc)\filemode.inc $(inc)\error.inc \ | ||
| 31 | $(inc)\syscall.inc \ | ||
| 32 | makefile | ||
| 33 | echo " touch $(inc)\dossym.inc " | ||
| 34 | |||
| 35 | ifssess.obj: ifssess.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 36 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 37 | makefile | ||
| 38 | |||
| 39 | ifsdir.obj: ifsdir.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 40 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 41 | makefile | ||
| 42 | |||
| 43 | ifsfile.obj: ifsfile.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 44 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 45 | makefile $(inc)\doscntry.inc | ||
| 46 | |||
| 47 | ifshand.obj: ifshand.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 48 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 49 | makefile | ||
| 50 | |||
| 51 | ifsdev.obj: ifsdev.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 52 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 53 | makefile | ||
| 54 | |||
| 55 | ifsutil.obj: ifsutil.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 56 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 57 | $(inc)\bugtyp.asm \ | ||
| 58 | makefile | ||
| 59 | |||
| 60 | ifserror.obj: ifserror.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 61 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 62 | ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \ | ||
| 63 | makefile | ||
| 64 | |||
| 65 | ifsfdos.obj: ifsfdos.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 66 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 67 | $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \ | ||
| 68 | $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \ | ||
| 69 | $(inc)\parse.asm \ | ||
| 70 | makefile | ||
| 71 | |||
| 72 | ifsinit.obj: ifsinit.asm $(inc)\ifssym.inc ifsfsym.inc \ | ||
| 73 | $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ | ||
| 74 | $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \ | ||
| 75 | $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \ | ||
| 76 | $(inc)\parse.asm \ | ||
| 77 | ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \ | ||
| 78 | makefile | ||
| 79 | |||
| 80 | $(inc)\nibdos.obj: | ||
| 81 | cd $(inc) | ||
| 82 | $(make) | ||
| 83 | cd $(here) | ||
| 84 | |||
| 85 | $(inc)\const2.obj: | ||
| 86 | cd $(inc) | ||
| 87 | $(make) | ||
| 88 | cd $(here) | ||
| 89 | |||
| 90 | $(inc)\msdata.obj: | ||
| 91 | cd $(inc) | ||
| 92 | $(make) | ||
| 93 | cd $(here) | ||
| 94 | |||
| 95 | $(inc)\mstable.obj: | ||
| 96 | cd $(inc) | ||
| 97 | $(make) | ||
| 98 | cd $(here) | ||
| 99 | |||
| 100 | $(inc)\msdosme.obj: | ||
| 101 | cd $(inc) | ||
| 102 | $(make) | ||
| 103 | cd $(here) | ||
| 104 | |||
| 105 | $(dos)\msdisp.obj: | ||
| 106 | cd $(dos) | ||
| 107 | $(make) | ||
| 108 | cd $(here) | ||
| 109 | |||
| 110 | $(dos)\mscode.obj: | ||
| 111 | cd $(dos) | ||
| 112 | $(make) | ||
| 113 | cd $(here) | ||
| 114 | |||
| 115 | ifsflink.obj: ifsflink.asm \ | ||
| 116 | $(inc)\dossym.inc \ | ||
| 117 | makefile | ||
| 118 | |||
| 119 | ifsfunc.exe: ifssess.obj ifsdir.obj ifsfile.obj ifshand.obj \ | ||
| 120 | ifsdev.obj ifsutil.obj ifserror.obj ifsfdos.obj \ | ||
| 121 | ifsinit.obj \ | ||
| 122 | $(inc)\nibdos.obj $(inc)\const2.obj $(inc)\msdata.obj \ | ||
| 123 | $(inc)\mstable.obj $(dos)\msdisp.obj \ | ||
| 124 | $(dos)\mscode.obj $(inc)\msdosme.obj \ | ||
| 125 | ifsflink.obj makefile ifsfunc.lnk | ||
| 126 | link @ifsfunc.lnk | ||
| 127 | |||