1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000;
3 TITLE IFSFUNC SESSION ROUTINES
- IFS Attach Routines
;AN000;
5 ;************************************************************************************
9 ; Session related IFS calls (Session = attachment)
17 ; IFS_RESET_ENVIRONMENT
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
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
63 ;************************************************************************************
67 INCLUDE IFSSYM
.INC ;AN000;
68 INCLUDE IFSFSYM
.INC ;AN000;
69 INCLUDE DOSSYM
.INC ;AN000;
70 INCLUDE DEVSYM
.INC ;AN000;
74 AsmVars
<IBM
, Installed
, DEBUG
> ;AN000;
76 ; define the base code segment of the network support first ;AN000;
78 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
82 ; NOTE: We cannot include DOSSEG here because the START seg is not declared ;AN000;
83 ; as PARA aligned in DOSSEG. ;AN000;
86 START
SEGMENT PARA
PUBLIC 'START' ;AN000;
89 CONSTANTS
SEGMENT WORD PUBLIC 'CONST' ;AN000;
90 CONSTANTS ENDS
;AN000;
92 DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
95 TABLE
SEGMENT BYTE PUBLIC 'TABLE' ;AN000;
98 CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
101 LAST
SEGMENT PARA
PUBLIC 'LAST' ;AN000;
104 DOSGROUP GROUP START
,CONSTANTS
,DATA,TABLE
,CODE,LAST
;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;
121 Extrn BugLev
:WORD ;AN000;
122 Extrn BugTyp
:WORD ;AN000;
123 include bugtyp
.asm
;AN000;
128 ; define our own code segment ;AN000;
130 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
131 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;AN000;
133 ;IFS Data - external ;AN000;
134 Extrn TEMPBUF
:BYTE ;AN000;
136 ;IFS Data - public - *** IFSFUNC SWAPPABLE DATA AREA *** ;AN000;
138 PUBLIC IFSF_SWAP_START
;AN000;
139 IFSF_SWAP_START
LABEL BYTE ;AN000;
141 PUBLIC THISIFS
;AN000;
142 THISIFS
DD -1 ;AN000;
144 PUBLIC THISDFL
;AN000;
145 THISDFL
DD -1 ;AN000;
148 IFSR
DB 72 DUP (0) ;AN000;
151 SFF1
DB 62 DUP (0) ;AN000;
154 CD1
DW 84 DUP (0) ;AN000;
157 DF1
DW 18 DUP (0) ;AN000;
159 PUBLIC IFSPROC_FLAGS
;AN000;
160 IFSPROC_FLAGS
DW 0 ;AN000;
162 ; Number of net drive (0=A) for use on net I 24 ;AN000;
163 PUBLIC IFSDRV
;AN000;
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;
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;
176 PUBLIC IFSSEM
;AN021;
177 ; This used as byte of semaphores. ;AN021;
180 IFSF_SWAP_END
LABEL BYTE ;AN000;
181 PUBLIC IFSF_SWAP_END
;AN000;
183 ;IFS Data - public ;AN000;
185 PUBLIC DFLAddr
;AN000;
186 DFLAddr
DD -1 ;AN000;
188 PUBLIC DFLCount
;AN000;
189 DFLCount
DB 0 ;AN000;
191 ;;;aliasPUBLIC NLAddr ;AN000;
192 ;;;aliasNLAddr DD -1 ;AN000;
194 ;;;aliasPUBLIC NLSIZE ;AN000;
195 ;;;aliasNLSIZE DW 0 ;AN000;
197 PUBLIC CDSAlt
;AN000;
200 PUBLIC UNC_FS_HDR
;AN000;
201 UNC_FS_HDR
DD -1 ;AN000;
203 PUBLIC IFSFUNC_FLAGS
;AN000;
204 IFSFUNC_FLAGS
DW 0 ;AN000;
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;
212 PUBLIC SFT_SERIAL_NUMBER
;AN005;
213 SFT_SERIAL_NUMBER
DW 0 ; to get sfts unique for fcb reasons ;AN005;
215 PUBLIC fAssign
;AC023;
216 fAssign
DB -1 ;AC023;
218 PUBLIC fPrint
;AC023;
221 PUBLIC TRUNCATE_FLAG
;AC030;moved out of swap
222 TRUNCATE_FLAG
DB 0 ;AC030; " "
225 ;IFS Data - local ;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;
233 BREAK <IFS_ASSOPER
-- Do the $Assignoper
call> ;AN000;
235 copyright db " IFSFUNC.EXE " ;AN000;
238 ;************************************************************************************ ;AN000;
240 ; IFS_ASSOPER ;AN000;
242 ; Called by: IFSFUNC dispatcher ;AN000;
244 ; Routines called: ;AN000;
245 ; RETURN_ASSIGN_MODE ;AN000;
246 ; SET_ASSIGN_MODE ;AN000;
247 ; GET_IFSFUNC_ITEM ;AN000;
248 ; ATTACH_START ;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;
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;
266 ; see subroutines ;AN000;
268 ;************************************************************************************ ;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;
279 Procedure IFS_ASSOPER
,NEAR ;AN000;
280 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
282 TEST CS:IFSFUNC_FLAGS
,no_ifs_drivers
285 MOV AX,error_not_supported
292 TEST CS:IFSFUNC_FLAGS
,unc_installed
295 MOV CS:IFSPROC_FLAGS
,ZERO
;AN000;
296 PUSH BX ; save macro type ;AN000;
298 SHL AL,1 ; AL x 2 ;AN000;
300 JMP CS:AO_TABLE
[BX] ;AN000;
302 EndProc IFS_ASSOPER
;AN000;
304 BREAK <RETURN_ASSIGN_MODE
-- Return Assign Mode
> ;AN000;
306 ;************************************************************************************ ;AN000;
308 ; RETURN_ASSIGN_MODE ;AN000;
310 ; Called by: IFS_ASSOPER ;AN000;
312 ; Routines called: DOS: Get_User_Stack ;AN000;
315 ; BL = macro type ;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;
324 ; IF AL==0 BX value on user stack ;AN000;
326 ; Notes: This routine is used only for UNC file system. This is the ;AN000;
327 ; only FS that supports pause. ;AN000;
329 ;************************************************************************************ ;AN000;
331 Procedure RETURN_ASSIGN_MODE
,NEAR ;AN000;
332 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
334 POP BX ; macro type ;AN000;
335 CMP BL,3 ; if (type == drive) ;AN000;
339 MOV BH,fAssign
; t = fAssign; ;AN000;
340 JMP Short GAM_40
; else ;AN000;
342 GAM_20: ; if (type == print) ;AN000;
343 MOV BH,fPrint
; t = fPrint; ;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;
351 MOV AL,error_invalid_function
;AN000;
352 transfer ifs_980
; go to general bad ret in util ;AN000;
355 EndProc RETURN_ASSIGN_MODE
;AN000;
357 BREAK <SET_ASSIGN_MODE
-- set assign mode
> ;AN000;
359 ;************************************************************************************ ;AN000;
361 ; SET_ASSIGN_MODE ;AN000;
363 ; Called by: IFS_ASSOPER ;AN000;
365 ; Routines called: ;AN000;
368 ; BL = macro type ;AN000;
369 ; BH = assign mode (0 = off - pause, 1 = on - no pause) ;AN000;
375 ;************************************************************************************ ;AN000;
377 Procedure SET_ASSIGN_MODE
,NEAR ;AN000;
378 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
380 POP BX ; restore macro type (3 or 4) ;AN000;
382 CMP BL,3 ; check if printer or drive ;AN000;
384 OR BH,BH ; printer - check mode ;AN000;
385 JZ SAM_20
; off - go pause ;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;
391 SAM_20: ; print off - pause ;AN000;
392 CALL PrintOff
;AN000;
393 transfer ifs_990
; go to general good ret in util ;AN000;
395 SAM_40: ; Drive ;AN000;
397 JNZ SAM_80
; jump on parm error ;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;
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;
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;
416 EndProc SET_ASSIGN_MODE
;AN000;
418 BREAK <GET_IFSFUNC_ITEM
-- for get attach list
> ;AN000;
420 ;************************************************************************************ ;AN000;
422 ; GET_IFSFUNC_ITEM ;AN000;
424 ; Called by: IFS_ASSOPER ;AN000;
426 ; Routines called: ;AN000;
427 ; GET_IFS_DRIVER_NAME DOS: STRCPY ;AN000;
428 ; CDS_TO_CD GET_USER_STACK ;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
440 ; STRUCTURE = 1st CDS ;AN000;
442 ; WHILE CDS structures ;AN000;
444 ; IF curdir_isIFS TRUE THEN ;AN000;
446 ; IF INDEX = BL THEN ;AN000;
448 ; DS:SI = Letter version of Index (0=A:, 1=B:, ...) ;AN000;
449 ; IF IFS .NOT. UNC THEN ;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;
456 ; LEAVE WHILE ;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;
463 ; LEAVE WHILE ;AN000;
466 ; IF IFS UNC THEN ;AN000;
468 ; INDEX=INDEX+1 ;AN000;
469 ; IF INDEX = BL THEN ;AN000;
471 ; DS:SI = Letter version of Index (0=A:, 1=B:, ;AN000;
472 ; ES:DI = "REDIR" ;AN000;
473 ; FOUND = true ;AN000;
475 ; LEAVE WHILE ;AN000;
484 ; Get next CDS structure ;AN000;
487 ; IF FOUND = false THEN ;AN000;
489 ; STRUCTURE = 1st DFL ;AN000;
490 ; WHILE DFL structures ;AN000;
492 ; IF INDEX = BL THEN ;AN000;
494 ; DS:SI = name pointed to by DFLL_NAME_PTR ;AN000;
495 ; IF IFS .NOT. UNC THEN ;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;
502 ; LEAVE WHILE ;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;
509 ; LEAVE WHILE ;AN000;
512 ; IF IFS UNC THEN ;AN000;
514 ; INDEX=INDEX+1 ;AN000;
515 ; IF INDEX = BL THEN ;AN000;
517 ; ES:DI = "REDIR" ;AN000;
518 ; FOUND = true ;AN000;
520 ; LEAVE WHILE ;AN000;
527 ; Get next DFL structure ;AN000;
531 ; IF FOUND = FALSE THEN ;AN000;
536 ; ELSE Clear carry ;AN000;
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)
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 ?
553 ; + IFSR_DEVICE_STATUS DB ?
558 ; *+ PARMS LABEL WORD
559 ; DW PARMCOUNT ; Number of parms. (only for new style)
560 ; DB ASCIIZ,...; Parms
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
576 ; Carry - AX = Error code ;AN000;
577 ; 18 - end of list ;AN000;
580 ;************************************************************************************ ;AN000;
581 USER_WORD
DW 0 ; i give in - temp storage
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;
589 entry GET_IFSFUNC_ITEM2
;AC003;
590 MOV CS:IFSPROC_FLAGS
,SetBP
; set this to get lsn ;AC003;
591 JMP SHORT GII_20
;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;
596 ;----------------------------------------------------------------------------------------;AC003;
598 ;----------------------------------------------------------------------------------------;AC003;
601 ifsr_fcn_def ATTSTAT
; define ifsr for attach status ;AC003;
602 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN006;
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;
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;
613 SaveReg
<BX,AX> ; save ax-cds count, bx-index ;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;
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;
627 JMP GII_280
; next drive ;AC003;
629 SUB BX,1 ; jae jumps if CF=0, CF=1 when ;AC003;
632 JMP GII_280
; next drive ;AC003;
634 TEST CS:IFSPROC_FLAGS
,Filesys_Status
; check old vs. new style ;AC003;
636 CMP [SI.CURDIR_TYPE
],TYPE_NET_DRIVE
; old style: check for type 4 ;AC003;
638 JMP GII_280
; not type 4, go get next one ;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;
645 ADD AL,'A' ; storing d:0 in devname buffer ;AC003;
647 MOV AX,(0 SHL 8) + ':' ;AC003;
649 RestoreReg
<DI,ES> ; restore target ptr ;AC003;
651 MOV BL,[SI.CURDIR_TYPE
] ; set bx=type (1,2,3,4) ;AC003;
653 TEST CS:IFSPROC_FLAGS
,Filesys_status
; target different for new style ;AC003;
655 PUSH [SI.CURDIR_USER_WORD
] ;AC003;
656 POP CS:[USER_WORD
] ;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;
664 POP DI ; retrieve target offset from stack ;AC003;
666 INC DI ; es:di -> parm buffer ;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;
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;
685 TEST IFSPROC_FLAGS
,Filesys_status
;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;
696 MOV WORD PTR ES:[BX.IFSR_PARMS@
],DI ;AC003;
697 MOV WORD PTR ES:[BX.IFSR_PARMS@
+2],DX ;AC003;
699 PUSH AX ; push type back (BX) ;AC003;
701 ;***********************************************************************************************
702 invoke CALL_IFS
; call fs with attach status request ;AC003;
703 ;***********************************************************************************************
706 ; attach status error: ;AC003;
707 RestoreReg
<BX,DI> ; type,target offset ;AC003;
709 SaveReg
<DI> ; put "ERROR" in parms display ;AC003;
710 TEST CS:IFSPROC_FLAGS
,Filesys_status
; don't add if net use ;AN029;
718 ASSUME
DS:IFSSEG
;AC003;
719 MOV SI,OFFSET ERROR_STATUS
;AC003;
722 RestoreReg
<DI,SI,DS> ;AC003;;AC029;
723 transfer ifs_1000
; go to general ret in util ;AC003;
726 RestoreReg
<AX,DI> ; device type, target offset ;AC003;
727 TEST IFSPROC_FLAGS
,Filesys_status
;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;
735 GII_240: ; NET drive: ;AC003;
736 JMP GII_640
; go down to net device processing- ;AC003;
737 ; does the same thing ;AC003;
739 INC AX ; next drive ;AC003;
742 ;----------------------------------------------------------------------------------------;AC003;
743 ; device loop ;AC003;
744 ;----------------------------------------------------------------------------------------;AC003;
746 GII_400: ; Device loop ;AC003;
747 CMP AL,CS:[DFLCount
] ; if run out of devices ;AC003;
749 JMP GII_800
; go set no_more error ;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;
761 TEST CS:IFSPROC_FLAGS
,Filesys_Status
; check old vs. new style ;AC003;
763 CMP [SI.DFLL_TYPE
],TYPE_NET_DEVICE
; old style: check for type 3 ;AC003;
765 JMP GII_680
; not type 4, go get next one ;AC003;
769 JMP GII_680
; next device ;AC003;
771 MOV WORD PTR CS:[THISDFL
],SI ; set thisdfl = dssi ;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;
779 PUSH SI ; save DFL offset ;AC003;
780 ADD SI,DFLL_DEV_NAME
;AC003;
782 GII_545: ; store device name in asciiz format ;AC003;
791 RestoreReg
<SI,DI,ES> ; restore target ptr & DFL offset ;AC003;
793 MOV BL,[SI.DFLL_TYPE
] ;AC003;
795 TEST CS:IFSPROC_FLAGS
,Filesys_Status
;AC003;
797 PUSH [SI.DFLL_USER_WORD
] ;AC003;
798 POP [USER_WORD
] ;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;
805 POP DI ; retrieve target offset from stack ;AC003;
807 INC DI ; es:di -> parm buffer ;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;
824 TEST CS:IFSPROC_FLAGS
,Filesys_Status
;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;
835 MOV WORD PTR ES:[BX.IFSR_PARMS@
],DI ;AC003;
836 MOV WORD PTR ES:[BX.IFSR_PARMS@
+2],DX ;AC003;
838 PUSH AX ; push type back (BX) ;AC003;
840 ;***********************************************************************************************
841 invoke CALL_IFS
; call fs with attach status request ;AC003;
842 ;***********************************************************************************************
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;
856 ASSUME
DS:IFSSEG
;AC003;
857 MOV SI,OFFSET ERROR_STATUS
;AC003;
860 RestoreReg
<DI,SI,DS> ;AC003;;AC027;
861 transfer ifs_1000
; go to general ret in util ;AC003;
864 RestoreReg
<AX,DI> ; device type, target offset ;AC003;
865 TEST IFSPROC_FLAGS
,Filesys_Status
;AC003;
866 JZ GII_640
; IFS device: ;AC003;
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;
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;
887 MOV CH,ES:[BX.IFSR_DEVICE_STATUS
] ;AC003;
889 MOV [SI].User_BX
,CX ; Bits and macro type ;AC003;
890 TEST CS:IFSPROC_FLAGS
,SetBP
;AC003;
892 PUSH ES:[BX.IFSR_LSN
] ;AC003;
893 POP [SI].User_BP
; LSN ;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;
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;
906 INC AX ; next drive ;AC003;
910 GII_800: ; end of CDSs & devices ;AC003;
911 ; now check deviceless attaches ;AC003;
912 ;----------------------------------------------------------------------------------------;AC003;
913 ; deviceless loop ;AC003;
914 ;----------------------------------------------------------------------------------------;AC003;
916 CALL GET_UNC_ITEM_INFO
;AC003;
918 RestoreReg
<SI,DS> ; set dev ptr null ;AC003;
919 MOV BYTE PTR DS:[SI],ZERO
;AC003;
920 transfer ifs_990
;AC003;
922 MOV AX,error_no_more_files
;AC003;
923 RestoreReg
<SI,DI> ; restore regs ;AC003;
927 EndProc GET_IFSFUNC_ITEM
;AC003;
930 BREAK <ATTACH_START
-- Attach drive
/device to IFS
> ;AN000;
932 ;************************************************************************************ ;AN000;
934 ; ATTACH_START ;AN000;
936 ; Called by: IFS_ASSOPER ;AN000;
938 ; Routines called: CALL_IFS DOS: GetCDSFromDrv ;AN000;
941 ; CREATE_DFL_ENTRY ;AN000;
942 ; DELETE_DFL_ENTRY ;AN000;
947 ; FIND_IFS_DRIVER ;AN000;
948 ;;; alias PROCESS_ALIAS ;AN000;
951 ; BL = Macro type ;AN000;
952 ;;; alias = 0 alias ;AN000;
953 ; = 1 device/file ;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;
963 ; CX is reserved (user word for REDIR) ;AN000;
966 ; IF BL > 0 THEN ;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;
972 ; IF (BL=2 .OR. BL=4) & no error THEN ;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;
979 ; IF source name not in DFL THEN ;AN000;
980 ; Call CREATE_DFL_ENTRY ;AN000;
981 ; ELSE Set error_device_already_attached ;AN000;
984 ; IF no error THEN ;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;
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;
998 ; * PARMS LABEL WORD ;AN000;
999 ; DW PARMCOUNT ; Number of parms. May be 0. ;AN000;
1000 ; DB ASCIIZ,...; Parms ;AN000;
1002 ; IF no error THEN ;AN000;
1004 ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
1005 ; IF IFSR_RETCODE = 0 THEN ;AN000;
1007 ; IF DFL flag set THEN ;AN000;
1009 ; Call DF_TO_DFL ;AN000;
1010 ; Set DFLL_PTR to IFS header ;AN000;
1013 ; Call CD_TO_CDS ;AN000;
1014 ; Set CDS_IFSR_PTR to IFS header ;AN000;
1017 ; Clear carry ;AN000;
1020 ; IF DFL flag set THEN ;AN000;
1021 ; Call DELETE_DFL_ENTRY ;AN000;
1026 ; ELSE Set carry ;AN000;
1029 ;************************************************************************************ ;AN000;
1031 Procedure ATTACH_START
,NEAR ;AN000;
1032 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1034 ifsr_fcn_def ATTSTART
;AN000;
1035 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
1038 XOR BH,BH ; not interested in bh, but should ;AN000;
1039 ; be 0 since later move type as word ;AN000;
1041 CMP BL,TYPE_DRIVE
; check ifs vs. network ;AN000;
1043 CMP BL,TYPE_NET_DRIVE
;AN000;
1047 MOV AX,error_invalid_function
; invalid fcn type ;AN000;
1048 transfer ifs_980
; go ret w/carry ;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;
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;
1065 MOV CX,0001H ; User word without password ;AN011;
1066 JMP SHORT AS_23
; go process as unc ;AN011;;AC017;
1068 MOV CX,8001H
; User word with password ;AN011;
1070 ADD DI,4 ; skip over ifs name offset & #parms ;AN017;
1071 JMP SHORT AS_33
; go process as unc ;AN000;
1073 AS_25: ; ifs driver not found ;AN000;
1074 POP DI ; error, restore stack and return ;AN000;
1076 transfer ifs_1000
;AN000;
1078 AS_30: ; NETWORK device/drive ;AN000;
1079 TEST CS:IFSFUNC_FLAGS
,UNC_INSTALLED
; check that unc installed ;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;
1085 CMP CS:fAssign
,-1 ;AN000;
1086 JMP SHORT AS_37
;AN000;
1088 CMP CS:fPrint
,-1 ;AN000;
1090 JE AS_40
; bad pause status ;AN000;
1091 MOV AX,72 ; set error and ret w/carry ;AN000;
1095 ASSUME
DS:IFSSEG
;AN000;
1096 invoke SET_EXTERR_INFO
;AN000;
1097 transfer ifs_980
;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;
1109 RestoreReg
<DI,ES> ; restore target parm ptr ;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;
1117 CMP BL,TYPE_NET_DEVICE
;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;
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;
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;
1136 MOV AX,error_invalid_drive
;AN000;
1137 transfer ifs_980
;AN000;
1141 Context
DS ; get addressability to DOSGROUP ;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;
1149 TEST [SI.curdir_flags
],curdir_isnet
+ curdir_splice
+ curdir_local
;AN000;
1151 MOV AX,error_already_assigned
; error - CDS already assigned ;AN000;
1152 transfer ifs_980
; go return with carry ;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;
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;
1162 RestoreReg
<CX> ; input user word ;AN001;
1165 POP SI ; DS:SI -> dummy CDS ;AN000;
1166 MOV [SI.curdir_flags
],curdir_isnet
+ curdir_inuse
;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;
1173 MOV DS:[SI.CURDIR_TYPE
],BL ; set CDS type ;AN000;
1174 MOV DS:[SI.CURDIR_USER_WORD
],CX ; set CDS user word ;AN001;
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
1186 MOV ES:[BX.IFSR_USER_WORD
],AX
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;
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;
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;
1205 RestoreReg
<BX,DI,ES> ; restore stack ;AC019;
1206 invoke CONSIST_SFT
;AN000;
1207 transfer ifs_980
; error ret ;AC019;
1209 POP AX ; restore type in AL ;AN000;moved ;AM019;
1210 MOV ES:[BX.IFSR_TYPE
],AL ;AC002;
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;
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;
1231 ;***********************************************************************************************
1232 invoke CALL_IFS
;AN000;
1233 ;***********************************************************************************************
1238 TEST IFSPROC_FLAGS
,ISCDS
; ifs error: ;AN000;
1240 RestoreReg
<DS,SI,DS,SI> ; pop dummy & real cds ;AN000;
1241 transfer ifs_980
;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;
1249 AS_440: ; successful attach ;AN000;
1250 TEST IFSPROC_FLAGS
,ISCDS
;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;
1259 transfer ifs_990
;AN000;
1262 invoke DF_TO_DFL
;AN000;
1263 invoke CONSIST_SFT
;AN025;
1264 transfer ifs_990
;AN000;
1267 EndProc ATTACH_START
;AN000;
1270 BREAK <ATTACH_END
-- break attachment
> ;AN000;
1272 ;************************************************************************************ ;AN000;
1274 ; ATTACH_END ;AN000;
1276 ; Called by: IFS_ASSOPER ;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;
1283 ; SET_EXTERR_INFO ;AN000;
1285 ; DELETE_DFL_ENTRY ;AN000;
1288 ; DS:SI -> ASCIZ source name ;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;
1300 ;************************************************************************************ ;AN000;
1302 Procedure ATTACH_END
,NEAR ;AN000;
1303 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1305 ifsr_fcn_def ATTEND
;AN000;
1309 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
1310 MOV CS:IFSPROC_FLAGS
,0 ;AN000;
1311 invoke PREP_IFSR
;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;
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;
1328 MOV AX,72 ; pause error ;AN000;
1331 ASSUME
DS:IFSSEG
;AN000;
1332 invoke SET_EXTERR_INFO
;AN000;
1333 transfer ifs_980
;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;
1339 MOV AX,error_invalid_drive
;AN000;
1340 transfer ifs_1000
;AN000;
1342 LES DI,[THISCDS
] ;AN000;
1343 TEST ES:[DI.curdir_flags
],curdir_isnet
;AN000;
1345 MOV AX,error_invalid_drive
; not redirected ;AN000;
1346 transfer ifs_980
;AN000;
1348 PUSH AX ; drive # ;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;
1356 AE_200: ; BREAK DEVICE ATTACH ;AN000;
1357 CMP fPrint
,-1 ; check for pause error ;AN000;
1361 CALL DFL_MATCH
;AN000;
1363 MOV AX,device_not_attached
;AN000;
1364 transfer ifs_1000
;AN000;
1366 MOV SI,WORD PTR [THISDFL
] ;AN000;
1367 MOV DS,WORD PTR [THISDFL
+2] ;AN000;
1369 TEST DS:[SI.DFLL_FLAGS
],DFL_DEV_REAL
;AN000;
1370 ; ???????????? check with baf on what reverting to ... ;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;
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;
1384 JMP AE_10
; jump to pause error ;AN000;
1386 SaveReg
<ES,BX,DS> ; ifsr ptr ;AC004;
1387 RestoreReg
<ES> ; set esdi = dssi = net path ;AC004;
1388 ASSUME
ES:NOTHING
;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;
1402 AE_400: ; call ifs ;AN000;
1403 MOV ES:[BX.IFSR_LENGTH
],LENGTH_ATTEND
;AN000;
1404 MOV ES:[BX.IFSR_FUNCTION
],IFSATTEND
;AN000;
1406 ;***********************************************************************************************
1407 invoke CALL_IFS
;AN000;
1408 ;***********************************************************************************************
1411 TEST IFSPROC_FLAGS
,ISCDS
; att end error: ;AN000;
1413 ADD SP,2 ; clear ax (drive #) off stack ;AN000;
1415 transfer ifs_980
;AN000;
1417 TEST CS:IFSPROC_FLAGS
,ISCDS
;AN000;
1420 POP AX ; drive ;AN000;
1422 CallInstall InitCDS
,multDOS
,31,AX,AX ;AN000;
1423 transfer ifs_990
;AN000;
1425 TEST CS:IFSPROC_FLAGS
,IsSeq
;AN018;
1427 CALL DELETE_DFL_ENTRY
;AN000;
1429 transfer ifs_990
;AN000;
1432 EndProc ATTACH_END
;AN000;
1435 BREAK <IFS_RESET_ENVIRONMENT
-- reset IFS environment
> ;AN016;
1437 ;***********************************************************************************
1439 ; IFS_RESET_ENVIRONMENT
1441 ; Called by: IFSFUNC Dispatcher
1444 ; jumps into ifs_abort
1447 ; [CurrentPDB] set to PID of process aborting
1450 ; Get address of IFS driver chain.
1451 ; FOR I = 1 to last IFS driver
1452 ; Send request below to IFS driver
1455 ; * IFSR_LENGTH DW 42 ; Request length
1456 ; * IFSR_FUNCTION DB 4 ; Execute API function
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 ?
1465 ; IFSR_I24_RETRY DB ?
1466 ; IFSR_I24_RESP 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
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
1482 ; DS Preserved, All others destroyed
1484 ;************************************************************************************
1486 procedure IFS_RESET_ENVIRONMENT
,NEAR ;AN016;
1487 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN016;
1489 ifsr_fcn_def EXECAPI
;AN016;
1490 ifsr_api_def EOP
;AN016;
1492 MOV CS:IFSPROC_FLAGS
,IsResetEnvirn
;AN016;
1493 Context
DS ; make sure ds=ss=dosgroup ;AN016;
1496 EndProc IFS_RESET_ENVIRONMENT
;AN016;
1499 BREAK <IFS_ABORT
-- Send CLOSE all files for process
> ;AN016;
1501 ;************************************************************************************
1505 ; Called by: IFSFUNC Dispatcher
1512 ; [CurrentPDB] set to PID of process aborting
1515 ; Get address of IFS driver chain.
1516 ; FOR I = 1 to last IFS driver
1517 ; Send request below to IFS driver
1520 ; * IFSR_LENGTH DW 42 ; Request length
1521 ; * IFSR_FUNCTION DB 4 ; Execute API function
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 ?
1530 ; IFSR_I24_RETRY DB ?
1531 ; IFSR_I24_RESP 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
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
1547 ; DS Preserved, All others destroyed
1549 ;************************************************************************************
1551 procedure IFS_ABORT
,NEAR ;AN000;
1552 ASSUME
DS:DOSGROUP
,ES:NOTHING
;AN000;
1554 ifsr_fcn_def EXECAPI
;AN000;
1555 ifsr_api_def EOP
;AN000;
1557 MOV CS:IFSPROC_FLAGS
,ZERO
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;
1563 LES DI,[SFTFCB
] ;AN000;
1564 MOV CX,ES:[DI].sfCount
;AN000;
1565 LEA DI,[DI].sfTable
;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;
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;
1586 ADD DI,size sf_entry
;AN000;
1589 ; Now loop through all ifs drivers with end of process request ;AN000;
1592 LDS SI,IFS_HEADER
;AN000;
1593 ASSUME
DS:NOTHING
;AN000;
1594 JMP SHORT IA_100
; go check if null ;AN007;
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;
1609 MOV ES:[BX.IFSR_SUBFUNC
],RESET_ENVIRONMENT
;AN016;
1611 SaveReg
<DS,SI,CS> ; dssi - ifs driver ;AC012;
1612 RestoreReg
<DS> ; ds - ifsseg ;AN000;
1614 ;***********************************************************************************************
1615 invoke CALL_IFS
;AN000;
1616 ;***********************************************************************************************
1618 RestoreReg
<SI,DS> ; dssi - ifs driver ;AC012;
1619 LDS SI,[SI.IFS_NEXT
] ; check next fs driver ;AN000;
1621 CMP SI,NULL_PTR
; if ptr null, no more ;AN000;
1625 CMP AX,NULL_PTR
;AN000;
1630 SaveReg
<SS> ; dosgroup ;AN000;
1631 RestoreReg
<DS> ;AN000;
1632 return
;????????? may need redir ioctl to ;AN000;
1633 ; consist_refs ;AN000;
1635 EndProc IFS_ABORT
;AN000;
1638 BREAK <GET_IFS_DRIVER_NAME
-- get IFS driver name
> ;AN000;
1640 ;************************************************************************************ ;AN000;
1642 ; GET_IFS_DRIVER_NAME ;AN000;
1644 ; Called by: GET_IFSFUNC_ITEM ;AN000;
1646 ; Routines called: ;AN000;
1649 ; DS:SI -> CDS/DFL ;AN000;
1650 ; ES:DI = buffer to place name ;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;
1655 ; buffer filled, hopefully with ifs name ;AN000;
1656 ; pointer not checked for valid ifs driver hdr ptr ;AN000;
1657 ; Regs: all preserved ;AN000;
1659 ;************************************************************************************ ;AN000;
1661 Procedure GET_IFS_DRIVER_NAME
,NEAR ;AN000;
1662 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1664 SaveReg
<DS,SI,CX,DI> ; preserve cds/dfl ptr, cx, buffer ;AN000;
1666 TEST CS:IFSPROC_FLAGS
,ISCDS
; get ifs hdr ptr from ;AN000;
1668 LDS SI,[SI.CURDIR_IFS_HDR
] ; cds ;AN000;
1671 LDS SI,[SI.DFLL_IFS_HDR
] ; dfl ;AN000;
1673 invoke MOVE_DRIVER_NAME
; move ifs driver name into buffer ;AN000;
1675 RestoreReg
<DI,CX,SI,DS> ; restore cds/dfl ptr, cx, buffer ;AN000;
1679 EndProc GET_IFS_DRIVER_NAME
;AN000;
1681 BREAK <FIND_IFS_DRIVER
-- get IFS driver
> ;AN000;
1683 ;************************************************************************************
1687 ; Called by: ATTACH_START
1689 ; Routines called: CHECK_END_SPACE
1692 ; ES:DI -> IFS driver name
1694 ; Loop through IFS driver chain until name match.
1695 ; If match found - set [THISIFS] and clear carry
1698 ; carry clear - match found,[THISIFS] set
1699 ; carry set - no match found
1701 ; Regs: all but ax preserved
1703 ;************************************************************************************
1705 Procedure FIND_IFS_DRIVER
;AN000;
1706 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1708 SaveReg
<DS,SI,BX,ES,DI> ; save registers (except ax for error) ;AC026;
1710 TEST CS:IFSFUNC_FLAGS
,NO_IFS_DRIVERS
; check for no drivers first ;AN024;
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;
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;
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;
1740 CMP AX,MINUS_ONE
;AN000;
1743 MOV AX,fs_driver_not_found
;AN000;
1744 JMP SHORT FID_980
;AN000;
1746 MOV WORD PTR CS:[THISIFS
],SI ; match. Set [THISIFS] to this ;AN000;
1747 MOV WORD PTR CS:[THISIFS
+2],DS ; driver ;AN000;
1751 FID_980: ; Return area ;AN000;
1753 JMP SHORT FID_1000
;AN000;
1757 RestoreReg
<DI,ES,BX,SI,DS> ; restore registers ;AC026;
1760 EndProc FIND_IFS_DRIVER
;AN000;
1763 BREAK <ASSIGN_MODE_FUNCTIONS
-- drive
/print
on/off
> ;AN000;
1765 ;************************************************************************************ ;AN000;
1767 ; AssignOn/AssignOff ;AN000;
1769 ; Called by: SET_ASSIGN_MODE ;AN000;
1771 ; AssignOn and AssignOFF copied from Network Redirector code ;AN000;
1772 ; PrintOn and PrintOff IFSFUNC new code ;AN000;
1780 ; Regs: none preserved ;AN000;
1782 ;************************************************************************************ ;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;
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;
1803 LeaveCrit CritNet
;AN000;
1808 REP MOVSB ; strcpy (d, s); ;AN000;
1810 EndProc AssignOn
;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;
1824 REP MOVSB ; Save current CDS state ;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;
1832 SaveReg
<AX> ;AN000;
1834 CallInstall InitCDS
,multDOS
,31,AX,AX ; initcds (p1); ;AN000;
1835 RestoreReg
<AX> ;AN000;
1836 OffInc: INC AL ;AN000;
1840 MOV fAssign
,0 ; fAssign = FALSE; ;AN000;
1842 LeaveCrit CritNet
;AN000;
1844 EndProc AssignOff
;AN000;
1846 ;****************************************************************************** ;AN000;
1848 ; PrintOn/PrintOff ;AN000;
1850 ; Called by: SET_ASSIGN_MODE ;AN000;
1852 ; Routines called: CALL_IFS ;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;
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;
1884 ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
1886 ; Outputs: none ;AN000;
1888 ; Regs: nothing preserved ;AN000;
1890 ;****************************************************************************** ;AN000;
1892 Procedure PrintOn
,Near ;AN000;
1893 ASSUME
DS:NOTHING
, ES:NOTHING
;AN000;
1895 EnterCrit CritNet
;AN000;
1896 CMP fPrint
,-1 ; if (fPrint) ;AN000;
1898 JMP POF_1000
; return; ;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;
1905 EndProc PrintOn
;AN000;
1907 Procedure PrintOff
,NEAR ;AN000;
1908 ASSUME
DS:NOTHING
, ES:NOTHING
;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;
1916 POF_20: ; (welcome print on) ;AN000;
1917 PUSH CS ; get addressability to IFSSEG ;AN000;
1919 ASSUME
DS:IFSSEG
,ES:NOTHING
;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;
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;
1932 SaveReg
<AX,ES> ;AN000;
1933 RestoreReg
<AX> ;AN000;
1935 RestoreReg
<AX> ;AN000;
1938 TEST ES:[DI.IFS_ATTRIBUTE
],IFSUNC
;AN000;
1940 OR DS:[SI.DFLL_FLAGS
],DFL_PAUSED
;AN000;
1941 JMP SHORT POF_60
;AN000;
1943 AND DS:[SI.DFLL_FLAGS
],NOT DFL_PAUSED
;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;
1951 ifsr_fcn_def EXECAPI
; define ifsr for dep ioctl ;AN000;
1952 ifsr_api_def DEPIOCTL
;AN000;
1954 invoke SET_DEPIOCTL_IFSR
;AN000;
1955 TEST IFSPROC_FLAGS
,PRINT_ON
;AN000;
1957 MOV ES:[BX.IFSR_CTLFUNC
],CTLFUNC_PRINT_ON
;AN000;
1958 JMP SHORT POF_100
;AN000;
1960 MOV ES:[BX.IFSR_CTLFUNC
],CTLFUNC_PRINT_OFF
;AN000;
1962 MOV ES:[BX.IFSR_CATEGORY
],1 ;AN000;
1963 invoke SET_THISIFS_UNC
;AN000;
1965 ;***********************************************************************************************
1966 invoke CALL_IFS
; call ifs driver w/request ;AN000;
1967 ;***********************************************************************************************
1969 invoke CONSIST_SFT
;AN000;
1972 LeaveCrit CritNet
;AN000;
1975 EndProc PrintOff
;AN000;
1978 BREAK <GET_UNC_ITEM_INFO
-- resv bits
, net name id
, user
word, max xmitt sz
> ;AC000;
1980 ;******************************************************************************
1984 ; Called by: GET_IFSFUNC_ITEM
1986 ; Routines called: CALL_IFS
1989 ; BL = redirection index
1990 ; ES:DI -> Target buffer: old - net path string ;AN00
1991 ; new - dw file system driver name
1998 ; * IFSR_LENGTH DW 48 ; Request length
1999 ; * IFSR_FUNCTION DB 4 ; Execute API function
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 ?
2008 ; IFSR_I24_RETRY DB ?
2009 ; IFSR_I24_RESP DB ?
2011 ; IFSR_DEVICE_CB@ DD ?
2012 ; IFSR_OPEN_CB@ DD ?
2013 ; * IFSR_FUNC DB 0 ; 0 generic ioctl
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
2020 ; buffer: dw index (bx)
2024 ; dw lower 8 bits lsn from ncb_list
2025 ; db redir reserved bits
2026 ; db net path...(asciiz)
2029 ; CALL routine, CALL_IFS, with pointer to IFS header
2031 ; Outputs: user stack contains info
2033 ; bx - bits and macro type
2034 ; dx - max xmitt size
2036 ; bp - lsn (if specified)
2038 ; Regs: nothing preserved
2040 ;******************************************************************************
2042 Procedure GET_UNC_ITEM_INFO
,NEAR ;AC003;
2044 TEST CS:IFSFUNC_FLAGS
,UNC_INSTALLED
;AN013;
2046 transfer ifs_980
;AN013;
2049 SaveReg
<ES,DI,BX> ; target ptr and index ;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;
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;
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;
2067 ;***********************************************************************************************
2068 invoke CALL_IFS
; call redir w/get unc item request ;AC003;
2069 ;***********************************************************************************************
2073 RestoreReg
<DI,ES> ;AC003;
2076 MOV SI,WORD PTR ES:[BX.IFSR_BUFFER@
] ;AC003;
2077 MOV DS,WORD PTR ES:[BX.IFSR_BUFFER@
+2] ;AC003;
2079 ADD SI,2 ; space to user word (skip index) ;AN018;
2080 LODSW ; user word ;AC003;
2082 LODSW ; max xmitt size ;AC003;
2084 LODSW ; net name id ;AC003;
2088 LODSB ; redir bits ;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;
2100 MOV [SI].User_BP
,BP ; LSN ;AC003;
2103 TEST IFSPROC_FLAGS
,Filesys_status
;AC003;
2106 RestoreReg
<DI,ES> ; buffer/target ptr (dssi - 18) ;AC003;;AC018;
2107 SaveReg
<AX,DI> ;AC003;;AC008;
2108 JMP SHORT GUI_40
;AC003;
2110 GUI_20: ; new style ;AC003;
2111 RestoreReg
<SI> ; offset path
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;
2123 MOV WORD PTR ES:[DI],1 ;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;
2138 EndProc GET_UNC_ITEM_INFO
;AC003;
2141 BREAK <CHECK_END_SPACE
-- check esdi string for blanks
> ;AN000;
2143 ;************************************************************************************ ;AN000;
2145 ; CHECK_END_SPACE ;AN000;
2147 ; Called by: FIND_IFS_DRIVER ;AN000;
2152 ; ES:DI -> IFS driver name ;AN000;
2154 ; Replace any blanks in asciiz ifs driver name with 0's. ;AN000;
2158 ; Regs: all preserved ;AN000;
2160 ;************************************************************************************ ;AN000;
2162 Procedure CHECK_END_SPACE
;AN000;
2163 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
2165 SaveReg
<AX,DS,SI,ES> ; save registers ;AN000;
2166 RestoreReg
<DS> ; set dssi -> asciiz ifs name ;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;
2179 RestoreReg
<SI,DS,AX> ; restore registers ;AN000;
2182 EndProc CHECK_END_SPACE
;AN000;