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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / IFSFUNC / IFSDEV.ASM
1 PAGE ,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000;
3 TITLE IFSFUNC DEVICE ROUTINES - Device/IOCTL routines ;AN000;
4 NAME 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;
48 INCLUDE IFSSYM.INC ;AN000;
49 INCLUDE IFSFSYM.INC ;AN000;
50 INCLUDE DOSSYM.INC ;AN000;
51 INCLUDE DEVSYM.INC ;AN000;
52 .cref ;AN000;
53 .list ;AN000;
54 ;AN000;
55 AsmVars <IBM,KANJI,DEBUG> ;AN000;
56 ;AN000;
57 ; define the base code segment of the network support first ;AN000;
58 ;AN000;
59 IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
60 IFSSEG ENDS ;AN000;
61 ;AN000;
62 ; include THE REST Of the segment definitions for normal MSDOS ;AN000;
63 ;AN000;
64 .xlist ;AN000;
65 include dosseg.asm ;AN000;
66 .list ;AN000;
67 ;AN000;
68 DATA 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;
75 DATA ENDS ;AN000;
76 ;AN000;
77 ;AN000;
78 IFSSEG 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;
100 BREAK <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;
184 ASSUME 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;
191 PGS_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;
207 PGS_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;
221 PGS_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;
230 PGS_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;
234 ASSUME 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;
244 PGS_60: ; printer get flags ;AN000;
245 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_FLAGS ;AN000;
246 ;AN000;
247 PGS_100: ;AN000;
248 PUSH AX ; save function ;AN000;
249 ;AN000;
250 PUSH CS ;AN000;
251 POP DS ;AN000;
252 ASSUME 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;
262 PGS_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;
272 PGS_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;
279 PGS_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;
285 EndProc PRINTER_GETSET_STRING ;AN000;
286 ;AN000;
287 ;AN000;
288 ;AN000;
289 BREAK <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;
328 ASSUME 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;
353 NOT_UNC: ;AN000;
354 ; ;AN000;
355 ; Scan string remembering previous path separator char. ;AN000;
356 ; ;AN000;
357 MOV DI,SI ; remember first character ;AN000;
358 PathSkip: ;AN000;
359 LODSB ;AN000;
360 OR AL,AL ;AN000;
361 JZ FoundEnd ;AN000;
362 IF Kanji ;AN000;
363 kanji load of next char too ;AN000;
364 ENDIF ;AN000;
365 CallInstall PathChrCmp,multDOS,4,<AX>,<AX> ;AN000;
366 JZ SaveSI ;AN000;
367 CMP AL,':' ;AN000;
368 JNZ TestDot ;AN000;
369 SaveSI: ;AN000;
370 MOV DI,SI ;AN000;
371 JMP PathSkip ;AN000;
372 TestDot: ;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;
382 FoundEnd: ;AN000;
383 CMP BYTE PTR [SI-2],':' ;AN000;
384 JNZ NOCOL ;AN000;
385 NotSpool: ;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;
394 Done: ;AN000;
395 LES DI,Dst ;AN000;
396 Leave ;AN000;
397 return ;AN000;
398 ;AN000;
399 NotSpoolLv: ;AN000;
400 LeaveCrit critNet ;AN000;
401 JMP NotSpool ;AN000;
402 ;AN000;
403 NOCOL: ;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;
417 GETP: ; 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;
424 IDC_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;
431 IDC_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;
446 IDC_140: ;AN000;
447 MOV ES:[BX.IFSR_TYPE],TYPE_NET_DEVICE ;AN000;
448 IDC_160: ;AN000;
449 PUSH CS ;AN000;
450 POP DS ;AN000;
451 ASSUME 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;
460 IDC_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
476 IDC_220: ;AN000;
477 LDS SI,Dst ;AN000;
478 CLC ;AN000;
479 JMP DONE ;AN000;
480 ;AN000;
481 ;AN000;
482 EndProc IFS_DEVICE_CHECK ;AN000;
483 ;AN000;
484 ;AN000;
485 ;AN000;
486 ;AN000;
487 BREAK <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;
538 ASSUME 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;
569 IDCL_60: ;AN000;
570 invoke SFF_TO_SFT ;AN000;
571 ;;;;;;;;transfer ifs_990 ;AD011;
572 IDCL_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;
578 EndProc IFS_DEVICE_CLOSE ;AN000;
579 ;AN000;
580 ;AN000;
581 BREAK <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;
654 IDO_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;
660 ASSUME 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;
668 IDO_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;
673 IDO_35:
674 XOR CH,CH ;AN000;
675 MOV DX,SIZE DFLL_LIST ;AN000;
676 LDS SI,[DFLAddr] ;AN000;
677 ;AN000;
678 IDO_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]
701 IDO_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;
710 IDO_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;
716 EndProc IFS_DEVICE_OPER ;AN000;
717 ;AN000;
718 ;AN000;
719 BREAK <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;
779 ASSUME 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;
789 ASSUME 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;
797 ISEC_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;
803 ISEC_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;
823 ISEC_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;
828 ISEC_80: ;AN000;
829 CLC ;AN011;
830
831
832 ISEC_1000: ; echo ret ;AN011;
833 RestoreReg <SI,DS,DI,ES> ;AN011;
834 RET ;AN011;
835
836 ;AN000;
837 EndProc IFS_SPOOL_ECHO_CHECK ;AN000;
838 ;AN000;
839 BREAK <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;
910 ASSUME 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;
932 IDI_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;
937 IDI_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;
952 IDI_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;
955 IDI_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;
967 IDI_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;
984 IDI_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
989 IDI_30: ;AN006;
990 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
991 ; IFSR_OPEN_CB@ ;AN000;
992 ; ds - netwrk ;AN000;
993 IDI_40: ;AN000;
994 invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000;
995 MOV ES:[BX.IFSR_CATEGORY],CL ;AN000;
996 IDI_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;
1002 IDI_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;
1006 IDI_100: ;AN000;
1007 MOV AX,error_invalid_function ;AN000;
1008 IDI_120: ;AN006;
1009 invoke SET_EXTERR_INFO ; set error info ;AN006;
1010 transfer ifs_980 ; go to general error return ;AN000;
1011 ;AN000;
1012 EndProc IFS_DEPENDENT_IOCTL ;AN000;
1013
1014
1015 BREAK <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;
1087 ASSUME 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;
1114 DI_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;
1120 DI_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
1132 DI_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;
1136 DI_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;
1145 DI_80: ;AN000;
1146 ADD SP,4 ; restore stack ;AN000;
1147 transfer ifs_980 ;AN000;
1148 ;AN000;
1149 DI_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;
1155 DI_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;
1162 EndProc DEVICE_IOCTL ;AN000;
1163 ;AN000;
1164 ;AN000;
1165 ;AN000;
1166 BREAK <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;
1190 ASSUME 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;
1204 GDFI_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;
1211 GDFI_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;
1223 GDFI_60: ;AN000;
1224 MOV AX,error_invalid_parameter ; user index too high ;AN000;
1225 JMP GDFI_980 ; go return w/carry already set ;AN000;
1226 GDFI_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;
1239 ASSUME 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;
1247 GDFI_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;
1256 GDFI_990: ;AN000;
1257 CLC ;AN000;
1258 GDFI_1000: ;AN000;
1259 RestoreReg <DX,CX,SI,DS> ; restore regs ;AC007;
1260 ; (removed ax from above) ;AN007;
1261 return ;AN000;
1262 ;AN000;
1263 EndProc GET_DFL_FROM_INDEX ;AN000;
1264 ;AN000;
1265 ;AN000;
1266 IFSSEG ENDS ;AN000;
1267 END ;AN000;