summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSSESS.ASM')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSSESS.ASM2187
1 files changed, 2187 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM
new file mode 100644
index 0000000..8eba357
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM
@@ -0,0 +1,2187 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC SESSION ROUTINES - IFS Attach Routines ;AN000;
4NAME 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;
67INCLUDE IFSSYM.INC ;AN000;
68INCLUDE IFSFSYM.INC ;AN000;
69INCLUDE DOSSYM.INC ;AN000;
70INCLUDE DEVSYM.INC ;AN000;
71.cref ;AN000;
72.list ;AN000;
73 ;AN000;
74AsmVars <IBM, Installed, DEBUG> ;AN000;
75 ;AN000;
76; define the base code segment of the network support first ;AN000;
77 ;AN000;
78IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
79IFSSEG 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;
86START SEGMENT PARA PUBLIC 'START' ;AN000;
87START ENDS ;AN000;
88 ;AN000;
89CONSTANTS SEGMENT WORD PUBLIC 'CONST' ;AN000;
90CONSTANTS ENDS ;AN000;
91 ;AN000;
92DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
93DATA ENDS ;AN000;
94 ;AN000;
95TABLE SEGMENT BYTE PUBLIC 'TABLE' ;AN000;
96TABLE ENDS ;AN000;
97 ;AN000;
98CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
99CODE ENDS ;AN000;
100 ;AN000;
101LAST SEGMENT PARA PUBLIC 'LAST' ;AN000;
102LAST ENDS ;AN000;
103 ;AN000;
104DOSGROUP GROUP START,CONSTANTS,DATA,TABLE,CODE,LAST ;AN000;
105 ;AN000;
106 ;AN000;
107DATA 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;
120if debug ;AN000;
121 Extrn BugLev:WORD ;AN000;
122 Extrn BugTyp:WORD ;AN000;
123 include bugtyp.asm ;AN000;
124endif ;AN000;
125DATA ENDS ;AN000;
126 ;AN000;
127 ;AN000;
128; define our own code segment ;AN000;
129 ;AN000;
130IFSSEG 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;
138PUBLIC IFSF_SWAP_START ;AN000;
139IFSF_SWAP_START LABEL BYTE ;AN000;
140 ;AN000;
141 PUBLIC THISIFS ;AN000;
142THISIFS DD -1 ;AN000;
143
144 PUBLIC THISDFL ;AN000;
145THISDFL DD -1 ;AN000;
146
147 PUBLIC IFSR ;AN000;
148IFSR DB 72 DUP (0) ;AN000;
149
150 PUBLIC SFF1 ;AN000;
151SFF1 DB 62 DUP (0) ;AN000;
152
153 PUBLIC CD1 ;AN000;
154CD1 DW 84 DUP (0) ;AN000;
155
156 PUBLIC DF1 ;AN000;
157DF1 DW 18 DUP (0) ;AN000;
158
159 PUBLIC IFSPROC_FLAGS ;AN000;
160IFSPROC_FLAGS DW 0 ;AN000;
161
162; Number of net drive (0=A) for use on net I 24 ;AN000;
163 PUBLIC IFSDRV ;AN000;
164IFSDRV 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;
170DEVICE_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;
174SAVE_CB@ DD -1 ;AN000;
175
176 PUBLIC IFSSEM ;AN021;
177; This used as byte of semaphores. ;AN021;
178IFSSEM DB 0 ;AN021;
179
180IFSF_SWAP_END LABEL BYTE ;AN000;
181PUBLIC IFSF_SWAP_END ;AN000;
182 ;AN000;
183 ;IFS Data - public ;AN000;
184 ;AN000;
185 PUBLIC DFLAddr ;AN000;
186DFLAddr DD -1 ;AN000;
187
188 PUBLIC DFLCount ;AN000;
189DFLCount 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;
198CDSAlt DD -1 ;AN000;
199
200 PUBLIC UNC_FS_HDR ;AN000;
201UNC_FS_HDR DD -1 ;AN000;
202
203 PUBLIC IFSFUNC_FLAGS ;AN000;
204IFSFUNC_FLAGS DW 0 ;AN000;
205
206 PUBLIC IFS_ATTRS ;AN000;
207IFS_ATTRS DW 0 ; all ifs_attribute words from ifs ;AN000;
208 ; headers or'ed together (ifsinit) ;AN000;
209 PUBLIC DOSCALL@ ;AN000;
210DOSCALL@ DD 0 ; IFS_DOSCALL@ set by ibmbio ;AN000;
211
212 PUBLIC SFT_SERIAL_NUMBER ;AN005;
213SFT_SERIAL_NUMBER DW 0 ; to get sfts unique for fcb reasons ;AN005;
214
215 PUBLIC fAssign ;AC023;
216fAssign DB -1 ;AC023;
217
218 PUBLIC fPrint ;AC023;
219fPrint DB -1 ;AC023;
220
221 PUBLIC TRUNCATE_FLAG ;AC030;moved out of swap
222TRUNCATE_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;
230ERROR_STATUS DB "ERROR",0 ; from fs (GII) ;AC029;
231 ;AN000;
232 ;AN000;
233BREAK <IFS_ASSOPER -- Do the $Assignoper call> ;AN000;
234 ;AN000;
235copyright db " IFSFUNC.EXE " ;AN000;
236INCLUDE 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;
270AO_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;
280ASSUME DS:NOTHING,ES:NOTHING ;AN000;
281 ;AN000;
282 TEST CS:IFSFUNC_FLAGS,no_ifs_drivers
283 JZ AO_20
284AO_10:
285 MOV AX,error_not_supported
286 transfer ifs_980
287AO_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
294AO_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;
302EndProc IFS_ASSOPER ;AN000;
303 ;AN000;
304BREAK <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;
332ASSUME 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;
342GAM_20: ; if (type == print) ;AN000;
343 MOV BH,fPrint ; t = fPrint; ;AN000;
344GAM_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;
350GAM_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;
355EndProc RETURN_ASSIGN_MODE ;AN000;
356 ;AN000;
357BREAK <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;
378ASSUME 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;
391SAM_20: ; print off - pause ;AN000;
392 CALL PrintOff ;AN000;
393 transfer ifs_990 ; go to general good ret in util ;AN000;
394 ;AN000;
395SAM_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;
405SAM_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;
410SAM_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;
416EndProc SET_ASSIGN_MODE ;AN000;
417 ;AN000;
418BREAK <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;
584ASSUME 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;
600GII_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;
607GII_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;
612GII_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;
620GII_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;
628GII_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;
633GII_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;
639GII_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;
658GII_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;
669GII_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;
689ASSUME 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;
695GII_180: ;AC003;
696 MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003;
697 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003;
698GII_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;
715GII_210: ;AN029;
716 PUSH CS ;AC003;
717 POP DS ;AC003;
718ASSUME 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;
725GII_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;
735GII_240: ; NET drive: ;AC003;
736 JMP GII_640 ; go down to net device processing- ;AC003;
737 ; does the same thing ;AC003;
738GII_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;
746GII_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;
750GII_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;
760GII_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;
766GII_520: ;AC003;
767 SUB BX,1 ;AC003;
768 JB GII_540 ;AC003;
769 JMP GII_680 ; next device ;AC003;
770GII_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;
782GII_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;
788GII_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;
800GII_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;
810GII_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;
828ASSUME 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;
834GII_580: ;AC003;
835 MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003;
836 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003;
837GII_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;
853GII_610: ;AN029;
854 PUSH CS ;AC003;
855 POP DS ;AC003;
856ASSUME 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;
863GII_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;
867GII_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;
876GII_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;
894GII_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;
905GII_680: ;AC003;
906 INC AX ; next drive ;AC003;
907 JMP GII_400 ;AC003;
908 ;AC003;
909 ;AC003;
910GII_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;
921GII_820: ;AC003;
922 MOV AX,error_no_more_files ;AC003;
923 RestoreReg <SI,DI> ; restore regs ;AC003;
924 ;AC003;
925 return ;AC003;
926 ;AC003;
927EndProc GET_IFSFUNC_ITEM ;AC003;
928 ;AN000;
929 ;AN000;
930BREAK <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;
1032ASSUME 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;
1040AS_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;
1046AS_15: ;AN000;
1047 MOV AX,error_invalid_function ; invalid fcn type ;AN000;
1048 transfer ifs_980 ; go ret w/carry ;AN000;
1049 ;AN000;
1050AS_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;
1067AS_22: ;AN011;
1068 MOV CX,8001H ; User word with password ;AN011;
1069AS_23: ;AN017;
1070 ADD DI,4 ; skip over ifs name offset & #parms ;AN017;
1071 JMP SHORT AS_33 ; go process as unc ;AN000;
1072
1073AS_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;
1078AS_30: ; NETWORK device/drive ;AN000;
1079 TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; check that unc installed ;AN000;
1080 JZ AS_15 ;AN000;
1081AS_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;
1087AS_35: ;AN000;
1088 CMP CS:fPrint,-1 ;AN000;
1089AS_37: ;AN000;
1090 JE AS_40 ; bad pause status ;AN000;
1091 MOV AX,72 ; set error and ret w/carry ;AN000;
1092AS_38: ;AN020;
1093 PUSH CS ;AN000;
1094 POP DS ;AN000;
1095ASSUME DS:IFSSEG ;AN000;
1096 invoke SET_EXTERR_INFO ;AN000;
1097 transfer ifs_980 ;AN000;
1098 ;AN000;
1099AS_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;
1108AS_50: ;AN000;
1109 RestoreReg <DI,ES> ; restore target parm ptr ;AN000;
1110AS_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;
1116AS_55_0: ;AN000;
1117 CMP BL,TYPE_NET_DEVICE ;AN000;
1118 JNE AS_55_1 ;AN000;
1119 JMP AS_200 ;AN000;
1120AS_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;
1132AS_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;
1135AS_57: ;AN000;
1136 MOV AX,error_invalid_drive ;AN000;
1137 transfer ifs_980 ;AN000;
1138 ;AN000;
1139AS_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;
1145ASSUME 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;
1154AS_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
1187AS_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;
1193AS_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;
1199AS_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;
1208AS_240: ;AN000;
1209 POP AX ; restore type in AL ;AN000;moved ;AM019;
1210 MOV ES:[BX.IFSR_TYPE],AL ;AC002;
1211 ;AN000;
1212 ;AN000;
1213AS_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;
1226AS_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;
1242AS_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;
1249AS_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;
1261AS_460: ;AN000;
1262 invoke DF_TO_DFL ;AN000;
1263 invoke CONSIST_SFT ;AN025;
1264 transfer ifs_990 ;AN000;
1265 ;AN000;
1266 ;AN000;
1267EndProc ATTACH_START ;AN000;
1268 ;AN000;
1269 ;AN000;
1270BREAK <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;
1303ASSUME 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;
1327AE_10: ;AN000;
1328 MOV AX,72 ; pause error ;AN000;
1329 PUSH CS ;AN000;
1330 POP DS ;AN000;
1331ASSUME DS:IFSSEG ;AN000;
1332 invoke SET_EXTERR_INFO ;AN000;
1333 transfer ifs_980 ;AN000;
1334AE_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;
1341AE_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;
1347AE_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;
1356AE_200: ; BREAK DEVICE ATTACH ;AN000;
1357 CMP fPrint,-1 ; check for pause error ;AN000;
1358 JZ AE_210 ;AN000;
1359 JMP AE_10 ;AN000;
1360AE_210: ;AN000;
1361 CALL DFL_MATCH ;AN000;
1362 JNC AE_220 ;AN000;
1363 MOV AX,device_not_attached ;AN000;
1364 transfer ifs_1000 ;AN000;
1365AE_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;
1378AE_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;
1385AE_320: ;AN000;
1386 SaveReg <ES,BX,DS> ; ifsr ptr ;AC004;
1387 RestoreReg <ES> ; set esdi = dssi = net path ;AC004;
1388ASSUME 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;
1395ASSUME 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;
1400ASSUME DS:IFSSEG ;AN000;
1401 ;AN000;
1402AE_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;
1414AE_405: ;AN000;
1415 transfer ifs_980 ;AN000;
1416AE_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;
1424AE_420: ;AN000;
1425 TEST CS:IFSPROC_FLAGS,IsSeq ;AN018;
1426 JNZ AE_440 ;AN018;
1427 CALL DELETE_DFL_ENTRY ;AN000;
1428AE_440: ;AN018;
1429 transfer ifs_990 ;AN000;
1430 ;AN000;
1431 ;AN000;
1432EndProc ATTACH_END ;AN000;
1433 ;AN000;
1434
1435BREAK <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;
1487ASSUME 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
1496EndProc IFS_RESET_ENVIRONMENT ;AN016;
1497
1498
1499BREAK <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;
1552ASSUME 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;
1567IA_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;
1580IA_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;
1585IA_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;
1591IA_70: ;AN000;
1592 LDS SI,IFS_HEADER ;AN000;
1593ASSUME DS:NOTHING ;AN000;
1594 JMP SHORT IA_100 ; go check if null ;AN007;
1595 ;AN000;
1596IA_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;
1610IA_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;
1620IA_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;
1629IA_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;
1635EndProc IFS_ABORT ;AN000;
1636 ;AN000;
1637 ;AN000;
1638BREAK <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;
1662ASSUME 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;
1670GIDN_20: ;AN000;
1671 LDS SI,[SI.DFLL_IFS_HDR] ; dfl ;AN000;
1672GIDN_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;
1679EndProc GET_IFS_DRIVER_NAME ;AN000;
1680 ;AN000;
1681BREAK <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;
1706ASSUME 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;
1713FID_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;
1718ASSUME DS:NOTHING ; ds:si -> 1st ifs driver ;AN000;
1719 ;AN000;
1720FID_20: ;AN000;
1721 SaveReg <DS,SI,ES,DI,CS> ; save ds,si,es,di ;AN000;
1722 RestoreReg <ES> ; set es=cs ;AN000;
1723ASSUME 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;
1742FID_30: ;AN024;
1743 MOV AX,fs_driver_not_found ;AN000;
1744 JMP SHORT FID_980 ;AN000;
1745FID_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;
1751FID_980: ; Return area ;AN000;
1752 STC ;AN000;
1753 JMP SHORT FID_1000 ;AN000;
1754FID_990: ;AN000;
1755 CLC ;AN000;
1756FID_1000: ;AN000;
1757 RestoreReg <DI,ES,BX,SI,DS> ; restore registers ;AC026;
1758 return ;AN000;
1759 ;AN000;
1760EndProc FIND_IFS_DRIVER ;AN000;
1761 ;AN000;
1762 ;AN000;
1763BREAK <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;
1784Procedure AssignOn,Near ;AN000;
1785ASSUME 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;
1794OnLoop: ;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;
1799NextCDS: ;AN000;
1800 DEC AL ;AN000;
1801 JNZ OnLoop ;AN000;
1802CrLvA: ;AN000;
1803 LeaveCrit CritNet ;AN000;
1804 return ;AN000;
1805 ;AN000;
1806RestCDS: ;AN000;
1807 MOV CX,DX ;AN000;
1808 REP MOVSB ; strcpy (d, s); ;AN000;
1809 JMP NextCDS ;AN000;
1810EndProc AssignOn ;AN000;
1811 ;AN000;
1812Procedure 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;
1826OffLoop: ; 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;
1836OffInc: INC AL ;AN000;
1837 JMP OffLoop ;AN000;
1838 ;AN000;
1839OffDone: ;AN000;
1840 MOV fAssign,0 ; fAssign = FALSE; ;AN000;
1841CrLvB: ;AN000;
1842 LeaveCrit CritNet ;AN000;
1843 return ;AN000;
1844EndProc 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;
1892Procedure 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;
1899PON_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;
1905EndProc PrintOn ;AN000;
1906 ;AN000;
1907Procedure 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;
1916POF_20: ; (welcome print on) ;AN000;
1917 PUSH CS ; get addressability to IFSSEG ;AN000;
1918 POP DS ;AN000;
1919ASSUME 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;
1926POF_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;
1937POF_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;
1942POF_50: ;AN000;
1943 AND DS:[SI.DFLL_FLAGS],NOT DFL_PAUSED ;AN000;
1944POF_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;
1959POF_80: ;AN000;
1960 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_OFF ;AN000;
1961POF_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;
1971POF_1000: ;AN000;
1972 LeaveCrit CritNet ;AN000;
1973 return ;AN000;
1974 ;AN000;
1975EndProc PrintOff ;AN000;
1976 ;AN000;
1977 ;AN000;
1978BREAK <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
2048GUI_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;
2054ASSUME 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;
2075GUI_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;
2101GUI_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;
2110GUI_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;
2127GUI_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
2134GUI_1000:
2135 return ;AC003;
2136 ;AC003;
2137 ;AC003;
2138EndProc GET_UNC_ITEM_INFO ;AC003;
2139 ;AN000;
2140
2141BREAK <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;
2163ASSUME 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;
2169CES_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;
2178CES_1000: ;AN000;
2179 RestoreReg <SI,DS,AX> ; restore registers ;AN000;
2180 return ;AN000;
2181 ;AN000;
2182EndProc CHECK_END_SPACE ;AN000;
2183
2184 ;AN000;
2185 ;AN000;
2186IFSSEG ENDS ;AN000;
2187 END ;AN000;