]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/IFSFUNC/IFSINIT.ASM

wirehaze git hosting

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