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