1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsinit.asm 1.0 87/05/11 ;AN000;
3 TITLE IFSFUNC INITIALIZATION ROUTINES
- Routines for ifs
;AN000;
5 ;*********************************************************************************** ;AN000;
7 ; IFS Initialization Routines ;AN000;
11 ; REVISION HISTORY: ;AN000;
12 ; A000 - Original version 4.00 MAY 1987 ;AN000;
13 ; A001 - PTM 331 Entry point for device ioctl
14 ; A002 - PTM 430 Renumber parse errors
15 ; A003 - DCR 96 Transfer IFS DOS callbacks to IFSFUNC
16 ; A004 - PTM 696 IFSFUNC hang w/no drivers
17 ; A005 - PTM 541 Parse problem
18 ; A006 - PTM 1227 DOS Version Check problem
19 ; A007 - PTM 842 Error messages in ifsfunc
20 ; A008 - PTM 1950 Autoattach when 2 ifs drivers loaded & 1st fails attach
21 ; A009 - PTM 2249 Autoattach must set isifs bit in cds
22 ; A010 - PTM 2827 Error proc problems 1/88 RMG
23 ; A011 - PTM 3334 put back reset environment call 2/88 rmg
24 ; A012 - PTM 4140 dos ext error msg enhancement - semaphore processing 4/19/88 RMG
25 ; A013 - DCR 526 New INT 2FH Share interface not to trigger logic install 4/19/88 RMG
29 ;***********************************************************************************
33 INCLUDE IFSFSYM
.INC ;AN000;
34 INCLUDE IFSSYM
.INC ;AN000;
35 INCLUDE DOSSYM
.INC ;AN000;
36 INCLUDE DEVSYM
.INC ;AN000;
37 include sysmsg
.inc ;AN000;
38 msg_utilname
<IFSFUNC
> ; resident msgret stuff ;AN000;
43 AsmVars
<IBM
, INSTALLED
, DEBUG
, PATHGEN
> ;AN000;
45 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
48 include dosseg
.asm
;AN000;
50 DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
51 ; DOSGROUP data ;AN000;
52 extrn DataVersion
:WORD ; version number of DOS data. ;AN000;
53 extrn SFTFCB
:DWORD ; FCB SFT cache ;AN000;
54 extrn KeepCount
:WORD ; FCB SFT cache ;AN000;
55 Extrn CDSAddr
:DWORD ;AN000;
56 Extrn CDSCount
:BYTE ;AN000;
57 Extrn DummyCDS
:BYTE ;AN000;
58 Extrn CritPatch
:WORD ;AN000;
61 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
62 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;AN000;
66 Extrn CDSAlt
:DWORD ;AN000;
67 Extrn DFLAddr
:DWORD ;AN000;
68 Extrn DFLCount
:BYTE ;AN000;
69 ;;;aliasExtrn NLAddr:DWORD ;AN000;
70 ;;;aliasExtrn NLSIZE:WORD ;AN000;
71 Extrn INT_2F_5
:BYTE ;AN000;
72 Extrn NEXT_2F_5
:DWORD ;AN000;
73 Extrn IFSR
:WORD ;AN000;
74 Extrn CD1
:WORD ;AN000;
75 Extrn DF1
:WORD ;AN000;
76 Extrn SFF1
:WORD ;AN000;
77 Extrn THISIFS
:DWORD ;AN000;
78 Extrn IFSPROC_FLAGS
:WORD ;AN000;
79 Extrn IFSFUNC_FLAGS
:WORD ;AN000;
80 Extrn UNC_FS_HDR
:DWORD ;AN000;
81 Extrn DEVICE_CB@_OFFSET
:WORD ;AN000;
83 Extrn RODS_LABEL
:BYTE ;AN000;
86 PUBLIC CODESIZE
;AN000;
87 CODESIZE
DB 'RMG' ;AN000;
94 PUBLIC TOTSIZE
;AN000;
95 TOTSIZE
DB 30H
;AN000;
104 Break <INT 2F handler
> ;AN000;
107 Procedure NetPointers
,NEAR ;AN000;
108 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
109 LDS SI,[DFLAddr
] ;AN000;
110 ;;;aliasLES DI,[NLAddr] ;AN000;
112 EndProc NetPointers
;AN000;
114 Procedure NetPointers2
,NEAR ;AN000;
115 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
118 ASSUME
DS:IFSSEG
;AN000;
119 MOV CX,[DFLCount
] ;AN000;
120 ;;;aliasMOV DX,[NLSIZE] ;AN000;
122 EndProc NetPointers2
;AN000;
126 Procedure GetIFSFCSinES
,NEAR ;AN000;
127 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
131 EndProc GetIFSFCSinES
;AN000;
134 Procedure UnusedFunc
,NEAR ;AN000;
135 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
136 fmt
<>,<>,<"Unused IFSFUNC function issued\n"> ;AN000;
137 MOV AX,error_invalid_function
;AN000;
140 EndProc UnusedFunc
;AN000;
142 ; the following multiplex functions are implemented: ;AN000;
147 FOO
DW Leave2F
;AN000;
149 INT2F PROC
FAR ;AN000;
150 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:DOSGroup
;AN000;
151 CMP AH,multIFS
;AN000;
158 Procedure IDispatch
,NEAR ;AN000;
159 POP WORD PTR retn1
; remove long return ;AN000;
160 POP WORD PTR retn1
+2 ;AN000;
161 POP DMY
; remove flags ;AN000;
162 XCHG AX,BX ; save bx/move index to index reg ;AN000;
163 SHL BL,1 ; convert byte to word index ;AN000;
164 XOR BH,BH ; convert to word index ;AN000;
165 POP DMY
; save fictitious AX ;AN000;
166 PUSH DMY
; restore spot on stack ;AN000;
167 PUSH WORD PTR retn1
+2 ; restore long return ;AN000;
168 PUSH WORD PTR retn1
;AN000;
169 PUSH FOO
; place near address of far return ;AN000;
170 PUSH CS:IFStable
[BX] ; place destination routine ;AN000;
171 XCHG AX,BX ; restore BX ;AN000;
172 MOV AX,DMY
; restore AX ;AN000;
173 STI ; let Mani see Clock ticks ;AN000;
175 return
; go to routine (dispatch for Aaron) ;AN000;
177 EDW
MACRO name
;AN000;
178 extrn name
:near ;AN000;
182 IFSTable
LABEL WORD ;AN000;
183 DW IFSInstall
;AN000;
184 EDW IFS_RMDIR
; 1 IFS_RMDIR ;AN000;
185 EDW IFS_SEQ_RMDIR
; 2 IFS_SEQ_RMDIR ;AN000;
186 EDW IFS_MKDIR
; 3 IFS_MKDIR ;AN000;
187 EDW IFS_SEQ_MKDIR
; 4 IFS_SEQ_MKDIR ;AN000;
188 EDW IFS_CHDIR
; 5 IFS_CHDIR ;AN000;
189 EDW IFS_CLOSE
; 6 IFS_CLOSE ;AN000;
190 EDW IFS_COMMIT
; 7 IFS_COMMIT ;AN000;
191 EDW IFS_READ
; 8 IFS_READ ;AN000;
192 EDW IFS_WRITE
; 9 IFS_WRITE ;AN000;
193 EDW IFS_XLOCK
; 10 IFS_XLOCK ;AN000;
194 DW UnusedFunc
; 11 ;AN000;
195 EDW IFS_DISK_INFO
; 12 IFS_DISK_INFO ;AN000;
196 EDW IFS_SET_FILE_ATTRIBUTE
; 13 IFS_SET_FILE_ATTRIBUTE ;AN000;
197 EDW IFS_SEQ_SET_FILE_ATTRIBUTE
; 14 IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000;
198 EDW IFS_GET_FILE_INFO
; 15 IFS_GET_FILE_INFO ;AN000;
199 EDW IFS_SEQ_GET_FILE_INFO
; 16 IFS_SEQ_GET_FILE_INFO ;AN000;
200 EDW IFS_RENAME
; 17 IFS_RENAME ;AN000;
201 EDW IFS_SEQ_RENAME
; 18 IFS_SEQ_RENAME ;AN000;
202 EDW IFS_DELETE
; 19 IFS_DELETE ;AN000;
203 EDW IFS_SEQ_DELETE
; 20 IFS_SEQ_DELETE ;AN000;
204 EDW IFS_OPEN
; 21 IFS_OPEN ;AN000;
205 EDW IFS_SEQ_OPEN
; 22 IFS_SEQ_OPEN ;AN000;
206 EDW IFS_CREATE
; 23 IFS_CREATE ;AN000;
207 EDW IFS_SEQ_CREATE
; 24 IFS_SEQ_CREATE ;AN000;
208 EDW IFS_SEQ_SEARCH_FIRST
; 25 IFS_SEQ_SEARCH_FIRST ;AN000;
209 EDW IFS_SEQ_SEARCH_NEXT
; 26 IFS_SEQ_SEARCH_NEXT ;AN000;
210 EDW IFS_SEARCH_FIRST
; 27 IFS_SEARCH_FIRST ;AN000;
211 EDW IFS_SEARCH_NEXT
; 28 IFS_SEARCH_NEXT ;AN000;
212 EDW IFS_ABORT
; 29 IFS_ABORT ;AN000;
213 EDW IFS_ASSOPER
; 30 IFS_ASSOPER ;AN000;
214 EDW Printer_GETSET_STRING
; 31 Printer_GETSET_STRING ;AN000;
215 EDW IFSFlushBuf
; 32 IFS_Flush_Buf ;AN000;
216 EDW IFS_LSEEK
; 33 IFS_LSEEK ;AN000;
217 EDW IFS_RESET_ENVIRONMENT
; 34 IFS_RESET_ENVIRONMENT ;AN000;
218 EDW IFS_DEVICE_CHECK
; 35 IFSDeviceCheck ;AN000;
219 EDW IFS_DEVICE_CLOSE
; 36 IFSDeviceClose ;AN000;
220 EDW IFS_DEVICE_OPER
; 37 IFSDeviceOper ;AN000;
221 EDW IFS_SPOOL_ECHO_CHECK
; 38 IFSSpoolEchoCheck ;AN000;
222 DW UnusedFunc
; 39 ;AN000;
223 DW UnusedFunc
; 40 ;AN000;
224 DW UnusedFunc
; 41 ;AN000;
225 EDW SERVER_DOSCALL_CLOSEFILES_FOR_UID
; 42 util ;AN000;
226 EDW DEVICE_IOCTL
; 43 dev ;AN001;
227 EDW IFS_UPDATE_CB
; 44 UPDATECB util ;AN000;
228 EDW IFS_FILE_XATTRIBUTES
; 45 hand ;AN000;
229 EDW IFS_XOPEN
; 46 XOPEN file ;AN000;
230 EDW IFS_DEPENDENT_IOCTL
; 47 util ;AN000;
233 DW NetPointers
; 47 NetPointers ;AN000;
234 DW NetPointers2
; 48 NetPointers2 ;AN000;
238 DW GetIFSFCSinES
; 49 (if debug) GetRedirCSinES ;AN000;
239 ; 47 (if NOT debug) GetRedirCSinES ;AN000;
246 EndProc IDispatch
;AN000;
248 Procedure EcritNet
,NEAR ;AN000;
249 ASSUME
SS:NOTHING
;AN000;
253 MOV AX,8000h
+CritNet
;AN000;
258 fmt
<>,<>,<"$p: ECritNet overflowed semaphore\n"> ;AN000;
264 EndProc EcritNet
;AN000;
267 ; Leave critical section for network. Note that the first instruction (PUSH ;AN000;
268 ; AX) here is used as the patch byte to enable the DOS critical section ;AN000;
269 ; routines... ;AN000;
271 ; NOTE!!! On a 286, this instruction issues POPF!!! ;AN000;
273 Procedure LcritNet
,NEAR ;AN000;
279 fmt
<>,<>,<"$p: LCritNet decrementing semaphore through zero\n"> ;AN000;
283 MOV AX,8100h
+critNet
;AN000;
286 POPF ; NOTE that this restores entry ;AN000;
289 EndProc LcritNet
;AN000;
292 Procedure EcritIFS
,NEAR ;AN000;
293 ASSUME
SS:NOTHING
;AN000;
297 MOV AX,8000h
+CritIFS
;AN000;
303 EndProc EcritIFS
;AN000;
305 Procedure LcritIFS
,NEAR ;AN000;
309 MOV AX,8100h
+critIFS
;AN000;
312 POPF ; NOTE that this restores entry ;AN000;
315 EndProc LcritIFS
;AN000;
317 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:DOSGroup
;AN000;
320 INTERRL:jmp INTERRL
; hang here - we're sick ;AN000;
323 PUBLIC TEMPBUF
;AN000;
324 TEMPBUF
LABEL BYTE ;AN000;
325 ; THE SPACE FROM HERE TO NETEND CONSTITUTES THE TEMP AREA OF IFSFUNC. ;AN000;
326 ; WARNING DANGER!!!!!!!!! ;AN000;
327 ; DO NOT reduce the size of this area without first checking ;AN000;
328 ; all users of it. It is OK to make it BIGGER without checking. ;AN000;
329 ; Current size: ?? ;AN000;
331 Break <General IFSFUNC INIT
> ;AN000;
332 ;************************************************************************************ ;AN000;
334 ; map: Resident: ;AN000;
335 ; IF_40 - (contifsinit) 2nd half of ifsfinit procedure = tempbuf area ;AN000;
336 ; allocate: DFL_LIST, altcds, sftfcb, ;AN000;
337 ; set TOTALSIZE ;AN000;
338 ; IFSFUNCINIT start ;AN000;
339 ; I_700 - INIT: 2nd half of IFSFUNCINIT ;AN000;
340 ; INT 23,24 stuff ;AN000;
341 ; call IFSFINIT ;AN000;
342 ; close std handles ;AN000;
343 ; enable critical section ;AN000;
344 ; terms & stays ;AN000;
345 ; tempbuf ends ;AN000;
347 ; IFSFINIT procedure ;AN000;
348 ; Set interrupt vectors - 2F ;AN000;
349 ; Call AUTO_ATTACH ;AN000;
350 ; allocate stuff (write over code) ;AN000;
351 ; jumps up to 2nd half ;AN000;
352 ; IFSFUNCINIT init code ;AN000;
353 ; version checks ;AN000;
354 ; error msg processing ;AN000;
355 ; free environment ;AN000;
358 ; check size for everything ;AN000;
359 ; ifsfunc code size calculation ;AN000;
360 ; ifsfunc total size calculation ;AN000;
361 ; jmps to I_700 ;AN000;
363 ; CheckUNCpresence ;AN000;
365 ;************************************************************************************ ;AN000;
367 ; This Code must be protected from overwrite when the structures are ;AN000;
368 ; initialized ;AN000;
371 IF_40: ; CONTIFSINIT ;AN000;
372 ASSUME
DS:IFSSEG
,ES:NOTHING
,SS:NOTHING
;AN000;
375 ; Allocate and init DFL_LIST ;AN000;
377 MOV WORD PTR DFLAddr
,DI ;AN000;
378 MOV WORD PTR DFLAddr
+2,ES ;AN000;
379 MOV AL,DFLCount
;AN000;
381 MOV BX,SIZE DFLL_LIST
;AN000;
387 ;;;aliasMOV WORD PTR NLAddr,DI ;AN000;
388 ;;; MOV WORD PTR NLAddr+2,ES ;AN000;
389 ;;; MOV AX,NLSIZE ;AN000;
391 ;;; XOR AX,AX ;AN000;
393 ;;;aliasADD DI,NLSIZE-4 ;AN000;
395 ; Allocate alt CDSs area ;AN000;
397 TEST IFSFUNC_FLAGS
,UNC_INSTALLED
;AN000;
399 MOV WORD PTR CDSAlt
,DI ;AN000;
400 MOV WORD PTR CDSAlt
+2,ES ;AN000;
402 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
404 ASSUME
DS:DOSGROUP
;AN000;
405 MOV AL,CDSCount
; Alt = Alloc ((sizeof(CDS)+1)*CDSCount); ;AN000;
408 MOV BX,SIZE curdir_list
;AN000;
411 JMP SHORT IF_55
;AN000;
414 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
416 ASSUME
DS:DOSGROUP
;AN000;
418 ; Allocate new FCB cache if appropriate ;AN000;
421 CMP BYTE PTR CS:NEWFCBCACHE
,0 ; Damn forward reference ;AN000;
422 JZ IF_80
; JZ NO_FCB_CACHE ;AN000;
424 ; We need to allocate (NewNumFCB * size of SF_entry) + size of sfTable. ;AN000;
426 CLI ; Diddling a DOS table, make sure ;AN000;
428 ; Make dos point to new table ;AN000;
430 MOV WORD PTR SFTFCB
,DI ;AN000;
431 MOV WORD PTR SFTFCB
+2,ES ;AN000;
433 ; Initialize table parts, next link and size ;AN000;
435 MOV WORD PTR ES:[DI.sfLink
],-1 ;AN000;
436 MOV WORD PTR ES:[DI.sfLink
+2],-1 ;AN000;
437 MOV CX,NewNumFCB
;AN000;
438 MOV ES:[DI.sfcount
],CX ;AN000;
440 ; Set up keepcount ;AN000;
442 MOV KeepCount
,NewKeepVal
;AN000;
444 ; Clean out the new FCB Cache ;AN000;
446 LEA DI,[DI].SFTable
; Point to the FCB SFTs ;AN000;
447 IF_60: ; CleanScan: ;AN000;
448 MOV ES:[DI.sf_ref_count
],0 ;AN000;
449 MOV WORD PTR ES:[DI.sf_position
],0 ;AN000;
450 MOV WORD PTR ES:[DI.sf_position
+2],0 ;AN000;
451 ADD DI,SIZE sf_entry
;AN000;
454 IF_80: ; NO_FCB_CACHE: ;AN000;
456 ASSUME
DS:IFSSEG
;AN000;
458 MOV [TOTALSIZE
],DI ; Offset of 1st free byte ;AN000;
471 ASSUME
CS:IFSSEG
,DS:IFSSEG
,ES:NOTHING
,SS:STACK ;AN000;
475 msg_services
<MSGDATA
> ;AN007;
477 msg_services
<GETmsg
>
481 Break <Installable Network INIT
> ;AN000;
483 Totalsize
DW ?
;AN000;
485 NEWFCBCACHE
DB 0 ;AN000;
487 INT_24: ; INT 24 handler used during INIT. ;AN000;
488 MOV AL,3 ; FAIL any INT 24s ;AN000;
489 INT_23: ; ^C handler used during INIT. ;AN000;
490 IRET ; ignores any ^C. ;AN000;
492 I_700: ; Init ;AN000;
493 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
495 ; We are now going to set lots of INT vectors and other stuff. We need ;AN000;
496 ; to make ourselves immune to INT 24 and ^C ;AN000;
500 MOV DX,OFFSET INT_23
;AN000;
501 MOV AX,(Set_Interrupt_Vector
SHL 8) + 23H
;AN000;
503 MOV DX,OFFSET INT_24
;AN000;
504 MOV AX,(Set_Interrupt_Vector
SHL 8) + 24H
;AN000;
506 invoke IFSFINIT
; Do general INIT ;AN000;
509 MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN ;AN000;
510 I_720: ; Close STD handles before ;AN000;
511 ; keep process ;AN000;
518 ; Enable the critical section code. This consists of replacing the RETs at ;AN000;
519 ; the beginning of each critical section routine with a PUSH AX ;AN000;
522 POP DS ; ds - ifsseg ;AN000;
524 TEST IFSFUNC_FLAGS
,UNC_INSTALLED
; 1st check if unc fs loaded ;AN000;
525 JZ I_800
; only do this for unc ;AN000;
526 MOV AH,Get_In_Vars
; do crit patch ;AN000;
529 ASSUME
ES:DOSGroup
;AN000;
530 MOV AL,BYTE PTR LCritNet
;AN000;
531 MOV BX,OFFSET DOSGROUP
:CritPatch
;AN000;
533 I_760: ; Scan ;AN000;
534 MOV DI,ES:[BX] ;AN000;
543 MOV CS:IFSSEM
,0 ; initialize ifs semaphores ;AN012;
545 ; Compute total size for residency. ;AN000;
547 MOV DX,TotalSize
; size of code and structs ;AN000;
548 ADD DX,100H
+0Fh ; Add size of header ;AN000;
552 MOV AX,(Keep_Process
SHL 8) + 0 ;AN000;
554 MOV AX,(EXIT
SHL 8) + 1 ;AN000;
558 ; %%%% CODE/DATA BELOW IS OVERLAYED WHEN STRUCTURES ARE SET UP ;AN000;
560 NETEND
LABEL BYTE ;AN000;
562 procedure IFSFINIT
,NEAR ;AN000;
563 ASSUME
DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
565 ; Perform initialization at DOSINIT time ;AN000;
578 ASSUME
DS:IFSSEG
;AN000;
580 ; SET INTERRUPT VECTORS ;AN000;
584 MOV AX,(multDOS
SHL 8) OR 2 ;AN000;
586 POP AX ; no know contents ;AN000;
590 LES BX,DWORD PTR ES:[BX] ; setting int 2f mult 5 ;AN000;
591 MOV WORD PTR [NEXT_2F_5
],BX ;AN000;
592 MOV WORD PTR [NEXT_2F_5
+2],ES ;AN000;
596 MOV DX,OFFSET INT_2F_5
;AN000;
597 MOV ES:[BX],DX ;AN000;
598 MOV ES:[BX+2],DS ;AN000;
600 MOV AX,(Get_Interrupt_Vector
SHL 8) + 2Fh
;AN000;
602 MOV WORD PTR CONT
,BX ;AN000;
603 MOV WORD PTR CONT
+2,ES ;AN000;
604 MOV AX,(Set_Interrupt_Vector
SHL 8) + 2Fh
;AN000;
605 MOV DX,OFFSET INT2F
; multIFS handler ;AN000;
608 ; auto - attach ;AN000;
610 CALL AUTO_ATTACH
;AN000;
612 ; call swap setup ;AN000;
615 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
617 ASSUME
DS:DOSGROUP
;AN000;
618 invoke SERVER_IFSFUNC_DATA_AREA
;AN000;
620 invoke SET_IFS_DOSCALL@
;AN003;
625 ; Prep error messages ;AN007;
627 LEA DI,Rods_label
;AN007;
629 RestoreReg
<ES> ;AN007;
630 MOV AX,DOS_GET_EXT_PARSE_ADD
;AN007;
631 MOV DL,7 ; set msg addr ;AN007;
634 ; Now start clobbering code ;AN000;
636 MOV DI,OFFSET NETEND
; Start strucs here ;AN000;
637 TEST DI,1 ; Word aligned? ;AN000;
638 JZ IF_20
; Yes, ok ;AN000;
639 INC DI ; Bump to word align ;AN000;
640 IF_20: ; NOADJ1 ;AN000;
641 JMP IF_40
; jmp CONTIFSINIT ;AN000;
643 EndProc IFSFINIT
;AN000;
645 ;************* ifsfuncinit transient portion ****************************** ;AN000;
646 AA_PARMS_BUF
DB 6 DUP(0) ; temp storage used by auto-attach ;AN000;
647 S_SIZE1
DB 11 ; Sublist size(PTR next SUBLIST) ;AN000;
648 DB 0 ; Reserved ;AN000;
649 DD SUB_IFSFUNC
; Ptr to substituted string ;AN000;
650 DB 1 ; n of %n ;AN000;
651 DB Left_Align
+Char_Field_ASCIIZ
; Data-type flags ;AN000;
652 DB 7 ; Maximum field width ;AN000;
653 DB 5 ; Minimum field width ;AN000;
654 DB " " ; Character for Pad field ;AN000;
655 S_SIZE2
DB 11 ; Sublist size(PTR next SUBLIST) ;AN000;
656 DB 0 ; Reserved ;AN000;
657 DD SUB_SHARE
; Ptr to substituted string ;AN000;
658 DB 1 ; n of %n ;AN000;
659 DB Left_Align
+Char_Field_ASCIIZ
; Data-type flags ;AN000;
660 DB 7 ; Maximum field width ;AN000;
661 DB 5 ; Minimum field width ;AN000;
662 DB " " ; Character for Pad field ;AN000;
664 SUB_IFSFUNC
DB "IFSFUNC",0 ;AN000;
665 SUB_SHARE
DB "SHARE",0 ;AN000;
667 DEFAULT_DFLCount
DB 4 ;AN000;
668 ;;;alias DEFAULT_NLSize DW 172 ; 4 * 43 ;AN000;
670 ASSUME
CS:IFSSEG
,DS:NOTHING
;AN000;
673 INCLUDE IFSPARSE
.INC ;AN000;
674 msg_services
<DISPLAYmsg
,CHARmsg
,LOADmsg
> ;AN000;
675 msg_services
<ifsfunc
.cla
,ifsfunc
.cl2
> ; parse/install msgs ;AN000;
679 ;****************************************************************************** ;AN000;
680 ; !!!!!!! IFSFUNC starts here !!!!!!! (see END statement) ;AN000;
681 ;****************************************************************************** ;AN000;
685 CALL SYSLOADMSG
;AN000;
688 RestoreReg
<DS> ;AN006;
689 CALL SYSDISPMSG
;AN000;
691 Badver_msg proc
far ;AN000;
694 RestoreReg
<DS> ;AN000;
701 badver_msg ENDP
;AN000;
703 Badmes proc
far ;AN000;
704 ASSUME
CS:IFSSEG
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
;AN000;
705 MOV BX,STDERR
;AN000;
707 CALL SYSDISPMSG
;AN000;
708 MOV AX,(EXIT
SHL 8) + 0FFH ;AN000;
713 I_20: ; Version OK ;AN000;
714 MOV AX,(multIFS
SHL 8)+0 ; Check if IFSFUNC already installed ;AN000;
718 MOV AX,COMMON_ERR_2
; yes - already installed - error 2 ;AN000;
721 MOV SI,OFFSET S_SIZE1
; prep for sysdispmsg call ;AN000;
723 MOV DH,UTILITY_MSG_CLASS
;AN000;
728 ; no error on install check, ;AN000;
729 I_40: ; free environment - no longer needed ;AN000;
730 MOV AX,DS:[PDB_ENVIRON
] ;AN000;
735 MOV AH,DEALLOC
;AN000;
739 ;************************************************************************************ ;AN000;
740 ; Parse IFSFUNC parameter : ;AN000;
741 ; NAMES = n ;;;alias[n | (n {m})] ;AN000;
742 ;************************************************************************************ ;AN000;
743 ; Set default n and m ;AN000;
744 MOV AL,DEFAULT_DFLCount
;AN000;
745 MOV [DFLCount
],AL ; 4 (n) ;AN000;
746 ;;;aliasMOV AX,DEFAULT_NLSize ;AN000;
747 ;;;aliasMOV NLSize,AX ; 4 * 43 (m) ;AN000;
749 MOV SI,81h
; ds:si -> cmd parameter ;AN000;
750 XOR CX,CX ; no operands parsed yet ;AN000;
753 ASSUME
ES:IFSSEG
;AN000;
754 MOV DI,OFFSET IFSF_PARMS
; es:di -> parse control blocks ;AN000;
755 XOR DX,DX ; reserved ;AN000;
757 CALL SYSPARSE
; call parser ;AN000;
759 CMP AX,-1 ; End of cmd? ;AN000;
761 JMP I_160
; if so continue w/init ;AN000;
763 CMP AX,0 ; Error? ;AN000;
764 JNE I_140
; yes - go display parse error ;AN000;
766 ;;;aliasCMP IFSF_RESULT,COMPLEX ; complex? ;AN000;
767 ;;;aliasJE I_80 ;AN000;
768 CMP IFSF_TAG
,"N" ; no - n only ;AN000;
769 MOV AX,PARSE_ERR_6
;AN002;
772 MOV AL,IFSF_NM
;AN000;
773 MOV [DFLCount
],AL ;AN000;
775 CALL SYSPARSE
;AN000;
778 MOV AX,PARSE_ERR_1
;AN000;
779 ;;;aliasJMP I_140 ; go display parse error ;AN000;
781 ;;;aliasI_80: ; process complex (n,m) ;AN000;
782 ;;; XOR CX,CX ; prep for new parse call ;AN000;
783 ;;; XOR DX,DX ;AN000;
784 ;;; CALL SYSPARSE ;AN000;
785 ;;; CMP AX,-1 ; End of cmd? ;AN000;
786 ;;; JE I_160 ; if so continue w/init ;AN000;
787 ;;; CMP AX,0 ; Error? ;AN000;
788 ;;; JNE I_140 ; if so go display error ;AN000;
789 ;;; CMP IFSF_TAG,"N" ; check if n or m parm ;AN000;
790 ;;; JNE I_100 ;AN000;
791 ;;; MOV AL,IFSF_NM ; n parm ;AN000;
792 ;;; MOV DFLCount,AL ;AN000;
793 ;;; CALL SYSPARSE ; go back for m ;AN000;
794 ;;; CMP AX,-1 ; End of cmd? ;AN000;
795 ;;; JE I_160 ; if so continue w/init ;AN000;
796 ;;; CMP AX,0 ; Error? ;AN000;
797 ;;; JNE I_140 ; if so go display error ;AN000;
800 ;;; CMP IFSF_TAG,"M" ; check if m parm ;AN000;
802 ;;; MOV AX,PARSE_ERR_7 ; not m - error ;AN002;
803 ;;; JMP I_140 ;AN000;
805 ;;; MOV AX,WORD PTR IFSF_NM ; m parm ;AN000;
806 ;;; MOV NLSize,AX ;AN000;
808 ;;; CALL SYSPARSE ; call parser again to check for ;AN000;
809 ;;; CMP AX,-1 ; possible garbage ;AN000;
811 ;;; MOV AX,PARSE_ERR_1 ;AN000;
813 I_140: ; display parse error ;AN000;
814 MOV DH,PARSE_ERR_CLASS
; then continue w/defaults ;AN000;
816 ;;; MOV BX,STDERR ;AD005;
817 ;;; XOR DL,DL ;AD005;
818 ;;; CALL SYSDISPMSG ;AD005;
823 MOV AX,DS ; Move the stack so it doesn't ;AN000;
824 ; get blasted by structure init ;AN000;
825 MOV SS,AX ; Set stack in the PSP overlaying ;AN000;
826 MOV SP,100H
; parms just processed ;AN000;
828 ; We must now do some computation. We have to check if there is enough room ;AN000;
829 ; for everything. We must do this here BEFORE we start overlaying this ;AN000;
834 ASSUME
DS:IFSSEG
;AN000;
836 MOV DI,OFFSET NETEND
; We have this much code ;AN000;
837 TEST DI,1 ; Word aligned? ;AN000;
838 JZ I_180
; Yes, OK. ;AN000;
839 INC DI ; Make word aligned ;AN000;
840 I_180: ; no adjust 5 label ;AN000;
842 ; This code is added to make it easy to determine the code size ;AN000;
843 ; of IFSFUNC for debug purposes. It is overlayed, so does not use extra ;AN000;
847 LEA SI,CODESIZE
+3 ; ;AN000;
848 I_200: ; TENT ;AN000;
849 SUB DI,10000 ; ;AN000;
851 INC BYTE PTR [SI] ; ;AN000;
853 I_220: ; NEG1 ;AN000;
854 ADD DI,10000 ; ;AN000;
856 I_240: ; THOU ;AN000;
857 SUB DI,1000 ; ;AN000;
859 INC BYTE PTR [SI] ; ;AN000;
861 I_260: ; NEG2 ;AN000;
862 ADD DI,1000 ; ;AN000;
864 I_280: ; HUND ;AN000;
867 INC BYTE PTR [SI] ; ;AN000;
869 I_300: ; NEG3 ;AN000;
872 I_320: ; TENS ;AN000;
875 INC BYTE PTR [SI] ; ;AN000;
877 I_340: ; NEG4 ;AN000;
880 I_360: ; ONES ;AN000;
883 INC BYTE PTR [SI] ; ;AN000;
885 I_380: ; DONE ;AN000;
889 ; Allocate the DFL ;AN000;
891 MOV AL,DFLCount
;AN000;
893 MOV CX,SIZE DFLL_LIST
;AN000;
897 JMP I_640
; out of memp ;AN000;
901 JMP I_640
; out of memp ;AN000;
903 ;;;aliasADD DI,NLSIZE ;AN000;
904 ;;;aliasJNC I_404 ;AN000;
905 ;;;aliasJMP I_640 ; out of memp ;AN000;
907 CALL CHECK_UNC_PRESENCE
; check if unc present, if not, ;AN000;
908 TEST IFSFUNC_FLAGS
,UNC_INSTALLED
;AN000;
909 JZ I_415
; no need to allocate altcds ;AN000;
911 ; Allocate the TEMP CDS area ;AN000;
914 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
916 ASSUME
DS:DOSGROUP
;AN000;
917 MOV CL,CDSCount
;AN000;
920 MOV AX,SIZE curdir_list
;AN000;
926 ADD DI,AX ; Temp CDS area ;AN000;
931 ; Determine if need new FCB cache and Allocate it if appropriate ;AN000;
933 PUSH DS ; get addressability to DOSGROUP ;AN000;
934 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
936 ASSUME
DS:DOSGROUP
;AN000;
938 CMP KeepCount
,DefKeepVal
;AN000;
940 LDS SI,SFTFCB
;AN000;
941 ASSUME
DS:NOTHING
;AN000;
942 CMP [SI].sfCount
,DefNumFCB
;AN000;
944 INC NEWFCBCACHE
; Flag ourselves ;AN000;
945 ADD DI,((SIZE sf_entry
) * NewNumFCB
)+((SIZE sf
)-2) ; New cache ;AN000;
946 JC I_640
; out of memp ;AN000;
947 I_420: ; no fcb ;AN000;
949 ASSUME
DS:IFSSEG
;AN000;
951 ; This code is added to make it easy to determine the total size @A1A ;AN000;
952 ; of IFSFUNC. It is overlayed, so does not use extra storage. @A1A ;AN000;
954 PUSH DI ; @A1A ;AN000;
955 PUSH SI ; @A1A ;AN000;
956 LEA SI,TOTSIZE
; @A1A ;AN000;
957 I_440: ; TENT2 @A1A ;AN000;
958 SUB DI,10000 ; @A1A ;AN000;
959 JC I_460
; @A1A ;AN000;
960 INC BYTE PTR [SI] ; @A1A ;AN000;
961 JMP I_440
; @A1A ;AN000;
962 I_460: ; NEG5 @A1A ;AN000;
963 ADD DI,10000 ; @A1A ;AN000;
964 INC SI ; @A1A ;AN000;
965 I_480: ; THOU2 @A1A ;AN000;
966 SUB DI,1000 ; @A1A ;AN000;
967 JC I_500
; @A1A ;AN000;
968 INC BYTE PTR [SI] ; @A1A ;AN000;
969 JMP I_480
; @A1A ;AN000;
970 I_500: ; NEG6 @A1A ;AN000;
971 ADD DI,1000 ; @A1A ;AN000;
972 INC SI ; @A1A ;AN000;
973 I_520: ; HUND2 @A1A ;AN000;
974 SUB DI,100 ; @A1A ;AN000;
975 JC I_540
; @A1A ;AN000;
976 INC BYTE PTR [SI] ; @A1A ;AN000;
977 JMP I_520
; @A1A ;AN000;
978 I_540: ; NEG7 @A1A ;AN000;
979 ADD DI,100 ; @A1A ;AN000;
980 INC SI ; @A1A ;AN000;
981 I_560: ; TENS2 @A1A ;AN000;
982 SUB DI,10 ; @A1A ;AN000;
983 JC I_580
; @A1A ;AN000;
984 INC BYTE PTR [SI] ; @A1A ;AN000;
985 JMP I_560
; @A1A ;AN000;
986 I_580: ; NEG8 @A1A ;AN000;
987 ADD DI,10 ; @A1A ;AN000;
988 INC SI ; @A1A ;AN000;
989 I_600: ; ONES2 @A1A ;AN000;
990 SUB DI,1 ; @A1A ;AN000;
991 JC I_620
; @A1A ;AN000;
992 INC BYTE PTR [SI] ; @A1A ;AN000;
993 JMP I_600
; @A1A ;AN000;
994 I_620: ; DONE2 @A1A ;AN000;
995 POP SI ; @A1A ;AN000;
996 POP DI ; @A1A ;AN000;
1001 I_640: ; OUT_OF_MEMP ;AN000;
1003 I_660: ; OUT_OF_MEM ;AN000;
1004 MOV AX,PARSE_ERR_10
;AN000;
1008 ASSUME
DS:NOTHING
;AN000;
1011 BREAK <AUTO_ATTACH
-- Attempt attaches of non
-FAT physical drives
> ;AN000;
1013 ;************************************************************************************ ;AN000;
1015 ; AUTO_ATTACH ;AN000;
1017 ; Called by: init ;AN000;
1019 ; Routines called: CALL_IFS ;AN000;
1022 ; FIND_IFS_DRIVER ;AN000;
1027 ; Get addressability to CDS structure (SYSVARS - IBMDOS/BIO) ;AN000;
1028 ; FOR I = 1 to # CDS ;AN000;
1030 ; ³ Drive = I - 1 (0-A,1-B,...) ;AN000;
1031 ; ³ IF (curdir_inuse == 0 & curdir_devptr .NOT. 0) THEN ;AN000;
1033 ; ³ ³ Get pointer to 1st IFS header ;AN000;
1034 ; ³ ³ WHILE pointer .NOT. 0FFFFH ;AN000;
1036 ; ³ ³ START ATTACH ;AN000;
1037 ; ³ ³ (IFSR_TYPE = 2 ;AN000;
1038 ; ³ ³ IFSR_PARMS@ -> IFS name, 0 parms) ;AN000;
1039 ; ³ ³ IF Attach successful THEN ;AN000;
1041 ; ³ ³ IF IFSUSESHARE set THEN ;AN000;
1042 ; ³ ³ Set share flag ;AN000;
1043 ; ³ ³ ENDIF ;AN000;
1044 ; ³ ³ LEAVE While ;AN000;
1045 ; ³ ³ ENDDO ;AN000;
1046 ; ³ ³ ELSE ;AN000;
1047 ; ³ ³ Get pointer to next IFS header ;AN000;
1048 ; ³ ³ ENDIF ;AN000;
1049 ; ³ ³ ENDDO ;AN000;
1050 ; ³ ³ ENDWHILE ;AN000;
1054 ; IF Share flag set THEN ;AN000;
1056 ; IF SHARE .NOT. loaded THEN ;AN000;
1057 ; issue warning msg: "SHARE not loaded" using msg retriever ;AN000;
1061 ; Outputs: Successful auto-attachments in effect ;AN000;
1063 ;************************************************************************************ ;AN000;
1065 Procedure AUTO_ATTACH
,NEAR ;AN000;
1066 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1068 TEST IFSFUNC_FLAGS
,NO_IFS_DRIVERS
;AN000;
1073 SaveReg
<DS,ES,DI> ; preserve ds - psp,es di storage ;AN000;
1074 ifsr_fcn_def ATTSTART
;AN000;
1075 MOV CS:IFSPROC_FLAGS
,THISIFS_SET
+IsInit
; set this so that cds_to_cd doesn't ;AC010;
1076 ; set thisifs ;AN000;
1078 MOV AH,Get_In_Vars
; Get ptr to ifs hdr chain ;AN000;
1079 INT 21h
; es:bx -> sysinitvars ;AN000;
1080 LES DI,ES:[BX.SYSI_IFS
] ; es:di -> 1st ifs driver ;AN000;
1082 MOV AX,(multDOS
SHL 8) OR 3 ; get addressability to dosgroup ;AN000;
1084 ASSUME
DS:DOSGROUP
;AN000;
1086 MOV CL,[CDSCount
] ; prep cds loop ;AN000;
1088 MOV DX,SIZE CURDIR_LIST
;AN000;
1089 LDS SI,[CDSAddr
] ; ds:si -> CDS list ;AN000;
1090 ASSUME
DS:NOTHING
;AN000;
1092 AA_10: ; ** Loop here on cds entries ;AN000;
1094 TEST DS:[SI.CURDIR_FLAGS
],CURDIR_INUSE
; check for ifs-able drive ;AN000;
1096 JMP AA_120
; cds already inuse, try next cds ;AN000;
1098 CMP WORD PTR DS:[SI.CURDIR_DEVPTR
],0 ;AN000;
1100 CMP WORD PTR DS:[SI.CURDIR_DEVPTR
+2],0 ;AN000;
1102 JMP AA_120
; cds not real, try next cds ;AN000;
1104 MOV AX,SI ; attempt ;AN000;
1105 SaveReg
<DS,AX> ; cds seg, offset ;AN000;
1106 MOV AX,(multDOS
SHL 8) OR 3 ; get dosgroup in ds to access cdsaddr ;AN000;
1108 ASSUME
DS:DOSGROUP
;AN000;
1109 RestoreReg
<AX> ; cds offset ;AN000;
1110 SUB AX,WORD PTR [CDSADDR
] ; get drive # (0-based) in al ;AN000;
1111 MOV BL,SIZE CurDir_list
;AN000;
1113 RestoreReg
<DS> ; cds segment ;AN000;
1114 SaveReg
<AX> ; drive # (0-based 0=A) ;AN000;
1116 INC BL ; change to 1-based (1=A) ;AN000;
1117 MOV AX,CHECK_REMOVABLE
; 4408H (device ioctl) ;AN000;
1119 OR AX,AX ; ax 0 - drive removable ;AN000;
1120 RestoreReg
<AX> ; drive # (0-based) ;AN000;
1122 JMP AA_120
; drive removable, don't auto-attach ;AN000;
1124 AA_19: ; cds ok, proceed with autoattach ;AN000;
1125 CBW ; convert al to word (ax) ;AN000;
1127 DIV BL ; convert number (ex.14) to char ;AN000;
1128 ADD AX,3030H
; (3134) (ah-remain,al-quot) ;AN000;
1130 SaveReg
<ES,DI> ; Save 1st ifs driver ;AN000;
1131 MOV CS:WORD PTR [THISIFS
],DI ; Send attach start request ;AN000;
1132 MOV CS:WORD PTR [THISIFS
+2],ES ; to all fs drivers. Stop when ;AN000;
1133 ; one clicks. ;AN000;
1135 SaveReg
<ES,DI,CX,DX,DS,SI> ; ifs ptr, cds count-size-ptr ;AN000;
1137 SaveReg
<AX,DS> ; get ES -> dosgroup (save char drv#) ;AN000;
1138 MOV AX,(multDOS
SHL 8) OR 3 ;AN000;
1140 SaveReg
<DS> ;AN000;
1141 RestoreReg
<ES> ;AN000;
1142 ASSUME
DS:DOSGROUP
,ES:DOSGROUP
;AN000;
1143 ; do attach w/dummy cds so as not ;AN000;
1144 MOV DI,OFFSET DOSGROUP
:DummyCDS
; to ruin valid cds ;AN000;
1145 RestoreReg
<DS> ;AN000;
1146 ASSUME
DS:NOTHING
;AN000;
1148 MOV CX,SIZE curdir_list
;AN000;
1152 POP SI ; DS:SI -> dummy CDS ;AN000;
1153 MOV [SI.curdir_flags
],curdir_isifs
+ curdir_inuse
;AN000;
1154 MOV [SI.curdir_type
],type_drive
;AN000;
1155 MOV AX,WORD PTR CS:[THISIFS
] ;AN000;
1156 MOV WORD PTR [SI.CURDIR_IFS_HDR
],AX ;AN000;
1157 MOV AX,WORD PTR CS:[THISIFS
+2] ;AN000;
1158 MOV WORD PTR [SI.CURDIR_IFS_HDR
+2],AX ;AN000;
1159 RestoreReg
<AX> ; char drive # ;AN000;
1160 SaveReg
<DS,SI> ; dummy cds ptr ;AN000;
1162 invoke PREP_IFSR
; sets es:bx -> ifsr, 0s fields, ;AN000;
1163 ; ds - ifsseg ;AN000;
1164 MOV DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
;AN000;
1165 invoke CDS_TO_CD
; sets ifsr_device_cb@ ;AN000;
1166 MOV ES:[BX.IFSR_LENGTH
],LENGTH_ATTSTART
;AN000;
1167 MOV ES:[BX.IFSR_FUNCTION
],IFSATTSTART
;AN000;
1168 MOV ES:[BX.IFSR_TYPE
],TYPE_DRIVE
;AN000;
1170 MOV SI,OFFSET AA_PARMS_BUF
; set up attach parameter buffer ;AN000;
1171 MOV WORD PTR DS:[SI],1 ; in tempbuf = dw 1 ;AN000;
1172 MOV WORD PTR DS:[SI+2],AX ; db 3134,0 ;AN000;
1174 MOV BYTE PTR DS:[SI+4],AL ; asciiz ;AN000;
1175 MOV WORD PTR ES:[BX.IFSR_PARMS@
],SI ;AN000;
1176 MOV WORD PTR ES:[BX.IFSR_PARMS@
+2],DS ;AN000;
1178 AA_40: ; ** Loop here on ifs drivers ;AN000;
1179 invoke CALL_IFS
; call ifs driver w/attach start req ;AN000;
1181 JC AA_60
; jmp on no click ;AN000;
1183 RestoreReg
<DI,ES> ; restore cds ptr to es:di ;AN000;
1184 invoke CD_TO_CDS
; update cds entry ;AN000;
1185 SaveReg
<ES> ; move dummy cds ptr back to ds:si ;AN000;
1186 RestoreReg
<DS> ;AN000;
1187 MOV SI,DI ; ds:si -> dummy cds ;AN000;
1188 RestoreReg
<DI,ES> ; es:di -> real cds ;AN000;
1189 MOV CX,SIZE CURDIR_LIST
; copy dummy into real - ok to ;AN000;
1190 SaveReg
<DI> ;AN000;
1191 OR DS:[SI.CURDIR_FLAGS
],CURDIR_ISIFS
; set this cds as ifs ;AN009;
1192 REP MOVSB ; clobber now ;AN000;
1193 RestoreReg
<SI> ; move real cds ptr back to ds:si ;AN000;
1194 SaveReg
<ES> ;AN000;
1195 RestoreReg
<DS> ;AN000;
1196 RestoreReg
<DX,CX,DI,ES> ; restore cds size, count, ;AN000;
1198 TEST CS:IFSPROC_FLAGS
,ISSHARE
; check if share checked ;AN000;
1199 JNZ AA_100
; go process next cds ;AN000;
1200 TEST ES:[DI.IFS_ATTRIBUTE
],IFSUSESHARE
;AN000;
1201 JZ AA_100
; ifs driver needs share ;AN000;
1202 ;; D526 CallInstall SHAREInstall,multSHARE,0 ; check that share loaded ;AN000;
1203 CallInstall SHAREInstall
,multSHARE
,40H
; check that share loaded ;AN013;
1204 CMP AL,INSTALLED
; if not generate warning ;AN000;
1206 SaveReg
<DS,SI,CX,DX> ;AN000;
1207 MOV AX,COMMON_ERR_3
; "SHARE not installed" ;AN000;
1210 MOV SI,OFFSET S_SIZE2
;AN000;
1212 MOV DH,UTILITY_MSG_CLASS
;AN000;
1213 MOV BX,STDERR
;AN000;
1215 CALL SYSDISPMSG
;AN000;
1216 RestoreReg
<DX,CX,SI,DS> ;AN000;
1219 OR CS:IFSPROC_FLAGS
,ISSHARE
; set this so won't check share again ;AN000;
1222 AA_60: ; ** Next driver ;AN000;
1223 RestoreReg
<AX,BX> ; dummy cds ptr ;AN000;
1224 RestoreReg
<SI,DS,DX,CX,DI,ES> ; restore: ifs and cds ptrs, ;AN000;
1225 ; cds count and size ;AN000;
1226 LES DI,ES:[DI.IFS_NEXT
] ; check next fs driver ;AN000;
1227 CMP DI,NULL_PTR
; if ptr null, end of ifs drivers ;AN000;
1229 PUSH AX ; dummy cds offset ;AN000;
1231 CMP AX,NULL_PTR
;AN000;
1232 POP AX ; dummy cds offset ;AN000;
1233 JE AA_100
; go process next cds if no more ifs ;AN000;
1235 MOV CS:WORD PTR [THISIFS
],DI ; prep next ifs driver ;AN000;
1236 MOV CS:WORD PTR [THISIFS
+2],ES ;AN000;
1237 SaveReg
<ES,DI,CX,DX,DS,SI> ; Save regs ;AN000;
1238 SaveReg
<AX,BX> ; dummy cds ptr ;AN000;
1239 SaveReg
<CS,CS> ; get esdi back to ifsrh ;AN008;
1240 RestoreReg
<ES,DS> ; and ds-ifsseg ;AN008;
1241 MOV BX,OFFSET IFSR
;AN008;
1243 MOV ES:[BX.IFSR_RETCODE
],AX ; restore error fields ;AN008;
1244 MOV ES:[BX.IFSR_RETCLASS
],AL ;AN008;
1245 JMP AA_40
; go process next ifs driver ;AN000;
1248 RestoreReg
<DI,ES> ; restore 1st ifs driver ;AN000;
1250 ADD SI,DX ; ** Next CDS ;AN000;
1257 RestoreReg
<DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000;
1259 AND CS:IFSPROC_FLAGS
,NOT IsInit
; reset isinit ;AN010;
1262 EndProc AUTO_ATTACH
;AN000;
1265 BREAK <CHECK_UNC_PRESENCE
-- check
if UNC
file system driver ifs
'ed
> ;AN000;
1267 ;************************************************************************************ ;AN000;
1269 ; CHECK_UNC_PRESENCE ;AN000;
1271 ; Called by: init - general ;AN000;
1273 ; Routines called: SYSDISPMSG ;AN000;
1279 ; Get pointer to 1st IFS header ;AN000;
1280 ; IF no file systems THEN ;AN000;
1281 ; Display warning ;AN000;
1284 ; WHILE pointer .NOT. 0FFFFH ;AN000;
1286 ; OR BX,IFS_ATTRIBUTES
1287 ; IF file system driver has unc bit set THEN ;AN000;
1289 ; Set unc_installed flag in IFSFUNC_FLAGS ;AN000;
1290 ; Set UNC_FS_HDR = unc file system driver header ;AN000;
1291 ; Set unc_found ;AN000;
1295 ; IF unc not found THEN ;AN000;
1296 ; Set UNC_FS_HDR = null ptr ;AN000;
1302 ; Outputs: unc_installed flag set in ifsfunc_flags in unc present ;AN000;
1305 ;************************************************************************************ ;AN000;
1307 Procedure CHECK_UNC_PRESENCE
,NEAR ;AN000;
1308 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
1310 SaveReg
<DS,ES,DI,BX> ; preserve ds - psp,es di storage ;AN000;
1311 MOV AH,Get_In_Vars
; Get ptr to ifs hdr chain ;AN000;
1312 INT 21h
; es:bx -> sysinitvars ;AN000;
1313 LES DI,ES:[BX.SYSI_IFS
] ; es:di -> 1st ifs driver ;AN000;
1315 CMP DI,NULL_PTR
; if 1st null, then no drivers ;AN000;
1316 JNE CUP_20
; must display no driver msg ;AN000;
1318 CMP AX,NULL_PTR
;AN000;
1321 MOV AX,UTIL_ERR_4
; def 4 "No IFS drivers found",CR,LF ;AN000;
1322 MOV BX,STDERR
;AN000;
1324 MOV DL,NO_INPUT
;AN000;
1325 MOV DH,UTILITY_MSG_CLASS
;AN000;
1328 CALL SYSDISPMSG
;AN000;
1329 MOV CS:IFSFUNC_FLAGS
,NO_IFS_DRIVERS
;AN000;
1331 JMP SHORT CUP_1000
;AN000;
1334 OR BX,ES:[DI.IFS_ATTRIBUTE
]
1335 TEST ES:[DI.IFS_ATTRIBUTE
],IFSUNC
; now set UNC_FS_HDR ;AN000;
1338 LES DI,ES:[DI.IFS_NEXT
] ;AN000;
1339 CMP DI,NULL_PTR
;AN000;
1342 CMP AX,NULL_PTR
;AN000;
1344 TEST IFSFUNC_FLAGS
,UNC_INSTALLED
1346 MOV WORD PTR [UNC_FS_HDR
],NULL_PTR
; no unc - set unc ptr null ;AN000;
1347 MOV WORD PTR [UNC_FS_HDR
+2],NULL_PTR
;AN000;
1348 JMP SHORT CUP_1000
;AN000;
1350 CUP_40: ; found unc - set unc ptr ;AN000;
1351 MOV WORD PTR [UNC_FS_HDR
],DI ; and unc flag ;AN000;
1352 MOV WORD PTR [UNC_FS_HDR
+2],ES ;AN000;
1353 OR IFSFUNC_FLAGS
,UNC_INSTALLED
;AN000;
1354 JMP SHORT CUP_30
;AN000;
1358 RestoreReg
<BX,DI,ES,DS> ; restore ds - psp,esdi - storage ;AN000;
1363 EndProc CHECK_UNC_PRESENCE
;AN000;
1368 STACK SEGMENT STACK ;AN000;
1369 DB 278 + 128 DUP (?
) ; 278 == IBM's ROM requirements ;AN000;
1372 END IFSFUNCinit
;AN000;