diff options
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSSESS.ASM')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSSESS.ASM | 2187 |
1 files changed, 2187 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM new file mode 100644 index 0000000..8eba357 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM | |||
| @@ -0,0 +1,2187 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFSFUNC SESSION ROUTINES - IFS Attach Routines ;AN000; | ||
| 4 | NAME IFSSESS ;AN000; | ||
| 5 | ;************************************************************************************ | ||
| 6 | ; | ||
| 7 | ; IFSSESS | ||
| 8 | ; | ||
| 9 | ; Session related IFS calls (Session = attachment) | ||
| 10 | ; | ||
| 11 | ; IFS_ASSOPER | ||
| 12 | ; RETURN_ASSIGN_MODE | ||
| 13 | ; SET_ASSIGN_MODE | ||
| 14 | ; GET_IFSFUNC_ITEM | ||
| 15 | ; ATTACH_START | ||
| 16 | ; ATTACH_END | ||
| 17 | ; IFS_RESET_ENVIRONMENT | ||
| 18 | ; IFS_ABORT | ||
| 19 | ; GET_IFS_DRIVER_NAME | ||
| 20 | ; FIND_IFS_DRIVER | ||
| 21 | ; AssignOn/AssignOff | ||
| 22 | ; PrintOn/PrintOff | ||
| 23 | ; GET_UNC_ITEM_INFO | ||
| 24 | ; | ||
| 25 | ; REVISION HISTORY: | ||
| 26 | ; A000 Original version 4.00 May 1987 | ||
| 27 | ; A001 DCR 158 - merge unc info in attach start/status requests 8/87 RGAZZIA | ||
| 28 | ; A002 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA | ||
| 29 | ; A003 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA | ||
| 30 | ; A004 PTM 764 - Printer attach problems 8/87 RGAZZIA | ||
| 31 | ; A005 DCR 213 - SFT Serial Number 9/87 RGazzia | ||
| 32 | ; A006 PTM 849 - Printer open problems 9/87 RGazzia | ||
| 33 | ; A007 P242 - IFSFUNC hangs on 2nd install. 8/87 rg | ||
| 34 | ; A008 P1244- Net Print problems 8/87 rg | ||
| 35 | ; A009 P1411- Net Use erroneous pause 10/87 rg | ||
| 36 | ; A010 P2270- Filesys network drive problems 11/87 RG | ||
| 37 | ; A011 P2312- Allow Net Use status to show FILESYSed network devices 11/87 RG | ||
| 38 | ; Do this via user word: 0001 without password | ||
| 39 | ; 8001 with password | ||
| 40 | ; A012 P2307- Critical error problems 11/87 RG | ||
| 41 | ; A013 P2379- Filesys status fails without network installed 11/87 RGazzia | ||
| 42 | ; A014 P2952- dfl problem 1/88 RG | ||
| 43 | ; A015 P3251- net trans problem (library.exe) 1/88 RG | ||
| 44 | ; A016 P3334- new abort subfunc - reset environment 2/88 RMG | ||
| 45 | ; A017 P3673- Filesys problems again. A010 not fixed right....3/14/88 RMG | ||
| 46 | ; A018 Austin deviceless attach problems 3/29/88 RMG | ||
| 47 | ; A019 P4188- names=0 problems 4/08/88 RMG | ||
| 48 | ; A020 Austin garbage attach problem 4/11/88 RMG | ||
| 49 | ; A021 P4140 dos ext err msgs enhancement 4/19/88 RMG | ||
| 50 | ; A022 P4249 filesys problems related to gii bx ret on user stack 4/21/88 RMG | ||
| 51 | ; A023 P4540 fAssign,fPrint out of swappable area 4/28/88 RMG | ||
| 52 | ; A024 P4731 find ifs driver must check for none 5/4/88 RMG | ||
| 53 | ; A025 P4839 ctrl ptrsc problems 5/13/88 RMG | ||
| 54 | ; A026 P4789 message problems w/no ifs drivers loaded 5/18/88 RMG | ||
| 55 | ; A027 P4791 Don't overwrite ax on error 5/19/88 RMG | ||
| 56 | ; A028 Error code problems w/no ifs drivers 5/20/88 RMG | ||
| 57 | ; A029 GII error path fixup 5/24/88 RMG | ||
| 58 | ; A030 P5005 Print stream problems 6/1/88 RMG | ||
| 59 | ; | ||
| 60 | ; LOC - 871 | ||
| 61 | ; LOD - 63 | ||
| 62 | ; | ||
| 63 | ;************************************************************************************ | ||
| 64 | ;AN000; | ||
| 65 | .xlist ;AN000; | ||
| 66 | .xcref ;AN000; | ||
| 67 | INCLUDE IFSSYM.INC ;AN000; | ||
| 68 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 69 | INCLUDE DOSSYM.INC ;AN000; | ||
| 70 | INCLUDE DEVSYM.INC ;AN000; | ||
| 71 | .cref ;AN000; | ||
| 72 | .list ;AN000; | ||
| 73 | ;AN000; | ||
| 74 | AsmVars <IBM, Installed, DEBUG> ;AN000; | ||
| 75 | ;AN000; | ||
| 76 | ; define the base code segment of the network support first ;AN000; | ||
| 77 | ;AN000; | ||
| 78 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 79 | IFSSEG ENDS ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | ; ;AN000; | ||
| 82 | ; NOTE: We cannot include DOSSEG here because the START seg is not declared ;AN000; | ||
| 83 | ; as PARA aligned in DOSSEG. ;AN000; | ||
| 84 | ; ;AN000; | ||
| 85 | ;AN000; | ||
| 86 | START SEGMENT PARA PUBLIC 'START' ;AN000; | ||
| 87 | START ENDS ;AN000; | ||
| 88 | ;AN000; | ||
| 89 | CONSTANTS SEGMENT WORD PUBLIC 'CONST' ;AN000; | ||
| 90 | CONSTANTS ENDS ;AN000; | ||
| 91 | ;AN000; | ||
| 92 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 93 | DATA ENDS ;AN000; | ||
| 94 | ;AN000; | ||
| 95 | TABLE SEGMENT BYTE PUBLIC 'TABLE' ;AN000; | ||
| 96 | TABLE ENDS ;AN000; | ||
| 97 | ;AN000; | ||
| 98 | CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000; | ||
| 99 | CODE ENDS ;AN000; | ||
| 100 | ;AN000; | ||
| 101 | LAST SEGMENT PARA PUBLIC 'LAST' ;AN000; | ||
| 102 | LAST ENDS ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | DOSGROUP GROUP START,CONSTANTS,DATA,TABLE,CODE,LAST ;AN000; | ||
| 105 | ;AN000; | ||
| 106 | ;AN000; | ||
| 107 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 108 | ;DOSGROUP Data ;AN000; | ||
| 109 | Extrn CurrentPDB:WORD ;AN000; | ||
| 110 | Extrn THISCDS:DWORD ;AN000; | ||
| 111 | Extrn CDSAddr:DWORD ;AN000; | ||
| 112 | Extrn CDSCount:BYTE ;AN000; | ||
| 113 | Extrn MYNAME:BYTE ;AN000; | ||
| 114 | Extrn DummyCDS:BYTE ;AN000; | ||
| 115 | Extrn sftFCB:DWORD ;AN000; | ||
| 116 | Extrn THISSFT:DWORD ;AN000; | ||
| 117 | Extrn SysInitTable:BYTE ;AN000; | ||
| 118 | Extrn EXIT_TYPE:BYTE ;AN000; | ||
| 119 | Extrn IFS_HEADER:DWORD ;AN000; | ||
| 120 | if debug ;AN000; | ||
| 121 | Extrn BugLev:WORD ;AN000; | ||
| 122 | Extrn BugTyp:WORD ;AN000; | ||
| 123 | include bugtyp.asm ;AN000; | ||
| 124 | endif ;AN000; | ||
| 125 | DATA ENDS ;AN000; | ||
| 126 | ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | ; define our own code segment ;AN000; | ||
| 129 | ;AN000; | ||
| 130 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 131 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 132 | ;AN000; | ||
| 133 | ;IFS Data - external ;AN000; | ||
| 134 | Extrn TEMPBUF:BYTE ;AN000; | ||
| 135 | ;AN000; | ||
| 136 | ;IFS Data - public - *** IFSFUNC SWAPPABLE DATA AREA *** ;AN000; | ||
| 137 | ;AN000; | ||
| 138 | PUBLIC IFSF_SWAP_START ;AN000; | ||
| 139 | IFSF_SWAP_START LABEL BYTE ;AN000; | ||
| 140 | ;AN000; | ||
| 141 | PUBLIC THISIFS ;AN000; | ||
| 142 | THISIFS DD -1 ;AN000; | ||
| 143 | |||
| 144 | PUBLIC THISDFL ;AN000; | ||
| 145 | THISDFL DD -1 ;AN000; | ||
| 146 | |||
| 147 | PUBLIC IFSR ;AN000; | ||
| 148 | IFSR DB 72 DUP (0) ;AN000; | ||
| 149 | |||
| 150 | PUBLIC SFF1 ;AN000; | ||
| 151 | SFF1 DB 62 DUP (0) ;AN000; | ||
| 152 | |||
| 153 | PUBLIC CD1 ;AN000; | ||
| 154 | CD1 DW 84 DUP (0) ;AN000; | ||
| 155 | |||
| 156 | PUBLIC DF1 ;AN000; | ||
| 157 | DF1 DW 18 DUP (0) ;AN000; | ||
| 158 | |||
| 159 | PUBLIC IFSPROC_FLAGS ;AN000; | ||
| 160 | IFSPROC_FLAGS DW 0 ;AN000; | ||
| 161 | |||
| 162 | ; Number of net drive (0=A) for use on net I 24 ;AN000; | ||
| 163 | PUBLIC IFSDRV ;AN000; | ||
| 164 | IFSDRV DB -1 ;AN000; | ||
| 165 | |||
| 166 | PUBLIC DEVICE_CB@_OFFSET ;AN000; | ||
| 167 | ; This used to set offset of ifsr_device_cb@ in common routine cds_to_cd ;AN000; | ||
| 168 | ; in ifsutil. If not used, offset always 1EH since that's what it is at ;AN000; | ||
| 169 | ; ifsutil assembly time. This not good for control fcns (attstart,attstat). ;AN000; | ||
| 170 | DEVICE_CB@_OFFSET DW 0 ; offset in ifsrh of device cb@ ;AN000; | ||
| 171 | |||
| 172 | PUBLIC SAVE_CB@ ;AN000; | ||
| 173 | ; This used by SFT_TO_SFF and SFF_TO_SFT routines in IFSUTIL to save cds ptr. ;AN000; | ||
| 174 | SAVE_CB@ DD -1 ;AN000; | ||
| 175 | |||
| 176 | PUBLIC IFSSEM ;AN021; | ||
| 177 | ; This used as byte of semaphores. ;AN021; | ||
| 178 | IFSSEM DB 0 ;AN021; | ||
| 179 | |||
| 180 | IFSF_SWAP_END LABEL BYTE ;AN000; | ||
| 181 | PUBLIC IFSF_SWAP_END ;AN000; | ||
| 182 | ;AN000; | ||
| 183 | ;IFS Data - public ;AN000; | ||
| 184 | ;AN000; | ||
| 185 | PUBLIC DFLAddr ;AN000; | ||
| 186 | DFLAddr DD -1 ;AN000; | ||
| 187 | |||
| 188 | PUBLIC DFLCount ;AN000; | ||
| 189 | DFLCount DB 0 ;AN000; | ||
| 190 | |||
| 191 | ;;;aliasPUBLIC NLAddr ;AN000; | ||
| 192 | ;;;aliasNLAddr DD -1 ;AN000; | ||
| 193 | |||
| 194 | ;;;aliasPUBLIC NLSIZE ;AN000; | ||
| 195 | ;;;aliasNLSIZE DW 0 ;AN000; | ||
| 196 | |||
| 197 | PUBLIC CDSAlt ;AN000; | ||
| 198 | CDSAlt DD -1 ;AN000; | ||
| 199 | |||
| 200 | PUBLIC UNC_FS_HDR ;AN000; | ||
| 201 | UNC_FS_HDR DD -1 ;AN000; | ||
| 202 | |||
| 203 | PUBLIC IFSFUNC_FLAGS ;AN000; | ||
| 204 | IFSFUNC_FLAGS DW 0 ;AN000; | ||
| 205 | |||
| 206 | PUBLIC IFS_ATTRS ;AN000; | ||
| 207 | IFS_ATTRS DW 0 ; all ifs_attribute words from ifs ;AN000; | ||
| 208 | ; headers or'ed together (ifsinit) ;AN000; | ||
| 209 | PUBLIC DOSCALL@ ;AN000; | ||
| 210 | DOSCALL@ DD 0 ; IFS_DOSCALL@ set by ibmbio ;AN000; | ||
| 211 | |||
| 212 | PUBLIC SFT_SERIAL_NUMBER ;AN005; | ||
| 213 | SFT_SERIAL_NUMBER DW 0 ; to get sfts unique for fcb reasons ;AN005; | ||
| 214 | |||
| 215 | PUBLIC fAssign ;AC023; | ||
| 216 | fAssign DB -1 ;AC023; | ||
| 217 | |||
| 218 | PUBLIC fPrint ;AC023; | ||
| 219 | fPrint DB -1 ;AC023; | ||
| 220 | |||
| 221 | PUBLIC TRUNCATE_FLAG ;AC030;moved out of swap | ||
| 222 | TRUNCATE_FLAG DB 0 ;AC030; " " | ||
| 223 | |||
| 224 | |||
| 225 | ;IFS Data - local ;AN000; | ||
| 226 | ;AN000; | ||
| 227 | ;SetBP DB 0 ; flag indicates whether to return ;AD003; | ||
| 228 | ; LSN on getuncitem call (GII) ;AN000; | ||
| 229 | ;ERROR_STATUS DW 1 ; Status returned on error return ;AD029; | ||
| 230 | ERROR_STATUS DB "ERROR",0 ; from fs (GII) ;AC029; | ||
| 231 | ;AN000; | ||
| 232 | ;AN000; | ||
| 233 | BREAK <IFS_ASSOPER -- Do the $Assignoper call> ;AN000; | ||
| 234 | ;AN000; | ||
| 235 | copyright db " IFSFUNC.EXE " ;AN000; | ||
| 236 | INCLUDE copyrigh.inc | ||
| 237 | |||
| 238 | ;************************************************************************************ ;AN000; | ||
| 239 | ; ;AN000; | ||
| 240 | ; IFS_ASSOPER ;AN000; | ||
| 241 | ; ;AN000; | ||
| 242 | ; Called by: IFSFUNC dispatcher ;AN000; | ||
| 243 | ; ;AN000; | ||
| 244 | ; Routines called: ;AN000; | ||
| 245 | ; RETURN_ASSIGN_MODE ;AN000; | ||
| 246 | ; SET_ASSIGN_MODE ;AN000; | ||
| 247 | ; GET_IFSFUNC_ITEM ;AN000; | ||
| 248 | ; ATTACH_START ;AN000; | ||
| 249 | ; ATTACH_END ;AN000; | ||
| 250 | ; ;AN000; | ||
| 251 | ; Inputs: ;AN000; | ||
| 252 | ; AL = 00 get / 01 set - redir assign mode (Return/Set Mode) ;AN000; | ||
| 253 | ; AL = 02 get attach list entry (Get ifsfunc item) ;AN000; | ||
| 254 | ; AL = 03 Define Macro (attach start) ;AN000; | ||
| 255 | ; AL = 04 Cancel Attach (attach end) ;AN000; | ||
| 256 | ; AL = 05 Revised get assign list entry (Getifsfuncitem2) ;AN000; | ||
| 257 | ; AL = 06 Get IFSFUNC Item (Getifsfuncitem3) ;AN003; | ||
| 258 | ; Function: ;AN000; | ||
| 259 | ; IF AL=0 call RETURN_ASSIGN_MODE ;AN000; | ||
| 260 | ; ELSE IF AL=1 call SET_ASSIGN_MODE ;AN000; | ||
| 261 | ; ELSE IF AL=2 call GET_IFSFUNC_ITEM ;AN000; | ||
| 262 | ; ELSE IF AL=3 call ATTACH_START ;AN000; | ||
| 263 | ; ELSE IF AL=4 call ATTACH_END ;AN000; | ||
| 264 | ; ;AN000; | ||
| 265 | ; Outputs: ;AN000; | ||
| 266 | ; see subroutines ;AN000; | ||
| 267 | ; ;AN000; | ||
| 268 | ;************************************************************************************ ;AN000; | ||
| 269 | ;AN000; | ||
| 270 | AO_TABLE LABEL WORD ;AN000; | ||
| 271 | DW RETURN_ASSIGN_MODE ;AN000; | ||
| 272 | DW SET_ASSIGN_MODE ;AN000; | ||
| 273 | DW GET_IFSFUNC_ITEM ;AN000; | ||
| 274 | DW ATTACH_START ;AN000; | ||
| 275 | DW ATTACH_END ;AN000; | ||
| 276 | DW GET_IFSFUNC_ITEM2 ;AN000; | ||
| 277 | DW GET_IFSFUNC_ITEM3 ;AN003; | ||
| 278 | ;AN000; | ||
| 279 | Procedure IFS_ASSOPER,NEAR ;AN000; | ||
| 280 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 281 | ;AN000; | ||
| 282 | TEST CS:IFSFUNC_FLAGS,no_ifs_drivers | ||
| 283 | JZ AO_20 | ||
| 284 | AO_10: | ||
| 285 | MOV AX,error_not_supported | ||
| 286 | transfer ifs_980 | ||
| 287 | AO_20: | ||
| 288 | CMP AL,0 | ||
| 289 | JNE AO_40 | ||
| 290 | CMP AL,1 | ||
| 291 | JNE AO_40 | ||
| 292 | TEST CS:IFSFUNC_FLAGS,unc_installed | ||
| 293 | JZ AO_10 | ||
| 294 | AO_40: | ||
| 295 | MOV CS:IFSPROC_FLAGS,ZERO ;AN000; | ||
| 296 | PUSH BX ; save macro type ;AN000; | ||
| 297 | XOR AH,AH ;AN000; | ||
| 298 | SHL AL,1 ; AL x 2 ;AN000; | ||
| 299 | MOV BX,AX ;AN000; | ||
| 300 | JMP CS:AO_TABLE[BX] ;AN000; | ||
| 301 | ;AN000; | ||
| 302 | EndProc IFS_ASSOPER ;AN000; | ||
| 303 | ;AN000; | ||
| 304 | BREAK <RETURN_ASSIGN_MODE -- Return Assign Mode> ;AN000; | ||
| 305 | ;AN000; | ||
| 306 | ;************************************************************************************ ;AN000; | ||
| 307 | ; ;AN000; | ||
| 308 | ; RETURN_ASSIGN_MODE ;AN000; | ||
| 309 | ; ;AN000; | ||
| 310 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 311 | ; ;AN000; | ||
| 312 | ; Routines called: DOS: Get_User_Stack ;AN000; | ||
| 313 | ; ;AN000; | ||
| 314 | ; Inputs: ;AN000; | ||
| 315 | ; BL = macro type ;AN000; | ||
| 316 | ; Function: ;AN000; | ||
| 317 | ; If macro type = 3 (network printer) THEN ;AN000; | ||
| 318 | ; BX = fPrint .AND. 1 ;AN000; | ||
| 319 | ; Elseif macro type = 4 (network disk) THEN ;AN000; | ||
| 320 | ; BX = fAssign .AND. 1 ;AN000; | ||
| 321 | ; Else set error_invalid_function ;AN000; | ||
| 322 | ; ;AN000; | ||
| 323 | ; Output: ;AN000; | ||
| 324 | ; IF AL==0 BX value on user stack ;AN000; | ||
| 325 | ; ;AN000; | ||
| 326 | ; Notes: This routine is used only for UNC file system. This is the ;AN000; | ||
| 327 | ; only FS that supports pause. ;AN000; | ||
| 328 | ; ;AN000; | ||
| 329 | ;************************************************************************************ ;AN000; | ||
| 330 | ;AN000; | ||
| 331 | Procedure RETURN_ASSIGN_MODE,NEAR ;AN000; | ||
| 332 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 333 | ;AN000; | ||
| 334 | POP BX ; macro type ;AN000; | ||
| 335 | CMP BL,3 ; if (type == drive) ;AN000; | ||
| 336 | JZ GAM_20 ;AN000; | ||
| 337 | CMP BL,4 ;AN000; | ||
| 338 | JNZ GAM_60 ;AN000; | ||
| 339 | MOV BH,fAssign ; t = fAssign; ;AN000; | ||
| 340 | JMP Short GAM_40 ; else ;AN000; | ||
| 341 | ;AN000; | ||
| 342 | GAM_20: ; if (type == print) ;AN000; | ||
| 343 | MOV BH,fPrint ; t = fPrint; ;AN000; | ||
| 344 | GAM_40: ;AN000; | ||
| 345 | AND BH,1 ; return t&1; ;AN000; | ||
| 346 | CallInstall Get_User_Stack,multDOS,24 ;AN000; | ||
| 347 | MOV [SI].User_BX,BX ;AN000; | ||
| 348 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 349 | ;AN000; | ||
| 350 | GAM_60: ;AN000; | ||
| 351 | MOV AL,error_invalid_function ;AN000; | ||
| 352 | transfer ifs_980 ; go to general bad ret in util ;AN000; | ||
| 353 | ;AN000; | ||
| 354 | ;AN000; | ||
| 355 | EndProc RETURN_ASSIGN_MODE ;AN000; | ||
| 356 | ;AN000; | ||
| 357 | BREAK <SET_ASSIGN_MODE -- set assign mode> ;AN000; | ||
| 358 | ;AN000; | ||
| 359 | ;************************************************************************************ ;AN000; | ||
| 360 | ; ;AN000; | ||
| 361 | ; SET_ASSIGN_MODE ;AN000; | ||
| 362 | ; ;AN000; | ||
| 363 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 364 | ; ;AN000; | ||
| 365 | ; Routines called: ;AN000; | ||
| 366 | ; ;AN000; | ||
| 367 | ; Inputs: ;AN000; | ||
| 368 | ; BL = macro type ;AN000; | ||
| 369 | ; BH = assign mode (0 = off - pause, 1 = on - no pause) ;AN000; | ||
| 370 | ; ;AN000; | ||
| 371 | ; Function: ;AN000; | ||
| 372 | ; ;AN000; | ||
| 373 | ; Output: ;AN000; | ||
| 374 | ; ;AN000; | ||
| 375 | ;************************************************************************************ ;AN000; | ||
| 376 | ;AN000; | ||
| 377 | Procedure SET_ASSIGN_MODE,NEAR ;AN000; | ||
| 378 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 379 | ;AN000; | ||
| 380 | POP BX ; restore macro type (3 or 4) ;AN000; | ||
| 381 | ;AN000; | ||
| 382 | CMP BL,3 ; check if printer or drive ;AN000; | ||
| 383 | JNZ SAM_40 ; ;AN000; | ||
| 384 | OR BH,BH ; printer - check mode ;AN000; | ||
| 385 | JZ SAM_20 ; off - go pause ;AN000; | ||
| 386 | CMP BH,1 ;AN000; | ||
| 387 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 388 | CALL PrintOn ; turn print on ;AN000; | ||
| 389 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 390 | ;AN000; | ||
| 391 | SAM_20: ; print off - pause ;AN000; | ||
| 392 | CALL PrintOff ;AN000; | ||
| 393 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 394 | ;AN000; | ||
| 395 | SAM_40: ; Drive ;AN000; | ||
| 396 | CMP BL,4 ;AN000; | ||
| 397 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 398 | OR BH,BH ;AN000; | ||
| 399 | JZ SAM_60 ;AN000; | ||
| 400 | CMP BH,1 ;AN000; | ||
| 401 | JNZ SAM_80 ; jump on parm error ;AN000; | ||
| 402 | CALL AssignOn ; drive on ;AN000; | ||
| 403 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 404 | ;AN000; | ||
| 405 | SAM_60: ; drive off ;AN000; | ||
| 406 | invoke AssignOff ; turn drives off (pause) ;AN000; | ||
| 407 | transfer ifs_990 ; go to general good ret in util ;AN000; | ||
| 408 | ;AN000; | ||
| 409 | ;AN000; | ||
| 410 | SAM_80: ;AN000; | ||
| 411 | MOV AX,error_invalid_parameter ;AN000; | ||
| 412 | invoke SET_EXTERR_INFO ;AN000; | ||
| 413 | transfer ifs_980 ; go to general bad ret in util ;AN000; | ||
| 414 | ;AN000; | ||
| 415 | ;AN000; | ||
| 416 | EndProc SET_ASSIGN_MODE ;AN000; | ||
| 417 | ;AN000; | ||
| 418 | BREAK <GET_IFSFUNC_ITEM -- for get attach list > ;AN000; | ||
| 419 | ;AN000; | ||
| 420 | ;************************************************************************************ ;AN000; | ||
| 421 | ; ;AN000; | ||
| 422 | ; GET_IFSFUNC_ITEM ;AN000; | ||
| 423 | ; ;AN000; | ||
| 424 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 425 | ; ;AN000; | ||
| 426 | ; Routines called: ;AN000; | ||
| 427 | ; GET_IFS_DRIVER_NAME DOS: STRCPY ;AN000; | ||
| 428 | ; CDS_TO_CD GET_USER_STACK ;AN000; | ||
| 429 | ; DFL_TO_DF ;AN000; | ||
| 430 | ; CALL_IFS ;AN000; | ||
| 431 | ; ;AN000; | ||
| 432 | ; Inputs: ;AN000; | ||
| 433 | ; BL = redirection index ;AN000; | ||
| 434 | ; DS:SI -> Device name buffer ;AN000; | ||
| 435 | ; ES:DI -> Target buffer: old - net path string ;AN000; | ||
| 436 | ; new - dw file system driver name | ||
| 437 | ; dw # parms | ||
| 438 | ; db parms | ||
| 439 | ; Function: ;AN000; | ||
| 440 | ; STRUCTURE = 1st CDS ;AN000; | ||
| 441 | ; INDEX = 0 ;AN000; | ||
| 442 | ; WHILE CDS structures ;AN000; | ||
| 443 | ; DO ;AN000; | ||
| 444 | ; IF curdir_isIFS TRUE THEN ;AN000; | ||
| 445 | ; DO ;AN000; | ||
| 446 | ; IF INDEX = BL THEN ;AN000; | ||
| 447 | ; DO ;AN000; | ||
| 448 | ; DS:SI = Letter version of Index (0=A:, 1=B:, ...) ;AN000; | ||
| 449 | ; IF IFS .NOT. UNC THEN ;AN000; | ||
| 450 | ; DO ;AN000; | ||
| 451 | ; ES:[DI] = IFS name (retrieved from CURDIR_IFSR_HDR) ;AN000; | ||
| 452 | ; Send ATTACH_STAT request to IFS for parms ;AN000; | ||
| 453 | ; ES:DI+2 = IFS parms ;AN000; | ||
| 454 | ; FOUND = true ;AN000; | ||
| 455 | ; TYPE = 2 ;AN000; | ||
| 456 | ; LEAVE WHILE ;AN000; | ||
| 457 | ; ENDDO ;AN000; | ||
| 458 | ; ELSE DO ;AN000; | ||
| 459 | ; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; | ||
| 460 | ; Move parms into one buffer and point with ES:DI ;AN000; | ||
| 461 | ; FOUND = true ;AN000; | ||
| 462 | ; TYPE = 4 ;AN000; | ||
| 463 | ; LEAVE WHILE ;AN000; | ||
| 464 | ; ENDDO ;AN000; | ||
| 465 | ; ELSE DO ;AN000; | ||
| 466 | ; IF IFS UNC THEN ;AN000; | ||
| 467 | ; DO ;AN000; | ||
| 468 | ; INDEX=INDEX+1 ;AN000; | ||
| 469 | ; IF INDEX = BL THEN ;AN000; | ||
| 470 | ; DO ;AN000; | ||
| 471 | ; DS:SI = Letter version of Index (0=A:, 1=B:, ;AN000; | ||
| 472 | ; ES:DI = "REDIR" ;AN000; | ||
| 473 | ; FOUND = true ;AN000; | ||
| 474 | ; TYPE = 2 ;AN000; | ||
| 475 | ; LEAVE WHILE ;AN000; | ||
| 476 | ; ENDDO ;AN000; | ||
| 477 | ; ENDIF ;AN000; | ||
| 478 | ; ENDDO ;AN000; | ||
| 479 | ; ENDIF ;AN000; | ||
| 480 | ; ENDDO ;AN000; | ||
| 481 | ; ENDIF ;AN000; | ||
| 482 | ; ENDDO ;AN000; | ||
| 483 | ; ENDIF ;AN000; | ||
| 484 | ; Get next CDS structure ;AN000; | ||
| 485 | ; ENDDO ;AN000; | ||
| 486 | ; ENDWHILE ;AN000; | ||
| 487 | ; IF FOUND = false THEN ;AN000; | ||
| 488 | ; DO ;AN000; | ||
| 489 | ; STRUCTURE = 1st DFL ;AN000; | ||
| 490 | ; WHILE DFL structures ;AN000; | ||
| 491 | ; DO ;AN000; | ||
| 492 | ; IF INDEX = BL THEN ;AN000; | ||
| 493 | ; DO ;AN000; | ||
| 494 | ; DS:SI = name pointed to by DFLL_NAME_PTR ;AN000; | ||
| 495 | ; IF IFS .NOT. UNC THEN ;AN000; | ||
| 496 | ; DO ;AN000; | ||
| 497 | ; ES:[DI] = IFS name (retrieved from DFLL_IFSR_HDR) ;AN000; | ||
| 498 | ; Send ATTACH_STAT request to IFS for parms ;AN000; | ||
| 499 | ; ES:DI+2 = IFS parms ;AN000; | ||
| 500 | ; FOUND = true ;AN000; | ||
| 501 | ; TYPE = 1 ;AN000; | ||
| 502 | ; LEAVE WHILE ;AN000; | ||
| 503 | ; ENDDO ;AN000; | ||
| 504 | ; ELSE DO ;AN000; | ||
| 505 | ; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; | ||
| 506 | ; Move parms into one buffer and point with ES:DI ;AN000; | ||
| 507 | ; FOUND = true ;AN000; | ||
| 508 | ; TYPE = 3 ;AN000; | ||
| 509 | ; LEAVE WHILE ;AN000; | ||
| 510 | ; ENDDO ;AN000; | ||
| 511 | ; ELSE DO ;AN000; | ||
| 512 | ; IF IFS UNC THEN ;AN000; | ||
| 513 | ; DO ;AN000; | ||
| 514 | ; INDEX=INDEX+1 ;AN000; | ||
| 515 | ; IF INDEX = BL THEN ;AN000; | ||
| 516 | ; DO ;AN000; | ||
| 517 | ; ES:DI = "REDIR" ;AN000; | ||
| 518 | ; FOUND = true ;AN000; | ||
| 519 | ; TYPE = 3 ;AN000; | ||
| 520 | ; LEAVE WHILE ;AN000; | ||
| 521 | ; ENDDO ;AN000; | ||
| 522 | ; ENDIF ;AN000; | ||
| 523 | ; ENDDO ;AN000; | ||
| 524 | ; ENDIF ;AN000; | ||
| 525 | ; ENDDO ;AN000; | ||
| 526 | ; ENDIF ;AN000; | ||
| 527 | ; Get next DFL structure ;AN000; | ||
| 528 | ; ENDWHILE ;AN000; | ||
| 529 | ; ENDDO ;AN000; | ||
| 530 | ; ENDIF ;AN000; | ||
| 531 | ; IF FOUND = FALSE THEN ;AN000; | ||
| 532 | ; DO ;AN000; | ||
| 533 | ; Set carry ;AN000; | ||
| 534 | ; AX = 18 ;AN000; | ||
| 535 | ; ENDDO ;AN000; | ||
| 536 | ; ELSE Clear carry ;AN000; | ||
| 537 | ; ENDIF ;AN000; | ||
| 538 | ; | ||
| 539 | ; IFSRH for Attach Start: | ||
| 540 | ; * IFSR_LENGTH DW 32 ; Request length | ||
| 541 | ; * IFSR_FUNCTION DB 3 ; Attach Start | ||
| 542 | ; + IFSR_RETCODE DW 0 | ||
| 543 | ; + IFSR_RETCLASS DB ? | ||
| 544 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 545 | ; + IFSR_TYPE DB ? ; BL (1,2,3,or 4) | ||
| 546 | ; IFSR_RESV2 DB ? | ||
| 547 | ; *+ IFSR_PARMS@ DD PARMS ; See below | ||
| 548 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) | ||
| 549 | ; + IFSR_USER_WORD DW ? | ||
| 550 | ; + IFSR_MAX_XMITT_SIZE DW ? | ||
| 551 | ; + IFSR_NET_NAME_ID DW ? | ||
| 552 | ; + IFSR_LSN DW ? | ||
| 553 | ; + IFSR_DEVICE_STATUS DB ? | ||
| 554 | ; IFSR_RESV3 DB ? | ||
| 555 | ; | ||
| 556 | ; | ||
| 557 | ; | ||
| 558 | ; *+ PARMS LABEL WORD | ||
| 559 | ; DW PARMCOUNT ; Number of parms. (only for new style) | ||
| 560 | ; DB ASCIIZ,...; Parms | ||
| 561 | ; | ||
| 562 | ; ;AN000; | ||
| 563 | ; Outputs: ;AN000; | ||
| 564 | ; No Carry - BH = device status flag ;AN000; | ||
| 565 | ; bit 0=0 is device valid ;AN000; | ||
| 566 | ; 1 if device invalid ;AN000; | ||
| 567 | ; BL = device type ;AN000; | ||
| 568 | ; DS:SI = ASCIIZ local device name ;AN000; | ||
| 569 | ; ES:DI = ASCIIZ network name ;AN000; | ||
| 570 | ; For old style call: | ||
| 571 | ; CX = user word ;AN000; | ||
| 572 | ; DX = max xmitt size | ||
| 573 | ; BP = Low 8 bits has LSN from NCB_LIST if input AL ^=0 | ||
| 574 | ; AX = Net name ID | ||
| 575 | ; | ||
| 576 | ; Carry - AX = Error code ;AN000; | ||
| 577 | ; 18 - end of list ;AN000; | ||
| 578 | ; Regs: ;AN000; | ||
| 579 | ; ;AN000; | ||
| 580 | ;************************************************************************************ ;AN000; | ||
| 581 | USER_WORD DW 0 ; i give in - temp storage | ||
| 582 | ;AN000; | ||
| 583 | Procedure GET_IFSFUNC_ITEM ;AC003; | ||
| 584 | ASSUME DS:NOTHING,ES:NOTHING ;AC003; | ||
| 585 | ; get_ifsfunc_item and get_ifsfunc_item2 ;AC003; | ||
| 586 | MOV CS:IFSPROC_FLAGS,ZERO ; are old style - types 3,4 only ;AC003; | ||
| 587 | JMP SHORT GII_20 ;AC003; | ||
| 588 | ;AC003; | ||
| 589 | entry GET_IFSFUNC_ITEM2 ;AC003; | ||
| 590 | MOV CS:IFSPROC_FLAGS,SetBP ; set this to get lsn ;AC003; | ||
| 591 | JMP SHORT GII_20 ;AC003; | ||
| 592 | ;AC003; | ||
| 593 | entry GET_IFSFUNC_ITEM3 ; new style get ifsfunc item ;AC003; | ||
| 594 | MOV CS:IFSPROC_FLAGS,Filesys_Status ; gets types 1,2,3,4 ;AC003; | ||
| 595 | ;AC003; | ||
| 596 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 597 | ; drive loop ;AC003; | ||
| 598 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 599 | ;AC003; | ||
| 600 | GII_20: ;AC003; | ||
| 601 | ifsr_fcn_def ATTSTAT ; define ifsr for attach status ;AC003; | ||
| 602 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN006; | ||
| 603 | ;AC003; | ||
| 604 | POP BX ; index ;AC003; | ||
| 605 | XOR AX,AX ; ax will be counter through CDSs ;AC003; | ||
| 606 | SaveReg <DS,SI> ; save device/drive name buffer ;AC003; | ||
| 607 | GII_40: ;AC003; | ||
| 608 | CMP AL,SS:[CDSCount] ; if run out of CDSs, ;AC003; | ||
| 609 | JB GII_60 ; go to devices ;AC003; | ||
| 610 | XOR AL,AL ; reset for dfl count ;AC003; | ||
| 611 | JMP GII_400 ;AC003; | ||
| 612 | GII_60: ;AC003; | ||
| 613 | SaveReg <BX,AX> ; save ax-cds count, bx-index ;AC003; | ||
| 614 | ;AC003; | ||
| 615 | LDS SI,[CDSAddr] ; Point ds:si to correct CDS entry ;AC003; | ||
| 616 | CMP [fAssign],ZERO ; if pause in effect, must use ;AC003; | ||
| 617 | JNZ GII_80 ; alternate cds list ;AC003; | ||
| 618 | LDS SI,[CDSAlt] ;AC003; | ||
| 619 | ;AC003; | ||
| 620 | GII_80: ;AC003; | ||
| 621 | MOV BL,SIZE CurDir_list ; size in convenient spot ;AC003; | ||
| 622 | MUL BL ; get net offset ;AC003; | ||
| 623 | ADD SI,AX ; convert to true pointer ;AC003; | ||
| 624 | RestoreReg <AX,BX> ;AC003; | ||
| 625 | TEST [SI].curdir_flags,curdir_isnet ; make sure ifs drive ;AC003; | ||
| 626 | JNZ GII_100 ;AC003; | ||
| 627 | JMP GII_280 ; next drive ;AC003; | ||
| 628 | GII_100: ;AC003; | ||
| 629 | SUB BX,1 ; jae jumps if CF=0, CF=1 when ;AC003; | ||
| 630 | ; index hit ;AC003; | ||
| 631 | JB GII_120 ;AC003; | ||
| 632 | JMP GII_280 ; next drive ;AC003; | ||
| 633 | GII_120: ;AC003; | ||
| 634 | TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; | ||
| 635 | JNZ GII_140 ;AC003; | ||
| 636 | CMP [SI.CURDIR_TYPE],TYPE_NET_DRIVE ; old style: check for type 4 ;AC003; | ||
| 637 | JE GII_140 ;AC003; | ||
| 638 | JMP GII_280 ; not type 4, go get next one ;AC003; | ||
| 639 | GII_140: ;AC003; | ||
| 640 | RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003; | ||
| 641 | SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003; | ||
| 642 | SaveReg <ES,DI> ; while preserving es:di - target ;AC003; | ||
| 643 | MOV ES,CX ;AC003; | ||
| 644 | MOV DI,DX ;AC003; | ||
| 645 | ADD AL,'A' ; storing d:0 in devname buffer ;AC003; | ||
| 646 | STOSB ;AC003; | ||
| 647 | MOV AX,(0 SHL 8) + ':' ;AC003; | ||
| 648 | STOSW ;AC003; | ||
| 649 | RestoreReg <DI,ES> ; restore target ptr ;AC003; | ||
| 650 | ;AC003; | ||
| 651 | MOV BL,[SI.CURDIR_TYPE] ; set bx=type (1,2,3,4) ;AC003; | ||
| 652 | XOR BH,BH ;AC003; | ||
| 653 | TEST CS:IFSPROC_FLAGS,Filesys_status ; target different for new style ;AC003; | ||
| 654 | JNZ GII_150 ;AC003; | ||
| 655 | PUSH [SI.CURDIR_USER_WORD] ;AC003; | ||
| 656 | POP CS:[USER_WORD] ;AC003; | ||
| 657 | JMP GII_160 ;AC003; | ||
| 658 | GII_150: ;AC003; | ||
| 659 | PUSH DI ; ifs drive; save target offset ;AC003; | ||
| 660 | MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; | ||
| 661 | OR IFSPROC_FLAGS,ISCDS ; get ifs driver name into target ;AC003; | ||
| 662 | CALL GET_IFS_DRIVER_NAME ;AC003; | ||
| 663 | ;AC003; | ||
| 664 | POP DI ; retrieve target offset from stack ;AC003; | ||
| 665 | PUSH DI ;AC003; | ||
| 666 | INC DI ; es:di -> parm buffer ;AC003; | ||
| 667 | INC DI ;AC003; | ||
| 668 | ;AC003; | ||
| 669 | GII_160: ;AC003; | ||
| 670 | SaveReg <ES,BX> ; save target segment, type ;AC003; | ||
| 671 | ; go to IFS to fill in rest of tgt ;AC003; | ||
| 672 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 673 | ;AC003; | ||
| 674 | MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC003; | ||
| 675 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AC003; | ||
| 676 | ; ES:BX -> IFSRH ;AC003; | ||
| 677 | ; IFSR_DEVICE_CB@ ;AC003; | ||
| 678 | ; ds - IFSSEG ;AC003; | ||
| 679 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; | ||
| 680 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; | ||
| 681 | POP AX ; type (BX) ;AC003; | ||
| 682 | MOV ES:[BX.IFSR_TYPE],AL ;AC003; | ||
| 683 | POP DX ; target segment (ES) ;AC003; | ||
| 684 | ;AC003; | ||
| 685 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 686 | JNZ GII_180 ;AC003; | ||
| 687 | PUSH CS ;AC003; | ||
| 688 | POP DS ;AC003; | ||
| 689 | ASSUME DS:IFSSEG ;AC003; | ||
| 690 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 691 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; | ||
| 692 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; | ||
| 693 | PUSH DI ; push tgt offset here for later pop ;AC003; | ||
| 694 | JMP GII_200 ;AC003; | ||
| 695 | GII_180: ;AC003; | ||
| 696 | MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; | ||
| 697 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; | ||
| 698 | GII_200: ;AC003; | ||
| 699 | PUSH AX ; push type back (BX) ;AC003; | ||
| 700 | ;AC003; | ||
| 701 | ;*********************************************************************************************** | ||
| 702 | invoke CALL_IFS ; call fs with attach status request ;AC003; | ||
| 703 | ;*********************************************************************************************** | ||
| 704 | ;AC003; | ||
| 705 | JNC GII_220 ;AC003; | ||
| 706 | ; attach status error: ;AC003; | ||
| 707 | RestoreReg <BX,DI> ; type,target offset ;AC003; | ||
| 708 | MOV ES,DX ;AC003; | ||
| 709 | SaveReg <DI> ; put "ERROR" in parms display ;AC003; | ||
| 710 | TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; | ||
| 711 | JZ GII_210 ;AN029; | ||
| 712 | ADD DI,2 ;AC003; | ||
| 713 | MOV AX,1 ;AC003; | ||
| 714 | STOSW ;AC003; | ||
| 715 | GII_210: ;AN029; | ||
| 716 | PUSH CS ;AC003; | ||
| 717 | POP DS ;AC003; | ||
| 718 | ASSUME DS:IFSSEG ;AC003; | ||
| 719 | MOV SI,OFFSET ERROR_STATUS ;AC003; | ||
| 720 | MOV CX,4 ;AC003; | ||
| 721 | REP MOVSW ;AC003; | ||
| 722 | RestoreReg <DI,SI,DS> ;AC003;;AC029; | ||
| 723 | transfer ifs_1000 ; go to general ret in util ;AC003; | ||
| 724 | ;AC003; | ||
| 725 | GII_220: ;AC003; | ||
| 726 | RestoreReg <AX,DI> ; device type, target offset ;AC003; | ||
| 727 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 728 | JZ GII_240 ;AC003; | ||
| 729 | ;;;;;;;;RestoreReg <SI,DS> ; IFS drive - devname ptr ;AC003;;AD022; | ||
| 730 | ; MOV ES,DX ; target ;AC003;;AD022; | ||
| 731 | ; MOV BX,AX ;AC003;;AD022; | ||
| 732 | ;;;;;;;;transfer ifs_1000 ;AC003;;AD022; | ||
| 733 | JMP GII_630 ; want user bx set ;AN022; | ||
| 734 | ;AC003; | ||
| 735 | GII_240: ; NET drive: ;AC003; | ||
| 736 | JMP GII_640 ; go down to net device processing- ;AC003; | ||
| 737 | ; does the same thing ;AC003; | ||
| 738 | GII_280: ;AC003; | ||
| 739 | INC AX ; next drive ;AC003; | ||
| 740 | JMP GII_40 ;AC003; | ||
| 741 | ;AC003; | ||
| 742 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 743 | ; device loop ;AC003; | ||
| 744 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 745 | ;AC003; | ||
| 746 | GII_400: ; Device loop ;AC003; | ||
| 747 | CMP AL,CS:[DFLCount] ; if run out of devices ;AC003; | ||
| 748 | JB GII_460 ;AC003; | ||
| 749 | JMP GII_800 ; go set no_more error ;AC003; | ||
| 750 | GII_460: ;AC003; | ||
| 751 | SaveReg <BX,AX> ; save ax-dfl count, bx-index ;AC003; | ||
| 752 | LDS SI,CS:[DFLAddr] ; Point ds:si to correct DFL entry ;AC003; | ||
| 753 | MOV BL,SIZE DFLL_list ; size in convenient spot ;AC003; | ||
| 754 | MUL BL ; get net offset ;AC003; | ||
| 755 | ADD SI,AX ; convert to true pointer ;AC003; | ||
| 756 | RestoreReg <AX,BX> ;AC003; | ||
| 757 | TEST [SI.DFLL_FLAGS],DFL_INUSE ; is dfl active??? ;AC003; | ||
| 758 | JNZ GII_480 ;AC003; | ||
| 759 | JMP GII_680 ;AC003; | ||
| 760 | GII_480: ;AC003; | ||
| 761 | TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; | ||
| 762 | JNZ GII_520 ;AC003; | ||
| 763 | CMP [SI.DFLL_TYPE],TYPE_NET_DEVICE ; old style: check for type 3 ;AC003; | ||
| 764 | JE GII_520 ;AC003; | ||
| 765 | JMP GII_680 ; not type 4, go get next one ;AC003; | ||
| 766 | GII_520: ;AC003; | ||
| 767 | SUB BX,1 ;AC003; | ||
| 768 | JB GII_540 ;AC003; | ||
| 769 | JMP GII_680 ; next device ;AC003; | ||
| 770 | GII_540: ;AC003; | ||
| 771 | MOV WORD PTR CS:[THISDFL],SI ; set thisdfl = dssi ;AN014; | ||
| 772 | PUSH DS ;AN014; | ||
| 773 | POP WORD PTR CS:[THISDFL+2] ;AN014; | ||
| 774 | RestoreReg <DX,CX> ; get devname ptr into es:di, ;AC003; | ||
| 775 | SaveReg <CX,DX> ; (push back for end ds:si setup) ;AC003; | ||
| 776 | SaveReg <ES,DI> ; while preserving es:di - target ;AC003; | ||
| 777 | MOV ES,CX ;AC003; | ||
| 778 | MOV DI,DX ;AC003; | ||
| 779 | PUSH SI ; save DFL offset ;AC003; | ||
| 780 | ADD SI,DFLL_DEV_NAME ;AC003; | ||
| 781 | MOV CX,8 ;AC003; | ||
| 782 | GII_545: ; store device name in asciiz format ;AC003; | ||
| 783 | LODSB ;AC003; | ||
| 784 | CMP AL," " ;AC003; | ||
| 785 | JE GII_550 ;AC003; | ||
| 786 | STOSB ;AC003; | ||
| 787 | LOOP GII_545 ;AC003; | ||
| 788 | GII_550: ;AC003; | ||
| 789 | XOR AL,AL ;AC003; | ||
| 790 | STOSB ;AC003; | ||
| 791 | RestoreReg <SI,DI,ES> ; restore target ptr & DFL offset ;AC003; | ||
| 792 | ;AC003; | ||
| 793 | MOV BL,[SI.DFLL_TYPE] ;AC003; | ||
| 794 | XOR BH,BH ;AC003; | ||
| 795 | TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 796 | JNZ GII_555 ;AC003; | ||
| 797 | PUSH [SI.DFLL_USER_WORD] ;AC003; | ||
| 798 | POP [USER_WORD] ;AC003; | ||
| 799 | JMP GII_560 ;AC003; | ||
| 800 | GII_555: ;AC003; | ||
| 801 | PUSH DI ; ifs device; save target offset ;AC003; | ||
| 802 | MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; | ||
| 803 | invoke GET_IFS_DRIVER_NAME ;AC003; | ||
| 804 | ;AC003; | ||
| 805 | POP DI ; retrieve target offset from stack ;AC003; | ||
| 806 | PUSH DI ;AC003; | ||
| 807 | INC DI ; es:di -> parm buffer ;AC003; | ||
| 808 | INC DI ;AC003; | ||
| 809 | ;AC003; | ||
| 810 | GII_560: ;AC003; | ||
| 811 | SaveReg <ES,BX> ; save target segment, type ;AC003; | ||
| 812 | ; now go to IFS to fill in rest of target;AC003; | ||
| 813 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 814 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AC003; | ||
| 815 | ; ES:BX -> IFSRH ;AC003; | ||
| 816 | ; IFSR_DEVICE_CB@ ;AC003; | ||
| 817 | ; ds - IFSSEG ;AC003; | ||
| 818 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; | ||
| 819 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; | ||
| 820 | POP AX ; type (BX) ;AC003; | ||
| 821 | MOV ES:[BX.IFSR_TYPE],AL ;AC003; | ||
| 822 | POP DX ; target segment (ES) ;AC003; | ||
| 823 | ;AC003; | ||
| 824 | TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 825 | JNZ GII_580 ;AC003; | ||
| 826 | PUSH CS ;AC003; | ||
| 827 | POP DS ;AC003; | ||
| 828 | ASSUME DS:IFSSEG ;AC003; | ||
| 829 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 830 | MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; | ||
| 831 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; | ||
| 832 | PUSH DI ; push tgt offset here for later pop ;AC003; | ||
| 833 | JMP GII_600 ;AC003; | ||
| 834 | GII_580: ;AC003; | ||
| 835 | MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; | ||
| 836 | MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; | ||
| 837 | GII_600: ;AC003; | ||
| 838 | PUSH AX ; push type back (BX) ;AC003; | ||
| 839 | ;AC003; | ||
| 840 | ;*********************************************************************************************** | ||
| 841 | invoke CALL_IFS ; call fs with attach status request ;AC003; | ||
| 842 | ;*********************************************************************************************** | ||
| 843 | ;AC003; | ||
| 844 | JNC GII_620 ;AC003; | ||
| 845 | RestoreReg <BX,DI> ; type,target offset,devname ptr ;AC003; | ||
| 846 | MOV ES,DX ; target ;AC003; | ||
| 847 | SaveReg <DI> ; put "ERROR" in parms display ;AC003; | ||
| 848 | TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; | ||
| 849 | JZ GII_610 ;AN029; | ||
| 850 | ADD DI,2 ;AC003; | ||
| 851 | MOV AX,1 ;AC003; | ||
| 852 | STOSW ;AC003; | ||
| 853 | GII_610: ;AN029; | ||
| 854 | PUSH CS ;AC003; | ||
| 855 | POP DS ;AC003; | ||
| 856 | ASSUME DS:IFSSEG ;AC003; | ||
| 857 | MOV SI,OFFSET ERROR_STATUS ;AC003; | ||
| 858 | MOV CX,4 ;AC003; | ||
| 859 | REP MOVSW ;AC003; | ||
| 860 | RestoreReg <DI,SI,DS> ;AC003;;AC027; | ||
| 861 | transfer ifs_1000 ; go to general ret in util ;AC003; | ||
| 862 | ;AC003; | ||
| 863 | GII_620: ;AC003; | ||
| 864 | RestoreReg <AX,DI> ; device type, target offset ;AC003; | ||
| 865 | TEST IFSPROC_FLAGS,Filesys_Status ;AC003; | ||
| 866 | JZ GII_640 ; IFS device: ;AC003; | ||
| 867 | GII_630: ;AN022; | ||
| 868 | CallInstall Get_User_Stack,MULTdos,24,<AX>,<AX> ;AN022; | ||
| 869 | MOV AH,ES:[BX.IFSR_DEVICE_STATUS] ;AN022; | ||
| 870 | MOV [SI].USER_BX,AX ;AN022; | ||
| 871 | RestoreReg <SI,DS> ; target offset,devname ptr ;AC003; | ||
| 872 | MOV ES,DX ; target ;AC003; | ||
| 873 | ;;;;;;;;MOV BX,AX ;AC003;;AD022; | ||
| 874 | transfer ifs_1000 ;AC003; | ||
| 875 | ;AC003; | ||
| 876 | GII_640: ; NET device: ;AC003; | ||
| 877 | CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003; | ||
| 878 | PUSH CS:[USER_WORD] ;AC003; | ||
| 879 | POP [SI].User_CX ; User Word ;AC003; | ||
| 880 | PUSH ES:[BX.IFSR_MAX_XMITT_SIZE] ;AC003; | ||
| 881 | POP [SI].User_DX ; Max Xmitt size ;AC003; | ||
| 882 | PUSH ES:[BX.IFSR_NET_NAME_ID] ;AC003/AC008/AC009 | ||
| 883 | PUSH ES:[BX.IFSR_NET_NAME_ID] ; leave this on stack for later pop into ax ;AC009; | ||
| 884 | POP [SI].User_AX ; Net name ID ;AC003/AC008; | ||
| 885 | ;;;;;;;;PUSH AX ;AN008/AD009; | ||
| 886 | |||
| 887 | MOV CH,ES:[BX.IFSR_DEVICE_STATUS] ;AC003; | ||
| 888 | MOV CL,AL ;AC003; | ||
| 889 | MOV [SI].User_BX,CX ; Bits and macro type ;AC003; | ||
| 890 | TEST CS:IFSPROC_FLAGS,SetBP ;AC003; | ||
| 891 | JZ GII_660 ;AC003; | ||
| 892 | PUSH ES:[BX.IFSR_LSN] ;AC003; | ||
| 893 | POP [SI].User_BP ; LSN ;AC003; | ||
| 894 | GII_660: ;AC003; | ||
| 895 | MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AC003; | ||
| 896 | MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AC003; | ||
| 897 | INC SI ; ds:si -> parms returned by redir ;AC003; | ||
| 898 | INC SI ;AC003; | ||
| 899 | MOV ES,DX ; es:di -> input target buffer ;AC003; | ||
| 900 | SaveReg <DI> ; save offset ;AC003; | ||
| 901 | CallInstall StrCpy,MultDOS,17 ;AC003; | ||
| 902 | RestoreReg <DI,AX,SI,DS> ; tgt offset,netpath id,devname ptr ;AC003/AC008; | ||
| 903 | transfer ifs_990 ;AC003; | ||
| 904 | ;AC003; | ||
| 905 | GII_680: ;AC003; | ||
| 906 | INC AX ; next drive ;AC003; | ||
| 907 | JMP GII_400 ;AC003; | ||
| 908 | ;AC003; | ||
| 909 | ;AC003; | ||
| 910 | GII_800: ; end of CDSs & devices ;AC003; | ||
| 911 | ; now check deviceless attaches ;AC003; | ||
| 912 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 913 | ; deviceless loop ;AC003; | ||
| 914 | ;----------------------------------------------------------------------------------------;AC003; | ||
| 915 | ;AC003; | ||
| 916 | CALL GET_UNC_ITEM_INFO ;AC003; | ||
| 917 | JC GII_820 ;AC003; | ||
| 918 | RestoreReg <SI,DS> ; set dev ptr null ;AC003; | ||
| 919 | MOV BYTE PTR DS:[SI],ZERO ;AC003; | ||
| 920 | transfer ifs_990 ;AC003; | ||
| 921 | GII_820: ;AC003; | ||
| 922 | MOV AX,error_no_more_files ;AC003; | ||
| 923 | RestoreReg <SI,DI> ; restore regs ;AC003; | ||
| 924 | ;AC003; | ||
| 925 | return ;AC003; | ||
| 926 | ;AC003; | ||
| 927 | EndProc GET_IFSFUNC_ITEM ;AC003; | ||
| 928 | ;AN000; | ||
| 929 | ;AN000; | ||
| 930 | BREAK <ATTACH_START -- Attach drive/device to IFS> ;AN000; | ||
| 931 | ;AN000; | ||
| 932 | ;************************************************************************************ ;AN000; | ||
| 933 | ; ;AN000; | ||
| 934 | ; ATTACH_START ;AN000; | ||
| 935 | ; ;AN000; | ||
| 936 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 937 | ; ;AN000; | ||
| 938 | ; Routines called: CALL_IFS DOS: GetCDSFromDrv ;AN000; | ||
| 939 | ; CDS_TO_CD ;AN000; | ||
| 940 | ; CD_TO_CDS ;AN000; | ||
| 941 | ; CREATE_DFL_ENTRY ;AN000; | ||
| 942 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 943 | ; DFL_MATCH ;AN000; | ||
| 944 | ; DFL_TO_DF ;AN000; | ||
| 945 | ; DF_TO_DFL ;AN000; | ||
| 946 | ; CALL_IFS ;AN000; | ||
| 947 | ; FIND_IFS_DRIVER ;AN000; | ||
| 948 | ;;; alias PROCESS_ALIAS ;AN000; | ||
| 949 | ; ;AN000; | ||
| 950 | ; Inputs: ;AN000; | ||
| 951 | ; BL = Macro type ;AN000; | ||
| 952 | ;;; alias = 0 alias ;AN000; | ||
| 953 | ; = 1 device/file ;AN000; | ||
| 954 | ; = 2 drive ;AN000; | ||
| 955 | ; = 3 Char device -> network ;AN000; | ||
| 956 | ; = 4 File device -> network ;AN000; | ||
| 957 | ; DS:SI -> ASCIIZ source name ;AN000; | ||
| 958 | ; ES:DI -> Target driver to attach to and parms. ;AN000; | ||
| 959 | ; DW ASCIIZ - asciiz name of driver ;AN000; | ||
| 960 | ; DW n - number of parms ;AN000; | ||
| 961 | ; DW ASCIIZ,... parms ;AN000; | ||
| 962 | ; ;AN000; | ||
| 963 | ; CX is reserved (user word for REDIR) ;AN000; | ||
| 964 | ; ;AN000; | ||
| 965 | ; Function: ;AN000; | ||
| 966 | ; IF BL > 0 THEN ;AN000; | ||
| 967 | ; DO ;AN000; | ||
| 968 | ; Check that IFS driver exists ;AN000; | ||
| 969 | ; IF found, set IFS header to that found ;AN000; | ||
| 970 | ; ELSE set error_file_system_not_found ;AN000; | ||
| 971 | ; ENDDO ;AN000; | ||
| 972 | ; IF (BL=2 .OR. BL=4) & no error THEN ;AN000; | ||
| 973 | ; DO ;AN000; | ||
| 974 | ; Find CDS for this drive ;AN000; | ||
| 975 | ; IF none exists, then set error_invalid_parameter ;AN000; | ||
| 976 | ; ELSE Call CDS_TO_CD ;AN000; | ||
| 977 | ; END ;AN000; | ||
| 978 | ; ELSE DO ;AN000; | ||
| 979 | ; IF source name not in DFL THEN ;AN000; | ||
| 980 | ; Call CREATE_DFL_ENTRY ;AN000; | ||
| 981 | ; ELSE Set error_device_already_attached ;AN000; | ||
| 982 | ; ENDIF ;AN000; | ||
| 983 | ; ENDDO ;AN000; | ||
| 984 | ; IF no error THEN ;AN000; | ||
| 985 | ; DO ;AN000; | ||
| 986 | ; Prep IFSRH for Attach Start: ;AN000; | ||
| 987 | ; * IFSR_LENGTH DW 34 ; Request length ;AN000; | ||
| 988 | ; * IFSR_FUNCTION DB 2 ; Attach Start ;AN000; | ||
| 989 | ; IFSR_RETCODE DW 0 ;AN000; | ||
| 990 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 991 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 992 | ; * IFSR_TYPE DB ? ; BL (0,1,2,3,or 4) ;AN000; | ||
| 993 | ; IFSR_RESV2 DB ? ; | ||
| 994 | ; * IFSR_PARMS@ DD PARMS ; See below ;AN000; | ||
| 995 | ; * IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) ;AN000; | ||
| 996 | ; * IFSR_USER_WORD DW ? ; for deviceless attach ;AN000; | ||
| 997 | ; ;AN000; | ||
| 998 | ; * PARMS LABEL WORD ;AN000; | ||
| 999 | ; DW PARMCOUNT ; Number of parms. May be 0. ;AN000; | ||
| 1000 | ; DB ASCIIZ,...; Parms ;AN000; | ||
| 1001 | ; ENDDO ;AN000; | ||
| 1002 | ; IF no error THEN ;AN000; | ||
| 1003 | ; DO ;AN000; | ||
| 1004 | ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; | ||
| 1005 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 1006 | ; DO ;AN000; | ||
| 1007 | ; IF DFL flag set THEN ;AN000; | ||
| 1008 | ; DO ;AN000; | ||
| 1009 | ; Call DF_TO_DFL ;AN000; | ||
| 1010 | ; Set DFLL_PTR to IFS header ;AN000; | ||
| 1011 | ; ENDDO ;AN000; | ||
| 1012 | ; ELSE DO ;AN000; | ||
| 1013 | ; Call CD_TO_CDS ;AN000; | ||
| 1014 | ; Set CDS_IFSR_PTR to IFS header ;AN000; | ||
| 1015 | ; ENDDO ;AN000; | ||
| 1016 | ; ENDIF ;AN000; | ||
| 1017 | ; Clear carry ;AN000; | ||
| 1018 | ; ENDDO ;AN000; | ||
| 1019 | ; ELSE DO ;AN000; | ||
| 1020 | ; IF DFL flag set THEN ;AN000; | ||
| 1021 | ; Call DELETE_DFL_ENTRY ;AN000; | ||
| 1022 | ; Set carry ;AN000; | ||
| 1023 | ; ENDDO ;AN000; | ||
| 1024 | ; ENDIF ;AN000; | ||
| 1025 | ; ENDDO ;AN000; | ||
| 1026 | ; ELSE Set carry ;AN000; | ||
| 1027 | ; ENDIF ;AN000; | ||
| 1028 | ; ;AN000; | ||
| 1029 | ;************************************************************************************ ;AN000; | ||
| 1030 | ;AN000; | ||
| 1031 | Procedure ATTACH_START,NEAR ;AN000; | ||
| 1032 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1033 | ;AN000; | ||
| 1034 | ifsr_fcn_def ATTSTART ;AN000; | ||
| 1035 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1036 | ;AN000; | ||
| 1037 | POP BX ;AN000; | ||
| 1038 | XOR BH,BH ; not interested in bh, but should ;AN000; | ||
| 1039 | ; be 0 since later move type as word ;AN000; | ||
| 1040 | AS_10: ;AN000; | ||
| 1041 | CMP BL,TYPE_DRIVE ; check ifs vs. network ;AN000; | ||
| 1042 | JLE AS_20 ;AN000; | ||
| 1043 | CMP BL,TYPE_NET_DRIVE ;AN000; | ||
| 1044 | JLE AS_30 ;AN000; | ||
| 1045 | ;AN000; | ||
| 1046 | AS_15: ;AN000; | ||
| 1047 | MOV AX,error_invalid_function ; invalid fcn type ;AN000; | ||
| 1048 | transfer ifs_980 ; go ret w/carry ;AN000; | ||
| 1049 | ;AN000; | ||
| 1050 | AS_20: ; IFS device/drive ;AN000; | ||
| 1051 | SaveReg <ES,DI> ; save target ptr for parms@ ;AN000; | ||
| 1052 | MOV DI,ES:[DI] ; set ES:DI -> driver name ;AN000; | ||
| 1053 | invoke FIND_IFS_DRIVER ; sets [THISIFS] ;AN000; | ||
| 1054 | JC AS_25 ;AN000; | ||
| 1055 | SaveReg <CX> ; save cx since next destroys ;AN000; | ||
| 1056 | invoke SET_CATEGORY ; do this to determine unc or not ;AN000; | ||
| 1057 | OR CL,CL ; cl=1 unc else ifs ;AN000; | ||
| 1058 | RestoreReg <CX> ; restore before branch - zf preserved ;AN000; | ||
| 1059 | JZ AS_50 ; jmp if not unc ;AN000; | ||
| 1060 | ADD BL,2 ; change type from 1/2 to 3/4 ;AN000; | ||
| 1061 | RestoreReg <DI,ES> ; retrieve orig target ptr ;AN010; | ||
| 1062 | ;;;;;;;;OR CS:IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; | ||
| 1063 | CMP WORD PTR ES:[DI+2],2 ; if # parms=2 then have password ;AN011; | ||
| 1064 | JE AS_22 ;AN011; | ||
| 1065 | MOV CX,0001H ; User word without password ;AN011; | ||
| 1066 | JMP SHORT AS_23 ; go process as unc ;AN011;;AC017; | ||
| 1067 | AS_22: ;AN011; | ||
| 1068 | MOV CX,8001H ; User word with password ;AN011; | ||
| 1069 | AS_23: ;AN017; | ||
| 1070 | ADD DI,4 ; skip over ifs name offset & #parms ;AN017; | ||
| 1071 | JMP SHORT AS_33 ; go process as unc ;AN000; | ||
| 1072 | |||
| 1073 | AS_25: ; ifs driver not found ;AN000; | ||
| 1074 | POP DI ; error, restore stack and return ;AN000; | ||
| 1075 | POP ES ;AN000; | ||
| 1076 | transfer ifs_1000 ;AN000; | ||
| 1077 | ;AN000; | ||
| 1078 | AS_30: ; NETWORK device/drive ;AN000; | ||
| 1079 | TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; check that unc installed ;AN000; | ||
| 1080 | JZ AS_15 ;AN000; | ||
| 1081 | AS_33: ; this label for unc already checked ;AN000; | ||
| 1082 | OR IFSPROC_FLAGS,IsNetwork ; set network bit ;AN000; | ||
| 1083 | CMP BL,TYPE_NET_DRIVE ; check pause status ;AN000; | ||
| 1084 | JNE AS_35 ;AN000; | ||
| 1085 | CMP CS:fAssign,-1 ;AN000; | ||
| 1086 | JMP SHORT AS_37 ;AN000; | ||
| 1087 | AS_35: ;AN000; | ||
| 1088 | CMP CS:fPrint,-1 ;AN000; | ||
| 1089 | AS_37: ;AN000; | ||
| 1090 | JE AS_40 ; bad pause status ;AN000; | ||
| 1091 | MOV AX,72 ; set error and ret w/carry ;AN000; | ||
| 1092 | AS_38: ;AN020; | ||
| 1093 | PUSH CS ;AN000; | ||
| 1094 | POP DS ;AN000; | ||
| 1095 | ASSUME DS:IFSSEG ;AN000; | ||
| 1096 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1097 | transfer ifs_980 ;AN000; | ||
| 1098 | ;AN000; | ||
| 1099 | AS_40: ;AN000; | ||
| 1100 | invoke SET_THISIFS_UNC ;AN000; | ||
| 1101 | SaveReg <CX> ;AN004;;AC015; | ||
| 1102 | invoke NET_TRANS ;AN000; | ||
| 1103 | RestoreReg <CX> ;AN004;;AC015; | ||
| 1104 | JNC SHORT AS_55 ;AC020; | ||
| 1105 | MOV AX,error_path_not_found ; net trans failure = path not found ;AN020; | ||
| 1106 | JMP AS_38 ;AN020; | ||
| 1107 | ;AN000; | ||
| 1108 | AS_50: ;AN000; | ||
| 1109 | RestoreReg <DI,ES> ; restore target parm ptr ;AN000; | ||
| 1110 | AS_55: ;AN000; | ||
| 1111 | OR CS:IFSPROC_FLAGS,THISIFS_SET ; do this so wont do in CDS_TO_CD ;AN000; | ||
| 1112 | ; or DFL_TO_DF ;AN000; | ||
| 1113 | CMP BL,TYPE_DEVICE ;AN000; | ||
| 1114 | JNE AS_55_0 ;AN000; | ||
| 1115 | JMP AS_200 ;AN000; | ||
| 1116 | AS_55_0: ;AN000; | ||
| 1117 | CMP BL,TYPE_NET_DEVICE ;AN000; | ||
| 1118 | JNE AS_55_1 ;AN000; | ||
| 1119 | JMP AS_200 ;AN000; | ||
| 1120 | AS_55_1: ;AN000; | ||
| 1121 | CMP BL,TYPE_NET_DRIVE ; deviceless attach check ;AN000; | ||
| 1122 | JNE AS_56 ; jmp if no ;AN000; | ||
| 1123 | CMP BYTE PTR [SI],0 ; DEVICELESS ATTACH ;AN000; | ||
| 1124 | JNZ AS_56 ; Set dummy CDS and flag ;AN000; | ||
| 1125 | Context DS ;AN000; | ||
| 1126 | MOV SI,OFFSET DOSGROUP:DummyCDS ;AN000; | ||
| 1127 | MOV WORD PTR [THISCDS+2],DS ;AN000; | ||
| 1128 | MOV WORD PTR [THISCDS],SI ;AN000; | ||
| 1129 | OR IFSPROC_FLAGS,ISDUMMYCDS ;AN000; | ||
| 1130 | JMP SHORT AS_100 ;AN000; | ||
| 1131 | ;AN000; | ||
| 1132 | AS_56: ; DRIVE ATTACH ;AN000; | ||
| 1133 | CMP WORD PTR [SI+1],ICOLON ; if 2nd char not ":" - error ;AN000; | ||
| 1134 | JE AS_60 ; else - find CDS ;AN000; | ||
| 1135 | AS_57: ;AN000; | ||
| 1136 | MOV AX,error_invalid_drive ;AN000; | ||
| 1137 | transfer ifs_980 ;AN000; | ||
| 1138 | ;AN000; | ||
| 1139 | AS_60: ;AN000; | ||
| 1140 | LODSB ;AN000; | ||
| 1141 | Context DS ; get addressability to DOSGROUP ;AN000; | ||
| 1142 | OR AL,20H ;AN000; | ||
| 1143 | SUB AL,"a" ; 0=A,1=B,... ;AN000; | ||
| 1144 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; | ||
| 1145 | ASSUME DS:NOTHING ;AN000; | ||
| 1146 | JC AS_57 ; no cds - error ;AN000; | ||
| 1147 | TEST [SI.curdir_flags],curdir_inuse ; DS:SI -> CDS ;AN000; | ||
| 1148 | JZ AS_100 ;AN000; | ||
| 1149 | TEST [SI.curdir_flags],curdir_isnet + curdir_splice + curdir_local ;AN000; | ||
| 1150 | JZ AS_100 ;AN000; | ||
| 1151 | MOV AX,error_already_assigned ; error - CDS already assigned ;AN000; | ||
| 1152 | transfer ifs_980 ; go return with carry ;AN000; | ||
| 1153 | ;AN000; | ||
| 1154 | AS_100: ;AN000; | ||
| 1155 | SaveReg <DS,SI,ES,DI> ; save real cds and target parm ptr ;AN000; | ||
| 1156 | ; If all goes OK this will be the "REAL" CDS ;AN000; | ||
| 1157 | Context ES ;AN000; | ||
| 1158 | MOV DI,OFFSET DOSGROUP:DummyCDS ;AN000; | ||
| 1159 | SaveReg <DI,CX> ; dummy cds offset, input user word ;AC001; | ||
| 1160 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1161 | REP MOVSB ;AN000; | ||
| 1162 | RestoreReg <CX> ; input user word ;AN001; | ||
| 1163 | PUSH ES ;AN000; | ||
| 1164 | POP DS ;AN000; | ||
| 1165 | POP SI ; DS:SI -> dummy CDS ;AN000; | ||
| 1166 | MOV [SI.curdir_flags],curdir_isnet + curdir_inuse ;AN000; | ||
| 1167 | ;AN000; | ||
| 1168 | MOV AX,WORD PTR [THISIFS] ; set ifs ptr in cds ;AN000; | ||
| 1169 | MOV DS:WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; | ||
| 1170 | MOV AX,WORD PTR [THISIFS+2] ;AN000; | ||
| 1171 | MOV DS:WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; | ||
| 1172 | ;AN000; | ||
| 1173 | MOV DS:[SI.CURDIR_TYPE],BL ; set CDS type ;AN000; | ||
| 1174 | MOV DS:[SI.CURDIR_USER_WORD],CX ; set CDS user word ;AN001; | ||
| 1175 | MOV AX,CX | ||
| 1176 | ;AN000; | ||
| 1177 | RestoreReg <DX,CX> ; get target parm ptr off stack ;AN000; | ||
| 1178 | SaveReg <DS,SI,BX> ; save type and dummy cds ptr ;AN000; | ||
| 1179 | invoke PREP_IFSR ; clear ifsrh ;AN000; | ||
| 1180 | invoke CDS_TO_CD ; CDS: sets ES:BX -> IFSRH ;AN000; | ||
| 1181 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1182 | ; ds - IFSSEG ;AN000; | ||
| 1183 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1184 | TEST IFSPROC_FLAGS,ISDUMMYCDS | ||
| 1185 | JZ AS_120 | ||
| 1186 | MOV ES:[BX.IFSR_USER_WORD],AX | ||
| 1187 | AS_120: | ||
| 1188 | POP AX ; restore type in AL ;AN000; | ||
| 1189 | MOV ES:[BX.IFSR_TYPE],AL ;AC002; | ||
| 1190 | SaveReg <CX,DX> ; put target parm ptr back on stack ;AN000; | ||
| 1191 | JMP SHORT AS_400 ; go prep IFSRH ;AN000; | ||
| 1192 | ;AN000; | ||
| 1193 | AS_200: ; DEVICE ATTACH: ;AN000; | ||
| 1194 | invoke DFL_MATCH ; check if device already assigned ;AN000; | ||
| 1195 | JC AS_220 ; cf-0 match, cf-set no match ;AN000; | ||
| 1196 | MOV AX,error_already_assigned ;AN000; | ||
| 1197 | transfer ifs_980 ; go return with carry ;AN000; | ||
| 1198 | ;AN000; | ||
| 1199 | AS_220: ;AN000; | ||
| 1200 | SaveReg <ES,DI,BX> ; save target parm ptr & type ;AN000; | ||
| 1201 | invoke CREATE_DFL_ENTRY ; DFL: sets ES:BX -> IFSRH ;AN000; | ||
| 1202 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1203 | ; ds - IFSSEG ;AN000; | ||
| 1204 | JNC AS_240 ;AN000; | ||
| 1205 | RestoreReg <BX,DI,ES> ; restore stack ;AC019; | ||
| 1206 | invoke CONSIST_SFT ;AN000; | ||
| 1207 | transfer ifs_980 ; error ret ;AC019; | ||
| 1208 | AS_240: ;AN000; | ||
| 1209 | POP AX ; restore type in AL ;AN000;moved ;AM019; | ||
| 1210 | MOV ES:[BX.IFSR_TYPE],AL ;AC002; | ||
| 1211 | ;AN000; | ||
| 1212 | ;AN000; | ||
| 1213 | AS_400: ; prep IFSRH ;AN000; | ||
| 1214 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; | ||
| 1215 | MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; | ||
| 1216 | POP AX ; old target DI ;AN000; | ||
| 1217 | ;;;;;;;;TEST IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; | ||
| 1218 | ; JZ AS_405 ;AN010;;AD017; | ||
| 1219 | ; ADD AX,4 ; filesys-net skip name offset ;AN010;;AD017; | ||
| 1220 | ;;;;;;;;JMP SHORT AS_410 ; and # parms - just want net path;AN010;;AD017; | ||
| 1221 | ;AS_405: ;AN010;;AD017; | ||
| 1222 | TEST IFSPROC_FLAGS,IsNetwork ;AN000; | ||
| 1223 | JNZ AS_410 ;AN000; | ||
| 1224 | INC AX ;AN000; | ||
| 1225 | INC AX ;AN000; | ||
| 1226 | AS_410: | ||
| 1227 | MOV ES:WORD PTR [BX.IFSR_PARMS@],AX ;AN000; | ||
| 1228 | POP AX ; old target ES ;AN000; | ||
| 1229 | MOV ES:WORD PTR [BX.IFSR_PARMS@+2],AX ;AN000; | ||
| 1230 | |||
| 1231 | ;*********************************************************************************************** | ||
| 1232 | invoke CALL_IFS ;AN000; | ||
| 1233 | ;*********************************************************************************************** | ||
| 1234 | |||
| 1235 | JNC AS_440 ;AN000; | ||
| 1236 | ;AN000; | ||
| 1237 | ;AN000; | ||
| 1238 | TEST IFSPROC_FLAGS,ISCDS ; ifs error: ;AN000; | ||
| 1239 | JZ AS_420 ;AN000; | ||
| 1240 | RestoreReg <DS,SI,DS,SI> ; pop dummy & real cds ;AN000; | ||
| 1241 | transfer ifs_980 ;AN000; | ||
| 1242 | AS_420: ;AN000; | ||
| 1243 | SaveReg <AX> ; preserve error code ;AN027; | ||
| 1244 | invoke DELETE_DFL_ENTRY ;AN000; | ||
| 1245 | invoke CONSIST_SFT ;AN025; | ||
| 1246 | RestoreReg <AX> ;AN027; | ||
| 1247 | transfer ifs_980 ;AN000; | ||
| 1248 | ;AN000; | ||
| 1249 | AS_440: ; successful attach ;AN000; | ||
| 1250 | TEST IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1251 | JZ AS_460 ;AN000; | ||
| 1252 | RestoreReg <DI,ES> ; restore ES:DI -> dummy cds ;AN000; | ||
| 1253 | invoke CD_TO_CDS ;AN000; | ||
| 1254 | RestoreReg <SI,DS> ; ds:si - real cds ;AN000; | ||
| 1255 | invoke XCHGP ;AN000; | ||
| 1256 | MOV CX,SIZE CURDIR_LIST ;AN000; | ||
| 1257 | OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; make sure this flag set ;AN000; | ||
| 1258 | REP MOVSB ;AN000; | ||
| 1259 | transfer ifs_990 ;AN000; | ||
| 1260 | ;AN000; | ||
| 1261 | AS_460: ;AN000; | ||
| 1262 | invoke DF_TO_DFL ;AN000; | ||
| 1263 | invoke CONSIST_SFT ;AN025; | ||
| 1264 | transfer ifs_990 ;AN000; | ||
| 1265 | ;AN000; | ||
| 1266 | ;AN000; | ||
| 1267 | EndProc ATTACH_START ;AN000; | ||
| 1268 | ;AN000; | ||
| 1269 | ;AN000; | ||
| 1270 | BREAK <ATTACH_END -- break attachment> ;AN000; | ||
| 1271 | ;AN000; | ||
| 1272 | ;************************************************************************************ ;AN000; | ||
| 1273 | ; ;AN000; | ||
| 1274 | ; ATTACH_END ;AN000; | ||
| 1275 | ; ;AN000; | ||
| 1276 | ; Called by: IFS_ASSOPER ;AN000; | ||
| 1277 | ; ;AN000; | ||
| 1278 | ; Routines called: DFL_MATCH DOS: StrCpy ;AN000; | ||
| 1279 | ; DFL_TO_DF DriveFromText ;AN000; | ||
| 1280 | ; DF_TO_DFL GetThisDrv ;AN000; | ||
| 1281 | ; CDS_TO_CD InitCDS ;AN000; | ||
| 1282 | ; CD_TO_CDS ;AN000; | ||
| 1283 | ; SET_EXTERR_INFO ;AN000; | ||
| 1284 | ; CALL_IFS ;AN000; | ||
| 1285 | ; DELETE_DFL_ENTRY ;AN000; | ||
| 1286 | ; ;AN000; | ||
| 1287 | ; Inputs: ;AN000; | ||
| 1288 | ; DS:SI -> ASCIZ source name ;AN000; | ||
| 1289 | ; Function: ;AN000; | ||
| 1290 | ; Prep IFSRH: ;AN000; | ||
| 1291 | ; * IFSR_LENGTH DW 30 ; Request length ;AN000; | ||
| 1292 | ; * IFSR_FUNCTION DB 4 ; End Attach ;AN000; | ||
| 1293 | ; IFSR_RETCODE DW ? ;AN000; | ||
| 1294 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 1295 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 1296 | ; * IFSR_DEVICE_CB@ DD ? ; CD or DF ;AN000; | ||
| 1297 | ; * IFSR_NAME@ DD ? ; for deviceless detach (unc) ;AN000; | ||
| 1298 | ; ;AN000; | ||
| 1299 | ; ;AN000; | ||
| 1300 | ;************************************************************************************ ;AN000; | ||
| 1301 | ;AN000; | ||
| 1302 | Procedure ATTACH_END,NEAR ;AN000; | ||
| 1303 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1304 | ;AN000; | ||
| 1305 | ifsr_fcn_def ATTEND ;AN000; | ||
| 1306 | ;AN000; | ||
| 1307 | POP BX ;AN000; | ||
| 1308 | ;AN000; | ||
| 1309 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1310 | MOV CS:IFSPROC_FLAGS,0 ;AN000; | ||
| 1311 | invoke PREP_IFSR ;AN000; | ||
| 1312 | ;AN000; | ||
| 1313 | PUSH DS ;AN000; | ||
| 1314 | POP ES ;AN000; | ||
| 1315 | MOV DI,SI ; ES:DI=DS:SI=source name ;AN000; | ||
| 1316 | PUSH SI ; Save SI ;AN000; | ||
| 1317 | CallInstall StrCpy,multDOS,17 ; "Beautify" input string ;AN000; | ||
| 1318 | ; (converts to uppercase & ;AN000; | ||
| 1319 | ; / to \) ;AN000; | ||
| 1320 | POP SI ; Recover string pointer ;AN000; | ||
| 1321 | CMP WORD PTR [SI],"\\" ; Special Case - ;AN000; | ||
| 1322 | JZ AE_300 ; deviceless detach ;AN000; | ||
| 1323 | CMP WORD PTR [SI+1],":" ; check for drive ;AN000; | ||
| 1324 | JNZ AE_200 ; no, go to device check ;AN000; | ||
| 1325 | CMP fAssign,-1 ; BREAK DRIVE ATTACH ;AN000; | ||
| 1326 | JZ AE_20 ;AN000; | ||
| 1327 | AE_10: ;AN000; | ||
| 1328 | MOV AX,72 ; pause error ;AN000; | ||
| 1329 | PUSH CS ;AN000; | ||
| 1330 | POP DS ;AN000; | ||
| 1331 | ASSUME DS:IFSSEG ;AN000; | ||
| 1332 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1333 | transfer ifs_980 ;AN000; | ||
| 1334 | AE_20: ;AN000; | ||
| 1335 | CallInstall DriveFromText,multDOS,26 ; AL = drive # (0-not drive ;AN000; | ||
| 1336 | context DS ; -1=a,1=b,2=c,...) ;AN000; | ||
| 1337 | CallInstall GetThisDrv,multDOS,25,AX,BX ; ES:DI->CDS ;AN000; | ||
| 1338 | JNC AE_40 ;AN000; | ||
| 1339 | MOV AX,error_invalid_drive ;AN000; | ||
| 1340 | transfer ifs_1000 ;AN000; | ||
| 1341 | AE_40: ;AN000; | ||
| 1342 | LES DI,[THISCDS] ;AN000; | ||
| 1343 | TEST ES:[DI.curdir_flags],curdir_isnet ;AN000; | ||
| 1344 | JNZ AE_60 ;AN000; | ||
| 1345 | MOV AX,error_invalid_drive ; not redirected ;AN000; | ||
| 1346 | transfer ifs_980 ;AN000; | ||
| 1347 | AE_60: ;AN000; | ||
| 1348 | PUSH AX ; drive # ;AN000; | ||
| 1349 | PUSH ES ;AN000; | ||
| 1350 | POP DS ;AN000; | ||
| 1351 | MOV SI,DI ; move cds ptr to ds:si ;AN000; | ||
| 1352 | invoke CDS_TO_CD ;AN000; | ||
| 1353 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1354 | JMP SHORT AE_400 ;AN000; | ||
| 1355 | ;AN000; | ||
| 1356 | AE_200: ; BREAK DEVICE ATTACH ;AN000; | ||
| 1357 | CMP fPrint,-1 ; check for pause error ;AN000; | ||
| 1358 | JZ AE_210 ;AN000; | ||
| 1359 | JMP AE_10 ;AN000; | ||
| 1360 | AE_210: ;AN000; | ||
| 1361 | CALL DFL_MATCH ;AN000; | ||
| 1362 | JNC AE_220 ;AN000; | ||
| 1363 | MOV AX,device_not_attached ;AN000; | ||
| 1364 | transfer ifs_1000 ;AN000; | ||
| 1365 | AE_220: ;AN000; | ||
| 1366 | MOV SI,WORD PTR [THISDFL] ;AN000; | ||
| 1367 | MOV DS,WORD PTR [THISDFL+2] ;AN000; | ||
| 1368 | ;AN000; | ||
| 1369 | TEST DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000; | ||
| 1370 | ; ???????????? check with baf on what reverting to ... ;AN000; | ||
| 1371 | ;AN000; | ||
| 1372 | invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; | ||
| 1373 | ; ES:BX -> IFSRH ;AN000; | ||
| 1374 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1375 | ; ds - IFSSEG ;AN000; | ||
| 1376 | JMP SHORT AE_400 ;AN000; | ||
| 1377 | ;AN000; | ||
| 1378 | AE_300: ; deviceless detach ;AN000; | ||
| 1379 | SaveReg <CS> ; restore es to ifsr & set seq flag ;AN018; | ||
| 1380 | RestoreReg <ES> ;AN018; | ||
| 1381 | OR CS:IFSPROC_FLAGS,IsSeq ;AN018; | ||
| 1382 | CMP fAssign,-1 ;AN000; | ||
| 1383 | JZ AE_320 ;AN000; | ||
| 1384 | JMP AE_10 ; jump to pause error ;AN000; | ||
| 1385 | AE_320: ;AN000; | ||
| 1386 | SaveReg <ES,BX,DS> ; ifsr ptr ;AC004; | ||
| 1387 | RestoreReg <ES> ; set esdi = dssi = net path ;AC004; | ||
| 1388 | ASSUME ES:NOTHING ;AC004; | ||
| 1389 | MOV DI,SI ;AC004; | ||
| 1390 | invoke NET_TRANS ;AC004; | ||
| 1391 | SaveReg <ES> ;AC004; | ||
| 1392 | RestoreReg <AX> ; name string segment ;AC004; | ||
| 1393 | MOV SI,DI ; name string offset ;AC004; | ||
| 1394 | RestoreReg <BX,ES> ; ifsr pointer ;AC004; | ||
| 1395 | ASSUME ES:IFSSEG ;AC004; | ||
| 1396 | MOV WORD PTR ES:[BX.IFSR_NAME@],DI ;AC004; | ||
| 1397 | MOV WORD PTR ES:[BX.IFSR_NAME@+2],AX ;AC004; | ||
| 1398 | SaveReg <CS> ;AC004; | ||
| 1399 | RestoreReg <DS> ;AN000; | ||
| 1400 | ASSUME DS:IFSSEG ;AN000; | ||
| 1401 | ;AN000; | ||
| 1402 | AE_400: ; call ifs ;AN000; | ||
| 1403 | MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTEND ;AN000; | ||
| 1404 | MOV ES:[BX.IFSR_FUNCTION],IFSATTEND ;AN000; | ||
| 1405 | ;AN000; | ||
| 1406 | ;*********************************************************************************************** | ||
| 1407 | invoke CALL_IFS ;AN000; | ||
| 1408 | ;*********************************************************************************************** | ||
| 1409 | ;AN000; | ||
| 1410 | JNC AE_410 ;AN000; | ||
| 1411 | TEST IFSPROC_FLAGS,ISCDS ; att end error: ;AN000; | ||
| 1412 | JZ AE_405 ;AN000; | ||
| 1413 | ADD SP,2 ; clear ax (drive #) off stack ;AN000; | ||
| 1414 | AE_405: ;AN000; | ||
| 1415 | transfer ifs_980 ;AN000; | ||
| 1416 | AE_410: ;AN000; | ||
| 1417 | TEST CS:IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1418 | JZ AE_420 ;AN000; | ||
| 1419 | ;AN000; | ||
| 1420 | POP AX ; drive ;AN000; | ||
| 1421 | ADD AL,'A' ;AN000; | ||
| 1422 | CallInstall InitCDS,multDOS,31,AX,AX ;AN000; | ||
| 1423 | transfer ifs_990 ;AN000; | ||
| 1424 | AE_420: ;AN000; | ||
| 1425 | TEST CS:IFSPROC_FLAGS,IsSeq ;AN018; | ||
| 1426 | JNZ AE_440 ;AN018; | ||
| 1427 | CALL DELETE_DFL_ENTRY ;AN000; | ||
| 1428 | AE_440: ;AN018; | ||
| 1429 | transfer ifs_990 ;AN000; | ||
| 1430 | ;AN000; | ||
| 1431 | ;AN000; | ||
| 1432 | EndProc ATTACH_END ;AN000; | ||
| 1433 | ;AN000; | ||
| 1434 | |||
| 1435 | BREAK <IFS_RESET_ENVIRONMENT -- reset IFS environment> ;AN016; | ||
| 1436 | |||
| 1437 | ;*********************************************************************************** | ||
| 1438 | ; | ||
| 1439 | ; IFS_RESET_ENVIRONMENT | ||
| 1440 | ; | ||
| 1441 | ; Called by: IFSFUNC Dispatcher | ||
| 1442 | ; | ||
| 1443 | ; Routines called: | ||
| 1444 | ; jumps into ifs_abort | ||
| 1445 | ; | ||
| 1446 | ; Inputs: | ||
| 1447 | ; [CurrentPDB] set to PID of process aborting | ||
| 1448 | ; | ||
| 1449 | ; Function: | ||
| 1450 | ; Get address of IFS driver chain. | ||
| 1451 | ; FOR I = 1 to last IFS driver | ||
| 1452 | ; Send request below to IFS driver | ||
| 1453 | ; | ||
| 1454 | ; IFSRH: | ||
| 1455 | ; * IFSR_LENGTH DW 42 ; Request length | ||
| 1456 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1457 | ; IFSR_RETCODE DW ? | ||
| 1458 | ; IFSR_RETCLASS DB ? | ||
| 1459 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1460 | ; * IFSR_APIFUNC DB 18 ; End of Process | ||
| 1461 | ; IFSR_ERROR_CLASS DB ? | ||
| 1462 | ; IFSR_ERROR_ACTION DB ? | ||
| 1463 | ; IFSR_ERROR_LOCUS DB ? | ||
| 1464 | ; IFSR_ALLOWED DB ? | ||
| 1465 | ; IFSR_I24_RETRY DB ? | ||
| 1466 | ; IFSR_I24_RESP DB ? | ||
| 1467 | ; IFSR_RESV2 DB ? | ||
| 1468 | ; IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1469 | ; IFSR_OPEN_CB@ DD ? | ||
| 1470 | ; * IFSR_PID DW ? ; process ID | ||
| 1471 | ; * IFSR_SUBFUNC DB 2 ; 0=normal exit 1=abort exit | ||
| 1472 | ; ; 2=reset environment | ||
| 1473 | ; IFSR_RESV3 DB ? | ||
| 1474 | ; | ||
| 1475 | ; Call all IFSs with this info. | ||
| 1476 | ; Scan through SFTFCB | ||
| 1477 | ; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN | ||
| 1478 | ; Call SF_IFS_HDR with close request | ||
| 1479 | ; ENDIF | ||
| 1480 | ; | ||
| 1481 | ; Outputs: None | ||
| 1482 | ; DS Preserved, All others destroyed | ||
| 1483 | ; | ||
| 1484 | ;************************************************************************************ | ||
| 1485 | |||
| 1486 | procedure IFS_RESET_ENVIRONMENT,NEAR ;AN016; | ||
| 1487 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN016; | ||
| 1488 | |||
| 1489 | ifsr_fcn_def EXECAPI ;AN016; | ||
| 1490 | ifsr_api_def EOP ;AN016; | ||
| 1491 | |||
| 1492 | MOV CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; | ||
| 1493 | Context DS ; make sure ds=ss=dosgroup ;AN016; | ||
| 1494 | JMP IA_70 ;AN016; | ||
| 1495 | |||
| 1496 | EndProc IFS_RESET_ENVIRONMENT ;AN016; | ||
| 1497 | |||
| 1498 | |||
| 1499 | BREAK <IFS_ABORT -- Send CLOSE all files for process> ;AN016; | ||
| 1500 | ;AN016; | ||
| 1501 | ;************************************************************************************ | ||
| 1502 | ; | ||
| 1503 | ; IFS_ABORT | ||
| 1504 | ; | ||
| 1505 | ; Called by: IFSFUNC Dispatcher | ||
| 1506 | ; | ||
| 1507 | ; Routines called: | ||
| 1508 | ; CALL_IFS | ||
| 1509 | ; IFS_CLOSE | ||
| 1510 | ; | ||
| 1511 | ; Inputs: | ||
| 1512 | ; [CurrentPDB] set to PID of process aborting | ||
| 1513 | ; | ||
| 1514 | ; Function: | ||
| 1515 | ; Get address of IFS driver chain. | ||
| 1516 | ; FOR I = 1 to last IFS driver | ||
| 1517 | ; Send request below to IFS driver | ||
| 1518 | ; | ||
| 1519 | ; IFSRH: | ||
| 1520 | ; * IFSR_LENGTH DW 42 ; Request length | ||
| 1521 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1522 | ; IFSR_RETCODE DW ? | ||
| 1523 | ; IFSR_RETCLASS DB ? | ||
| 1524 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1525 | ; * IFSR_APIFUNC DB 18 ; End of Process | ||
| 1526 | ; IFSR_ERROR_CLASS DB ? | ||
| 1527 | ; IFSR_ERROR_ACTION DB ? | ||
| 1528 | ; IFSR_ERROR_LOCUS DB ? | ||
| 1529 | ; IFSR_ALLOWED DB ? | ||
| 1530 | ; IFSR_I24_RETRY DB ? | ||
| 1531 | ; IFSR_I24_RESP DB ? | ||
| 1532 | ; IFSR_RESV2 DB ? | ||
| 1533 | ; IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1534 | ; IFSR_OPEN_CB@ DD ? | ||
| 1535 | ; * IFSR_PID DW ? ; process ID | ||
| 1536 | ; * IFSR_SUBFUNC DB ? ; 0=normal exit 1=abort exit | ||
| 1537 | ; ; 2=reset environment | ||
| 1538 | ; IFSR_RESV3 DB ? | ||
| 1539 | ; | ||
| 1540 | ; Call all IFSs with this info. | ||
| 1541 | ; Scan through SFTFCB | ||
| 1542 | ; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN | ||
| 1543 | ; Call SF_IFS_HDR with close request | ||
| 1544 | ; ENDIF | ||
| 1545 | ; | ||
| 1546 | ; Outputs: None | ||
| 1547 | ; DS Preserved, All others destroyed | ||
| 1548 | ; | ||
| 1549 | ;************************************************************************************ | ||
| 1550 | |||
| 1551 | procedure IFS_ABORT,NEAR ;AN000; | ||
| 1552 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1553 | ;AN000; | ||
| 1554 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 1555 | ifsr_api_def EOP ;AN000; | ||
| 1556 | |||
| 1557 | MOV CS:IFSPROC_FLAGS,ZERO | ||
| 1558 | ;AN000; | ||
| 1559 | ; Scan the FCB Cache and close any NET FCBs ;AN000; | ||
| 1560 | ; belonging to this process. The reason we must do this is that ;AN000; | ||
| 1561 | ; NET FCBs are well behaved and must be closed on EXIT. ;AN000; | ||
| 1562 | ;AN000; | ||
| 1563 | LES DI,[SFTFCB] ;AN000; | ||
| 1564 | MOV CX,ES:[DI].sfCount ;AN000; | ||
| 1565 | LEA DI,[DI].sfTable ;AN000; | ||
| 1566 | JCXZ IA_70 ;AN000; | ||
| 1567 | IA_20: ; Loop through sftfcb's ;AN000; | ||
| 1568 | CMP ES:[DI].sf_ref_count,0 ;AN000; | ||
| 1569 | JZ IA_60 ; Ignore Free ones ;AN000; | ||
| 1570 | CMP ES:[DI].sf_ref_count,sf_busy ;AN000; | ||
| 1571 | JZ IA_60 ; Ignore busy ones ;AN000; | ||
| 1572 | TEST ES:[DI].sf_flags,sf_isnet ;AN000; | ||
| 1573 | JZ IA_60 ; Ignore non NET ones ;AN000; | ||
| 1574 | MOV AX,[CurrentPDB] ;AN000; | ||
| 1575 | CMP AX,ES:[DI].sf_PID ;AN000; | ||
| 1576 | JNZ IA_60 ; Ignore FCBs not for this proc ;AN000; | ||
| 1577 | MOV WORD PTR [THISSFT],DI ;AN000; | ||
| 1578 | MOV WORD PTR [THISSFT+2],ES ;AN000; | ||
| 1579 | PUSH CX ;AN000; | ||
| 1580 | IA_40: ; CLOSE ;AN000; | ||
| 1581 | invoke IFS_CLOSE ; IGNORE ANY ERRORS ON THIS. ;AN000; | ||
| 1582 | CMP ES:[DI].sf_ref_count,0 ; Make sure it gets closed ;AN000; | ||
| 1583 | JNE IA_40 ; Loop until closed ;AN000; | ||
| 1584 | POP CX ;AN000; | ||
| 1585 | IA_60: ;AN000; | ||
| 1586 | ADD DI,size sf_entry ;AN000; | ||
| 1587 | LOOP IA_20 ;AN000; | ||
| 1588 | ; ;AN000; | ||
| 1589 | ; Now loop through all ifs drivers with end of process request ;AN000; | ||
| 1590 | ; ;AN000; | ||
| 1591 | IA_70: ;AN000; | ||
| 1592 | LDS SI,IFS_HEADER ;AN000; | ||
| 1593 | ASSUME DS:NOTHING ;AN000; | ||
| 1594 | JMP SHORT IA_100 ; go check if null ;AN007; | ||
| 1595 | ;AN000; | ||
| 1596 | IA_80: ;AN000; | ||
| 1597 | MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000; | ||
| 1598 | MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000; | ||
| 1599 | invoke PREP_IFSR ; sets esbx -> ifsrh ;AN000; | ||
| 1600 | MOV ES:[BX.IFSR_LENGTH],LENGTH_EOP ;AN000; | ||
| 1601 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1602 | MOV ES:[BX.IFSR_APIFUNC],IFSEOP ;AN000; | ||
| 1603 | MOV AX,[CurrentPDB] ;AN000; | ||
| 1604 | MOV ES:[BX.IFSR_PID],AX ; ????? ;AN000; | ||
| 1605 | MOV AL,[EXIT_TYPE] ;AN000; | ||
| 1606 | MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; | ||
| 1607 | TEST CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; | ||
| 1608 | JZ IA_90 ;AN016; | ||
| 1609 | MOV ES:[BX.IFSR_SUBFUNC],RESET_ENVIRONMENT ;AN016; | ||
| 1610 | IA_90: ;AN016; | ||
| 1611 | SaveReg <DS,SI,CS> ; dssi - ifs driver ;AC012; | ||
| 1612 | RestoreReg <DS> ; ds - ifsseg ;AN000; | ||
| 1613 | ;AN000; | ||
| 1614 | ;*********************************************************************************************** | ||
| 1615 | invoke CALL_IFS ;AN000; | ||
| 1616 | ;*********************************************************************************************** | ||
| 1617 | ;AN000; | ||
| 1618 | RestoreReg <SI,DS> ; dssi - ifs driver ;AC012; | ||
| 1619 | LDS SI,[SI.IFS_NEXT] ; check next fs driver ;AN000; | ||
| 1620 | IA_100: ;AN007; | ||
| 1621 | CMP SI,NULL_PTR ; if ptr null, no more ;AN000; | ||
| 1622 | JNE IA_80 ;AN000; | ||
| 1623 | PUSH DS ;AN000; | ||
| 1624 | POP AX ;AN000; | ||
| 1625 | CMP AX,NULL_PTR ;AN000; | ||
| 1626 | JNE IA_80 ;AN000; | ||
| 1627 | ;AN000; | ||
| 1628 | ;AN000; | ||
| 1629 | IA_1000: ;AN000; | ||
| 1630 | SaveReg <SS> ; dosgroup ;AN000; | ||
| 1631 | RestoreReg <DS> ;AN000; | ||
| 1632 | return ;????????? may need redir ioctl to ;AN000; | ||
| 1633 | ; consist_refs ;AN000; | ||
| 1634 | ;AN000; | ||
| 1635 | EndProc IFS_ABORT ;AN000; | ||
| 1636 | ;AN000; | ||
| 1637 | ;AN000; | ||
| 1638 | BREAK <GET_IFS_DRIVER_NAME -- get IFS driver name> ;AN000; | ||
| 1639 | ;AN000; | ||
| 1640 | ;************************************************************************************ ;AN000; | ||
| 1641 | ; ;AN000; | ||
| 1642 | ; GET_IFS_DRIVER_NAME ;AN000; | ||
| 1643 | ; ;AN000; | ||
| 1644 | ; Called by: GET_IFSFUNC_ITEM ;AN000; | ||
| 1645 | ; ;AN000; | ||
| 1646 | ; Routines called: ;AN000; | ||
| 1647 | ; ;AN000; | ||
| 1648 | ; Inputs: ;AN000; | ||
| 1649 | ; DS:SI -> CDS/DFL ;AN000; | ||
| 1650 | ; ES:DI = buffer to place name ;AN000; | ||
| 1651 | ; Function: ;AN000; | ||
| 1652 | ; Find FS name in IFS header pointed to by CDS or DFL ;AN000; | ||
| 1653 | ; Place name in buffer pointed to by ES:DI ;AN000; | ||
| 1654 | ; Output: ;AN000; | ||
| 1655 | ; buffer filled, hopefully with ifs name ;AN000; | ||
| 1656 | ; pointer not checked for valid ifs driver hdr ptr ;AN000; | ||
| 1657 | ; Regs: all preserved ;AN000; | ||
| 1658 | ; ;AN000; | ||
| 1659 | ;************************************************************************************ ;AN000; | ||
| 1660 | ;AN000; | ||
| 1661 | Procedure GET_IFS_DRIVER_NAME,NEAR ;AN000; | ||
| 1662 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1663 | ;AN000; | ||
| 1664 | SaveReg <DS,SI,CX,DI> ; preserve cds/dfl ptr, cx, buffer ;AN000; | ||
| 1665 | ; offset ;AN000; | ||
| 1666 | TEST CS:IFSPROC_FLAGS,ISCDS ; get ifs hdr ptr from ;AN000; | ||
| 1667 | JZ GIDN_20 ;AN000; | ||
| 1668 | LDS SI,[SI.CURDIR_IFS_HDR] ; cds ;AN000; | ||
| 1669 | JMP GIDN_40 ;AN000; | ||
| 1670 | GIDN_20: ;AN000; | ||
| 1671 | LDS SI,[SI.DFLL_IFS_HDR] ; dfl ;AN000; | ||
| 1672 | GIDN_40: ;AN000; | ||
| 1673 | invoke MOVE_DRIVER_NAME ; move ifs driver name into buffer ;AN000; | ||
| 1674 | ;AN000; | ||
| 1675 | RestoreReg <DI,CX,SI,DS> ; restore cds/dfl ptr, cx, buffer ;AN000; | ||
| 1676 | ; offset ;AN000; | ||
| 1677 | return ;AN000; | ||
| 1678 | ;AN000; | ||
| 1679 | EndProc GET_IFS_DRIVER_NAME ;AN000; | ||
| 1680 | ;AN000; | ||
| 1681 | BREAK <FIND_IFS_DRIVER -- get IFS driver> ;AN000; | ||
| 1682 | ;AN000; | ||
| 1683 | ;************************************************************************************ | ||
| 1684 | ; | ||
| 1685 | ; FIND_IFS_DRIVER | ||
| 1686 | ; | ||
| 1687 | ; Called by: ATTACH_START | ||
| 1688 | ; | ||
| 1689 | ; Routines called: CHECK_END_SPACE | ||
| 1690 | ; | ||
| 1691 | ; Inputs: | ||
| 1692 | ; ES:DI -> IFS driver name | ||
| 1693 | ; Function: | ||
| 1694 | ; Loop through IFS driver chain until name match. | ||
| 1695 | ; If match found - set [THISIFS] and clear carry | ||
| 1696 | ; Else set carry. | ||
| 1697 | ; Output: | ||
| 1698 | ; carry clear - match found,[THISIFS] set | ||
| 1699 | ; carry set - no match found | ||
| 1700 | ; | ||
| 1701 | ; Regs: all but ax preserved | ||
| 1702 | ; | ||
| 1703 | ;************************************************************************************ | ||
| 1704 | ;AN000; | ||
| 1705 | Procedure FIND_IFS_DRIVER ;AN000; | ||
| 1706 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 1707 | ;AN000; | ||
| 1708 | SaveReg <DS,SI,BX,ES,DI> ; save registers (except ax for error) ;AC026; | ||
| 1709 | ;AN000; | ||
| 1710 | TEST CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ; check for no drivers first ;AN024; | ||
| 1711 | JZ FID_10 ;AN024; | ||
| 1712 | JMP FID_30 ;AN024; | ||
| 1713 | FID_10: ;AN024; | ||
| 1714 | |||
| 1715 | SaveReg <SS> ; get addressability to dosgroup ;AN000; | ||
| 1716 | RestoreReg <DS> ; to get ifs driver chain ;AN000; | ||
| 1717 | LDS SI,IFS_HEADER ;AN000; | ||
| 1718 | ASSUME DS:NOTHING ; ds:si -> 1st ifs driver ;AN000; | ||
| 1719 | ;AN000; | ||
| 1720 | FID_20: ;AN000; | ||
| 1721 | SaveReg <DS,SI,ES,DI,CS> ; save ds,si,es,di ;AN000; | ||
| 1722 | RestoreReg <ES> ; set es=cs ;AN000; | ||
| 1723 | ASSUME ES:IFSSEG ;AN000; | ||
| 1724 | MOV DI,OFFSET TEMPBUF ; move ifs driver name into tempbuf ;AN000; | ||
| 1725 | SaveReg <SI,DI> ; so that can be asciiz form before ;AN000; | ||
| 1726 | invoke MOVE_DRIVER_NAME ; strcmp ;AN000; | ||
| 1727 | RestoreReg <SI,DI> ; dssi -> tempbuf (ifs driver asciiz ;AN000; | ||
| 1728 | SaveReg <ES> ; name) ;AN000; | ||
| 1729 | RestoreReg <DS,DI,ES> ; esdi -> ifs driver name (input) ;AN000; | ||
| 1730 | CALL CHECK_END_SPACE ; make sure ^ has no blanks ;AN000; | ||
| 1731 | |||
| 1732 | CallInstall StrCmp,multDOS,30 ; check for match (regs preserved) ;AN000; | ||
| 1733 | RestoreReg <SI,DS> ; (ifs driver) ;AN000; | ||
| 1734 | JZ FID_40 ; if match, go set thisifs & return ;AN000; | ||
| 1735 | LDS SI,[SI.IFS_NEXT] ; else check next fs driver ;AN000; | ||
| 1736 | CMP SI,MINUS_ONE ; if ptr null, no more = error ;AN000; | ||
| 1737 | JNE FID_20 ;AN000; | ||
| 1738 | PUSH DS ;AN000; | ||
| 1739 | POP AX ;AN000; | ||
| 1740 | CMP AX,MINUS_ONE ;AN000; | ||
| 1741 | JNE FID_20 ;AN000; | ||
| 1742 | FID_30: ;AN024; | ||
| 1743 | MOV AX,fs_driver_not_found ;AN000; | ||
| 1744 | JMP SHORT FID_980 ;AN000; | ||
| 1745 | FID_40: ;AN000; | ||
| 1746 | MOV WORD PTR CS:[THISIFS],SI ; match. Set [THISIFS] to this ;AN000; | ||
| 1747 | MOV WORD PTR CS:[THISIFS+2],DS ; driver ;AN000; | ||
| 1748 | JMP FID_990 ;AN000; | ||
| 1749 | ;AN000; | ||
| 1750 | ;AN000; | ||
| 1751 | FID_980: ; Return area ;AN000; | ||
| 1752 | STC ;AN000; | ||
| 1753 | JMP SHORT FID_1000 ;AN000; | ||
| 1754 | FID_990: ;AN000; | ||
| 1755 | CLC ;AN000; | ||
| 1756 | FID_1000: ;AN000; | ||
| 1757 | RestoreReg <DI,ES,BX,SI,DS> ; restore registers ;AC026; | ||
| 1758 | return ;AN000; | ||
| 1759 | ;AN000; | ||
| 1760 | EndProc FIND_IFS_DRIVER ;AN000; | ||
| 1761 | ;AN000; | ||
| 1762 | ;AN000; | ||
| 1763 | BREAK <ASSIGN_MODE_FUNCTIONS -- drive/print on/off> ;AN000; | ||
| 1764 | ;AN000; | ||
| 1765 | ;************************************************************************************ ;AN000; | ||
| 1766 | ; ;AN000; | ||
| 1767 | ; AssignOn/AssignOff ;AN000; | ||
| 1768 | ; ;AN000; | ||
| 1769 | ; Called by: SET_ASSIGN_MODE ;AN000; | ||
| 1770 | ; ;AN000; | ||
| 1771 | ; AssignOn and AssignOFF copied from Network Redirector code ;AN000; | ||
| 1772 | ; PrintOn and PrintOff IFSFUNC new code ;AN000; | ||
| 1773 | ; ;AN000; | ||
| 1774 | ; Inputs: ;AN000; | ||
| 1775 | ; ;AN000; | ||
| 1776 | ; Function: ;AN000; | ||
| 1777 | ; ;AN000; | ||
| 1778 | ; Output: ;AN000; | ||
| 1779 | ; ;AN000; | ||
| 1780 | ; Regs: none preserved ;AN000; | ||
| 1781 | ; ;AN000; | ||
| 1782 | ;************************************************************************************ ;AN000; | ||
| 1783 | ;AN000; | ||
| 1784 | Procedure AssignOn,Near ;AN000; | ||
| 1785 | ASSUME ES:NOTHING, DS:NOTHING ;AN000; | ||
| 1786 | EnterCrit CritNet ;AN000; | ||
| 1787 | CMP fAssign,-1 ; if (fAssign) ;AN000; | ||
| 1788 | JZ CrLvA ; return; ;AN000; | ||
| 1789 | MOV fAssign,-1 ; fAssign = TRUE; ;AN000; | ||
| 1790 | LDS SI,CDSAlt ; s = CDSAlt; ;AN000; | ||
| 1791 | LES DI,CDSAddr ; d = CDSAddr; ;AN000; | ||
| 1792 | MOV AL,CDSCount ;AN000; | ||
| 1793 | MOV DX,SIZE curdir_list ;AN000; | ||
| 1794 | OnLoop: ;AN000; | ||
| 1795 | TEST [SI].curdir_flags,curdir_isnet ;AN000; | ||
| 1796 | JNZ RestCDS ; Restore this NET guy ;AN000; | ||
| 1797 | ADD SI,DX ; Skip to next CDS ;AN000; | ||
| 1798 | ADD DI,DX ;AN000; | ||
| 1799 | NextCDS: ;AN000; | ||
| 1800 | DEC AL ;AN000; | ||
| 1801 | JNZ OnLoop ;AN000; | ||
| 1802 | CrLvA: ;AN000; | ||
| 1803 | LeaveCrit CritNet ;AN000; | ||
| 1804 | return ;AN000; | ||
| 1805 | ;AN000; | ||
| 1806 | RestCDS: ;AN000; | ||
| 1807 | MOV CX,DX ;AN000; | ||
| 1808 | REP MOVSB ; strcpy (d, s); ;AN000; | ||
| 1809 | JMP NextCDS ;AN000; | ||
| 1810 | EndProc AssignOn ;AN000; | ||
| 1811 | ;AN000; | ||
| 1812 | Procedure AssignOff,Near ;AN000; | ||
| 1813 | ASSUME ES:NOTHING, DS:NOTHING ;AN000; | ||
| 1814 | EnterCrit CritNet ;AN000; | ||
| 1815 | CMP fAssign,0 ; if (!fAssign) ;AN000; | ||
| 1816 | JZ CrLvB ; return; ;AN000; | ||
| 1817 | LES DI,CDSAlt ; d = CDSAlt; ;AN000; | ||
| 1818 | LDS SI,CDSAddr ; s = CDSAddr; ;AN000; | ||
| 1819 | MOV AL,CDSCount ;AN000; | ||
| 1820 | CBW ; always less or = 26 ;AN000; | ||
| 1821 | MOV CX,SIZE curdir_list ;AN000; | ||
| 1822 | MUL CX ;AN000; | ||
| 1823 | MOV CX,AX ;AN000; | ||
| 1824 | REP MOVSB ; Save current CDS state ;AN000; | ||
| 1825 | XOR AL,AL ;AN000; | ||
| 1826 | OffLoop: ; for (i=0; p1=getcds(i); i++) ;AN000; | ||
| 1827 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ; Set THISCDS for possible ;AN000; | ||
| 1828 | ; call to InitCDS ;AN000; | ||
| 1829 | JC OffDone ; ;AN000; | ||
| 1830 | TEST [SI].curdir_flags,curdir_isnet ;AN000; | ||
| 1831 | JZ OffInc ;AN000; | ||
| 1832 | SaveReg <AX> ;AN000; | ||
| 1833 | ADD AX,'A' ;AN000; | ||
| 1834 | CallInstall InitCDS,multDOS,31,AX,AX ; initcds (p1); ;AN000; | ||
| 1835 | RestoreReg <AX> ;AN000; | ||
| 1836 | OffInc: INC AL ;AN000; | ||
| 1837 | JMP OffLoop ;AN000; | ||
| 1838 | ;AN000; | ||
| 1839 | OffDone: ;AN000; | ||
| 1840 | MOV fAssign,0 ; fAssign = FALSE; ;AN000; | ||
| 1841 | CrLvB: ;AN000; | ||
| 1842 | LeaveCrit CritNet ;AN000; | ||
| 1843 | return ;AN000; | ||
| 1844 | EndProc AssignOff ;AN000; | ||
| 1845 | ;AN000; | ||
| 1846 | ;****************************************************************************** ;AN000; | ||
| 1847 | ; ;AN000; | ||
| 1848 | ; PrintOn/PrintOff ;AN000; | ||
| 1849 | ; ;AN000; | ||
| 1850 | ; Called by: SET_ASSIGN_MODE ;AN000; | ||
| 1851 | ; ;AN000; | ||
| 1852 | ; Routines called: CALL_IFS ;AN000; | ||
| 1853 | ; ;AN000; | ||
| 1854 | ; Inputs: ;AN000; | ||
| 1855 | ; ;AN000; | ||
| 1856 | ; Function: ;AN000; | ||
| 1857 | ; Print on - loop through dfl entries resetting pause flag to zero ;AN000; | ||
| 1858 | ; Print off- loop through dfl entries, set pause flag if unc ;AN000; | ||
| 1859 | ; ;AN000; | ||
| 1860 | ; Prep IFSRH: ;AN000; | ||
| 1861 | ; * IFSR_LENGTH DW 48 ; Request length ;AN000; | ||
| 1862 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 1863 | ; IFSR_RETCODE DB ? ;AN000; | ||
| 1864 | ; IFSR_RETCLASS DB ? ;AN000; | ||
| 1865 | ; IFSR_RESV1 DB 17 DUP(0) ;AN000; | ||
| 1866 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; | ||
| 1867 | ; IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 1868 | ; IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 1869 | ; IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 1870 | ; IFSR_ALLOWED DB ? ;AN000; | ||
| 1871 | ; IFSR_I24_RETRY DB ? ;AN000; | ||
| 1872 | ; IFSR_I24_RESP DB ? ;AN000; | ||
| 1873 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 1874 | ; IFSR_DEVICE_CB@ DD ? ;AN000; | ||
| 1875 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 1876 | ; * IFSR_FUNC DB 0 ; 0 generic ioctl ;AN000; | ||
| 1877 | ; IFSR_RESV2 DB 0 ;AN000; | ||
| 1878 | ; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000; | ||
| 1879 | ; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000; | ||
| 1880 | ; * IFSR_CATEGORY DB 1 ; 1 for UNC ;AN000; | ||
| 1881 | ; * IFSR_CTLFUNC DB ? ; x - print on, y - print off ;AN000; | ||
| 1882 | ; ;AN000; | ||
| 1883 | ; ;AN000; | ||
| 1884 | ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; | ||
| 1885 | ; ;AN000; | ||
| 1886 | ; Outputs: none ;AN000; | ||
| 1887 | ; ;AN000; | ||
| 1888 | ; Regs: nothing preserved ;AN000; | ||
| 1889 | ; ;AN000; | ||
| 1890 | ;****************************************************************************** ;AN000; | ||
| 1891 | ;AN000; | ||
| 1892 | Procedure PrintOn,Near ;AN000; | ||
| 1893 | ASSUME DS:NOTHING, ES:NOTHING ;AN000; | ||
| 1894 | ;AN000; | ||
| 1895 | EnterCrit CritNet ;AN000; | ||
| 1896 | CMP fPrint,-1 ; if (fPrint) ;AN000; | ||
| 1897 | JNE PON_20 ;AN000; | ||
| 1898 | JMP POF_1000 ; return; ;AN000; | ||
| 1899 | PON_20: ;AN000; | ||
| 1900 | MOV fPrint,-1 ; fPrint = TRUE; ;AN000; | ||
| 1901 | MOV CS:IFSPROC_FLAGS,PRINT_ON ;AN000; | ||
| 1902 | JMP POF_20 ; finish in printoff routine ;AN000; | ||
| 1903 | ;AN000; | ||
| 1904 | ;AN000; | ||
| 1905 | EndProc PrintOn ;AN000; | ||
| 1906 | ;AN000; | ||
| 1907 | Procedure PrintOff,NEAR ;AN000; | ||
| 1908 | ASSUME DS:NOTHING, ES:NOTHING ;AN000; | ||
| 1909 | ;AN000; | ||
| 1910 | EnterCrit CritNet ;AN000; | ||
| 1911 | CMP fPrint,0 ; quit if already off ;AN000; | ||
| 1912 | JZ POF_1000 ; return ;AN000; | ||
| 1913 | MOV fPrint,0 ; set off ;AN000; | ||
| 1914 | MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000; | ||
| 1915 | ;AN000; | ||
| 1916 | POF_20: ; (welcome print on) ;AN000; | ||
| 1917 | PUSH CS ; get addressability to IFSSEG ;AN000; | ||
| 1918 | POP DS ;AN000; | ||
| 1919 | ASSUME DS:IFSSEG,ES:NOTHING ;AN000; | ||
| 1920 | ;AN000; | ||
| 1921 | MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000; | ||
| 1922 | XOR CH,CH ; For all unc devices, set pause ;AN000; | ||
| 1923 | XOR DH,DH ; flag ;AN000; | ||
| 1924 | MOV DL,SIZE DFLL_LIST ;AN000; | ||
| 1925 | LDS SI,[DFLAddr] ;AN000; | ||
| 1926 | POF_40: ; *** loop on setting pause flag ;AN000; | ||
| 1927 | TEST IFSPROC_FLAGS,PRINT_ON ; on print on, just reset all ;AN000; | ||
| 1928 | JNZ POF_50 ;AN000; | ||
| 1929 | LES DI,DS:[SI.DFLL_IFS_HDR] ; only set pause on unc devices ;AN000; | ||
| 1930 | OR DI,DI ; make sure this dfl taken ;AN000; | ||
| 1931 | JNZ POF_45 ;AN000; | ||
| 1932 | SaveReg <AX,ES> ;AN000; | ||
| 1933 | RestoreReg <AX> ;AN000; | ||
| 1934 | OR AX,AX ;AN000; | ||
| 1935 | RestoreReg <AX> ;AN000; | ||
| 1936 | JZ POF_60 ;AN000; | ||
| 1937 | POF_45: ;AN000; | ||
| 1938 | TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ;AN000; | ||
| 1939 | JZ POF_60 ;AN000; | ||
| 1940 | OR DS:[SI.DFLL_FLAGS],DFL_PAUSED ;AN000; | ||
| 1941 | JMP SHORT POF_60 ;AN000; | ||
| 1942 | POF_50: ;AN000; | ||
| 1943 | AND DS:[SI.DFLL_FLAGS],NOT DFL_PAUSED ;AN000; | ||
| 1944 | POF_60: ;AN000; | ||
| 1945 | ADD SI,DX ; prep for next dfl ;AN000; | ||
| 1946 | LOOP POF_40 ; go process next dfl ;AN000; | ||
| 1947 | ; now go tell unc, device pause ;AN000; | ||
| 1948 | ; is in effect ;AN000; | ||
| 1949 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 1950 | ;AN000; | ||
| 1951 | ifsr_fcn_def EXECAPI ; define ifsr for dep ioctl ;AN000; | ||
| 1952 | ifsr_api_def DEPIOCTL ;AN000; | ||
| 1953 | ;AN000; | ||
| 1954 | invoke SET_DEPIOCTL_IFSR ;AN000; | ||
| 1955 | TEST IFSPROC_FLAGS,PRINT_ON ;AN000; | ||
| 1956 | JZ POF_80 ;AN000; | ||
| 1957 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_ON ;AN000; | ||
| 1958 | JMP SHORT POF_100 ;AN000; | ||
| 1959 | POF_80: ;AN000; | ||
| 1960 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_OFF ;AN000; | ||
| 1961 | POF_100: ;AN000; | ||
| 1962 | MOV ES:[BX.IFSR_CATEGORY],1 ;AN000; | ||
| 1963 | invoke SET_THISIFS_UNC ;AN000; | ||
| 1964 | |||
| 1965 | ;*********************************************************************************************** | ||
| 1966 | invoke CALL_IFS ; call ifs driver w/request ;AN000; | ||
| 1967 | ;*********************************************************************************************** | ||
| 1968 | |||
| 1969 | invoke CONSIST_SFT ;AN000; | ||
| 1970 | ;AN000; | ||
| 1971 | POF_1000: ;AN000; | ||
| 1972 | LeaveCrit CritNet ;AN000; | ||
| 1973 | return ;AN000; | ||
| 1974 | ;AN000; | ||
| 1975 | EndProc PrintOff ;AN000; | ||
| 1976 | ;AN000; | ||
| 1977 | ;AN000; | ||
| 1978 | BREAK <GET_UNC_ITEM_INFO -- resv bits, net name id, user word, max xmitt sz> ;AC000; | ||
| 1979 | |||
| 1980 | ;****************************************************************************** | ||
| 1981 | ; | ||
| 1982 | ; GET_UNC_ITEM_INFO | ||
| 1983 | ; | ||
| 1984 | ; Called by: GET_IFSFUNC_ITEM | ||
| 1985 | ; | ||
| 1986 | ; Routines called: CALL_IFS | ||
| 1987 | ; | ||
| 1988 | ; Inputs: | ||
| 1989 | ; BL = redirection index | ||
| 1990 | ; ES:DI -> Target buffer: old - net path string ;AN00 | ||
| 1991 | ; new - dw file system driver name | ||
| 1992 | ; dw # parms | ||
| 1993 | ; db parms | ||
| 1994 | ; | ||
| 1995 | ; Function: | ||
| 1996 | ; | ||
| 1997 | ; Prep IFSRH: | ||
| 1998 | ; * IFSR_LENGTH DW 48 ; Request length | ||
| 1999 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 2000 | ; IFSR_RETCODE DB ? | ||
| 2001 | ; IFSR_RETCLASS DB ? | ||
| 2002 | ; IFSR_RESV1 DB 17 DUP(0) | ||
| 2003 | ; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL | ||
| 2004 | ; IFSR_ERROR_CLASS DB ? | ||
| 2005 | ; IFSR_ERROR_ACTION DB ? | ||
| 2006 | ; IFSR_ERROR_LOCUS DB ? | ||
| 2007 | ; IFSR_ALLOWED DB ? | ||
| 2008 | ; IFSR_I24_RETRY DB ? | ||
| 2009 | ; IFSR_I24_RESP DB ? | ||
| 2010 | ; IFSR_RESV2 DB ? | ||
| 2011 | ; IFSR_DEVICE_CB@ DD ? | ||
| 2012 | ; IFSR_OPEN_CB@ DD ? | ||
| 2013 | ; * IFSR_FUNC DB 0 ; 0 generic ioctl | ||
| 2014 | ; IFSR_RESV2 DB 0 | ||
| 2015 | ; * IFSR_BUFFER@ DD ? ; unc item info buffer | ||
| 2016 | ; IFSR_BUFSIZE DW 10 | ||
| 2017 | ; * IFSR_CATEGORY DB 1 ; 1 for UNC | ||
| 2018 | ; * IFSR_CTLFUNC DB ? ; 4 - get unc item | ||
| 2019 | ; | ||
| 2020 | ; buffer: dw index (bx) | ||
| 2021 | ; dw user word | ||
| 2022 | ; dw max xmitt size | ||
| 2023 | ; dw net name ID | ||
| 2024 | ; dw lower 8 bits lsn from ncb_list | ||
| 2025 | ; db redir reserved bits | ||
| 2026 | ; db net path...(asciiz) | ||
| 2027 | ; | ||
| 2028 | ; | ||
| 2029 | ; CALL routine, CALL_IFS, with pointer to IFS header | ||
| 2030 | ; | ||
| 2031 | ; Outputs: user stack contains info | ||
| 2032 | ; cx - user word | ||
| 2033 | ; bx - bits and macro type | ||
| 2034 | ; dx - max xmitt size | ||
| 2035 | ; ax - net name id | ||
| 2036 | ; bp - lsn (if specified) | ||
| 2037 | ; | ||
| 2038 | ; Regs: nothing preserved | ||
| 2039 | ; | ||
| 2040 | ;****************************************************************************** | ||
| 2041 | ;AC003; | ||
| 2042 | Procedure GET_UNC_ITEM_INFO,NEAR ;AC003; | ||
| 2043 | ;AC003; | ||
| 2044 | TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ;AN013; | ||
| 2045 | JNZ GUI_05 ;AN013; | ||
| 2046 | transfer ifs_980 ;AN013; | ||
| 2047 | |||
| 2048 | GUI_05: ;AN013; | ||
| 2049 | SaveReg <ES,DI,BX> ; target ptr and index ;AC003; | ||
| 2050 | ;AC003; | ||
| 2051 | invoke PREP_IFSR ; init ifsr ;AC003; | ||
| 2052 | SaveReg <CS> ; prep ds for call ifs call ;AC003; | ||
| 2053 | RestoreReg <DS> ;AC003; | ||
| 2054 | ASSUME DS:IFSSEG ;AC003; | ||
| 2055 | ;AC003; | ||
| 2056 | invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AC003; | ||
| 2057 | invoke SET_THISIFS_UNC ; prep IFSRH ;AC003; | ||
| 2058 | MOV ES:[BX.IFSR_CATEGORY],1 ;AC003; | ||
| 2059 | MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_GET_UNC_ITEM ;AC003; | ||
| 2060 | ;AC003; | ||
| 2061 | MOV SI,OFFSET TEMPBUF ;AC003; | ||
| 2062 | MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ;AC003; | ||
| 2063 | MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ;AC003; | ||
| 2064 | RestoreReg <AX> ; index ;AN003; | ||
| 2065 | MOV WORD PTR DS:[SI],AX ;AN003; | ||
| 2066 | |||
| 2067 | ;*********************************************************************************************** | ||
| 2068 | invoke CALL_IFS ; call redir w/get unc item request ;AC003; | ||
| 2069 | ;*********************************************************************************************** | ||
| 2070 | |||
| 2071 | ;AC003; | ||
| 2072 | JNC GUI_10 ;AC003; | ||
| 2073 | RestoreReg <DI,ES> ;AC003; | ||
| 2074 | return ;AC003; | ||
| 2075 | GUI_10: ;AC003; | ||
| 2076 | MOV SI,WORD PTR ES:[BX.IFSR_BUFFER@] ;AC003; | ||
| 2077 | MOV DS,WORD PTR ES:[BX.IFSR_BUFFER@+2] ;AC003; | ||
| 2078 | SaveReg <SI> | ||
| 2079 | ADD SI,2 ; space to user word (skip index) ;AN018; | ||
| 2080 | LODSW ; user word ;AC003; | ||
| 2081 | MOV CX,AX ;AC003; | ||
| 2082 | LODSW ; max xmitt size ;AC003; | ||
| 2083 | MOV DX,AX ;AC003; | ||
| 2084 | LODSW ; net name id ;AC003; | ||
| 2085 | PUSH AX ;AC003; | ||
| 2086 | LODSW ; lsn ;AC003; | ||
| 2087 | MOV BP,AX ;AC003; | ||
| 2088 | LODSB ; redir bits ;AC003; | ||
| 2089 | MOV BH,AL ;AC003; | ||
| 2090 | MOV BL,4 ;AC003; | ||
| 2091 | POP AX ; net name id ;AC003; | ||
| 2092 | SaveReg <DS,SI> ;AC003; | ||
| 2093 | CallInstall Get_User_Stack,multDOS,24,<AX>,<AX> ;AC003; | ||
| 2094 | MOV [SI].User_CX,CX ; User Word ;AC003; | ||
| 2095 | MOV [SI].User_BX,BX ; Bits and macro type ;AC003; | ||
| 2096 | MOV [SI].User_DX,DX ; Max Xmitt size ;AC003; | ||
| 2097 | MOV [SI].User_AX,AX ; Net name ID ;AC003; | ||
| 2098 | TEST CS:IFSPROC_FLAGS,SetBP ;AC003; | ||
| 2099 | JZ GUI_15 ;AC003; | ||
| 2100 | MOV [SI].User_BP,BP ; LSN ;AC003; | ||
| 2101 | GUI_15: ;AN003; | ||
| 2102 | RestoreReg <SI,DS> | ||
| 2103 | TEST IFSPROC_FLAGS,Filesys_status ;AC003; | ||
| 2104 | JNZ GUI_20 ;AC003; | ||
| 2105 | ADD SP,2 ; old si | ||
| 2106 | RestoreReg <DI,ES> ; buffer/target ptr (dssi - 18) ;AC003;;AC018; | ||
| 2107 | SaveReg <AX,DI> ;AC003;;AC008; | ||
| 2108 | JMP SHORT GUI_40 ;AC003; | ||
| 2109 | ;AC003; | ||
| 2110 | GUI_20: ; new style ;AC003; | ||
| 2111 | RestoreReg <SI> ; offset path | ||
| 2112 | ADD SI,11 ;AC003; | ||
| 2113 | RestoreReg <DI,ES> ; target - dw fsname ;AC003; | ||
| 2114 | ; dw # parms ;AC003; | ||
| 2115 | ; db asciiz,... ;AC003; | ||
| 2116 | SaveReg <DI> ;AC003; | ||
| 2117 | MOV DI,ES:[DI] ;AC003; | ||
| 2118 | invoke GET_UNC_FS_NAME ;AC003; | ||
| 2119 | RestoreReg <DI> ;AC003; | ||
| 2120 | SaveReg <AX,DI> ;AC003; | ||
| 2121 | INC DI ;AC003; | ||
| 2122 | INC DI ;AC003; | ||
| 2123 | MOV WORD PTR ES:[DI],1 ;AC003; | ||
| 2124 | INC DI ;AC003; | ||
| 2125 | INC DI ;AC003; | ||
| 2126 | ;AC003; | ||
| 2127 | GUI_40: ;AC003; | ||
| 2128 | CallInstall StrCpy,MultDOS,17 ;AC003; | ||
| 2129 | RestoreReg <DI> ;AC003; | ||
| 2130 | ;;;;;;;;TEST CS:IFSPROC_FLAGS,FILESYS_STATUS ;AN008;;AD018; | ||
| 2131 | ;;;;;;;;JZ GUI_1000 ;AN008;;AD018; | ||
| 2132 | RestoreReg <AX> ;AN008; | ||
| 2133 | |||
| 2134 | GUI_1000: | ||
| 2135 | return ;AC003; | ||
| 2136 | ;AC003; | ||
| 2137 | ;AC003; | ||
| 2138 | EndProc GET_UNC_ITEM_INFO ;AC003; | ||
| 2139 | ;AN000; | ||
| 2140 | |||
| 2141 | BREAK <CHECK_END_SPACE -- check esdi string for blanks> ;AN000; | ||
| 2142 | ;AN000; | ||
| 2143 | ;************************************************************************************ ;AN000; | ||
| 2144 | ; ;AN000; | ||
| 2145 | ; CHECK_END_SPACE ;AN000; | ||
| 2146 | ; ;AN000; | ||
| 2147 | ; Called by: FIND_IFS_DRIVER ;AN000; | ||
| 2148 | ; ;AN000; | ||
| 2149 | ; Routines called: | ||
| 2150 | ; ;AN000; | ||
| 2151 | ; Inputs: ;AN000; | ||
| 2152 | ; ES:DI -> IFS driver name ;AN000; | ||
| 2153 | ; Function: ;AN000; | ||
| 2154 | ; Replace any blanks in asciiz ifs driver name with 0's. ;AN000; | ||
| 2155 | ; Output: ;AN000; | ||
| 2156 | ; none | ||
| 2157 | ; ;AN000; | ||
| 2158 | ; Regs: all preserved ;AN000; | ||
| 2159 | ; ;AN000; | ||
| 2160 | ;************************************************************************************ ;AN000; | ||
| 2161 | ;AN000; | ||
| 2162 | Procedure CHECK_END_SPACE ;AN000; | ||
| 2163 | ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 2164 | ;AN000; | ||
| 2165 | SaveReg <AX,DS,SI,ES> ; save registers ;AN000; | ||
| 2166 | RestoreReg <DS> ; set dssi -> asciiz ifs name ;AN000; | ||
| 2167 | MOV SI,DI ;AN000; | ||
| 2168 | CLD ; clear dir flag to count forward ;AN000; | ||
| 2169 | CES_20: ; search LOOP ;AN000; | ||
| 2170 | LODSB ; put char in al ;AN000; | ||
| 2171 | OR AL,AL ; check for end of string ;AN000; | ||
| 2172 | JZ CES_1000 ; if so go quit ;AN000; | ||
| 2173 | CMP AL," " ; check for blank ;AN000; | ||
| 2174 | JNE CES_20 ; cont loop if not ;AN000; | ||
| 2175 | MOV BYTE PTR DS:[SI-1],0 ; replace blank with zero ;AN000; | ||
| 2176 | ;AN000; | ||
| 2177 | ;AN000; | ||
| 2178 | CES_1000: ;AN000; | ||
| 2179 | RestoreReg <SI,DS,AX> ; restore registers ;AN000; | ||
| 2180 | return ;AN000; | ||
| 2181 | ;AN000; | ||
| 2182 | EndProc CHECK_END_SPACE ;AN000; | ||
| 2183 | |||
| 2184 | ;AN000; | ||
| 2185 | ;AN000; | ||
| 2186 | IFSSEG ENDS ;AN000; | ||
| 2187 | END ;AN000; | ||