summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSDEV.ASM')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSDEV.ASM1267
1 files changed, 1267 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM
new file mode 100644
index 0000000..1ad88ff
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSDEV.ASM
@@ -0,0 +1,1267 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC DEVICE ROUTINES - Device/IOCTL routines ;AN000;
4NAME IFSDEV ;AN000;
5 ;AN000;
6;******************************************************************************
7;
8; Device related IFS calls
9;
10; Printer_GetSet_String
11; IFS_Device_Check
12; IFS_Device_Close
13; IFS_Device_Oper
14; IFS_Spool_Echo_Check
15; IFS_DEPENDENT_IOCTL
16; DEVICE_IOCTL
17; GET_DFL_FROM_INDEX
18;
19; Programming notes:
20; Old redirector segmentation and DOS interface preserved.
21; Routine prologues are accurate for input/output.
22; However, the pseudocode was not kept up to date.
23; Use it for a rough idea of the routine function.
24;
25; REVISION HISTORY:
26; A000 Original version 4.00 May 1987
27; A001 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA
28; A002 PTM 764 - printer attach problems 8/87 RGAZZIA
29; A003 PTM 849 - printer open problems 8/87 RGAZZIA
30; A004 PTM 1244- Net Print problems 8/87 RGAZZIA
31; A005 PTM 1600- dev ioctl ds bug 8/87 RGAZZIA
32; A006 PTM 3619- thiscds,thissft not set in ifs dep ioctl 2/88 RGazzia
33; A007 PTM 3971 Austin Print bug raid 3/88 RMG
34; A008 PTM 4055 UNC problems (make sure thisdfl null on error) 3/30/88 RMG
35; A009 PTM 4188 Names=0 problems 4/08/88 RMG
36; A010 PTM 4554 Echo across network in vitt alt task 5/12/88 RMG
37; A011 PTM 4841 Ctrl ptrsc problems 5/13/88 RMG
38; A012 PTM 4885 ifs dept ioctl not recog non-ifs drive 5/17/88 RMG
39; A013 PTM 4791 problem with ax error code overwrite 5/19/88 RMG
40; A014 PTM 4946 net - no ptrs 5E02 doesn't return error 5/20/88 RMG
41; A015 PTM 5005 get truncate flag faulty - ret on user stack 6/02/88 RMG
42; LOC - 477
43;
44;******************************************************************************
45 ;AN000;
46.xlist ;AN000;
47.xcref ;AN000;
48INCLUDE IFSSYM.INC ;AN000;
49INCLUDE IFSFSYM.INC ;AN000;
50INCLUDE DOSSYM.INC ;AN000;
51INCLUDE DEVSYM.INC ;AN000;
52.cref ;AN000;
53.list ;AN000;
54 ;AN000;
55AsmVars <IBM,KANJI,DEBUG> ;AN000;
56 ;AN000;
57; define the base code segment of the network support first ;AN000;
58 ;AN000;
59IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
60IFSSEG ENDS ;AN000;
61 ;AN000;
62; include THE REST Of the segment definitions for normal MSDOS ;AN000;
63 ;AN000;
64.xlist ;AN000;
65include dosseg.asm ;AN000;
66.list ;AN000;
67 ;AN000;
68DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
69 ; DOSGROUP Data ;AN000;
70 Extrn THISCDS:DWORD ;AN000;
71 Extrn THISSFT:DWORD ;AN000;
72 Extrn CDSAddr:DWORD ;AN000;
73 Extrn CDSCount:BYTE ;AN000;
74 Extrn CurrentPDB:WORD ;AN000;
75DATA ENDS ;AN000;
76 ;AN000;
77 ;AN000;
78IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
79 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
80 ;AN000;
81 ; IFS data ;AN000;
82;;;aliasExtrn NLAddr:DWORD ;AN000;
83 Extrn TEMPBUF:BYTE ;AN000;
84 Extrn UNC_FS_HDR:DWORD ;AN000;
85 Extrn THISIFS:DWORD ;AN000;
86 Extrn THISDFL:DWORD ;AN000;
87 Extrn DFLCount:BYTE ;AN000;
88 Extrn DFLAddr:DWORD ;AN000;
89 Extrn IFSDRV:BYTE ;AN000;
90 Extrn fAssign:BYTE ;AN000;
91 Extrn CDSAlt:DWORD ;AN000;
92 Extrn TRUNCATE_FLAG:BYTE ;AN000;
93 Extrn IFSPROC_FLAGS:WORD ;AN000;
94 Extrn IFSFUNC_FLAGS:WORD ;AN000;
95 Extrn IFSR:WORD ;AN000;
96 Extrn LPT1_NAME:BYTE ;AN000;
97 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
98 ;AN000;
99 ;AN000;
100BREAK <PRINTER_GETSET_STRING Get/Set a Pre-pend string> ;AN000;
101 ;AN000;
102;****************************************************************************** ;AN000;
103; ;AN000;
104; PRINTER_GETSET_STRING Get or Set the printer string and flag word ;AN000;
105; ;AN000;
106; Called by: Dispatcher ;AN000;
107; ;AN000;
108; Routines called: CALL_IFS DOS: Get_User_Stack ;AN000;
109; GET_DFL_FROM_INDEX ;AN000;
110; DF_TO_DFL ;AN000;
111; ;AN000;
112; Inputs: ;AN000;
113; AL has function type (2-printer-set 3-printer-get ;AN000;
114; 4-printer-set-flags 5-printer-get-flags ;AN000;
115; VALUE ALREADY RANGE CHECKED BY CALLER ;AN000;
116; DS:SI is user string pointer (call 2) ;AN000;
117; ES:DI is user buffer (call 3) ;AN000;
118; BX is assign index (calls 2,3,4,5) ;AN000;
119; CX is length DS:SI (call 2) ;AN000;
120; DX is flag word (call 4) ;AN000;
121; ;AN000;
122; Function: ;AN000;
123; Prep IFSRH: ;AN000;
124; * IFSR_LENGTH DW 48 ; Request length ;AN000;
125; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
126; IFSR_RETCODE DW ? ;AN000;
127; IFSR_RETCLASS DB ? ;AN000;
128; IFSR_RESV1 DB 16 DUP(0) ;AN000;
129; * IFSR_APIFUNC DB 16 ; REDIR IOCTL (Printer Getset String) ;AN000;
130; IFSR_ERROR_CLASS DB ? ;AN000;
131; IFSR_ERROR_ACTION DB ? ;AN000;
132; IFSR_ERROR_LOCUS DB ? ;AN000;
133; IFSR_ALLOWED DB ? ;AN000;
134; IFSR_I24_RETRY DB ? ;AN000;
135; IFSR_I24_RESP DB ? ;AN000;
136; IFSR_RESV2 DB ? ;AN000;
137; * IFSR_DEVICE_CB@ DD ? ; DFL entry found by IFSFUNC ;AN000;
138; ; Step through CDS & DFL lists counting ;AN000;
139; ; (0,1,2,...) ones with IFS bit set. ;AN000;
140; ; Stop at BXth one. Pass that in ;AN000;
141; ; IFSR_DEVICE_CB@. ;AN000;
142; IFSR_OPEN_CB@ DD ? ;AN000;
143; * IFSR_FUNC DB 0 ; subfunction: ;AN000;
144; ; 00 Generic IOCTL by device number ;AN000;
145; IFSR_RESV3 DB 0 ;AN000;
146; * IFSR_BUFFER@ DD ? ; user buffer (see below) ;AN000;
147; * IFSR_BUFSIZE DW ? ; length ;AN000;
148; * IFSR_CATEGORY DB 1 ; category 1 for REDIR ;AN000;
149; * IFSR_CTLFUNC DB ? ; For AL=2,3 00F00001H F=0 GET,F=1 SET ;AN000;
150; ; printer string ;AN000;
151; ; For AL=4,5 00F00010H F=0 GET,F=1 SET ;AN000;
152; ; printer flag ;AN000;
153; ;AN000;
154; BUFFER LABEL WORD ; AL=2,3 ;AN000;
155; DATA DB ... ;AN000;
156; ;AN000;
157; BUFFER LABEL WORD ; AL=4,5 ;AN000;
158; DW FLAGS ; Printer mode flags ;AN000;
159; ; 8000H=binary (vs.ascii) ;AN000;
160; ;AN000;
161; ;AN000;
162; CALL routine, CALL_IFS, with pointer to UNC capable IFS header ;AN000;
163; IF IFSR_RETCODE = 0 THEN ;AN000;
164; DO ;AN000;
165; IF AL=5 THEN DX = Flags ;AN000;
166; Call DF_TO_DFL ;AN000;
167; ENDDO ;AN000;
168; ELSE ;AN000;
169; Set carry ;AN000;
170; Put error code in AX ;AN000;
171; ENDIF ;AN000;
172; ;AN000;
173; Outputs: ;AN000;
174; If AL = 3 then CX bytes have been put at input ES:DI ;AN000;
175; If AL = 5 then DX is the flag word ;AN000;
176; ;AN000;
177; Regs: nothing preserved ;AN000;
178; ;AN000;
179; Notes: This request is a REDIR.SYS dependent ioctl request ;AN000;
180; ;AN000;
181;****************************************************************************** ;AN000;
182 ;AN000;
183 procedure PRINTER_GETSET_STRING,NEAR ;AN000;
184ASSUME DS:NOTHING,ES:NOTHING ;AN000;
185 ;AN000;
186 TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; unc (redir.sys) must be ;AN000;
187 JNZ PGS_05 ; installed, else do nothing ;AN000;
188 MOV AX,error_invalid_function ;AN000;
189 transfer ifs_980 ;AN000;
190 ;AN000;
191PGS_05: ;AN000;
192 ifsr_fcn_def EXECAPI ;AN000;
193 ifsr_api_def DEPIOCTL ;AN000;
194 ;AN000;
195 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
196 ; right ;AN000;
197 SaveReg <ES,AX> ; preserve input es since ;AC007;
198 ; next call destroys it ;AN000;
199 ; preserve ax too ;AN007;
200 CALL GET_DFL_FROM_INDEX ; sets [THISDFL], ;AN000;
201 ; ifsr_device_cb@ & ;AN000;
202 ; [THISIFS] ;AN000;
203 JNC PGS_10 ; error on carry - no dfl ;AN000;
204 ADD SP,4 ; restore stack and ;AC007;
205 transfer IFS_980 ; go return in ifsutil ;AC007;
206 ;AN000;
207PGS_10: ;AN000;
208 RestoreReg <AX> ; restore input al ;AN007;
209 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
210 MOV ES:[BX.IFSR_CATEGORY],CATEGORY_REDIR ;AN000;
211 CMP AL,PRINTER_SET_STRING ;AN000;
212 JNE PGS_20 ;AN000;
213 ; printer set string ;AN000;
214 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ; ;AN000;
215 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ; ;AN000;
216 MOV ES:[BX.IFSR_BUFSIZE],CX ; ;AN000;
217 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_STRING ;AN000;
218 ADD SP,2 ; restore stack (es) & ;AN000;
219 JMP SHORT PGS_100 ; go call redir.sys ;AN000;
220 ;AN000;
221PGS_20: ;AN000;
222 CMP AL,PRINTER_GET_STRING ; printer get string ;AN000;
223 JNE PGS_40 ;AN000;
224 POP CX ; retrieve es in cx ;AN000;
225 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ; ;AN000;
226 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000;
227 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_STRING ;AN000;
228 JMP SHORT PGS_100 ;AN000;
229 ;AN000;
230PGS_40: ; flags ;AN000;
231 ADD SP,2 ; 1st clean stack of es ;AN000;
232 PUSH CS ; not needed here ;AN000;
233 POP DS ; must set up buffer ;AN000;
234ASSUME DS:IFSSEG ; to hold flag word ;AN000;
235 MOV SI,OFFSET TEMPBUF ;AN000;
236 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000;
237 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
238 CMP AL,PRINTER_SET_FLAGS ;AN000;
239 JNE PGS_60 ;AN000;
240 MOV DS:[SI],DX ; printer set flags ;AN000;
241 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_FLAGS ;AN000;
242 JMP PGS_100 ;AN000;
243 ;AN000;
244PGS_60: ; printer get flags ;AN000;
245 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_FLAGS ;AN000;
246 ;AN000;
247PGS_100: ;AN000;
248 PUSH AX ; save function ;AN000;
249 ;AN000;
250 PUSH CS ;AN000;
251 POP DS ;AN000;
252ASSUME DS:IFSSEG ;AN000;
253 ;AN000;
254 invoke SET_THISIFS_UNC ; set thisifs to unc ;AN000;
255 ;AN000;
256 invoke CALL_IFS ; call ifs driver w/request ;AN000;
257 ;AN000;
258 JNC PGS_120 ;AN000;
259 ADD SP,2 ; clean stack of ax (fcn #) ;AN013;
260 transfer ifs_980 ; go ret on error ;AN000;
261 ;AN000;
262PGS_120: ;AN000;
263 POP AX ; restore original input fcn ;AN000;;AM013;
264 invoke DF_TO_DFL ; Update dfl entry ;AN000;
265 ;AN000;
266 CMP AL,PRINTER_GET_FLAGS ; if printer get flags ;AN000;
267 JE PGS_140 ; put flags in DX ;AN000;
268 CMP AL,PRINTER_GET_STRING ; if printer get string ;AN000;
269 JE PGS_160 ; put stg size in CX ;AN000;
270 ;AN000;
271 transfer ifs_990 ;AN000;
272PGS_140: ;AN000;
273 LES DI,ES:[BX.IFSR_BUFFER@] ;AN000;
274 MOV DX,WORD PTR ES:[DI] ;AC004;
275 CallInstall Get_User_Stack,multDOS,24 ;AN000;
276 MOV [SI].User_DX,DX ; return user flags to dos ;AN000;
277 transfer ifs_990 ; go return with no carry ;AN000;
278 ;AN000;
279PGS_160: ;AN000;
280 MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000;
281 CallInstall Get_User_Stack,multDOS,24 ;AN000;
282 MOV [SI].User_CX,CX ; Size of pre string just transferred ;AN000;
283 transfer ifs_990 ; go return with no carry ;AN000;
284 ;AN000;
285EndProc PRINTER_GETSET_STRING ;AN000;
286 ;AN000;
287 ;AN000;
288 ;AN000;
289BREAK <IFS_DEVICE_CHECK See if given path is device> ;AN000;
290 ;AN000;
291;****************************************************************************** ;AN000;
292; ;AN000;
293; IFS_DEVICE_CHECK ;AN000;
294; ;AN000;
295; Called by: Dispatcher ;AN000;
296; ;AN000;
297; Routines called: DFL_MATCH DOS: PathChrCmp ;AN000;
298; DFL_TO_DF StrCpy ;AN000;
299; CALL_IFS ;AN000;
300; Inputs: ;AN000;
301; DS:SI -> name ;AN000;
302; ES:DI -> buffer ;AN000;
303; ;AN000;
304; Function: ;AN000;
305; Search DFL for match on name. ;AN000;
306; IF match found THEN ;AN000;
307; DO /* match found */ ;AN000;
308; IF DFL_TYPE = 3 (net device) THEN ;AN000;
309; ES:DI -> parms ;AN000;
310; Clear carry ;AN000;
311; ENDDO ;AN000;
312; ELSE /* no match found */ ;AN000;
313; Set carry ;AN000;
314; ENDIF ;AN000;
315; ;AN000;
316; Outputs: ;AN000;
317; no match: carry set ;AN000;
318; match: carry clear, es:di -> parms if unc ;AN000;
319; ;AN000;
320; ;AN000;
321; Regs: nothing preserved ;AN000;
322; ;AN000;
323; Programming notes: Most of this code lifted right out of the Redirector. ;AN000;
324; ;AN000;
325;****************************************************************************** ;AN000;
326 ;AN000;
327 procedure IFS_DEVICE_CHECK,NEAR ;AN000;
328ASSUME DS:NOTHING,ES:NOTHING ;AN000;
329 ;AN000;
330 ifsr_fcn_def ATTSTAT ;AN000;
331 ;AN000;
332 LocalVar Src,DWORD ; ** netprn parse code begins ;AN000;
333 LocalVar Dst,DWORD ;AN000;
334 LocalVar DotPos,WORD ;AN000;
335 Enter ;AN000;
336; ;AN000;
337; Preserve all of the input quantities ;AN000;
338; ;AN000;
339 MOV SrcL,SI ;AN000;
340 MOV SrcH,DS ;AN000;
341 MOV DstL,DI ;AN000;
342 MOV DstH,ES ;AN000;
343 MOV DotPos,-1 ;AN000;
344; ;AN000;
345; Check for a UNC string. If UNC, is not spooled. ;AN000;
346; ;AN000;
347 MOV AX,[SI] ;AN000;
348 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
349 JNZ NOT_UNC ;AN000;
350 XCHG AH,AL ;AN000;
351 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
352 JZ NOTSpool ;AN000;
353NOT_UNC: ;AN000;
354; ;AN000;
355; Scan string remembering previous path separator char. ;AN000;
356; ;AN000;
357 MOV DI,SI ; remember first character ;AN000;
358PathSkip: ;AN000;
359 LODSB ;AN000;
360 OR AL,AL ;AN000;
361 JZ FoundEnd ;AN000;
362IF Kanji ;AN000;
363 kanji load of next char too ;AN000;
364ENDIF ;AN000;
365 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
366 JZ SaveSI ;AN000;
367 CMP AL,':' ;AN000;
368 JNZ TestDot ;AN000;
369SaveSI: ;AN000;
370 MOV DI,SI ;AN000;
371 JMP PathSkip ;AN000;
372TestDot: ;AN000;
373 CMP AL,'.' ;AN000;
374 JNZ PathSkip ;AN000;
375 MOV DotPos,SI ;AN000;
376 JMP PathSkip ;AN000;
377 ;AN000;
378; ;AN000;
379; Better check for trailing :. They are ILLEGAL (read this comment, IBM) in ;AN000;
380; file names. ;AN000;
381; ;AN000;
382FoundEnd: ;AN000;
383 CMP BYTE PTR [SI-2],':' ;AN000;
384 JNZ NOCOL ;AN000;
385NotSpool: ;AN000;
386 SaveReg <AX,CS> ;AN008;
387 RestoreReg <DS> ;AN008;
388 MOV AX,NULL_PTR ;AN008;
389 MOV WORD PTR [THISDFL],AX ;AN008;
390 MOV WORD PTR [THISDFL+2],AX ;AN008;
391 RestoreReg <AX> ;AN008;
392 LDS SI,Src ;AN000;
393 STC ;AN000;
394Done: ;AN000;
395 LES DI,Dst ;AN000;
396 Leave ;AN000;
397 return ;AN000;
398 ;AN000;
399NotSpoolLv: ;AN000;
400 LeaveCrit critNet ;AN000;
401 JMP NotSpool ;AN000;
402 ;AN000;
403NOCOL: ;AN000;
404 XCHG SI,DI ;AN000;
405; ;AN000;
406; DS:SI points to remainder of string. DS:DI points to 1 past NUL. AL = 0 ;AN000;
407; ;AN000;
408 CMP DotPos,-1 ;AN000;
409 JZ GetP ;AN000;
410 MOV DI,DotPos ;AN000;
411 XCHG AL,[DI-1] ;AN000;
412; ;AN000;
413; DI points to 1 past either former . (now NUL) or terminating NUL. AL has ;AN000;
414; former character (. or NUL) ;AN000;
415; ;AN000;
416 ; ** end of netprn code ;AN000;
417GETP: ; ds:si -> parsed string ;AN000;
418 invoke DFL_MATCH ;AN000;
419 MOV ES,SrcH ;AN000;
420 MOV ES:[DI-1],AL ; replace original character ;AN000;
421 JNC IDC_100 ; not in dfl; set bl=ff ;AN000;
422 JMP NotSpool ;AN000;
423 ;AN000;
424IDC_100: ; match found ;AN000;
425 LES DI,[THISDFL] ;AN000;
426 CMP ES:[DI.DFL_TYPE],TYPE_NET_DEVICE ;AN000;
427 JE IDC_120 ;AN000;
428 LES DI,Dst ;AN000;
429 JMP IDC_220 ;AN000;
430 ;AN000;
431IDC_120: ; ifs: get parms ;AN000;
432 invoke PREP_IFSR ; clear ifsr ;AN003;
433 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN003;
434 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
435 ; ES:BX -> IFSRH ;AN000;
436 ; IFSR_DEVICE_CB@ ;AN000;
437 ; ds - IFSSEG ;AN000;
438 MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AN000;
439 MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AN000;
440 invoke SET_CATEGORY ; this has nothing to do w/catrgory ;AN000;
441 ; want to determine if unc or not ;AN000;
442 OR CL,CL ; unc cl=1, other cl=0 ;AN000;
443 JNE IDC_140 ;AN000;
444 MOV ES:[BX.IFSR_TYPE],TYPE_DEVICE ;AN000;
445 JMP SHORT IDC_160 ;AN000;
446IDC_140: ;AN000;
447 MOV ES:[BX.IFSR_TYPE],TYPE_NET_DEVICE ;AN000;
448IDC_160: ;AN000;
449 PUSH CS ;AN000;
450 POP DS ;AN000;
451ASSUME DS:IFSSEG ;AN000;
452 MOV SI,OFFSET TEMPBUF ;AN000;
453 MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000;
454 MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000;
455 ;AN000;
456 invoke CALL_IFS ;AN000;
457 JNC IDC_200 ;AN008;
458 JMP NotSpool ;AC008;
459 ;AN000;
460IDC_200: ;AN000;
461 MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AN000;
462 MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AN000;
463 MOV BL,ES:[BX.IFSR_TYPE] ;AC001;
464 XOR BH,BH ;AN001;
465 INC SI ; ds:si -> parms returned by redir ;AN000;
466 INC SI ;AN000;
467 LES DI,Dst ;AN000;
468 CallInstall StrCpy,multDOS,17 ;AN000;
469 DEC DI ; now append device name to net path ;AN003;
470 MOV AL,'\' ; | ;AN003;
471 STOSB ; | ;AN003;
472 LDS SI,CS:[THISDFL] ; | ;AN003;
473 ADD SI,2 ; | ;AN003;
474 invoke CONVERT_NAME_ASCIIZ ; | mov name string over ;AN003;
475
476IDC_220: ;AN000;
477 LDS SI,Dst ;AN000;
478 CLC ;AN000;
479 JMP DONE ;AN000;
480 ;AN000;
481 ;AN000;
482EndProc IFS_DEVICE_CHECK ;AN000;
483 ;AN000;
484 ;AN000;
485 ;AN000;
486 ;AN000;
487BREAK <IFS_DEVICE_CLOSE Do a close on a device session directly> ;AN000;
488 ;AN000;
489;****************************************************************************** ;AN000;
490; ;AN000;
491; IFS_DEVICE_CLOSE ;AN000;
492; ;AN000;
493; Called by: IFSFUNC Dispatcher ;AN000;
494; ;AN000;
495; Routines called: ;AN000;
496; SFT_TO_SFF ;AN000;
497; SFF_TO_SFT ;AN000;
498; CALL_IFS ;AN000;
499; ;AN000;
500; Inputs: ES:DI -> SFT ;AN000;
501; ;AN000;
502; Function: ;AN000;
503; Send request below to IFS specified if SFT. ;AN000;
504; ;AN000;
505; Prep IFSRH: ;AN000;
506; * IFSR_LENGTH DW 48 ; Request length ;AN000;
507; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
508; IFSR_RETCODE DW ? ;AN000;
509; IFSR_RETCLASS DB ? ;AN000;
510; IFSR_RESV1 DB 16 DUP(0) ;AN000;
511; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
512; IFSR_ERROR_CLASS DB ? ;AN000;
513; IFSR_ERROR_ACTION DB ? ;AN000;
514; IFSR_ERROR_LOCUS DB ? ;AN000;
515; IFSR_ALLOWED DB ? ;AN000;
516; IFSR_I24_RETRY DB ? ;AN000;
517; IFSR_I24_RESP DB ? ;AN000;
518; IFSR_RESV2 DB ? ;AN000;
519; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
520; * IFSR_OPEN_CB@ DD ? ; SF ;AN000;
521; * IFSR_FUNC DB 0 ; generic IOCTL by handle ;AN000;
522; IFSR_RESV3 DB 0 ;AN000;
523; IFSR_BUFFER@ DD ? ;AN000;
524; IFSR_BUFSIZE DW ? ;AN000;
525; IFSR_CATEGORY DB 1 for UNC, 0 for all other FSs ;AN000;
526; IFSR_CTLFUNC DB 00000101B ; device spool close ;AN000;
527; ;AN000;
528; Outputs: ;AN000;
529; Carry set - error code in AX ;AN000;
530; ;AN000;
531; ;AN000;
532; Regs: nothing preserved ;AN000;
533; ;AN000;
534; ;AN000;
535;****************************************************************************** ;AN000;
536 ;AN000;
537 procedure IFS_DEVICE_CLOSE,NEAR ;AN000;
538ASSUME DS:NOTHING,ES:NOTHING ;AN000;
539 ;AN000;
540 ifsr_fcn_def EXECAPI ;AN000;
541 ifsr_api_def DEPIOCTL ;AN000;
542 ;AN000;
543 SaveReg <DS,SI,ES,DI> ; preserve these for dos - guesing ;AN011;
544 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002;
545 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000;
546 ;AN000;
547 Context DS ;AN000;
548 MOV WORD PTR [THISSFT],DI ;AN000;
549 MOV WORD PTR [THISSFT+2],ES ;AN000;
550
551 invoke PREP_IFSR ; & ifsr ;AM011;
552 invoke SFT_TO_SFF ; sets [THISIFS] ;AN000;
553 ; ES:BX -> IFSRH ;AN000;
554 ; IFSR_OPEN_CB@ ;AN000;
555 ; IFSR_DEVICE_CB@ ;AN000;
556 ; ds - IFSSEG ;AN000;
557 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
558;;;;;;;;INC ES:[BX.IFSR_FUNC] ; inc func from gen_ioctl_by_devnum ;AD011;
559;;;;;;;; ; to gen_ioctl_by_handle ;AD011;
560 invoke SET_CATEGORY ;AN000;
561 MOV ES:[BX.IFSR_CATEGORY],CL ;AN002;
562 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVCLOSE ;AN000;
563 ;AN000;
564 invoke CALL_IFS ; call ifs w/device close request ;AN000;
565 ;AN000;
566 JNC IDCL_60 ;AN000;
567 JMP IDCL_1000 ; go ret w/carry already set ;AC011;
568 ;AN000;
569IDCL_60: ;AN000;
570 invoke SFF_TO_SFT ;AN000;
571;;;;;;;;transfer ifs_990 ;AD011;
572IDCL_1000: ;AN011;
573 RestoreReg <DI,ES,SI,DS> ;AN011;
574 XOR CX,CX ; set zero flag ;AN011;;AC013;
575 return ;AN011;
576 ;AN000;
577 ;AN000;
578EndProc IFS_DEVICE_CLOSE ;AN000;
579 ;AN000;
580 ;AN000;
581BREAK <IFS_DEVICE_OPER Do various device control functions> ;AN000;
582 ;AN000;
583;****************************************************************************** ;AN000;
584; ;AN000;
585; IFS_DEVICE_OPER ;AN000;
586; ;AN000;
587; Called by: IFSFUNC Dispatcher ;AN000;
588; ;AN000;
589; Routines called: PREP_IFSR ;AN000;
590; CALL_IFS ;AN000;
591; DFL_TO_DF ;AN000;
592; ;AN000;
593; Inputs: AL = 7 Get truncate flag ;AN000;
594; AL = 8 Set truncate flag ;AN000;
595; DL = value ;AN000;
596; AL = 9 Close all spool files ;AN000;
597; ;AN000;
598; Function: ;AN000;
599; IF AL=7 THEN DL = [TRUNCATE_FLAG] ;AN000;
600; ELSE DO ;AN000;
601; Get addr of 1st DFL entry. ;AN000;
602; FOR I = 1 to last DFL entry in use ;AN000;
603; Send request below to IFS specified if DFL. ;AN000;
604; ENDDO ;AN000;
605; ;AN000;
606; Prep IFSRH: ;AN000;
607; * IFSR_LENGTH DW 48 ; Request length ;AN000;
608; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609; IFSR_RETCODE DW ? ;AN000;
610; IFSR_RETCLASS DB ? ;AN000;
611; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
613; IFSR_ERROR_CLASS DB ? ;AN000;
614; IFSR_ERROR_ACTION DB ? ;AN000;
615; IFSR_ERROR_LOCUS DB ? ;AN000;
616; IFSR_ALLOWED DB ? ;AN000;
617; IFSR_I24_RETRY DB ? ;AN000;
618; IFSR_I24_RESP DB ? ;AN000;
619; IFSR_RESV2 DB ? ;AN000;
620; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
621; IFSR_OPEN_CB@ DD ? ;AN000;
622; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by device number ;AN000;
623; IFSR_RESV3 DB 0 ;AN000;
624; * IFSR_BUFFER@ DD ? ;AN000;
625; * IFSR_BUFSIZE DW 1 ;AN000;
626; IFSR_CATEGORY DB 1 for UNC, 0 for other FSs ;AN000;
627; IFSR_CTLFUNC DB 00000110 ; device_oper ;AN000;
628; ;AN000;
629; BUFFER LABEL BYTE ;AN000;
630; DB function ; 8 set truncate flag ;AN000;
631; ; 9 close all spool files ;AN000;
632; DB truncate flag on set ;AN000;
633; ;AN000;
634; Outputs: ;AN000;
635; Carry clear - DL = truncate flag on get ;AN000;
636; Carry set - AX = error code ;AN000;
637; ;AN000;
638; Regs: nothing preserved ;AN000;
639; ;AN000;
640; Notes: DFL not updated ;AN000;
641; ;AN000;
642;****************************************************************************** ;AN000;
643 ;AN000;
644 procedure IFS_DEVICE_OPER,NEAR ;AN000;
645 ;AN000;
646 CMP AL,GET_TRUNCATE_FLAG ;AN000;
647 JNE IDO_20 ;AN000;
648 MOV DL,[TRUNCATE_FLAG] ; Get truncate flag ;AN000;
649 XOR DH,DH ;AN015;
650 CallInstall Get_User_Stack,multDOS,24 ;AN015;
651 MOV [SI].User_DX,DX ;AN015;
652 transfer ifs_990 ; go ret no carry ;AN000;
653 ;AN000;
654IDO_20: ; Set truncate flag or close all ;AN000;
655 ifsr_fcn_def EXECAPI ; spool files ;AN000;
656 ifsr_api_def DEPIOCTL ;AN000;
657 ;AN000;
658 PUSH CS ; get addressability to IFSSEG ;AN000;
659 POP DS ;AN000;
660ASSUME DS:IFSSEG,ES:NOTHING ;AN000;
661 ;AN000;
662 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002;
663 CMP AL,SET_TRUNCATE_FLAG ; Set local storage of truncate_flag ;AN000;
664 JNE IDO_30 ;AN000;
665 MOV [TRUNCATE_FLAG],DL ;AC002;
666 MOV AH,DL ; for safekeeping ;AN002;
667 ;AN000;
668IDO_30: ;AN000;
669 MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000;
670 OR CL,CL ; check for no dfl ;AN009;
671 JNZ IDO_35 ;AN009;
672 transfer ifs_990 ; no dfl - just go successfully ;AN009;
673IDO_35:
674 XOR CH,CH ;AN000;
675 MOV DX,SIZE DFLL_LIST ;AN000;
676 LDS SI,[DFLAddr] ;AN000;
677 ;AN000;
678IDO_40: ; ** Loop here thru DFL list entries ;AN000;
679;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ;AN000;
680;;;aliasJE IDO_100 ; skip alias dfl entries ;AN000;
681;;;alias ;AN000;
682 TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ; skip unused dfl entries ;AN000;
683 JZ IDO_100 ;AN000;
684 MOV WORD PTR [THISDFL],SI ; Prep IFSRH ;AN000;
685 MOV WORD PTR [THISDFL+2],DS ;AN000;
686 invoke PREP_IFSR ;AN000;
687 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
688 ; ES:BX -> IFSRH ;AN000;
689 ; IFSR_DEVICE_CB@ ;AN000;
690 ; ds - IFSSEG ;AN000;
691 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
692 MOV SI,OFFSET TEMPBUF ; prep devoper buffer ;AN000;
693 MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000;
694 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
695 MOV BYTE PTR DS:[SI],AL ; buffer contains: db fcn ;AN000;
696 MOV ES:[BX.IFSR_BUFSIZE],1 ;AN002;
697 CMP AL,CLOSE_SPOOL_FILES ; db truncate flag ;AN000;
698 JE IDO_60 ;AN000;
699 MOV BYTE PTR DS:[SI+1],AH ;AC002;
700 INC ES:[BX.IFSR_BUFSIZE]
701IDO_60: ;AN000;
702 invoke SET_CATEGORY ;AN000;
703 MOV ES:[BX.IFSR_CATEGORY],CL ;AN002;
704 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVOPER ;AN000;
705 ;AN000;
706 SaveReg <CX> ; save count ;AN000;
707 invoke CALL_IFS ; call ifs with device oper request ;AN000;
708 RestoreReg <CX> ; restore count ;AN000;
709 ;AN000;
710IDO_100: ;AN000;
711 ADD SI,DX ; prep for next dfl ;AN000;
712 LOOP IDO_40 ; go process next dfl ;AN000;
713 transfer ifs_990 ; Finished. Go ret no carry. ;AN000;
714 ;AN000;
715 ;AN000;
716EndProc IFS_DEVICE_OPER ;AN000;
717 ;AN000;
718 ;AN000;
719BREAK <IFS_SPOOL_ECHO_CHECK See if FS controling LPT1 allows echo> ;AN000;
720 ;AN000;
721;****************************************************************************** ;AN000;
722; ;AN000;
723; IFS_SPOOL_ECHO_CHECK ;AN000;
724; ;AN000;
725; Called by: Dispatcher ;AN000;
726; ;AN000;
727; Routines called: DFL_MATCH ;AN000;
728; DFL_TO_DF ;AN000;
729; CALL_IFS ;AN000;
730; Inputs: None ;AN000;
731; ;AN000;
732; Function: ;AN000;
733; Call DFL_MATCH for match on "LPT1". ;AN000;
734; IF match found THEN ;AN000;
735; DO ;AN000;
736; Prep IFSRH: ;AN000;
737; * IFSR_LENGTH DW 48 ; Request length ;AN000;
738; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
739; IFSR_RETCODE DW ? ;AN000;
740; IFSR_RETCLASS DB ? ;AN000;
741; IFSR_RESV1 DB 16 DUP(0) ;AN000;
742; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
743; IFSR_ERROR_CLASS DB ? ;AN000;
744; IFSR_ERROR_ACTION DB ? ;AN000;
745; IFSR_ERROR_LOCUS DB ? ;AN000;
746; IFSR_ALLOWED DB ? ;AN000;
747; IFSR_I24_RETRY DB ? ;AN000;
748; IFSR_I24_RESP DB ? ;AN000;
749; IFSR_RESV2 DB ? ;AN000;
750; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000;
751; IFSR_OPEN_CB@ DD ? ;AN000;
752; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by devnum ;AN000;
753; IFSR_RESV2 DB 0 ;AN000;
754; * IFSR_BUFFER@ DD ? ;AN000;
755; * IFSR_BUFSIZE DW ? ;AN000;
756; IFSR_CATEGORY DB ? ; 0 non-unc, 1 unc ;AN000;
757; IFSR_CTLFUNC DB 00000011B ;AN000;
758; ;AN000;
759; BUFFER LABEL BYTE ;AN000;
760; DB VALUE,0 ; 0 echo allowed ;AN000;
761; ; 1 echo not allowed ;AN000;
762; ;AN000;
763; ;AN000;
764; Call routine, CALL_IFS, with DFL_IFSR_HDR ;AN000;
765; ENDDO ;AN000;
766; ;AN000;
767; Outputs: ;AN000;
768; Carry clear - echo allowed ;AN000;
769; Carry set - echo NOT allowed ;AN000;
770; ;AN000;
771; ;AN000;
772; Regs: nothing preserved ;AN000;
773; ;AN000;
774; Programming notes: DFL FSDA not updated ;AN000;
775; ;AN000;
776;****************************************************************************** ;AN000;
777 ;AN000;
778 procedure IFS_SPOOL_ECHO_CHECK,NEAR ;AN000;
779ASSUME DS:NOTHING,ES:NOTHING ;AN000;
780 ;AN000;
781 ifsr_fcn_def EXECAPI ;AN000;
782 ifsr_api_def DEPIOCTL ;AN000;
783 ;AN000;
784 SaveReg <ES,DI,DS,SI> ; save these for ibmdos (guessing which) ;AN011;
785 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
786 ; right ;AN000;
787 PUSH CS ; Set ds:si -> "lpt1",0 ;AN000;
788 POP DS ; want to find dfl entry with ;AN000;
789ASSUME DS:IFSSEG ; this dev name ;AN000;
790 MOV SI,OFFSET LPT1_NAME ;AN000;
791 ;AN000;
792 invoke DFL_MATCH ;AN000;
793 JNC ISEC_10 ;AN000;
794 CLC ; not in dfl; assume echo ok ;AN011;
795 JMP ISEC_1000 ;AC011;
796 ;AN000;
797ISEC_10: ;AN000;
798 LES DI,[THISDFL] ;AN000;
799;;;aliasCMP ES:[DI.DFL_TYPE],TYPE_ALIAS ;AN000;
800;;;aliasJNE ISEC_15 ;AN000;
801;;;aliastransfer ifs_980 ; lpt1 is alias, assume no echo ;AN000;
802 ;AN000;
803ISEC_15: ;AN000;
804 invoke PREP_IFSR ; zero out ifsr ;AN000;
805 invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000;
806 ; ES:BX -> IFSRH ;AN000;
807 ; IFSR_DEVICE_CB@ ;AN000;
808 ; ds - IFSSEG ;AN000;
809 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
810 MOV SI,OFFSET TEMPBUF ;AN000;
811 MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ; use tempbuf for ;AN000;
812 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ; return byte value ;AN000;
813 MOV ES:[BX.IFSR_BUFSIZE],LENGTH_DEVECHOCHECK_BUFFER ; (1) ;AN000;
814 ;AN000;
815 invoke SET_CATEGORY ;AN000;
816 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVECHOCHECK ; (00000011) ;AN000;
817 ;AN000;
818 invoke CALL_IFS ;AN000;
819 ;AN000;
820 JNC ISEC_60 ;AN000;
821 JMP SHORT ISEC_1000 ; no echo on err, cf set ;AC011;
822 ;AN000;
823ISEC_60: ;AN000;
824 CMP BYTE PTR DS:[SI],0 ; else byte returned in buffr ;AN000;
825 JE ISEC_80 ; determines echo (0-yes,1-no) ;AN000;
826 STC ;AN011;
827 JMP SHORT ISEC_1000 ; no echo ret ;AC011;
828ISEC_80: ;AN000;
829 CLC ;AN011;
830
831
832ISEC_1000: ; echo ret ;AN011;
833 RestoreReg <SI,DS,DI,ES> ;AN011;
834 RET ;AN011;
835
836 ;AN000;
837EndProc IFS_SPOOL_ECHO_CHECK ;AN000;
838 ;AN000;
839BREAK <IFS_DEPENDENT_IOCTL - dependent ioctl> ;AN000;
840 ;AN000;
841;****************************************************************************** ;AN000;
842; ;AN000;
843; IFS_DEPENDENT_IOCTL ;AN000;
844; ;AN000;
845; Called by: Dispatcher ;AN000;
846; ;AN000;
847; Routines called: CALL_IFS ;AN000;
848; CDS_TO_CD SFT_TO_SFF ;AN000;
849; CD_TO_CDS SFF_TO_SFT ;AN000;
850; ;AN000;
851; Inputs: ;AN000;
852; AL = 0 - Generic by device number ;AN000;
853; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000;
854; CX = private subfunction ;AN000;
855; DS:DX -> buffer ;AN000;
856; AL = 1 - Generic by handle ;AN000;
857; BX = handle [THISSFT] set ;AN000;
858; CX = private subfunction ;AN000;
859; DS:DX -> buffer ;AN000;
860; AL = 2 - Query OS type ;AN000;
861; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000;
862; CX = buffer size ;AN000;
863; ES:DI -> buffer ;AN000;
864; ;AN000;
865; Function: ;AN000;
866; Prep IFSRH: ;AN000;
867; * IFSR_LENGTH DW 48 ; Request length ;AN000;
868; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
869; IFSR_RETCODE DW ? ;AN000;
870; IFSR_RETCLASS DB ? ;AN000;
871; IFSR_RESV1 DB 16 DUP(0) ;AN000;
872; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000;
873; IFSR_ERROR_CLASS DB ? ;AN000;
874; IFSR_ERROR_ACTION DB ? ;AN000;
875; IFSR_ERROR_LOCUS DB ? ;AN000;
876; IFSR_ALLOWED DB ? ;AN000;
877; IFSR_I24_RETRY DB ? ;AN000;
878; IFSR_I24_RESP DB ? ;AN000;
879; IFSR_RESV2 DB ? ;AN000;
880; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (subfs 0,2) ;AN000;
881; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SFF (subf 1) ;AN000;
882; * IFSR_FUNC DB 0 ; AL - 0,1,or 2 ;AN000;
883; IFSR_RESV2 DB 0 ;AN000;
884; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000;
885; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000;
886;;;; for al=0,1 ;AN000;
887; * IFSR_CATEGORY DB 1 ; 1 for UNC, 0 for non-UNC ;AN000;
888; * IFSR_CTLFUNC DB ? ; al-2 ???, else cx ;AN000;
889; ;AN000;
890; ;AN000;
891; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
892; IF IFSR_RETCODE = 0 THEN ;AN000;
893; DO ;AN000;
894; IF CDS THEN ;AN000;
895; Call CD_TO_CDS ;AN000;
896; ELSE Call SFF_TO_SFT ;AN000;
897; ENDDO ;AN000;
898; ELSE ;AN000;
899; Set carry ;AN000;
900; Put error code in AX ;AN000;
901; ENDIF ;AN000;
902; ;AN000;
903; Outputs: function dependent ;AN000;
904; ;AN000;
905; Regs: nothing preserved ;AN000;
906; ;AN000;
907;****************************************************************************** ;AN000;
908 ;AN000;
909 procedure IFS_DEPENDENT_IOCTL,NEAR ;AN000;
910ASSUME DS:NOTHING,ES:NOTHING ;AN000;
911 ;AN000;
912 ifsr_fcn_def EXECAPI ;AN000;
913 ifsr_api_def DEPIOCTL ;AN000;
914 ;AN000;
915 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
916 ; right ;AN000;
917 SaveReg <BX,ES> ; save input es for query os type ;AC006;
918 ; and bx for drive # / handle ;AN006;
919 ;AN000;
920 MOV CS:IFSPROC_FLAGS,ZERO ; init ifsfunc flags ;AN000;
921 invoke PREP_IFSR ; & IFSR ;AN000;
922 ;AN000;
923 invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000;
924 MOV ES:[BX.IFSR_FUNC],AL ; 0,1, or 2 ;AN000;
925 CMP AL,QUERY_OS_TYPE ;AN000;
926 JE IDI_10 ;AN000;
927 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ; ioctl generic ;AN000;
928 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000;
929 MOV ES:[BX.IFSR_CTLFUNC],CL ;AN000;
930 ADD SP,2 ; ditch es stored on stack ;AN000;
931 JMP SHORT IDI_15 ;AN000;
932IDI_10: ; query os type ;AN000;
933 MOV ES:[BX.IFSR_BUFSIZE],CX ; cx is bufsize ;AN000;
934 POP CX ; pop input es in cx ;AN000;
935 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ;AN000;
936 MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000;
937IDI_15: ;AN000;
938 CMP AL,GEN_IOCTL_BY_HANDLE ;AN000;
939 RestoreReg <CX> ; restore input bx into ax, no cx ;AN006;;AC012;
940 ; (drive # or handle) ;AN006;
941 JE IDI_20 ;AN000;
942 ;AN000;
943;;;;;;; LDS SI,[THISCDS] ; have device number (block only???) ;AD006;
944 ; Now get CDS: ;AN006;
945 SaveReg <AX> ; function 0,1,2 ;AN012;
946 MOV AX,CX ; input bx ;AN012;
947 DEC AL ; make 0-based ;AN006;
948 MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN006;
949 CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN006;
950 RestoreReg <AX> ; fcn 0,1,2 ;AN012;
951 JNC IDI_17 ;AN006;
952IDI_16: ;AN012;
953 MOV AX,error_invalid_drive ; no cds, set error & ret ;AN006;
954 JMP IDI_120 ; ret up in FA to preserve DS ;AN006;
955IDI_17: ; (welcome lock) ;AN006;
956 TEST DS:[SI.curdir_flags],curdir_isifs ; check if drive ifs ;AN012;
957 JZ IDI_16
958 SaveReg <DS,SI> ; save cds ptr al=0,2 ;AN000;
959 OR IFSPROC_FLAGS,ISCDS ;AN000;
960 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
961 ; IFSR_DEVICE_CB@ ;AN000;
962 ; ds - netwrk ;AN000;
963 CMP AL,QUERY_OS_TYPE ;AN000;
964 JNE IDI_40 ;AN000;
965 JMP SHORT IDI_60 ;AN000;
966 ;AN000;
967IDI_20: ; al=1 ;AN000;
968 Context DS ;AN000;
969 OR IFSPROC_FLAGS,SETDEVICECB ;AN000;
970 ; Now, need to get THISSFT set: ;AN006;
971 SaveReg <ES,DI,BX> ; these about to be clobbered ;AN006;
972 MOV BX,CX ; put handle in bx ;AC012;
973 CallInstall pJFNFromHandle,multDOS,32 ; intermediate step to getting sft ;AN006;
974 JC IDI_25 ;AN006;
975 CMP BYTE PTR ES:[DI],-1 ; unused handle ;AN006;
976 JE IDI_25 ;AN006;
977 MOV BL,BYTE PTR ES:[DI] ; get SFN ;AN006;
978 XOR BH,BH ; ignore upper half ;AN006;
979 CallInstall SFFromSFN,multDOS,22 ; get real sf spot ;AN006;
980 MOV WORD PTR [THISSFT],DI ;AN006;
981 MOV WORD PTR [THISSFT+2],ES ;AN006;
982 RestoreReg <BX,DI,ES> ;AN006;
983 JMP SHORT IDI_30 ;AN006;
984IDI_25: ; sft error ;AN006;
985 RestoreReg <BX,DI,ES> ; restore regs ;AN006;
986 MOV AX,error_invalid_handle ;AN006;
987 JMP IDI_120 ;AN006;
988
989IDI_30: ;AN006;
990 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
991 ; IFSR_OPEN_CB@ ;AN000;
992 ; ds - netwrk ;AN000;
993IDI_40: ;AN000;
994 invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000;
995 MOV ES:[BX.IFSR_CATEGORY],CL ;AN000;
996IDI_60:
997 MOV DX,IFSIOCTL ; check if fs supports fs ioctl
998 invoke CHECK_IFS_ATTRIBUTE
999 JZ IDI_80 ; Z = no support, NZ = yes support
1000 JMP DI_70 ; continues in device_ioctl ;AN000;
1001 ;AN000;
1002IDI_80: ; error invalid fcn - fs doesn't support ;AN000;
1003 TEST IFSPROC_FLAGS,ISCDS ; if cds, must clean stack of ;AN000;
1004 JZ IDI_100 ; cds ptr ;AN000;
1005 ADD SP,4 ;AN000;
1006IDI_100: ;AN000;
1007 MOV AX,error_invalid_function ;AN000;
1008IDI_120: ;AN006;
1009 invoke SET_EXTERR_INFO ; set error info ;AN006;
1010 transfer ifs_980 ; go to general error return ;AN000;
1011 ;AN000;
1012EndProc IFS_DEPENDENT_IOCTL ;AN000;
1013
1014
1015BREAK <DEVICE_IOCTL - device ioctl> ;AN000;
1016 ;AN000;
1017;******************************************************************************
1018;
1019; DEVICE_IOCTL
1020;
1021; Called by: Dispatcher
1022;
1023; Routines called: CALL_IFS
1024; CDS_TO_CD SFT_TO_SFF
1025; CD_TO_CDS SFF_TO_SFT
1026;
1027; Inputs:
1028; AL = 02H(03H0 Read from(Write to) character device
1029; BX = handle [THISSFT] set
1030; CX = number of bytes to read(write)
1031; DS:DX -> buffer
1032; AL = 0CH Character Generic IOCTL
1033; CH = 1-async, 3-display, 5-printer
1034; CL = 5F-set, 7F-get
1035; DS:DX -> buffer
1036; AL = 0DH Block Generic IOCTL
1037; BH = 0
1038; BL = Drive number [THISCDS] set (0-based)
1039; CH = 08
1040; CL = 43-set, 63-get media id
1041; DS:DX -> buffer
1042;
1043; Function:
1044; Prep IFSRH:
1045; * IFSR_LENGTH DW 48 ; Request length
1046; * IFSR_FUNCTION DB 4 ; Execute API function
1047; IFSR_RETCODE DW ?
1048; IFSR_RETCLASS DB ?
1049; IFSR_RESV1 DB 16 DUP(0)
1050; * IFSR_APIFUNC DB 17 ; IFS device IOCTL
1051; IFSR_ERROR_CLASS DB ?
1052; IFSR_ERROR_ACTION DB ?
1053; IFSR_ERROR_LOCUS DB ?
1054; IFSR_ALLOWED DB ?
1055; IFSR_I24_RETRY DB ?
1056; IFSR_I24_RESP DB ?
1057; IFSR_RESV2 DB ?
1058; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (0DH)
1059; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SF (0CH)
1060; * IFSR_FUNC DB 0 ; AL 2,3,12,or 13
1061; IFSR_RESV2 DB 0
1062; * IFSR_BUFFER@ DD ? ; ds:dx
1063; * IFSR_BUFSIZE DW ? ; cx for al=2,3
1064; * IFSR_CATEGORY DB 1 ; ch for al=12,13
1065; * IFSR_CTLFUNC DB ? ; cl for al=12,13
1066;
1067;
1068; CALL routine, CALL_IFS
1069; IF IFSR_RETCODE = 0 THEN
1070; DO
1071; IF CDS THEN
1072; Call CD_TO_CDS
1073; ELSE Call SFF_TO_SFT
1074; ENDDO
1075; ELSE
1076; Set carry
1077; Put error code in AX
1078; ENDIF
1079;
1080; Outputs: function dependent
1081;
1082; Regs: nothing preserved
1083;
1084;******************************************************************************
1085 ;AN000;
1086 procedure DEVICE_IOCTL,NEAR ;AN000;
1087ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1088 ;AN000;
1089; mov ax,26 ; these two instrs temporary
1090; transfer ifs_980
1091
1092 ifsr_fcn_def EXECAPI ;AN000;
1093 ifsr_api_def DEVIOCTL ;AN000;
1094 ;AN000;
1095 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
1096 ; right ;AN000;
1097 PUSH DS ; save input ds ;AN000;
1098 ;AN000;
1099 MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000;
1100 invoke PREP_IFSR ; & ifsr ;AN000;
1101 POP ES:WORD PTR [BX.IFSR_BUFFER@+2] ; put input ds in now before clobber it ;AN005;
1102 ;AN000;
1103 CMP AL,BLOCK_GENERIC ;AN000;
1104 JNE DI_20 ;AN000;
1105 ;AN000;
1106 LDS SI,[THISCDS] ; block generic - cds processing ;AN000;
1107 SaveReg <DS,SI> ; save cds ptr ;AN000;
1108 OR IFSPROC_FLAGS,ISCDS ;AN000;
1109 invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000;
1110 ; IFSR_DEVICE_CB@ ;AN000;
1111 ; ds - netwrk ;AN000;
1112 JMP SHORT DI_40 ;AN000;
1113 ;AN000;
1114DI_20: ; handle function ;AN000;
1115 OR CS:IFSPROC_FLAGS,SetDeviceCB ; to get possible related cd or df ;AN000;
1116 Context DS ;AN000;
1117 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
1118 ; IFSR_OPEN_CB@ ;AN000;
1119 ; ds - netwrk ;AN000;
1120DI_40: ;AN000;
1121 MOV ES:[BX.IFSR_LENGTH],LENGTH_DEVIOCTL ;AN000;
1122 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
1123 MOV ES:[BX.IFSR_APIFUNC],IFSDEVIOCTL ;AN000;
1124 MOV ES:[BX.IFSR_FUNC],AL ; 2,3,12 or 13 ;AN000;
1125;;;;; POP DS ; retrieve input ds ;AD005;
1126 MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ;AN000;
1127;;;;; MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AD005;
1128 CMP AL,CHAR_GENERIC ; fork 2,3 vs 12,13 ;AN000;
1129 JGE DI_60 ; go if 12,13
1130 MOV ES:[BX.IFSR_BUFSIZE],CX ; 2,3 processing
1131 JMP SHORT DI_70
1132DI_60: ; 12,13 processing
1133 MOV ES:[BX.IFSR_CATEGORY],CH ; 1,3,5,or 8
1134 MOV ES:[BX.IFSR_CTLFUNC],CL ; 5F,7F,4E,or 6E
1135 ;AN000;
1136DI_70: ;AN000;
1137;-----------------------------------------------------------------------------------------
1138 invoke CALL_IFS ; call ifs driver w/request ;AN000;
1139;-----------------------------------------------------------------------------------------
1140 ;AN000;
1141 JNC DI_100 ;AN000;
1142 TEST IFSPROC_FLAGS,ISCDS ; error return ;AN000;
1143 JNZ DI_80 ; if cds clean up stack ;AN000;
1144 transfer ifs_1000 ; go return in ifsutil ;AN000;
1145DI_80: ;AN000;
1146 ADD SP,4 ; restore stack ;AN000;
1147 transfer ifs_980 ;AN000;
1148 ;AN000;
1149DI_100: ;AN000;
1150 TEST IFSPROC_FLAGS,ISCDS ;AN000;
1151 JNZ DI_120 ;AN000;
1152 MOV AX,ES:[BX.IFSR_BUFSIZE] ; set return size for 2,3 (won't hurt ;AN000;
1153 invoke SFF_TO_SFT ; for 12 either ;AN000;
1154 transfer ifs_990 ;AN000;
1155DI_120: ;AN000;
1156 MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000;
1157 RestoreReg <DI,ES> ; restore cds ptr into esdi ;AN000;
1158 invoke CD_TO_CDS ;AN000;
1159 transfer ifs_990 ;AN000;
1160 ;AN000;
1161 ;AN000;
1162EndProc DEVICE_IOCTL ;AN000;
1163 ;AN000;
1164 ;AN000;
1165 ;AN000;
1166BREAK <GET_DFL_FROM_INDEX Get DFL entry from index> ;AN000;
1167 ;AN000;
1168;****************************************************************************** ;AN000;
1169; ;AN000;
1170; GET_DFL_FROM_INDEX ;AN000;
1171; ;AN000;
1172; Called by: PRINTER_GETSET_STRING ;AN000;
1173; ;AN000;
1174; Routines called: none ;AN000;
1175; ;AN000;
1176; Inputs: ;AN000;
1177; BX is index number (as in GetIFSFUNCItem) ;AN000;
1178; ;AN000;
1179; Outputs: ;AN000;
1180; Carry Clear ;AN000;
1181; [THISDFL] set ;AN000;
1182; Carry Set ;AN000;
1183; Bad index number ;AN000;
1184; ;AN000;
1185; Regs: Preserves Printer Get/Set String input regs ;AN000;
1186; ;AN000;
1187;****************************************************************************** ;AN000;
1188 ;AN000;
1189 procedure GET_DFL_FROM_INDEX,NEAR ;AN000;
1190ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1191 ;AN000;
1192 SaveReg <DS,SI,CX,DX> ; save Ptr GetSet Str input regs ;AC007;
1193 ; (removed ax from above) ;AN007;
1194 PUSH BX ;AN000;
1195; Compute index # of first device ;AN000;
1196 XOR BX,BX ;AN000;
1197 MOV CX,BX ;AN000;
1198 Context DS ; DS-Dosgroup ;AN003;
1199 MOV CL,[CDSCount] ;AN000;
1200 LDS SI,[CDSAddr] ; Assume not paused ;AN000;
1201 CMP CS:[fAssign],0 ;AN000;
1202 JNZ GDFI_20 ;AN000;
1203 LDS SI,CS:[CDSAlt] ; Paused, get REAL CDSs from here ;AN000;
1204GDFI_20: ;AN000;
1205 TEST [SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000;
1206 JZ GDFI_40 ;AN000;
1207 INC BX ;AN000;
1208;;; TEST [SI.CURDIR_TYPE],TYPE_NET_DRIVE ;AD003;
1209;;; JZ GDFI_40 ; count 2 for redir ;AD003;
1210;;; INC BX ;AD003;
1211GDFI_40: ;AN000;
1212 ADD SI,SIZE CURDIR_LIST ; Next CDS ;AN000;
1213 LOOP GDFI_20 ;AN000;
1214 ; BX is index # of first device ;AN000;
1215 POP AX ; Get user index # ;AN000;
1216 SUB AX,BX ;AN000;
1217 JB GDFI_60 ; if carry set (JB), user index < ;AN000;
1218 ; 1st device index - too low ;AN000;
1219 ; go return w/carry already set ;AN000;
1220 MOV CL,CS:[DFLCount] ;AN000;
1221 CMP CL,AL ; AL is now device index # ;AN000;
1222 JAE GDFI_80 ;AN000;
1223GDFI_60: ;AN000;
1224 MOV AX,error_invalid_parameter ; user index too high ;AN000;
1225 JMP GDFI_980 ; go return w/carry already set ;AN000;
1226GDFI_80: ;AN000;
1227 LDS SI,CS:[DFLAddr] ;AN000;
1228 MOV BL,SIZE DFLL_list ; size in convenient spot ;AN000;
1229;;; DEC AX ;AD003
1230 MUL BL ; get net offset ;AN000;
1231 ADD SI,AX ; convert to true pointer ;AN000;
1232 TEST DS:[SI.DFLL_FLAGS],dfl_inuse ; is this device attached????? ;AN014;
1233 JZ GDFI_60 ; error if not
1234 ;AN000;
1235 PUSH DS ;AN000;
1236 POP DX ;AN000;
1237 PUSH CS ;AN000;
1238 POP DS ;AN000;
1239ASSUME DS:IFSSEG ;AN000;
1240 MOV WORD PTR [THISDFL],SI ;AN000;
1241 MOV WORD PTR [THISDFL+2],DX ;AN000;
1242 invoke PREP_IFSR ; init ifsr ;AN000;
1243 invoke DFL_TO_DF ;AN000;
1244 JMP GDFI_990 ;AN000;
1245 ;AN000;
1246 ;AN000;
1247GDFI_980: ; Return area ;AN000;
1248 SaveReg <AX,CS> ; set thisdfl null on error ;AN008;
1249 RestoreReg <DS> ;AN008;
1250 MOV AX,NULL_PTR ;AN008;
1251 MOV WORD PTR [THISDFL],AX ;AN008;
1252 MOV WORD PTR [THISDFL+2],AX ;AN008;
1253 RestoreReg <AX> ;AN008;
1254 STC ;AN000;
1255 JMP GDFI_1000 ;AN000;
1256GDFI_990: ;AN000;
1257 CLC ;AN000;
1258GDFI_1000: ;AN000;
1259 RestoreReg <DX,CX,SI,DS> ; restore regs ;AC007;
1260 ; (removed ax from above) ;AN007;
1261 return ;AN000;
1262 ;AN000;
1263EndProc GET_DFL_FROM_INDEX ;AN000;
1264 ;AN000;
1265 ;AN000;
1266IFSSEG ENDS ;AN000;
1267 END ;AN000;