diff options
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM | 2739 |
1 files changed, 2739 insertions, 0 deletions
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; | ||