diff options
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSINIT.ASM')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSINIT.ASM | 1373 |
1 files changed, 1373 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM new file mode 100644 index 0000000..96fb591 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM | |||
| @@ -0,0 +1,1373 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsinit.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC INITIALIZATION ROUTINES - Routines for ifs ;AN000; | ||
| 4 | NAME IFSINIT ;AN000; | ||
| 5 | ;*********************************************************************************** ;AN000; | ||
| 6 | ; ;AN000; | ||
| 7 | ; IFS Initialization Routines ;AN000; | ||
| 8 | ; ;AN000; | ||
| 9 | ; IFSINIT ;AN000; | ||
| 10 | ; ;AN000; | ||
| 11 | ; REVISION HISTORY: ;AN000; | ||
| 12 | ; A000 - Original version 4.00 MAY 1987 ;AN000; | ||
| 13 | ; A001 - PTM 331 Entry point for device ioctl | ||
| 14 | ; A002 - PTM 430 Renumber parse errors | ||
| 15 | ; A003 - DCR 96 Transfer IFS DOS callbacks to IFSFUNC | ||
| 16 | ; A004 - PTM 696 IFSFUNC hang w/no drivers | ||
| 17 | ; A005 - PTM 541 Parse problem | ||
| 18 | ; A006 - PTM 1227 DOS Version Check problem | ||
| 19 | ; A007 - PTM 842 Error messages in ifsfunc | ||
| 20 | ; A008 - PTM 1950 Autoattach when 2 ifs drivers loaded & 1st fails attach | ||
| 21 | ; A009 - PTM 2249 Autoattach must set isifs bit in cds | ||
| 22 | ; A010 - PTM 2827 Error proc problems 1/88 RMG | ||
| 23 | ; A011 - PTM 3334 put back reset environment call 2/88 rmg | ||
| 24 | ; A012 - PTM 4140 dos ext error msg enhancement - semaphore processing 4/19/88 RMG | ||
| 25 | ; A013 - DCR 526 New INT 2FH Share interface not to trigger logic install 4/19/88 RMG | ||
| 26 | ; | ||
| 27 | ; LOC - | ||
| 28 | ; | ||
| 29 | ;*********************************************************************************** | ||
| 30 | ;AN000; | ||
| 31 | .xlist ;AN000; | ||
| 32 | .xcref ;AN000; | ||
| 33 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 34 | INCLUDE IFSSYM.INC ;AN000; | ||
| 35 | INCLUDE DOSSYM.INC ;AN000; | ||
| 36 | INCLUDE DEVSYM.INC ;AN000; | ||
| 37 | include sysmsg.inc ;AN000; | ||
| 38 | msg_utilname <IFSFUNC> ; resident msgret stuff ;AN000; | ||
| 39 | .cref ;AN000; | ||
| 40 | .list ;AN000; | ||
| 41 | .sall ;AN000; | ||
| 42 | ;AN000; | ||
| 43 | AsmVars <IBM, INSTALLED, DEBUG, PATHGEN> ;AN000; | ||
| 44 | ;AN000; | ||
| 45 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 46 | IFSSEG ENDS ;AN000; | ||
| 47 | ;AN000; | ||
| 48 | include dosseg.asm ;AN000; | ||
| 49 | ;AN000; | ||
| 50 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 51 | ; DOSGROUP data ;AN000; | ||
| 52 | extrn DataVersion:WORD ; version number of DOS data. ;AN000; | ||
| 53 | extrn SFTFCB:DWORD ; FCB SFT cache ;AN000; | ||
| 54 | extrn KeepCount:WORD ; FCB SFT cache ;AN000; | ||
| 55 | Extrn CDSAddr:DWORD ;AN000; | ||
| 56 | Extrn CDSCount:BYTE ;AN000; | ||
| 57 | Extrn DummyCDS:BYTE ;AN000; | ||
| 58 | Extrn CritPatch:WORD ;AN000; | ||
| 59 | DATA ENDS ;AN000; | ||
| 60 | ;AN000; | ||
| 61 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 62 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | ;IFS Data ;AN000; | ||
| 65 | ;AN000; | ||
| 66 | Extrn CDSAlt:DWORD ;AN000; | ||
| 67 | Extrn DFLAddr:DWORD ;AN000; | ||
| 68 | Extrn DFLCount:BYTE ;AN000; | ||
| 69 | ;;;aliasExtrn NLAddr:DWORD ;AN000; | ||
| 70 | ;;;aliasExtrn NLSIZE:WORD ;AN000; | ||
| 71 | Extrn INT_2F_5:BYTE ;AN000; | ||
| 72 | Extrn NEXT_2F_5:DWORD ;AN000; | ||
| 73 | Extrn IFSR:WORD ;AN000; | ||
| 74 | Extrn CD1:WORD ;AN000; | ||
| 75 | Extrn DF1:WORD ;AN000; | ||
| 76 | Extrn SFF1:WORD ;AN000; | ||
| 77 | Extrn THISIFS:DWORD ;AN000; | ||
| 78 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 79 | Extrn IFSFUNC_FLAGS:WORD ;AN000; | ||
| 80 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 81 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 82 | Extrn IFS_ATTRS:WORD | ||
| 83 | Extrn RODS_LABEL:BYTE ;AN000; | ||
| 84 | Extrn IFSSEM:BYTE | ||
| 85 | ;AN000; | ||
| 86 | PUBLIC CODESIZE ;AN000; | ||
| 87 | CODESIZE DB 'RMG' ;AN000; | ||
| 88 | DB 30H ;AN000; | ||
| 89 | DB 30H ;AN000; | ||
| 90 | DB 30H ;AN000; | ||
| 91 | DB 30H ;AN000; | ||
| 92 | DB 30H ;AN000; | ||
| 93 | DB 20H ;AN000; | ||
| 94 | PUBLIC TOTSIZE ;AN000; | ||
| 95 | TOTSIZE DB 30H ;AN000; | ||
| 96 | DB 30H ;AN000; | ||
| 97 | DB 30H ;AN000; | ||
| 98 | DB 30H ;AN000; | ||
| 99 | DB 30H ;AN000; | ||
| 100 | DB 20H ;AN000; | ||
| 101 | ;AN000; | ||
| 102 | ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | Break <INT 2F handler> ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | IF DEBUG ;AN000; | ||
| 107 | Procedure NetPointers,NEAR ;AN000; | ||
| 108 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 109 | LDS SI,[DFLAddr] ;AN000; | ||
| 110 | ;;;aliasLES DI,[NLAddr] ;AN000; | ||
| 111 | return ;AN000; | ||
| 112 | EndProc NetPointers ;AN000; | ||
| 113 | ;AN000; | ||
| 114 | Procedure NetPointers2,NEAR ;AN000; | ||
| 115 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 116 | PUSH CS ;AN000; | ||
| 117 | POP DS ;AN000; | ||
| 118 | ASSUME DS:IFSSEG ;AN000; | ||
| 119 | MOV CX,[DFLCount] ;AN000; | ||
| 120 | ;;;aliasMOV DX,[NLSIZE] ;AN000; | ||
| 121 | return ;AN000; | ||
| 122 | EndProc NetPointers2 ;AN000; | ||
| 123 | ENDIF ;AN000; | ||
| 124 | ;AN000; | ||
| 125 | IF PATHGEN ;AN000; | ||
| 126 | Procedure GetIFSFCSinES,NEAR ;AN000; | ||
| 127 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 128 | PUSH CS ;AN000; | ||
| 129 | POP ES ;AN000; | ||
| 130 | return ;AN000; | ||
| 131 | EndProc GetIFSFCSinES ;AN000; | ||
| 132 | ENDIF ;AN000; | ||
| 133 | ;AN000; | ||
| 134 | Procedure UnusedFunc,NEAR ;AN000; | ||
| 135 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 136 | fmt <>,<>,<"Unused IFSFUNC function issued\n"> ;AN000; | ||
| 137 | MOV AX,error_invalid_function ;AN000; | ||
| 138 | STC ;AN000; | ||
| 139 | return ;AN000; | ||
| 140 | EndProc UnusedFunc ;AN000; | ||
| 141 | ;AN000; | ||
| 142 | ; the following multiplex functions are implemented: ;AN000; | ||
| 143 | ;AN000; | ||
| 144 | retn1 DD ? ;AN000; | ||
| 145 | DMY DW ? ;AN000; | ||
| 146 | CONT DD ? ;AN000; | ||
| 147 | FOO DW Leave2F ;AN000; | ||
| 148 | ;AN000; | ||
| 149 | INT2F PROC FAR ;AN000; | ||
| 150 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; | ||
| 151 | CMP AH,multIFS ;AN000; | ||
| 152 | JZ IDispatch ;AN000; | ||
| 153 | JMP CONT ;AN000; | ||
| 154 | Leave2F: ;AN000; | ||
| 155 | RET ;AN000; | ||
| 156 | INT2F ENDP ;AN000; | ||
| 157 | ;AN000; | ||
| 158 | Procedure IDispatch,NEAR ;AN000; | ||
| 159 | POP WORD PTR retn1 ; remove long return ;AN000; | ||
| 160 | POP WORD PTR retn1+2 ;AN000; | ||
| 161 | POP DMY ; remove flags ;AN000; | ||
| 162 | XCHG AX,BX ; save bx/move index to index reg ;AN000; | ||
| 163 | SHL BL,1 ; convert byte to word index ;AN000; | ||
| 164 | XOR BH,BH ; convert to word index ;AN000; | ||
| 165 | POP DMY ; save fictitious AX ;AN000; | ||
| 166 | PUSH DMY ; restore spot on stack ;AN000; | ||
| 167 | PUSH WORD PTR retn1+2 ; restore long return ;AN000; | ||
| 168 | PUSH WORD PTR retn1 ;AN000; | ||
| 169 | PUSH FOO ; place near address of far return ;AN000; | ||
| 170 | PUSH CS:IFStable[BX] ; place destination routine ;AN000; | ||
| 171 | XCHG AX,BX ; restore BX ;AN000; | ||
| 172 | MOV AX,DMY ; restore AX ;AN000; | ||
| 173 | STI ; let Mani see Clock ticks ;AN000; | ||
| 174 | ShortReturn: ;AN000; | ||
| 175 | return ; go to routine (dispatch for Aaron) ;AN000; | ||
| 176 | ;AN000; | ||
| 177 | EDW MACRO name ;AN000; | ||
| 178 | extrn name:near ;AN000; | ||
| 179 | DW name ;AN000; | ||
| 180 | ENDM ;AN000; | ||
| 181 | ;AN000; | ||
| 182 | IFSTable LABEL WORD ;AN000; | ||
| 183 | DW IFSInstall ;AN000; | ||
| 184 | EDW IFS_RMDIR ; 1 IFS_RMDIR ;AN000; | ||
| 185 | EDW IFS_SEQ_RMDIR ; 2 IFS_SEQ_RMDIR ;AN000; | ||
| 186 | EDW IFS_MKDIR ; 3 IFS_MKDIR ;AN000; | ||
| 187 | EDW IFS_SEQ_MKDIR ; 4 IFS_SEQ_MKDIR ;AN000; | ||
| 188 | EDW IFS_CHDIR ; 5 IFS_CHDIR ;AN000; | ||
| 189 | EDW IFS_CLOSE ; 6 IFS_CLOSE ;AN000; | ||
| 190 | EDW IFS_COMMIT ; 7 IFS_COMMIT ;AN000; | ||
| 191 | EDW IFS_READ ; 8 IFS_READ ;AN000; | ||
| 192 | EDW IFS_WRITE ; 9 IFS_WRITE ;AN000; | ||
| 193 | EDW IFS_XLOCK ; 10 IFS_XLOCK ;AN000; | ||
| 194 | DW UnusedFunc ; 11 ;AN000; | ||
| 195 | EDW IFS_DISK_INFO ; 12 IFS_DISK_INFO ;AN000; | ||
| 196 | EDW IFS_SET_FILE_ATTRIBUTE ; 13 IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 197 | EDW IFS_SEQ_SET_FILE_ATTRIBUTE ; 14 IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 198 | EDW IFS_GET_FILE_INFO ; 15 IFS_GET_FILE_INFO ;AN000; | ||
| 199 | EDW IFS_SEQ_GET_FILE_INFO ; 16 IFS_SEQ_GET_FILE_INFO ;AN000; | ||
| 200 | EDW IFS_RENAME ; 17 IFS_RENAME ;AN000; | ||
| 201 | EDW IFS_SEQ_RENAME ; 18 IFS_SEQ_RENAME ;AN000; | ||
| 202 | EDW IFS_DELETE ; 19 IFS_DELETE ;AN000; | ||
| 203 | EDW IFS_SEQ_DELETE ; 20 IFS_SEQ_DELETE ;AN000; | ||
| 204 | EDW IFS_OPEN ; 21 IFS_OPEN ;AN000; | ||
| 205 | EDW IFS_SEQ_OPEN ; 22 IFS_SEQ_OPEN ;AN000; | ||
| 206 | EDW IFS_CREATE ; 23 IFS_CREATE ;AN000; | ||
| 207 | EDW IFS_SEQ_CREATE ; 24 IFS_SEQ_CREATE ;AN000; | ||
| 208 | EDW IFS_SEQ_SEARCH_FIRST ; 25 IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 209 | EDW IFS_SEQ_SEARCH_NEXT ; 26 IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 210 | EDW IFS_SEARCH_FIRST ; 27 IFS_SEARCH_FIRST ;AN000; | ||
| 211 | EDW IFS_SEARCH_NEXT ; 28 IFS_SEARCH_NEXT ;AN000; | ||
| 212 | EDW IFS_ABORT ; 29 IFS_ABORT ;AN000; | ||
| 213 | EDW IFS_ASSOPER ; 30 IFS_ASSOPER ;AN000; | ||
| 214 | EDW Printer_GETSET_STRING ; 31 Printer_GETSET_STRING ;AN000; | ||
| 215 | EDW IFSFlushBuf ; 32 IFS_Flush_Buf ;AN000; | ||
| 216 | EDW IFS_LSEEK ; 33 IFS_LSEEK ;AN000; | ||
| 217 | EDW IFS_RESET_ENVIRONMENT ; 34 IFS_RESET_ENVIRONMENT ;AN000; | ||
| 218 | EDW IFS_DEVICE_CHECK ; 35 IFSDeviceCheck ;AN000; | ||
| 219 | EDW IFS_DEVICE_CLOSE ; 36 IFSDeviceClose ;AN000; | ||
| 220 | EDW IFS_DEVICE_OPER ; 37 IFSDeviceOper ;AN000; | ||
| 221 | EDW IFS_SPOOL_ECHO_CHECK ; 38 IFSSpoolEchoCheck ;AN000; | ||
| 222 | DW UnusedFunc ; 39 ;AN000; | ||
| 223 | DW UnusedFunc ; 40 ;AN000; | ||
| 224 | DW UnusedFunc ; 41 ;AN000; | ||
| 225 | EDW SERVER_DOSCALL_CLOSEFILES_FOR_UID ; 42 util ;AN000; | ||
| 226 | EDW DEVICE_IOCTL ; 43 dev ;AN001; | ||
| 227 | EDW IFS_UPDATE_CB ; 44 UPDATECB util ;AN000; | ||
| 228 | EDW IFS_FILE_XATTRIBUTES ; 45 hand ;AN000; | ||
| 229 | EDW IFS_XOPEN ; 46 XOPEN file ;AN000; | ||
| 230 | EDW IFS_DEPENDENT_IOCTL ; 47 util ;AN000; | ||
| 231 | ;AN000; | ||
| 232 | IF DEBUG ;AN000; | ||
| 233 | DW NetPointers ; 47 NetPointers ;AN000; | ||
| 234 | DW NetPointers2 ; 48 NetPointers2 ;AN000; | ||
| 235 | ENDIF ;AN000; | ||
| 236 | ;AN000; | ||
| 237 | IF PATHGEN ;AN000; | ||
| 238 | DW GetIFSFCSinES ; 49 (if debug) GetRedirCSinES ;AN000; | ||
| 239 | ; 47 (if NOT debug) GetRedirCSinES ;AN000; | ||
| 240 | ENDIF ;AN000; | ||
| 241 | ;AN000; | ||
| 242 | IFSInstall: ;AN000; | ||
| 243 | MOV AL,0FFh ;AN000; | ||
| 244 | MOV BX,IFS_ATTRS | ||
| 245 | return ;AN000; | ||
| 246 | EndProc IDispatch ;AN000; | ||
| 247 | ;AN000; | ||
| 248 | Procedure EcritNet,NEAR ;AN000; | ||
| 249 | ASSUME SS:NOTHING ;AN000; | ||
| 250 | PUSHF ;AN000; | ||
| 251 | CLI ;AN000; | ||
| 252 | PUSH AX ;AN000; | ||
| 253 | MOV AX,8000h+CritNet ;AN000; | ||
| 254 | INT int_ibm ;AN000; | ||
| 255 | POP AX ;AN000; | ||
| 256 | IF DEBUG ;AN000; | ||
| 257 | JNC NoCarry ;AN000; | ||
| 258 | fmt <>,<>,<"$p: ECritNet overflowed semaphore\n"> ;AN000; | ||
| 259 | NoCarry: ;AN000; | ||
| 260 | ENDIF ;AN000; | ||
| 261 | STI ;AN000; | ||
| 262 | POPF ;AN000; | ||
| 263 | return ;AN000; | ||
| 264 | EndProc EcritNet ;AN000; | ||
| 265 | ;AN000; | ||
| 266 | ; ;AN000; | ||
| 267 | ; Leave critical section for network. Note that the first instruction (PUSH ;AN000; | ||
| 268 | ; AX) here is used as the patch byte to enable the DOS critical section ;AN000; | ||
| 269 | ; routines... ;AN000; | ||
| 270 | ; ;AN000; | ||
| 271 | ; NOTE!!! On a 286, this instruction issues POPF!!! ;AN000; | ||
| 272 | ; ;AN000; | ||
| 273 | Procedure LcritNet,NEAR ;AN000; | ||
| 274 | PUSH AX ;AN000; | ||
| 275 | PUSHF ;AN000; | ||
| 276 | CLI ;AN000; | ||
| 277 | IF DEBUG ;AN000; | ||
| 278 | JGE NoWrap ;AN000; | ||
| 279 | fmt <>,<>,<"$p: LCritNet decrementing semaphore through zero\n"> ;AN000; | ||
| 280 | NoWrap: ;AN000; | ||
| 281 | ENDIF ;AN000; | ||
| 282 | ;AN000; | ||
| 283 | MOV AX,8100h+critNet ;AN000; | ||
| 284 | INT int_ibm ;AN000; | ||
| 285 | STI ;AN000; | ||
| 286 | POPF ; NOTE that this restores entry ;AN000; | ||
| 287 | POP AX ;AN000; | ||
| 288 | return ;AN000; | ||
| 289 | EndProc LcritNet ;AN000; | ||
| 290 | ;AN000; | ||
| 291 | ;AN000; | ||
| 292 | Procedure EcritIFS,NEAR ;AN000; | ||
| 293 | ASSUME SS:NOTHING ;AN000; | ||
| 294 | PUSHF ;AN000; | ||
| 295 | CLI ;AN000; | ||
| 296 | PUSH AX ;AN000; | ||
| 297 | MOV AX,8000h+CritIFS ;AN000; | ||
| 298 | INT int_ibm ;AN000; | ||
| 299 | POP AX ;AN000; | ||
| 300 | STI ;AN000; | ||
| 301 | POPF ;AN000; | ||
| 302 | return ;AN000; | ||
| 303 | EndProc EcritIFS ;AN000; | ||
| 304 | ;AN000; | ||
| 305 | Procedure LcritIFS,NEAR ;AN000; | ||
| 306 | PUSH AX ;AN000; | ||
| 307 | PUSHF ;AN000; | ||
| 308 | CLI ;AN000; | ||
| 309 | MOV AX,8100h+critIFS ;AN000; | ||
| 310 | INT int_ibm ;AN000; | ||
| 311 | STI ;AN000; | ||
| 312 | POPF ; NOTE that this restores entry ;AN000; | ||
| 313 | POP AX ;AN000; | ||
| 314 | return ;AN000; | ||
| 315 | EndProc LcritIFS ;AN000; | ||
| 316 | ;AN000; | ||
| 317 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; | ||
| 318 | ;AN000; | ||
| 319 | INTERR: ;AN000; | ||
| 320 | INTERRL:jmp INTERRL ; hang here - we're sick ;AN000; | ||
| 321 | ;AN000; | ||
| 322 | ;AN000; | ||
| 323 | PUBLIC TEMPBUF ;AN000; | ||
| 324 | TEMPBUF LABEL BYTE ;AN000; | ||
| 325 | ; THE SPACE FROM HERE TO NETEND CONSTITUTES THE TEMP AREA OF IFSFUNC. ;AN000; | ||
| 326 | ; WARNING DANGER!!!!!!!!! ;AN000; | ||
| 327 | ; DO NOT reduce the size of this area without first checking ;AN000; | ||
| 328 | ; all users of it. It is OK to make it BIGGER without checking. ;AN000; | ||
| 329 | ; Current size: ?? ;AN000; | ||
| 330 | ;AN000; | ||
| 331 | Break <General IFSFUNC INIT> ;AN000; | ||
| 332 | ;************************************************************************************ ;AN000; | ||
| 333 | ; ;AN000; | ||
| 334 | ; map: Resident: ;AN000; | ||
| 335 | ; IF_40 - (contifsinit) 2nd half of ifsfinit procedure = tempbuf area ;AN000; | ||
| 336 | ; allocate: DFL_LIST, altcds, sftfcb, ;AN000; | ||
| 337 | ; set TOTALSIZE ;AN000; | ||
| 338 | ; IFSFUNCINIT start ;AN000; | ||
| 339 | ; I_700 - INIT: 2nd half of IFSFUNCINIT ;AN000; | ||
| 340 | ; INT 23,24 stuff ;AN000; | ||
| 341 | ; call IFSFINIT ;AN000; | ||
| 342 | ; close std handles ;AN000; | ||
| 343 | ; enable critical section ;AN000; | ||
| 344 | ; terms & stays ;AN000; | ||
| 345 | ; tempbuf ends ;AN000; | ||
| 346 | ; Transient: ;AN000; | ||
| 347 | ; IFSFINIT procedure ;AN000; | ||
| 348 | ; Set interrupt vectors - 2F ;AN000; | ||
| 349 | ; Call AUTO_ATTACH ;AN000; | ||
| 350 | ; allocate stuff (write over code) ;AN000; | ||
| 351 | ; jumps up to 2nd half ;AN000; | ||
| 352 | ; IFSFUNCINIT init code ;AN000; | ||
| 353 | ; version checks ;AN000; | ||
| 354 | ; error msg processing ;AN000; | ||
| 355 | ; free environment ;AN000; | ||
| 356 | ; parsing ;AN000; | ||
| 357 | ; move stack ;AN000; | ||
| 358 | ; check size for everything ;AN000; | ||
| 359 | ; ifsfunc code size calculation ;AN000; | ||
| 360 | ; ifsfunc total size calculation ;AN000; | ||
| 361 | ; jmps to I_700 ;AN000; | ||
| 362 | ; AutoAttach ;AN000; | ||
| 363 | ; CheckUNCpresence ;AN000; | ||
| 364 | ; ;AN000; | ||
| 365 | ;************************************************************************************ ;AN000; | ||
| 366 | ;AN000; | ||
| 367 | ; This Code must be protected from overwrite when the structures are ;AN000; | ||
| 368 | ; initialized ;AN000; | ||
| 369 | ;AN000; | ||
| 370 | ;AN000; | ||
| 371 | IF_40: ; CONTIFSINIT ;AN000; | ||
| 372 | ASSUME DS:IFSSEG,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 373 | ;AN000; | ||
| 374 | ; ;AN000; | ||
| 375 | ; Allocate and init DFL_LIST ;AN000; | ||
| 376 | ; ;AN000; | ||
| 377 | MOV WORD PTR DFLAddr,DI ;AN000; | ||
| 378 | MOV WORD PTR DFLAddr+2,ES ;AN000; | ||
| 379 | MOV AL,DFLCount ;AN000; | ||
| 380 | XOR AH,AH ;AN000; | ||
| 381 | MOV BX,SIZE DFLL_LIST ;AN000; | ||
| 382 | MUL BX ;AN000; | ||
| 383 | MOV CX,AX ;AN000; | ||
| 384 | XOR AX,AX ;AN000; | ||
| 385 | REP STOSB ;AN000; | ||
| 386 | ;AN000; | ||
| 387 | ;;;aliasMOV WORD PTR NLAddr,DI ;AN000; | ||
| 388 | ;;; MOV WORD PTR NLAddr+2,ES ;AN000; | ||
| 389 | ;;; MOV AX,NLSIZE ;AN000; | ||
| 390 | ;;; STOSW ;AN000; | ||
| 391 | ;;; XOR AX,AX ;AN000; | ||
| 392 | ;;; STOSW ;AN000; | ||
| 393 | ;;;aliasADD DI,NLSIZE-4 ;AN000; | ||
| 394 | ; ;AN000; | ||
| 395 | ; Allocate alt CDSs area ;AN000; | ||
| 396 | ; ;AN000; | ||
| 397 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 398 | JZ IF_50 ;AN000; | ||
| 399 | MOV WORD PTR CDSAlt,DI ;AN000; | ||
| 400 | MOV WORD PTR CDSAlt+2,ES ;AN000; | ||
| 401 | PUSH DS ;AN000; | ||
| 402 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 403 | INT 2FH ;AN000; | ||
| 404 | ASSUME DS:DOSGROUP ;AN000; | ||
| 405 | MOV AL,CDSCount ; Alt = Alloc ((sizeof(CDS)+1)*CDSCount); ;AN000; | ||
| 406 | XOR AH,AH ;AN000; | ||
| 407 | INC AX ;AN000; | ||
| 408 | MOV BX,SIZE curdir_list ;AN000; | ||
| 409 | MUL BX ;AN000; | ||
| 410 | ADD DI,AX ;AN000; | ||
| 411 | JMP SHORT IF_55 ;AN000; | ||
| 412 | IF_50: ;AN000; | ||
| 413 | PUSH DS ;AN000; | ||
| 414 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 415 | INT 2FH ;AN000; | ||
| 416 | ASSUME DS:DOSGROUP ;AN000; | ||
| 417 | ; ;AN000; | ||
| 418 | ; Allocate new FCB cache if appropriate ;AN000; | ||
| 419 | ; ;AN000; | ||
| 420 | IF_55: ;AN000; | ||
| 421 | CMP BYTE PTR CS:NEWFCBCACHE,0 ; Damn forward reference ;AN000; | ||
| 422 | JZ IF_80 ; JZ NO_FCB_CACHE ;AN000; | ||
| 423 | ; ;AN000; | ||
| 424 | ; We need to allocate (NewNumFCB * size of SF_entry) + size of sfTable. ;AN000; | ||
| 425 | ; ;AN000; | ||
| 426 | CLI ; Diddling a DOS table, make sure ;AN000; | ||
| 427 | ; ;AN000; | ||
| 428 | ; Make dos point to new table ;AN000; | ||
| 429 | ; ;AN000; | ||
| 430 | MOV WORD PTR SFTFCB,DI ;AN000; | ||
| 431 | MOV WORD PTR SFTFCB+2,ES ;AN000; | ||
| 432 | ; ;AN000; | ||
| 433 | ; Initialize table parts, next link and size ;AN000; | ||
| 434 | ; ;AN000; | ||
| 435 | MOV WORD PTR ES:[DI.sfLink],-1 ;AN000; | ||
| 436 | MOV WORD PTR ES:[DI.sfLink+2],-1 ;AN000; | ||
| 437 | MOV CX,NewNumFCB ;AN000; | ||
| 438 | MOV ES:[DI.sfcount],CX ;AN000; | ||
| 439 | ; ;AN000; | ||
| 440 | ; Set up keepcount ;AN000; | ||
| 441 | ; ;AN000; | ||
| 442 | MOV KeepCount,NewKeepVal ;AN000; | ||
| 443 | ; ;AN000; | ||
| 444 | ; Clean out the new FCB Cache ;AN000; | ||
| 445 | ; ;AN000; | ||
| 446 | LEA DI,[DI].SFTable ; Point to the FCB SFTs ;AN000; | ||
| 447 | IF_60: ; CleanScan: ;AN000; | ||
| 448 | MOV ES:[DI.sf_ref_count],0 ;AN000; | ||
| 449 | MOV WORD PTR ES:[DI.sf_position],0 ;AN000; | ||
| 450 | MOV WORD PTR ES:[DI.sf_position+2],0 ;AN000; | ||
| 451 | ADD DI,SIZE sf_entry ;AN000; | ||
| 452 | LOOP IF_60 ;AN000; | ||
| 453 | STI ;AN000; | ||
| 454 | IF_80: ; NO_FCB_CACHE: ;AN000; | ||
| 455 | POP DS ;AN000; | ||
| 456 | ASSUME DS:IFSSEG ;AN000; | ||
| 457 | ;AN000; | ||
| 458 | MOV [TOTALSIZE],DI ; Offset of 1st free byte ;AN000; | ||
| 459 | POP AX ;AN000; | ||
| 460 | POP BX ;AN000; | ||
| 461 | POP CX ;AN000; | ||
| 462 | POP DX ;AN000; | ||
| 463 | POP DI ;AN000; | ||
| 464 | POP SI ;AN000; | ||
| 465 | POP ES ;AN000; | ||
| 466 | POP DS ;AN000; | ||
| 467 | return ;AN000; | ||
| 468 | ;AN000; | ||
| 469 | ;AN000; | ||
| 470 | ;AN000; | ||
| 471 | ASSUME CS:IFSSEG,DS:IFSSEG,ES:NOTHING,SS:STACK ;AN000; | ||
| 472 | ;AN000; | ||
| 473 | .xlist ;AN000; | ||
| 474 | .xcref ;AN000; | ||
| 475 | msg_services <MSGDATA> ;AN007; | ||
| 476 | PUBLIC SYSGETMSG | ||
| 477 | msg_services <GETmsg> | ||
| 478 | .cref ;AN000; | ||
| 479 | .list ;AN000; | ||
| 480 | ;AN000; | ||
| 481 | Break <Installable Network INIT> ;AN000; | ||
| 482 | ;AN000; | ||
| 483 | Totalsize DW ? ;AN000; | ||
| 484 | ;AN000; | ||
| 485 | NEWFCBCACHE DB 0 ;AN000; | ||
| 486 | ;AN000; | ||
| 487 | INT_24: ; INT 24 handler used during INIT. ;AN000; | ||
| 488 | MOV AL,3 ; FAIL any INT 24s ;AN000; | ||
| 489 | INT_23: ; ^C handler used during INIT. ;AN000; | ||
| 490 | IRET ; ignores any ^C. ;AN000; | ||
| 491 | ;AN000; | ||
| 492 | I_700: ; Init ;AN000; | ||
| 493 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 494 | ; ;AN000; | ||
| 495 | ; We are now going to set lots of INT vectors and other stuff. We need ;AN000; | ||
| 496 | ; to make ourselves immune to INT 24 and ^C ;AN000; | ||
| 497 | ; ;AN000; | ||
| 498 | PUSH CS ;AN000; | ||
| 499 | POP DS ;AN000; | ||
| 500 | MOV DX,OFFSET INT_23 ;AN000; | ||
| 501 | MOV AX,(Set_Interrupt_Vector SHL 8) + 23H ;AN000; | ||
| 502 | INT 21H ;AN000; | ||
| 503 | MOV DX,OFFSET INT_24 ;AN000; | ||
| 504 | MOV AX,(Set_Interrupt_Vector SHL 8) + 24H ;AN000; | ||
| 505 | INT 21H ;AN000; | ||
| 506 | invoke IFSFINIT ; Do general INIT ;AN000; | ||
| 507 | ;AN000; | ||
| 508 | XOR BX,BX ;AN000; | ||
| 509 | MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN ;AN000; | ||
| 510 | I_720: ; Close STD handles before ;AN000; | ||
| 511 | ; keep process ;AN000; | ||
| 512 | MOV AH,CLOSE ;AN000; | ||
| 513 | INT 21H ;AN000; | ||
| 514 | INC BX ;AN000; | ||
| 515 | LOOP I_720 ;AN000; | ||
| 516 | ;AN000; | ||
| 517 | ; ;AN000; | ||
| 518 | ; Enable the critical section code. This consists of replacing the RETs at ;AN000; | ||
| 519 | ; the beginning of each critical section routine with a PUSH AX ;AN000; | ||
| 520 | ; ;AN000; | ||
| 521 | PUSH CS ;AN000; | ||
| 522 | POP DS ; ds - ifsseg ;AN000; | ||
| 523 | ;AN000; | ||
| 524 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ; 1st check if unc fs loaded ;AN000; | ||
| 525 | JZ I_800 ; only do this for unc ;AN000; | ||
| 526 | MOV AH,Get_In_Vars ; do crit patch ;AN000; | ||
| 527 | INT 21h ;AN000; | ||
| 528 | cld ;AN000; | ||
| 529 | ASSUME ES:DOSGroup ;AN000; | ||
| 530 | MOV AL,BYTE PTR LCritNet ;AN000; | ||
| 531 | MOV BX,OFFSET DOSGROUP:CritPatch ;AN000; | ||
| 532 | CLI ;AN000; | ||
| 533 | I_760: ; Scan ;AN000; | ||
| 534 | MOV DI,ES:[BX] ;AN000; | ||
| 535 | ADD BX,2 ;AN000; | ||
| 536 | OR DI,DI ;AN000; | ||
| 537 | JZ I_780 ;AN000; | ||
| 538 | stosb ;AN000; | ||
| 539 | JMP I_760 ;AN000; | ||
| 540 | I_780: ;AN000; | ||
| 541 | STI ;AN000; | ||
| 542 | I_800: ;AC012;moved | ||
| 543 | MOV CS:IFSSEM,0 ; initialize ifs semaphores ;AN012; | ||
| 544 | ; ;AN000; | ||
| 545 | ; Compute total size for residency. ;AN000; | ||
| 546 | ; ;AN000; | ||
| 547 | MOV DX,TotalSize ; size of code and structs ;AN000; | ||
| 548 | ADD DX,100H+0Fh ; Add size of header ;AN000; | ||
| 549 | RCR DX,1 ;AN000; | ||
| 550 | MOV CL,3 ;AN000; | ||
| 551 | SHR DX,CL ;AN000; | ||
| 552 | MOV AX,(Keep_Process SHL 8) + 0 ;AN000; | ||
| 553 | INT 21h ;AN000; | ||
| 554 | MOV AX,(EXIT SHL 8) + 1 ;AN000; | ||
| 555 | INT 21h ;AN000; | ||
| 556 | ;AN000; | ||
| 557 | ;AN000; | ||
| 558 | ; %%%% CODE/DATA BELOW IS OVERLAYED WHEN STRUCTURES ARE SET UP ;AN000; | ||
| 559 | ;AN000; | ||
| 560 | NETEND LABEL BYTE ;AN000; | ||
| 561 | ;AN000; | ||
| 562 | procedure IFSFINIT,NEAR ;AN000; | ||
| 563 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 564 | ;AN000; | ||
| 565 | ; Perform initialization at DOSINIT time ;AN000; | ||
| 566 | ;AN000; | ||
| 567 | PUSH DS ;AN000; | ||
| 568 | PUSH ES ;AN000; | ||
| 569 | PUSH SI ;AN000; | ||
| 570 | PUSH DI ;AN000; | ||
| 571 | PUSH DX ;AN000; | ||
| 572 | PUSH CX ;AN000; | ||
| 573 | PUSH BX ;AN000; | ||
| 574 | PUSH AX ;AN000; | ||
| 575 | PUSH CS ;AN000; | ||
| 576 | POP DS ;AN000; | ||
| 577 | ;AN000; | ||
| 578 | ASSUME DS:IFSSEG ;AN000; | ||
| 579 | ;AN000; | ||
| 580 | ; SET INTERRUPT VECTORS ;AN000; | ||
| 581 | ;AN000; | ||
| 582 | MOV AL,2FH ;AN000; | ||
| 583 | PUSH AX ;AN000; | ||
| 584 | MOV AX,(multDOS SHL 8) OR 2 ;AN000; | ||
| 585 | INT 2FH ;AN000; | ||
| 586 | POP AX ; no know contents ;AN000; | ||
| 587 | ;AN000; | ||
| 588 | PUSH ES ;AN000; | ||
| 589 | PUSH BX ;AN000; | ||
| 590 | LES BX,DWORD PTR ES:[BX] ; setting int 2f mult 5 ;AN000; | ||
| 591 | MOV WORD PTR [NEXT_2F_5],BX ;AN000; | ||
| 592 | MOV WORD PTR [NEXT_2F_5+2],ES ;AN000; | ||
| 593 | POP BX ;AN000; | ||
| 594 | POP ES ;AN000; | ||
| 595 | ;AN000; | ||
| 596 | MOV DX,OFFSET INT_2F_5 ;AN000; | ||
| 597 | MOV ES:[BX],DX ;AN000; | ||
| 598 | MOV ES:[BX+2],DS ;AN000; | ||
| 599 | ;AN000; | ||
| 600 | MOV AX,(Get_Interrupt_Vector SHL 8) + 2Fh ;AN000; | ||
| 601 | INT 21h ;AN000; | ||
| 602 | MOV WORD PTR CONT,BX ;AN000; | ||
| 603 | MOV WORD PTR CONT+2,ES ;AN000; | ||
| 604 | MOV AX,(Set_Interrupt_Vector SHL 8) + 2Fh ;AN000; | ||
| 605 | MOV DX,OFFSET INT2F ; multIFS handler ;AN000; | ||
| 606 | INT 21h ;AN000; | ||
| 607 | ; ;AN000; | ||
| 608 | ; auto - attach ;AN000; | ||
| 609 | ; ;AN000; | ||
| 610 | CALL AUTO_ATTACH ;AN000; | ||
| 611 | ; ;AN000; | ||
| 612 | ; call swap setup ;AN000; | ||
| 613 | ; ;AN000; | ||
| 614 | PUSH DS ;AN000; | ||
| 615 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 616 | INT 2FH ;AN000; | ||
| 617 | ASSUME DS:DOSGROUP ;AN000; | ||
| 618 | invoke SERVER_IFSFUNC_DATA_AREA ;AN000; | ||
| 619 | POP DS ;AN000; | ||
| 620 | invoke SET_IFS_DOSCALL@ ;AN003; | ||
| 621 | ;AN000; | ||
| 622 | PUSH CS ;AN000; | ||
| 623 | POP ES ;AN000; | ||
| 624 | ; ;AN007; | ||
| 625 | ; Prep error messages ;AN007; | ||
| 626 | ; ;AN007; | ||
| 627 | LEA DI,Rods_label ;AN007; | ||
| 628 | SaveReg <CS> ;AN007; | ||
| 629 | RestoreReg <ES> ;AN007; | ||
| 630 | MOV AX,DOS_GET_EXT_PARSE_ADD ;AN007; | ||
| 631 | MOV DL,7 ; set msg addr ;AN007; | ||
| 632 | INT 2FH ;AN007; | ||
| 633 | ; ;AN000; | ||
| 634 | ; Now start clobbering code ;AN000; | ||
| 635 | ; ;AN000; | ||
| 636 | MOV DI,OFFSET NETEND ; Start strucs here ;AN000; | ||
| 637 | TEST DI,1 ; Word aligned? ;AN000; | ||
| 638 | JZ IF_20 ; Yes, ok ;AN000; | ||
| 639 | INC DI ; Bump to word align ;AN000; | ||
| 640 | IF_20: ; NOADJ1 ;AN000; | ||
| 641 | JMP IF_40 ; jmp CONTIFSINIT ;AN000; | ||
| 642 | ;AN000; | ||
| 643 | EndProc IFSFINIT ;AN000; | ||
| 644 | ;AN000; | ||
| 645 | ;************* ifsfuncinit transient portion ****************************** ;AN000; | ||
| 646 | AA_PARMS_BUF DB 6 DUP(0) ; temp storage used by auto-attach ;AN000; | ||
| 647 | S_SIZE1 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; | ||
| 648 | DB 0 ; Reserved ;AN000; | ||
| 649 | DD SUB_IFSFUNC ; Ptr to substituted string ;AN000; | ||
| 650 | DB 1 ; n of %n ;AN000; | ||
| 651 | DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; | ||
| 652 | DB 7 ; Maximum field width ;AN000; | ||
| 653 | DB 5 ; Minimum field width ;AN000; | ||
| 654 | DB " " ; Character for Pad field ;AN000; | ||
| 655 | S_SIZE2 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; | ||
| 656 | DB 0 ; Reserved ;AN000; | ||
| 657 | DD SUB_SHARE ; Ptr to substituted string ;AN000; | ||
| 658 | DB 1 ; n of %n ;AN000; | ||
| 659 | DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; | ||
| 660 | DB 7 ; Maximum field width ;AN000; | ||
| 661 | DB 5 ; Minimum field width ;AN000; | ||
| 662 | DB " " ; Character for Pad field ;AN000; | ||
| 663 | ;AN000; | ||
| 664 | SUB_IFSFUNC DB "IFSFUNC",0 ;AN000; | ||
| 665 | SUB_SHARE DB "SHARE",0 ;AN000; | ||
| 666 | ;AN000; | ||
| 667 | DEFAULT_DFLCount DB 4 ;AN000; | ||
| 668 | ;;;alias DEFAULT_NLSize DW 172 ; 4 * 43 ;AN000; | ||
| 669 | ;AN000; | ||
| 670 | ASSUME CS:IFSSEG,DS:NOTHING ;AN000; | ||
| 671 | .xlist ;AN000; | ||
| 672 | .xcref ;AN000; | ||
| 673 | INCLUDE IFSPARSE.INC ;AN000; | ||
| 674 | msg_services <DISPLAYmsg,CHARmsg,LOADmsg> ;AN000; | ||
| 675 | msg_services <ifsfunc.cla,ifsfunc.cl2> ; parse/install msgs ;AN000; | ||
| 676 | .cref ;AN000; | ||
| 677 | .list ;AN000; | ||
| 678 | ;AN000; | ||
| 679 | ;****************************************************************************** ;AN000; | ||
| 680 | ; !!!!!!! IFSFUNC starts here !!!!!!! (see END statement) ;AN000; | ||
| 681 | ;****************************************************************************** ;AN000; | ||
| 682 | ;AN000; | ||
| 683 | IFSFUNCINIT: ;AN000; | ||
| 684 | ;AN000; | ||
| 685 | CALL SYSLOADMSG ;AN000; | ||
| 686 | JNC I_20 ;AN000; | ||
| 687 | SaveReg <CS> ;AN006; | ||
| 688 | RestoreReg <DS> ;AN006; | ||
| 689 | CALL SYSDISPMSG ;AN000; | ||
| 690 | ;AN000; | ||
| 691 | Badver_msg proc far ;AN000; | ||
| 692 | MOV AL,0FFh ;AN000; | ||
| 693 | SaveReg <CS> ;AN000; | ||
| 694 | RestoreReg <DS> ;AN000; | ||
| 695 | MOV AH,EXIT ;AN000; | ||
| 696 | INT 21h ;AN000; | ||
| 697 | PUSH ES ;AN000; | ||
| 698 | XOR AX,AX ;AN000; | ||
| 699 | PUSH AX ;AN000; | ||
| 700 | RET ;AN000; | ||
| 701 | badver_msg ENDP ;AN000; | ||
| 702 | ;AN000; | ||
| 703 | Badmes proc far ;AN000; | ||
| 704 | ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; | ||
| 705 | MOV BX,STDERR ;AN000; | ||
| 706 | XOR DL,DL ;AN000; | ||
| 707 | CALL SYSDISPMSG ;AN000; | ||
| 708 | MOV AX,(EXIT SHL 8) + 0FFH ;AN000; | ||
| 709 | INT 21h ;AN000; | ||
| 710 | badmes ENDP ;AN000; | ||
| 711 | ;AN000; | ||
| 712 | ;AN000; | ||
| 713 | I_20: ; Version OK ;AN000; | ||
| 714 | MOV AX,(multIFS SHL 8)+0 ; Check if IFSFUNC already installed ;AN000; | ||
| 715 | INT 2Fh ;AN000; | ||
| 716 | CMP AL,0 ;AN000; | ||
| 717 | JE I_40 ;AN000; | ||
| 718 | MOV AX,COMMON_ERR_2 ; yes - already installed - error 2 ;AN000; | ||
| 719 | PUSH CS ;AN000; | ||
| 720 | POP DS ;AN000; | ||
| 721 | MOV SI,OFFSET S_SIZE1 ; prep for sysdispmsg call ;AN000; | ||
| 722 | MOV CX,1 ;AN000; | ||
| 723 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 724 | I_30: ;AN005; | ||
| 725 | PUSH CS ;AN000; | ||
| 726 | POP DS ;AN000; | ||
| 727 | JMP BADMES ;AN000; | ||
| 728 | ; no error on install check, ;AN000; | ||
| 729 | I_40: ; free environment - no longer needed ;AN000; | ||
| 730 | MOV AX,DS:[PDB_ENVIRON] ;AN000; | ||
| 731 | OR AX,AX ;AN000; | ||
| 732 | JZ I_60 ;AN000; | ||
| 733 | PUSH ES ;AN000; | ||
| 734 | MOV ES,AX ;AN000; | ||
| 735 | MOV AH,DEALLOC ;AN000; | ||
| 736 | INT 21H ;AN000; | ||
| 737 | POP ES ;AN000; | ||
| 738 | I_60: ;AN000; | ||
| 739 | ;************************************************************************************ ;AN000; | ||
| 740 | ; Parse IFSFUNC parameter : ;AN000; | ||
| 741 | ; NAMES = n ;;;alias[n | (n {m})] ;AN000; | ||
| 742 | ;************************************************************************************ ;AN000; | ||
| 743 | ; Set default n and m ;AN000; | ||
| 744 | MOV AL,DEFAULT_DFLCount ;AN000; | ||
| 745 | MOV [DFLCount],AL ; 4 (n) ;AN000; | ||
| 746 | ;;;aliasMOV AX,DEFAULT_NLSize ;AN000; | ||
| 747 | ;;;aliasMOV NLSize,AX ; 4 * 43 (m) ;AN000; | ||
| 748 | ;AN000; | ||
| 749 | MOV SI,81h ; ds:si -> cmd parameter ;AN000; | ||
| 750 | XOR CX,CX ; no operands parsed yet ;AN000; | ||
| 751 | PUSH CS ;AN000; | ||
| 752 | POP ES ;AN000; | ||
| 753 | ASSUME ES:IFSSEG ;AN000; | ||
| 754 | MOV DI,OFFSET IFSF_PARMS ; es:di -> parse control blocks ;AN000; | ||
| 755 | XOR DX,DX ; reserved ;AN000; | ||
| 756 | ;AN000; | ||
| 757 | CALL SYSPARSE ; call parser ;AN000; | ||
| 758 | ;AN000; | ||
| 759 | CMP AX,-1 ; End of cmd? ;AN000; | ||
| 760 | JNE I_70 ;AN000; | ||
| 761 | JMP I_160 ; if so continue w/init ;AN000; | ||
| 762 | I_70: ;AN000; | ||
| 763 | CMP AX,0 ; Error? ;AN000; | ||
| 764 | JNE I_140 ; yes - go display parse error ;AN000; | ||
| 765 | ;AN000; | ||
| 766 | ;;;aliasCMP IFSF_RESULT,COMPLEX ; complex? ;AN000; | ||
| 767 | ;;;aliasJE I_80 ;AN000; | ||
| 768 | CMP IFSF_TAG,"N" ; no - n only ;AN000; | ||
| 769 | MOV AX,PARSE_ERR_6 ;AN002; | ||
| 770 | JNE I_140 ;AN000; | ||
| 771 | ;AN000; | ||
| 772 | MOV AL,IFSF_NM ;AN000; | ||
| 773 | MOV [DFLCount],AL ;AN000; | ||
| 774 | ;AN000; | ||
| 775 | CALL SYSPARSE ;AN000; | ||
| 776 | CMP AX,-1 ;AN000; | ||
| 777 | JE I_160 ;AN000; | ||
| 778 | MOV AX,PARSE_ERR_1 ;AN000; | ||
| 779 | ;;;aliasJMP I_140 ; go display parse error ;AN000; | ||
| 780 | ;;; ;AN000; | ||
| 781 | ;;;aliasI_80: ; process complex (n,m) ;AN000; | ||
| 782 | ;;; XOR CX,CX ; prep for new parse call ;AN000; | ||
| 783 | ;;; XOR DX,DX ;AN000; | ||
| 784 | ;;; CALL SYSPARSE ;AN000; | ||
| 785 | ;;; CMP AX,-1 ; End of cmd? ;AN000; | ||
| 786 | ;;; JE I_160 ; if so continue w/init ;AN000; | ||
| 787 | ;;; CMP AX,0 ; Error? ;AN000; | ||
| 788 | ;;; JNE I_140 ; if so go display error ;AN000; | ||
| 789 | ;;; CMP IFSF_TAG,"N" ; check if n or m parm ;AN000; | ||
| 790 | ;;; JNE I_100 ;AN000; | ||
| 791 | ;;; MOV AL,IFSF_NM ; n parm ;AN000; | ||
| 792 | ;;; MOV DFLCount,AL ;AN000; | ||
| 793 | ;;; CALL SYSPARSE ; go back for m ;AN000; | ||
| 794 | ;;; CMP AX,-1 ; End of cmd? ;AN000; | ||
| 795 | ;;; JE I_160 ; if so continue w/init ;AN000; | ||
| 796 | ;;; CMP AX,0 ; Error? ;AN000; | ||
| 797 | ;;; JNE I_140 ; if so go display error ;AN000; | ||
| 798 | ;;; ;AN000; | ||
| 799 | ;;;00: ;AN000; | ||
| 800 | ;;; CMP IFSF_TAG,"M" ; check if m parm ;AN000; | ||
| 801 | ;;; JE I_120 ;AN000; | ||
| 802 | ;;; MOV AX,PARSE_ERR_7 ; not m - error ;AN002; | ||
| 803 | ;;; JMP I_140 ;AN000; | ||
| 804 | ;;;20: ;AN000; | ||
| 805 | ;;; MOV AX,WORD PTR IFSF_NM ; m parm ;AN000; | ||
| 806 | ;;; MOV NLSize,AX ;AN000; | ||
| 807 | ;;; ;AN000; | ||
| 808 | ;;; CALL SYSPARSE ; call parser again to check for ;AN000; | ||
| 809 | ;;; CMP AX,-1 ; possible garbage ;AN000; | ||
| 810 | ;;; JE I_160 ;AN000; | ||
| 811 | ;;; MOV AX,PARSE_ERR_1 ;AN000; | ||
| 812 | ;;;alias ;AN000; | ||
| 813 | I_140: ; display parse error ;AN000; | ||
| 814 | MOV DH,PARSE_ERR_CLASS ; then continue w/defaults ;AN000; | ||
| 815 | XOR CX,CX ;AN000; | ||
| 816 | ;;; MOV BX,STDERR ;AD005; | ||
| 817 | ;;; XOR DL,DL ;AD005; | ||
| 818 | ;;; CALL SYSDISPMSG ;AD005; | ||
| 819 | JMP I_30 ;AN005; | ||
| 820 | ;AN000; | ||
| 821 | I_160: ;AN000; | ||
| 822 | ; doinit ;AN000; | ||
| 823 | MOV AX,DS ; Move the stack so it doesn't ;AN000; | ||
| 824 | ; get blasted by structure init ;AN000; | ||
| 825 | MOV SS,AX ; Set stack in the PSP overlaying ;AN000; | ||
| 826 | MOV SP,100H ; parms just processed ;AN000; | ||
| 827 | ; ;AN000; | ||
| 828 | ; We must now do some computation. We have to check if there is enough room ;AN000; | ||
| 829 | ; for everything. We must do this here BEFORE we start overlaying this ;AN000; | ||
| 830 | ; code ;AN000; | ||
| 831 | ; ;AN000; | ||
| 832 | PUSH CS ;AN000; | ||
| 833 | POP DS ;AN000; | ||
| 834 | ASSUME DS:IFSSEG ;AN000; | ||
| 835 | ;AN000; | ||
| 836 | MOV DI,OFFSET NETEND ; We have this much code ;AN000; | ||
| 837 | TEST DI,1 ; Word aligned? ;AN000; | ||
| 838 | JZ I_180 ; Yes, OK. ;AN000; | ||
| 839 | INC DI ; Make word aligned ;AN000; | ||
| 840 | I_180: ; no adjust 5 label ;AN000; | ||
| 841 | ;AN000; | ||
| 842 | ; This code is added to make it easy to determine the code size ;AN000; | ||
| 843 | ; of IFSFUNC for debug purposes. It is overlayed, so does not use extra ;AN000; | ||
| 844 | ; storage. ;AN000; | ||
| 845 | PUSH DI ; ;AN000; | ||
| 846 | PUSH SI ; ;AN000; | ||
| 847 | LEA SI,CODESIZE+3 ; ;AN000; | ||
| 848 | I_200: ; TENT ;AN000; | ||
| 849 | SUB DI,10000 ; ;AN000; | ||
| 850 | JC I_220 ; ;AN000; | ||
| 851 | INC BYTE PTR [SI] ; ;AN000; | ||
| 852 | JMP I_200 ; ;AN000; | ||
| 853 | I_220: ; NEG1 ;AN000; | ||
| 854 | ADD DI,10000 ; ;AN000; | ||
| 855 | INC SI ; ;AN000; | ||
| 856 | I_240: ; THOU ;AN000; | ||
| 857 | SUB DI,1000 ; ;AN000; | ||
| 858 | JC I_260 ; ;AN000; | ||
| 859 | INC BYTE PTR [SI] ; ;AN000; | ||
| 860 | JMP I_240 ; ;AN000; | ||
| 861 | I_260: ; NEG2 ;AN000; | ||
| 862 | ADD DI,1000 ; ;AN000; | ||
| 863 | INC SI ; ;AN000; | ||
| 864 | I_280: ; HUND ;AN000; | ||
| 865 | SUB DI,100 ; ;AN000; | ||
| 866 | JC I_300 ; ;AN000; | ||
| 867 | INC BYTE PTR [SI] ; ;AN000; | ||
| 868 | JMP I_280 ; ;AN000; | ||
| 869 | I_300: ; NEG3 ;AN000; | ||
| 870 | ADD DI,100 ; ;AN000; | ||
| 871 | INC SI ; ;AN000; | ||
| 872 | I_320: ; TENS ;AN000; | ||
| 873 | SUB DI,10 ; ;AN000; | ||
| 874 | JC I_340 ; ;AN000; | ||
| 875 | INC BYTE PTR [SI] ; ;AN000; | ||
| 876 | JMP I_320 ; ;AN000; | ||
| 877 | I_340: ; NEG4 ;AN000; | ||
| 878 | ADD DI,10 ; ;AN000; | ||
| 879 | INC SI ; ;AN000; | ||
| 880 | I_360: ; ONES ;AN000; | ||
| 881 | SUB DI,1 ; ;AN000; | ||
| 882 | JC I_380 ; ;AN000; | ||
| 883 | INC BYTE PTR [SI] ; ;AN000; | ||
| 884 | JMP I_360 ; ;AN000; | ||
| 885 | I_380: ; DONE ;AN000; | ||
| 886 | POP SI ; ;AN000; | ||
| 887 | POP DI ; ;AN000; | ||
| 888 | ; ;AN000; | ||
| 889 | ; Allocate the DFL ;AN000; | ||
| 890 | ; ;AN000; | ||
| 891 | MOV AL,DFLCount ;AN000; | ||
| 892 | XOR AH,AH ;AN000; | ||
| 893 | MOV CX,SIZE DFLL_LIST ;AN000; | ||
| 894 | MUL CX ;AN000; | ||
| 895 | OR DX,DX ;AN000; | ||
| 896 | JZ I_402 ;AN000; | ||
| 897 | JMP I_640 ; out of memp ;AN000; | ||
| 898 | I_402: ;AN000; | ||
| 899 | ADD DI,AX ;AN000; | ||
| 900 | JNC I_403 ;AN000; | ||
| 901 | JMP I_640 ; out of memp ;AN000; | ||
| 902 | I_403: ;AN000; | ||
| 903 | ;;;aliasADD DI,NLSIZE ;AN000; | ||
| 904 | ;;;aliasJNC I_404 ;AN000; | ||
| 905 | ;;;aliasJMP I_640 ; out of memp ;AN000; | ||
| 906 | I_404: ;AN000; | ||
| 907 | CALL CHECK_UNC_PRESENCE ; check if unc present, if not, ;AN000; | ||
| 908 | TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 909 | JZ I_415 ; no need to allocate altcds ;AN000; | ||
| 910 | ; ;AN000; | ||
| 911 | ; Allocate the TEMP CDS area ;AN000; | ||
| 912 | ; ;AN000; | ||
| 913 | PUSH DS ;AN000; | ||
| 914 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 915 | INT 2FH ;AN000; | ||
| 916 | ASSUME DS:DOSGROUP ;AN000; | ||
| 917 | MOV CL,CDSCount ;AN000; | ||
| 918 | XOR CH,CH ;AN000; | ||
| 919 | INC CX ;AN000; | ||
| 920 | MOV AX,SIZE curdir_list ;AN000; | ||
| 921 | MUL CX ;AN000; | ||
| 922 | OR DX,DX ;AN000; | ||
| 923 | JZ I_410 ;AN000; | ||
| 924 | JMP I_640 ;AN000; | ||
| 925 | I_410: ;AN000; | ||
| 926 | ADD DI,AX ; Temp CDS area ;AN000; | ||
| 927 | JNC I_417 ;AN000; | ||
| 928 | JMP I_640 ;AN000; | ||
| 929 | I_415: ;AN000; | ||
| 930 | ; ;AN000; | ||
| 931 | ; Determine if need new FCB cache and Allocate it if appropriate ;AN000; | ||
| 932 | ; ;AN000; | ||
| 933 | PUSH DS ; get addressability to DOSGROUP ;AN000; | ||
| 934 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 935 | INT 2FH ;AN000; | ||
| 936 | ASSUME DS:DOSGROUP ;AN000; | ||
| 937 | I_417: ;AN000; | ||
| 938 | CMP KeepCount,DefKeepVal ;AN000; | ||
| 939 | JNZ I_420 ;AN000; | ||
| 940 | LDS SI,SFTFCB ;AN000; | ||
| 941 | ASSUME DS:NOTHING ;AN000; | ||
| 942 | CMP [SI].sfCount,DefNumFCB ;AN000; | ||
| 943 | JNZ I_420 ;AN000; | ||
| 944 | INC NEWFCBCACHE ; Flag ourselves ;AN000; | ||
| 945 | ADD DI,((SIZE sf_entry) * NewNumFCB)+((SIZE sf)-2) ; New cache ;AN000; | ||
| 946 | JC I_640 ; out of memp ;AN000; | ||
| 947 | I_420: ; no fcb ;AN000; | ||
| 948 | POP DS ;AN000; | ||
| 949 | ASSUME DS:IFSSEG ;AN000; | ||
| 950 | ;AN000; | ||
| 951 | ; This code is added to make it easy to determine the total size @A1A ;AN000; | ||
| 952 | ; of IFSFUNC. It is overlayed, so does not use extra storage. @A1A ;AN000; | ||
| 953 | ; @A1A ;AN000; | ||
| 954 | PUSH DI ; @A1A ;AN000; | ||
| 955 | PUSH SI ; @A1A ;AN000; | ||
| 956 | LEA SI,TOTSIZE ; @A1A ;AN000; | ||
| 957 | I_440: ; TENT2 @A1A ;AN000; | ||
| 958 | SUB DI,10000 ; @A1A ;AN000; | ||
| 959 | JC I_460 ; @A1A ;AN000; | ||
| 960 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 961 | JMP I_440 ; @A1A ;AN000; | ||
| 962 | I_460: ; NEG5 @A1A ;AN000; | ||
| 963 | ADD DI,10000 ; @A1A ;AN000; | ||
| 964 | INC SI ; @A1A ;AN000; | ||
| 965 | I_480: ; THOU2 @A1A ;AN000; | ||
| 966 | SUB DI,1000 ; @A1A ;AN000; | ||
| 967 | JC I_500 ; @A1A ;AN000; | ||
| 968 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 969 | JMP I_480 ; @A1A ;AN000; | ||
| 970 | I_500: ; NEG6 @A1A ;AN000; | ||
| 971 | ADD DI,1000 ; @A1A ;AN000; | ||
| 972 | INC SI ; @A1A ;AN000; | ||
| 973 | I_520: ; HUND2 @A1A ;AN000; | ||
| 974 | SUB DI,100 ; @A1A ;AN000; | ||
| 975 | JC I_540 ; @A1A ;AN000; | ||
| 976 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 977 | JMP I_520 ; @A1A ;AN000; | ||
| 978 | I_540: ; NEG7 @A1A ;AN000; | ||
| 979 | ADD DI,100 ; @A1A ;AN000; | ||
| 980 | INC SI ; @A1A ;AN000; | ||
| 981 | I_560: ; TENS2 @A1A ;AN000; | ||
| 982 | SUB DI,10 ; @A1A ;AN000; | ||
| 983 | JC I_580 ; @A1A ;AN000; | ||
| 984 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 985 | JMP I_560 ; @A1A ;AN000; | ||
| 986 | I_580: ; NEG8 @A1A ;AN000; | ||
| 987 | ADD DI,10 ; @A1A ;AN000; | ||
| 988 | INC SI ; @A1A ;AN000; | ||
| 989 | I_600: ; ONES2 @A1A ;AN000; | ||
| 990 | SUB DI,1 ; @A1A ;AN000; | ||
| 991 | JC I_620 ; @A1A ;AN000; | ||
| 992 | INC BYTE PTR [SI] ; @A1A ;AN000; | ||
| 993 | JMP I_600 ; @A1A ;AN000; | ||
| 994 | I_620: ; DONE2 @A1A ;AN000; | ||
| 995 | POP SI ; @A1A ;AN000; | ||
| 996 | POP DI ; @A1A ;AN000; | ||
| 997 | ;AN000; | ||
| 998 | ;AN000; | ||
| 999 | JMP I_700 ;AN000; | ||
| 1000 | ;AN000; | ||
| 1001 | I_640: ; OUT_OF_MEMP ;AN000; | ||
| 1002 | POP DS ;AN000; | ||
| 1003 | I_660: ; OUT_OF_MEM ;AN000; | ||
| 1004 | MOV AX,PARSE_ERR_10 ;AN000; | ||
| 1005 | XOR CX,CX ;AN000; | ||
| 1006 | JMP BADMES ;AN000; | ||
| 1007 | ;AN000; | ||
| 1008 | ASSUME DS:NOTHING ;AN000; | ||
| 1009 | ;AN000; | ||
| 1010 | ;AN000; | ||
| 1011 | BREAK <AUTO_ATTACH -- Attempt attaches of non-FAT physical drives> ;AN000; | ||
| 1012 | ;AN000; | ||
| 1013 | ;************************************************************************************ ;AN000; | ||
| 1014 | ; ;AN000; | ||
| 1015 | ; AUTO_ATTACH ;AN000; | ||
| 1016 | ; ;AN000; | ||
| 1017 | ; Called by: init ;AN000; | ||
| 1018 | ; ;AN000; | ||
| 1019 | ; Routines called: CALL_IFS ;AN000; | ||
| 1020 | ; CDS_TO_CD ;AN000; | ||
| 1021 | ; CD_TO_CDS ;AN000; | ||
| 1022 | ; FIND_IFS_DRIVER ;AN000; | ||
| 1023 | ; Inputs: ;AN000; | ||
| 1024 | ; None ;AN000; | ||
| 1025 | ; ;AN000; | ||
| 1026 | ; Function: ;AN000; | ||
| 1027 | ; Get addressability to CDS structure (SYSVARS - IBMDOS/BIO) ;AN000; | ||
| 1028 | ; FOR I = 1 to # CDS ;AN000; | ||
| 1029 | ; DO ;AN000; | ||
| 1030 | ; ³ Drive = I - 1 (0-A,1-B,...) ;AN000; | ||
| 1031 | ; ³ IF (curdir_inuse == 0 & curdir_devptr .NOT. 0) THEN ;AN000; | ||
| 1032 | ; ³ DO ;AN000; | ||
| 1033 | ; ³ ³ Get pointer to 1st IFS header ;AN000; | ||
| 1034 | ; ³ ³ WHILE pointer .NOT. 0FFFFH ;AN000; | ||
| 1035 | ; ³ ³ DO ;AN000; | ||
| 1036 | ; ³ ³ START ATTACH ;AN000; | ||
| 1037 | ; ³ ³ (IFSR_TYPE = 2 ;AN000; | ||
| 1038 | ; ³ ³ IFSR_PARMS@ -> IFS name, 0 parms) ;AN000; | ||
| 1039 | ; ³ ³ IF Attach successful THEN ;AN000; | ||
| 1040 | ; ³ ³ DO ;AN000; | ||
| 1041 | ; ³ ³ IF IFSUSESHARE set THEN ;AN000; | ||
| 1042 | ; ³ ³ Set share flag ;AN000; | ||
| 1043 | ; ³ ³ ENDIF ;AN000; | ||
| 1044 | ; ³ ³ LEAVE While ;AN000; | ||
| 1045 | ; ³ ³ ENDDO ;AN000; | ||
| 1046 | ; ³ ³ ELSE ;AN000; | ||
| 1047 | ; ³ ³ Get pointer to next IFS header ;AN000; | ||
| 1048 | ; ³ ³ ENDIF ;AN000; | ||
| 1049 | ; ³ ³ ENDDO ;AN000; | ||
| 1050 | ; ³ ³ ENDWHILE ;AN000; | ||
| 1051 | ; ³ ENDDO ;AN000; | ||
| 1052 | ; ³ ENDIF ;AN000; | ||
| 1053 | ; ENDDO ;AN000; | ||
| 1054 | ; IF Share flag set THEN ;AN000; | ||
| 1055 | ; DO ;AN000; | ||
| 1056 | ; IF SHARE .NOT. loaded THEN ;AN000; | ||
| 1057 | ; issue warning msg: "SHARE not loaded" using msg retriever ;AN000; | ||
| 1058 | ; END ;AN000; | ||
| 1059 | ; ENDIF ;AN000; | ||
| 1060 | ; ;AN000; | ||
| 1061 | ; Outputs: Successful auto-attachments in effect ;AN000; | ||
| 1062 | ; ;AN000; | ||
| 1063 | ;************************************************************************************ ;AN000; | ||
| 1064 | ;AN000; | ||
| 1065 | Procedure AUTO_ATTACH,NEAR ;AN000; | ||
| 1066 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1067 | ;AN000; | ||
| 1068 | TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; | ||
| 1069 | JZ AA_05 ;AN000; | ||
| 1070 | JMP AA_1000 ;AN000; | ||
| 1071 | ;AN000; | ||
| 1072 | AA_05: ;AN000; | ||
| 1073 | SaveReg <DS,ES,DI> ; preserve ds - psp,es di storage ;AN000; | ||
| 1074 | ifsr_fcn_def ATTSTART ;AN000; | ||
| 1075 | MOV CS:IFSPROC_FLAGS,THISIFS_SET+IsInit ; set this so that cds_to_cd doesn't ;AC010; | ||
| 1076 | ; set thisifs ;AN000; | ||
| 1077 | ;AN000; | ||
| 1078 | MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; | ||
| 1079 | INT 21h ; es:bx -> sysinitvars ;AN000; | ||
| 1080 | LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; | ||
| 1081 | ;AN000; | ||
| 1082 | MOV AX,(multDOS SHL 8) OR 3 ; get addressability to dosgroup ;AN000; | ||
| 1083 | INT 2FH ;AN000; | ||
| 1084 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1085 | ;AN000; | ||
| 1086 | MOV CL,[CDSCount] ; prep cds loop ;AN000; | ||
| 1087 | XOR CH,CH ;AN000; | ||
| 1088 | MOV DX,SIZE CURDIR_LIST ;AN000; | ||
| 1089 | LDS SI,[CDSAddr] ; ds:si -> CDS list ;AN000; | ||
| 1090 | ASSUME DS:NOTHING ;AN000; | ||
| 1091 | ;AN000; | ||
| 1092 | AA_10: ; ** Loop here on cds entries ;AN000; | ||
| 1093 | |||
| 1094 | TEST DS:[SI.CURDIR_FLAGS],CURDIR_INUSE ; check for ifs-able drive ;AN000; | ||
| 1095 | JZ AA_13 ;AN000; | ||
| 1096 | JMP AA_120 ; cds already inuse, try next cds ;AN000; | ||
| 1097 | AA_13: ;AN000; | ||
| 1098 | CMP WORD PTR DS:[SI.CURDIR_DEVPTR],0 ;AN000; | ||
| 1099 | JNZ AA_16 ;AN000; | ||
| 1100 | CMP WORD PTR DS:[SI.CURDIR_DEVPTR+2],0 ;AN000; | ||
| 1101 | JNZ AA_16 ;AN000; | ||
| 1102 | JMP AA_120 ; cds not real, try next cds ;AN000; | ||
| 1103 | AA_16: ;AN000; | ||
| 1104 | MOV AX,SI ; attempt ;AN000; | ||
| 1105 | SaveReg <DS,AX> ; cds seg, offset ;AN000; | ||
| 1106 | MOV AX,(multDOS SHL 8) OR 3 ; get dosgroup in ds to access cdsaddr ;AN000; | ||
| 1107 | INT 2FH ;AN000; | ||
| 1108 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1109 | RestoreReg <AX> ; cds offset ;AN000; | ||
| 1110 | SUB AX,WORD PTR [CDSADDR] ; get drive # (0-based) in al ;AN000; | ||
| 1111 | MOV BL,SIZE CurDir_list ;AN000; | ||
| 1112 | DIV BL ;AN000; | ||
| 1113 | RestoreReg <DS> ; cds segment ;AN000; | ||
| 1114 | SaveReg <AX> ; drive # (0-based 0=A) ;AN000; | ||
| 1115 | MOV BL,AL ;AN000; | ||
| 1116 | INC BL ; change to 1-based (1=A) ;AN000; | ||
| 1117 | MOV AX,CHECK_REMOVABLE ; 4408H (device ioctl) ;AN000; | ||
| 1118 | INT 21H ;AN000; | ||
| 1119 | OR AX,AX ; ax 0 - drive removable ;AN000; | ||
| 1120 | RestoreReg <AX> ; drive # (0-based) ;AN000; | ||
| 1121 | JNZ AA_19 ;AN000; | ||
| 1122 | JMP AA_120 ; drive removable, don't auto-attach ;AN000; | ||
| 1123 | ;AN000; | ||
| 1124 | AA_19: ; cds ok, proceed with autoattach ;AN000; | ||
| 1125 | CBW ; convert al to word (ax) ;AN000; | ||
| 1126 | MOV BL,10 ;AN000; | ||
| 1127 | DIV BL ; convert number (ex.14) to char ;AN000; | ||
| 1128 | ADD AX,3030H ; (3134) (ah-remain,al-quot) ;AN000; | ||
| 1129 | ;AN000; | ||
| 1130 | SaveReg <ES,DI> ; Save 1st ifs driver ;AN000; | ||
| 1131 | MOV CS:WORD PTR [THISIFS],DI ; Send attach start request ;AN000; | ||
| 1132 | MOV CS:WORD PTR [THISIFS+2],ES ; to all fs drivers. Stop when ;AN000; | ||
| 1133 | ; one clicks. ;AN000; | ||
| 1134 | AA_20: ;AN000; | ||
| 1135 | SaveReg <ES,DI,CX,DX,DS,SI> ; ifs ptr, cds count-size-ptr ;AN000; | ||
| 1136 | ;AN000; | ||
| 1137 | SaveReg <AX,DS> ; get ES -> dosgroup (save char drv#) ;AN000; | ||
| 1138 | MOV AX,(multDOS SHL 8) OR 3 ;AN000; | ||
| 1139 | INT 2FH ;AN000; | ||
| 1140 | SaveReg <DS> ;AN000; | ||
| 1141 | RestoreReg <ES> ;AN000; | ||
| 1142 | ASSUME DS:DOSGROUP,ES:DOSGROUP ;AN000; | ||
| 1143 | ; do attach w/dummy cds so as not ;AN000; | ||
| 1144 | MOV DI,OFFSET DOSGROUP:DummyCDS ; to ruin valid cds ;AN000; | ||
| 1145 | RestoreReg <DS> ;AN000; | ||
| 1146 | ASSUME DS:NOTHING ;AN000; | ||
| 1147 | PUSH DI ;AN000; | ||
| 1148 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1149 | REP MOVSB ;AN000; | ||
| 1150 | PUSH ES ;AN000; | ||
| 1151 | POP DS ;AN000; | ||
| 1152 | POP SI ; DS:SI -> dummy CDS ;AN000; | ||
| 1153 | MOV [SI.curdir_flags],curdir_isifs + curdir_inuse ;AN000; | ||
| 1154 | MOV [SI.curdir_type],type_drive ;AN000; | ||
| 1155 | MOV AX,WORD PTR CS:[THISIFS] ;AN000; | ||
| 1156 | MOV WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; | ||
| 1157 | MOV AX,WORD PTR CS:[THISIFS+2] ;AN000; | ||
| 1158 | MOV WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; | ||
| 1159 | RestoreReg <AX> ; char drive # ;AN000; | ||
| 1160 | SaveReg <DS,SI> ; dummy cds ptr ;AN000; | ||
| 1161 | ;AN000; | ||
| 1162 | invoke PREP_IFSR ; sets es:bx -> ifsr, 0s fields, ;AN000; | ||
| 1163 | ; ds - ifsseg ;AN000; | ||
| 1164 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1165 | invoke CDS_TO_CD ; sets ifsr_device_cb@ ;AN000; | ||
| 1166 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; | ||
| 1167 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; | ||
| 1168 | MOV ES:[BX.IFSR_TYPE],TYPE_DRIVE ;AN000; | ||
| 1169 | ;AN000; | ||
| 1170 | MOV SI,OFFSET AA_PARMS_BUF ; set up attach parameter buffer ;AN000; | ||
| 1171 | MOV WORD PTR DS:[SI],1 ; in tempbuf = dw 1 ;AN000; | ||
| 1172 | MOV WORD PTR DS:[SI+2],AX ; db 3134,0 ;AN000; | ||
| 1173 | XOR AL,AL ;AN000; | ||
| 1174 | MOV BYTE PTR DS:[SI+4],AL ; asciiz ;AN000; | ||
| 1175 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000; | ||
| 1176 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000; | ||
| 1177 | ;AN000; | ||
| 1178 | AA_40: ; ** Loop here on ifs drivers ;AN000; | ||
| 1179 | invoke CALL_IFS ; call ifs driver w/attach start req ;AN000; | ||
| 1180 | ;AN000; | ||
| 1181 | JC AA_60 ; jmp on no click ;AN000; | ||
| 1182 | ; click: ;AN000; | ||
| 1183 | RestoreReg <DI,ES> ; restore cds ptr to es:di ;AN000; | ||
| 1184 | invoke CD_TO_CDS ; update cds entry ;AN000; | ||
| 1185 | SaveReg <ES> ; move dummy cds ptr back to ds:si ;AN000; | ||
| 1186 | RestoreReg <DS> ;AN000; | ||
| 1187 | MOV SI,DI ; ds:si -> dummy cds ;AN000; | ||
| 1188 | RestoreReg <DI,ES> ; es:di -> real cds ;AN000; | ||
| 1189 | MOV CX,SIZE CURDIR_LIST ; copy dummy into real - ok to ;AN000; | ||
| 1190 | SaveReg <DI> ;AN000; | ||
| 1191 | OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; set this cds as ifs ;AN009; | ||
| 1192 | REP MOVSB ; clobber now ;AN000; | ||
| 1193 | RestoreReg <SI> ; move real cds ptr back to ds:si ;AN000; | ||
| 1194 | SaveReg <ES> ;AN000; | ||
| 1195 | RestoreReg <DS> ;AN000; | ||
| 1196 | RestoreReg <DX,CX,DI,ES> ; restore cds size, count, ;AN000; | ||
| 1197 | ; ifs ptr ;AN000; | ||
| 1198 | TEST CS:IFSPROC_FLAGS,ISSHARE ; check if share checked ;AN000; | ||
| 1199 | JNZ AA_100 ; go process next cds ;AN000; | ||
| 1200 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUSESHARE ;AN000; | ||
| 1201 | JZ AA_100 ; ifs driver needs share ;AN000; | ||
| 1202 | ;; D526 CallInstall SHAREInstall,multSHARE,0 ; check that share loaded ;AN000; | ||
| 1203 | CallInstall SHAREInstall,multSHARE,40H ; check that share loaded ;AN013; | ||
| 1204 | CMP AL,INSTALLED ; if not generate warning ;AN000; | ||
| 1205 | JE AA_50 ;AN000; | ||
| 1206 | SaveReg <DS,SI,CX,DX> ;AN000; | ||
| 1207 | MOV AX,COMMON_ERR_3 ; "SHARE not installed" ;AN000; | ||
| 1208 | PUSH CS ;AN000; | ||
| 1209 | POP DS ;AN000; | ||
| 1210 | MOV SI,OFFSET S_SIZE2 ;AN000; | ||
| 1211 | MOV CX,1 ;AN000; | ||
| 1212 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 1213 | MOV BX,STDERR ;AN000; | ||
| 1214 | XOR DL,DL ;AN000; | ||
| 1215 | CALL SYSDISPMSG ;AN000; | ||
| 1216 | RestoreReg <DX,CX,SI,DS> ;AN000; | ||
| 1217 | ;AN000; | ||
| 1218 | AA_50: ;AN000; | ||
| 1219 | OR CS:IFSPROC_FLAGS,ISSHARE ; set this so won't check share again ;AN000; | ||
| 1220 | JMP AA_100 ;AN000; | ||
| 1221 | ;AN000; | ||
| 1222 | AA_60: ; ** Next driver ;AN000; | ||
| 1223 | RestoreReg <AX,BX> ; dummy cds ptr ;AN000; | ||
| 1224 | RestoreReg <SI,DS,DX,CX,DI,ES> ; restore: ifs and cds ptrs, ;AN000; | ||
| 1225 | ; cds count and size ;AN000; | ||
| 1226 | LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000; | ||
| 1227 | CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000; | ||
| 1228 | JNE AA_80 ;AN000; | ||
| 1229 | PUSH AX ; dummy cds offset ;AN000; | ||
| 1230 | MOV AX,ES ;AN000; | ||
| 1231 | CMP AX,NULL_PTR ;AN000; | ||
| 1232 | POP AX ; dummy cds offset ;AN000; | ||
| 1233 | JE AA_100 ; go process next cds if no more ifs ;AN000; | ||
| 1234 | AA_80: ;AN000; | ||
| 1235 | MOV CS:WORD PTR [THISIFS],DI ; prep next ifs driver ;AN000; | ||
| 1236 | MOV CS:WORD PTR [THISIFS+2],ES ;AN000; | ||
| 1237 | SaveReg <ES,DI,CX,DX,DS,SI> ; Save regs ;AN000; | ||
| 1238 | SaveReg <AX,BX> ; dummy cds ptr ;AN000; | ||
| 1239 | SaveReg <CS,CS> ; get esdi back to ifsrh ;AN008; | ||
| 1240 | RestoreReg <ES,DS> ; and ds-ifsseg ;AN008; | ||
| 1241 | MOV BX,OFFSET IFSR ;AN008; | ||
| 1242 | XOR AX,AX ;AN008; | ||
| 1243 | MOV ES:[BX.IFSR_RETCODE],AX ; restore error fields ;AN008; | ||
| 1244 | MOV ES:[BX.IFSR_RETCLASS],AL ;AN008; | ||
| 1245 | JMP AA_40 ; go process next ifs driver ;AN000; | ||
| 1246 | ;AN000; | ||
| 1247 | AA_100: ;AN000; | ||
| 1248 | RestoreReg <DI,ES> ; restore 1st ifs driver ;AN000; | ||
| 1249 | AA_120: ;AN000; | ||
| 1250 | ADD SI,DX ; ** Next CDS ;AN000; | ||
| 1251 | DEC CX ;AN000; | ||
| 1252 | JZ AA_990 ;AC004; | ||
| 1253 | JMP AA_10 ;AN000; | ||
| 1254 | ;AN000; | ||
| 1255 | ;AN000; | ||
| 1256 | AA_990: ;AC004; | ||
| 1257 | RestoreReg <DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000; | ||
| 1258 | AA_1000: ;AN004; | ||
| 1259 | AND CS:IFSPROC_FLAGS,NOT IsInit ; reset isinit ;AN010; | ||
| 1260 | return ;AN000; | ||
| 1261 | ;AN000; | ||
| 1262 | EndProc AUTO_ATTACH ;AN000; | ||
| 1263 | ;AN000; | ||
| 1264 | ;AN000; | ||
| 1265 | BREAK <CHECK_UNC_PRESENCE -- check if UNC file system driver ifs'ed> ;AN000; | ||
| 1266 | ;AN000; | ||
| 1267 | ;************************************************************************************ ;AN000; | ||
| 1268 | ; ;AN000; | ||
| 1269 | ; CHECK_UNC_PRESENCE ;AN000; | ||
| 1270 | ; ;AN000; | ||
| 1271 | ; Called by: init - general ;AN000; | ||
| 1272 | ; ;AN000; | ||
| 1273 | ; Routines called: SYSDISPMSG ;AN000; | ||
| 1274 | ; ;AN000; | ||
| 1275 | ; Inputs: ;AN000; | ||
| 1276 | ; None ;AN000; | ||
| 1277 | ; ;AN000; | ||
| 1278 | ; Function: ;AN000; | ||
| 1279 | ; Get pointer to 1st IFS header ;AN000; | ||
| 1280 | ; IF no file systems THEN ;AN000; | ||
| 1281 | ; Display warning ;AN000; | ||
| 1282 | ; ELSE DO ;AN000; | ||
| 1283 | ; BX=0 | ||
| 1284 | ; WHILE pointer .NOT. 0FFFFH ;AN000; | ||
| 1285 | ; DO ;AN000; | ||
| 1286 | ; OR BX,IFS_ATTRIBUTES | ||
| 1287 | ; IF file system driver has unc bit set THEN ;AN000; | ||
| 1288 | ; DO ;AN000; | ||
| 1289 | ; Set unc_installed flag in IFSFUNC_FLAGS ;AN000; | ||
| 1290 | ; Set UNC_FS_HDR = unc file system driver header ;AN000; | ||
| 1291 | ; Set unc_found ;AN000; | ||
| 1292 | ; ENDDO ;AN000; | ||
| 1293 | ; ENDDO ;AN000; | ||
| 1294 | ; ENDWHILE ;AN000; | ||
| 1295 | ; IF unc not found THEN ;AN000; | ||
| 1296 | ; Set UNC_FS_HDR = null ptr ;AN000; | ||
| 1297 | ; ENDIF ;AN000; | ||
| 1298 | ; IFS_ATTRS=BX | ||
| 1299 | ; ENDDO ;AN000; | ||
| 1300 | ; ENDIF ;AN000; | ||
| 1301 | ; ;AN000; | ||
| 1302 | ; Outputs: unc_installed flag set in ifsfunc_flags in unc present ;AN000; | ||
| 1303 | ; IFS_ATTRS set | ||
| 1304 | ; ;AN000; | ||
| 1305 | ;************************************************************************************ ;AN000; | ||
| 1306 | ;AN000; | ||
| 1307 | Procedure CHECK_UNC_PRESENCE,NEAR ;AN000; | ||
| 1308 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1309 | ;AN000; | ||
| 1310 | SaveReg <DS,ES,DI,BX> ; preserve ds - psp,es di storage ;AN000; | ||
| 1311 | MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; | ||
| 1312 | INT 21h ; es:bx -> sysinitvars ;AN000; | ||
| 1313 | LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; | ||
| 1314 | XOR BX,BX ;AN000; | ||
| 1315 | CMP DI,NULL_PTR ; if 1st null, then no drivers ;AN000; | ||
| 1316 | JNE CUP_20 ; must display no driver msg ;AN000; | ||
| 1317 | MOV AX,ES ;AN000; | ||
| 1318 | CMP AX,NULL_PTR ;AN000; | ||
| 1319 | JNE CUP_20 ;AN000; | ||
| 1320 | ;AN000; | ||
| 1321 | MOV AX,UTIL_ERR_4 ; def 4 "No IFS drivers found",CR,LF ;AN000; | ||
| 1322 | MOV BX,STDERR ;AN000; | ||
| 1323 | XOR CX,CX ;AN000; | ||
| 1324 | MOV DL,NO_INPUT ;AN000; | ||
| 1325 | MOV DH,UTILITY_MSG_CLASS ;AN000; | ||
| 1326 | PUSH CS ;AN000; | ||
| 1327 | POP DS ;AN000; | ||
| 1328 | CALL SYSDISPMSG ;AN000; | ||
| 1329 | MOV CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; | ||
| 1330 | ;AN000; | ||
| 1331 | JMP SHORT CUP_1000 ;AN000; | ||
| 1332 | ;AN000; | ||
| 1333 | CUP_20: ;AN000; | ||
| 1334 | OR BX,ES:[DI.IFS_ATTRIBUTE] | ||
| 1335 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ; now set UNC_FS_HDR ;AN000; | ||
| 1336 | JNZ CUP_40 ;AN000; | ||
| 1337 | CUP_30: | ||
| 1338 | LES DI,ES:[DI.IFS_NEXT] ;AN000; | ||
| 1339 | CMP DI,NULL_PTR ;AN000; | ||
| 1340 | JNE CUP_20 ;AN000; | ||
| 1341 | MOV AX,ES ;AN000; | ||
| 1342 | CMP AX,NULL_PTR ;AN000; | ||
| 1343 | JNE CUP_20 ;AN000; | ||
| 1344 | TEST IFSFUNC_FLAGS,UNC_INSTALLED | ||
| 1345 | JNZ CUP_1000 | ||
| 1346 | MOV WORD PTR [UNC_FS_HDR],NULL_PTR ; no unc - set unc ptr null ;AN000; | ||
| 1347 | MOV WORD PTR [UNC_FS_HDR+2],NULL_PTR ;AN000; | ||
| 1348 | JMP SHORT CUP_1000 ;AN000; | ||
| 1349 | ;AN000; | ||
| 1350 | CUP_40: ; found unc - set unc ptr ;AN000; | ||
| 1351 | MOV WORD PTR [UNC_FS_HDR],DI ; and unc flag ;AN000; | ||
| 1352 | MOV WORD PTR [UNC_FS_HDR+2],ES ;AN000; | ||
| 1353 | OR IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; | ||
| 1354 | JMP SHORT CUP_30 ;AN000; | ||
| 1355 | ;AN000; | ||
| 1356 | ;AN000; | ||
| 1357 | CUP_1000: ;AN000; | ||
| 1358 | RestoreReg <BX,DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000; | ||
| 1359 | return ;AN000; | ||
| 1360 | |||
| 1361 | include msgdcl.inc | ||
| 1362 | ;AN000; | ||
| 1363 | EndProc CHECK_UNC_PRESENCE ;AN000; | ||
| 1364 | ;AN000; | ||
| 1365 | ;AN000; | ||
| 1366 | IFSSEG ENDS ;AN000; | ||
| 1367 | ;AN000; | ||
| 1368 | STACK SEGMENT STACK ;AN000; | ||
| 1369 | DB 278 + 128 DUP (?) ; 278 == IBM's ROM requirements ;AN000; | ||
| 1370 | STACK ENDS ;AN000; | ||
| 1371 | ;AN000; | ||
| 1372 | END IFSFUNCinit ;AN000; | ||
| 1373 | END ;AN000; | ||