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

wirehaze git hosting

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