1 PAGE
,132 ; \ f ;AN000;
2 ; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000;
3 TITLE IFSFUNC DEVICE ROUTINES
- Device
/IOCTL routines
;AN000;
6 ;******************************************************************************
8 ; Device related IFS calls
10 ; Printer_GetSet_String
14 ; IFS_Spool_Echo_Check
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.
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
44 ;******************************************************************************
48 INCLUDE IFSSYM
.INC ;AN000;
49 INCLUDE IFSFSYM
.INC ;AN000;
50 INCLUDE DOSSYM
.INC ;AN000;
51 INCLUDE DEVSYM
.INC ;AN000;
55 AsmVars
<IBM
,KANJI
,DEBUG
> ;AN000;
57 ; define the base code segment of the network support first ;AN000;
59 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
62 ; include THE REST Of the segment definitions for normal MSDOS ;AN000;
65 include dosseg
.asm
;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;
78 IFSSEG
SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
79 ASSUME
SS:DOSGROUP
,CS:IFSSEG
;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;
100 BREAK <PRINTER_GETSET_STRING Get
/Set a Pre
-pend string
> ;AN000;
102 ;****************************************************************************** ;AN000;
104 ; PRINTER_GETSET_STRING Get or Set the printer string and flag word ;AN000;
106 ; Called by: Dispatcher ;AN000;
108 ; Routines called: CALL_IFS DOS: Get_User_Stack ;AN000;
109 ; GET_DFL_FROM_INDEX ;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;
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;
154 ; BUFFER LABEL WORD ; AL=2,3 ;AN000;
155 ; DATA DB ... ;AN000;
157 ; BUFFER LABEL WORD ; AL=4,5 ;AN000;
158 ; DW FLAGS ; Printer mode flags ;AN000;
159 ; ; 8000H=binary (vs.ascii) ;AN000;
162 ; CALL routine, CALL_IFS, with pointer to UNC capable IFS header ;AN000;
163 ; IF IFSR_RETCODE = 0 THEN ;AN000;
165 ; IF AL=5 THEN DX = Flags ;AN000;
166 ; Call DF_TO_DFL ;AN000;
170 ; Put error code in AX ;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;
177 ; Regs: nothing preserved ;AN000;
179 ; Notes: This request is a REDIR.SYS dependent ioctl request ;AN000;
181 ;****************************************************************************** ;AN000;
183 procedure PRINTER_GETSET_STRING
,NEAR ;AN000;
184 ASSUME
DS:NOTHING
,ES:NOTHING
;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;
192 ifsr_fcn_def EXECAPI
;AN000;
193 ifsr_api_def DEPIOCTL
;AN000;
195 MOV CS:DEVICE_CB@_OFFSET
,IFSR_DEVICE_CB@
; make sure this positioned ;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;
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;
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;
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;
222 CMP AL,PRINTER_GET_STRING
; printer get string ;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;
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;
240 MOV DS:[SI],DX ; printer set flags ;AN000;
241 MOV ES:[BX.IFSR_CTLFUNC
],CTLFUNC_PRINTER_SET_FLAGS
;AN000;
244 PGS_60: ; printer get flags ;AN000;
245 MOV ES:[BX.IFSR_CTLFUNC
],CTLFUNC_PRINTER_GET_FLAGS
;AN000;
248 PUSH AX ; save function ;AN000;
252 ASSUME
DS:IFSSEG
;AN000;
254 invoke SET_THISIFS_UNC
; set thisifs to unc ;AN000;
256 invoke CALL_IFS
; call ifs driver w/request ;AN000;
259 ADD SP,2 ; clean stack of ax (fcn #) ;AN013;
260 transfer ifs_980
; go ret on error ;AN000;
263 POP AX ; restore original input fcn ;AN000;;AM013;
264 invoke DF_TO_DFL
; Update dfl entry ;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;
271 transfer ifs_990
;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;
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;
285 EndProc PRINTER_GETSET_STRING
;AN000;
289 BREAK <IFS_DEVICE_CHECK See
if given path is device
> ;AN000;
291 ;****************************************************************************** ;AN000;
293 ; IFS_DEVICE_CHECK ;AN000;
295 ; Called by: Dispatcher ;AN000;
297 ; Routines called: DFL_MATCH DOS: PathChrCmp ;AN000;
298 ; DFL_TO_DF StrCpy ;AN000;
301 ; DS:SI -> name ;AN000;
302 ; ES:DI -> buffer ;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;
312 ; ELSE /* no match found */ ;AN000;
317 ; no match: carry set ;AN000;
318 ; match: carry clear, es:di -> parms if unc ;AN000;
321 ; Regs: nothing preserved ;AN000;
323 ; Programming notes: Most of this code lifted right out of the Redirector. ;AN000;
325 ;****************************************************************************** ;AN000;
327 procedure IFS_DEVICE_CHECK
,NEAR ;AN000;
328 ASSUME
DS:NOTHING
,ES:NOTHING
;AN000;
330 ifsr_fcn_def ATTSTAT
;AN000;
332 LocalVar Src
,DWORD ; ** netprn parse code begins ;AN000;
333 LocalVar Dst
,DWORD ;AN000;
334 LocalVar DotPos
,WORD ;AN000;
337 ; Preserve all of the input quantities ;AN000;
343 MOV DotPos
,-1 ;AN000;
345 ; Check for a UNC string. If UNC, is not spooled. ;AN000;
348 CallInstall PathChrCmp
,multDOS
,4,<AX>,<AX> ;AN000;
351 CallInstall PathChrCmp
,multDOS
,4,<AX>,<AX> ;AN000;
355 ; Scan string remembering previous path separator char. ;AN000;
357 MOV DI,SI ; remember first character ;AN000;
363 kanji
load of next char too
;AN000;
365 CallInstall PathChrCmp
,multDOS
,4,<AX>,<AX> ;AN000;
375 MOV DotPos
,SI ;AN000;
379 ; Better check for trailing :. They are ILLEGAL (read this comment, IBM) in ;AN000;
380 ; file names. ;AN000;
383 CMP BYTE PTR [SI-2],':' ;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;
400 LeaveCrit critNet
;AN000;
406 ; DS:SI points to remainder of string. DS:DI points to 1 past NUL. AL = 0 ;AN000;
408 CMP DotPos
,-1 ;AN000;
410 MOV DI,DotPos
;AN000;
411 XCHG AL,[DI-1] ;AN000;
413 ; DI points to 1 past either former . (now NUL) or terminating NUL. AL has ;AN000;
414 ; former character (. or NUL) ;AN000;
416 ; ** end of netprn code ;AN000;
417 GETP: ; ds:si -> parsed string ;AN000;
418 invoke DFL_MATCH
;AN000;
420 MOV ES:[DI-1],AL ; replace original character ;AN000;
421 JNC IDC_100
; not in dfl; set bl=ff ;AN000;
424 IDC_100: ; match found ;AN000;
425 LES DI,[THISDFL
] ;AN000;
426 CMP ES:[DI.DFL_TYPE
],TYPE_NET_DEVICE
;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;
444 MOV ES:[BX.IFSR_TYPE
],TYPE_DEVICE
;AN000;
445 JMP SHORT IDC_160
;AN000;
447 MOV ES:[BX.IFSR_TYPE
],TYPE_NET_DEVICE
;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;
456 invoke CALL_IFS
;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;
465 INC SI ; ds:si -> parms returned by redir ;AN000;
468 CallInstall StrCpy
,multDOS
,17 ;AN000;
469 DEC DI ; now append device name to net path ;AN003;
470 MOV AL,'\' ; | ;AN003;
472 LDS SI,CS:[THISDFL] ; | ;AN003;
474 invoke CONVERT_NAME_ASCIIZ ; | mov name string over ;AN003;
482 EndProc IFS_DEVICE_CHECK ;AN000;
487 BREAK <IFS_DEVICE_CLOSE Do a close on a device session directly> ;AN000;
489 ;****************************************************************************** ;AN000;
491 ; IFS_DEVICE_CLOSE ;AN000;
493 ; Called by: IFSFUNC Dispatcher ;AN000;
495 ; Routines called: ;AN000;
500 ; Inputs: ES:DI -> SFT ;AN000;
503 ; Send request below to IFS specified if SFT. ;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;
529 ; Carry set - error code in AX ;AN000;
532 ; Regs: nothing preserved ;AN000;
535 ;****************************************************************************** ;AN000;
537 procedure IFS_DEVICE_CLOSE,NEAR ;AN000;
538 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
540 ifsr_fcn_def EXECAPI ;AN000;
541 ifsr_api_def DEPIOCTL ;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;
548 MOV WORD PTR [THISSFT],DI ;AN000;
549 MOV WORD PTR [THISSFT+2],ES ;AN000;
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;
564 invoke CALL_IFS ; call ifs w/device close request ;AN000;
567 JMP IDCL_1000 ; go ret w/carry already set ;AC011;
570 invoke SFF_TO_SFT ;AN000;
571 ;;;;;;;;transfer ifs_990 ;AD011;
573 RestoreReg <DI,ES,SI,DS> ;AN011;
574 XOR CX,CX ; set zero flag ;AN011;;AC013;
578 EndProc IFS_DEVICE_CLOSE ;AN000;
581 BREAK <IFS_DEVICE_OPER Do various device control functions> ;AN000;
583 ;****************************************************************************** ;AN000;
585 ; IFS_DEVICE_OPER ;AN000;
587 ; Called by: IFSFUNC Dispatcher ;AN000;
589 ; Routines called: PREP_IFSR ;AN000;
593 ; Inputs: AL = 7 Get truncate flag ;AN000;
594 ; AL = 8 Set truncate flag ;AN000;
596 ; AL = 9 Close all spool files ;AN000;
599 ; IF AL=7 THEN DL = [TRUNCATE_FLAG] ;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;
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;
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;
635 ; Carry clear - DL = truncate flag on get ;AN000;
636 ; Carry set - AX = error code ;AN000;
638 ; Regs: nothing preserved ;AN000;
640 ; Notes: DFL not updated ;AN000;
642 ;****************************************************************************** ;AN000;
644 procedure IFS_DEVICE_OPER,NEAR ;AN000;
646 CMP AL,GET_TRUNCATE_FLAG ;AN000;
648 MOV DL,[TRUNCATE_FLAG] ; Get truncate flag ;AN000;
650 CallInstall Get_User_Stack,multDOS,24 ;AN015;
651 MOV [SI].User_DX,DX ;AN015;
652 transfer ifs_990 ; go ret no carry ;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;
658 PUSH CS ; get addressability to IFSSEG ;AN000;
660 ASSUME DS:IFSSEG,ES:NOTHING ;AN000;
662 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002;
663 CMP AL,SET_TRUNCATE_FLAG ; Set local storage of truncate_flag ;AN000;
665 MOV [TRUNCATE_FLAG],DL ;AC002;
666 MOV AH,DL ; for safekeeping ;AN002;
669 MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000;
670 OR CL,CL ; check for no dfl ;AN009;
672 transfer ifs_990 ; no dfl - just go successfully ;AN009;
675 MOV DX,SIZE DFLL_LIST ;AN000;
676 LDS SI,[DFLAddr] ;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;
682 TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ; skip unused dfl entries ;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;
699 MOV BYTE PTR DS:[SI+1],AH ;AC002;
700 INC ES:[BX.IFSR_BUFSIZE]
702 invoke SET_CATEGORY ;AN000;
703 MOV ES:[BX.IFSR_CATEGORY],CL ;AN002;
704 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVOPER ;AN000;
706 SaveReg <CX> ; save count ;AN000;
707 invoke CALL_IFS ; call ifs with device oper request ;AN000;
708 RestoreReg <CX> ; restore count ;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;
716 EndProc IFS_DEVICE_OPER ;AN000;
719 BREAK <IFS_SPOOL_ECHO_CHECK See if FS controling LPT1 allows echo> ;AN000;
721 ;****************************************************************************** ;AN000;
723 ; IFS_SPOOL_ECHO_CHECK ;AN000;
725 ; Called by: Dispatcher ;AN000;
727 ; Routines called: DFL_MATCH ;AN000;
730 ; Inputs: None ;AN000;
733 ; Call DFL_MATCH for match on "LPT1". ;AN000;
734 ; IF match found THEN ;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;
759 ; BUFFER LABEL BYTE ;AN000;
760 ; DB VALUE,0 ; 0 echo allowed ;AN000;
761 ; ; 1 echo not allowed ;AN000;
764 ; Call routine, CALL_IFS, with DFL_IFSR_HDR ;AN000;
768 ; Carry clear - echo allowed ;AN000;
769 ; Carry set - echo NOT allowed ;AN000;
772 ; Regs: nothing preserved ;AN000;
774 ; Programming notes: DFL FSDA not updated ;AN000;
776 ;****************************************************************************** ;AN000;
778 procedure IFS_SPOOL_ECHO_CHECK,NEAR ;AN000;
779 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
781 ifsr_fcn_def EXECAPI ;AN000;
782 ifsr_api_def DEPIOCTL ;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;
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;
792 invoke DFL_MATCH ;AN000;
794 CLC ; not in dfl; assume echo ok ;AN011;
795 JMP ISEC_1000 ;AC011;
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;
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;
815 invoke SET_CATEGORY ;AN000;
816 MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVECHOCHECK ; (00000011) ;AN000;
818 invoke CALL_IFS ;AN000;
821 JMP SHORT ISEC_1000 ; no echo on err, cf set ;AC011;
824 CMP BYTE PTR DS:[SI],0 ; else byte returned in buffr ;AN000;
825 JE ISEC_80 ; determines echo (0-yes,1-no) ;AN000;
827 JMP SHORT ISEC_1000 ; no echo ret ;AC011;
832 ISEC_1000: ; echo ret ;AN011;
833 RestoreReg <SI,DS,DI,ES> ;AN011;
837 EndProc IFS_SPOOL_ECHO_CHECK ;AN000;
839 BREAK <IFS_DEPENDENT_IOCTL - dependent ioctl> ;AN000;
841 ;****************************************************************************** ;AN000;
843 ; IFS_DEPENDENT_IOCTL ;AN000;
845 ; Called by: Dispatcher ;AN000;
847 ; Routines called: CALL_IFS ;AN000;
848 ; CDS_TO_CD SFT_TO_SFF ;AN000;
849 ; CD_TO_CDS SFF_TO_SFT ;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;
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;
891 ; CALL routine, CALL_IFS, with pointer to IFS header ;AN000;
892 ; IF IFSR_RETCODE = 0 THEN ;AN000;
894 ; IF CDS THEN ;AN000;
895 ; Call CD_TO_CDS ;AN000;
896 ; ELSE Call SFF_TO_SFT ;AN000;
900 ; Put error code in AX ;AN000;
903 ; Outputs: function dependent ;AN000;
905 ; Regs: nothing preserved ;AN000;
907 ;****************************************************************************** ;AN000;
909 procedure IFS_DEPENDENT_IOCTL,NEAR ;AN000;
910 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
912 ifsr_fcn_def EXECAPI ;AN000;
913 ifsr_api_def DEPIOCTL ;AN000;
915 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
917 SaveReg <BX,ES> ; save input es for query os type ;AC006;
918 ; and bx for drive # / handle ;AN006;
920 MOV CS:IFSPROC_FLAGS,ZERO ; init ifsfunc flags ;AN000;
921 invoke PREP_IFSR ; & IFSR ;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;
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;
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;
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;
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;
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;
965 JMP SHORT IDI_60 ;AN000;
967 IDI_20: ; al=1 ;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;
975 CMP BYTE PTR ES:[DI],-1 ; unused handle ;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;
990 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
991 ; IFSR_OPEN_CB@ ;AN000;
992 ; ds - netwrk ;AN000;
994 invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000;
995 MOV ES:[BX.IFSR_CATEGORY],CL ;AN000;
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;
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;
1007 MOV AX,error_invalid_function ;AN000;
1009 invoke SET_EXTERR_INFO ; set error info ;AN006;
1010 transfer ifs_980 ; go to general error return ;AN000;
1012 EndProc IFS_DEPENDENT_IOCTL ;AN000;
1015 BREAK <DEVICE_IOCTL - device ioctl> ;AN000;
1017 ;******************************************************************************
1021 ; Called by: Dispatcher
1023 ; Routines called: CALL_IFS
1024 ; CDS_TO_CD SFT_TO_SFF
1025 ; CD_TO_CDS SFF_TO_SFT
1028 ; AL = 02H(03H0 Read from(Write to) character device
1029 ; BX = handle [THISSFT] set
1030 ; CX = number of bytes to read(write)
1032 ; AL = 0CH Character Generic IOCTL
1033 ; CH = 1-async, 3-display, 5-printer
1034 ; CL = 5F-set, 7F-get
1036 ; AL = 0DH Block Generic IOCTL
1038 ; BL = Drive number [THISCDS] set (0-based)
1040 ; CL = 43-set, 63-get media id
1045 ; * IFSR_LENGTH DW 48 ; Request length
1046 ; * IFSR_FUNCTION DB 4 ; Execute API function
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 ?
1055 ; IFSR_I24_RETRY DB ?
1056 ; IFSR_I24_RESP 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
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
1068 ; CALL routine, CALL_IFS
1069 ; IF IFSR_RETCODE = 0 THEN
1073 ; ELSE Call SFF_TO_SFT
1077 ; Put error code in AX
1080 ; Outputs: function dependent
1082 ; Regs: nothing preserved
1084 ;******************************************************************************
1086 procedure DEVICE_IOCTL,NEAR ;AN000;
1087 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1089 ; mov ax,26 ; these two instrs temporary
1092 ifsr_fcn_def EXECAPI ;AN000;
1093 ifsr_api_def DEVIOCTL ;AN000;
1095 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000;
1097 PUSH DS ; save input ds ;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;
1103 CMP AL,BLOCK_GENERIC ;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;
1114 DI_20: ; handle function ;AN000;
1115 OR CS:IFSPROC_FLAGS,SetDeviceCB ; to get possible related cd or df ;AN000;
1117 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
1118 ; IFSR_OPEN_CB@ ;AN000;
1119 ; ds - netwrk ;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
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
1137 ;-----------------------------------------------------------------------------------------
1138 invoke CALL_IFS ; call ifs driver w/request ;AN000;
1139 ;-----------------------------------------------------------------------------------------
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;
1146 ADD SP,4 ; restore stack ;AN000;
1147 transfer ifs_980 ;AN000;
1150 TEST IFSPROC_FLAGS,ISCDS ;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;
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;
1162 EndProc DEVICE_IOCTL ;AN000;
1166 BREAK <GET_DFL_FROM_INDEX Get DFL entry from index> ;AN000;
1168 ;****************************************************************************** ;AN000;
1170 ; GET_DFL_FROM_INDEX ;AN000;
1172 ; Called by: PRINTER_GETSET_STRING ;AN000;
1174 ; Routines called: none ;AN000;
1177 ; BX is index number (as in GetIFSFUNCItem) ;AN000;
1180 ; Carry Clear ;AN000;
1181 ; [THISDFL] set ;AN000;
1183 ; Bad index number ;AN000;
1185 ; Regs: Preserves Printer Get/Set String input regs ;AN000;
1187 ;****************************************************************************** ;AN000;
1189 procedure GET_DFL_FROM_INDEX,NEAR ;AN000;
1190 ASSUME DS:NOTHING,ES:NOTHING ;AN000;
1192 SaveReg <DS,SI,CX,DX> ; save Ptr GetSet Str input regs ;AC007;
1193 ; (removed ax from above) ;AN007;
1195 ; Compute index # of first device ;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;
1203 LDS SI,CS:[CDSAlt] ; Paused, get REAL CDSs from here ;AN000;
1205 TEST [SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000;
1208 ;;; TEST [SI.CURDIR_TYPE],TYPE_NET_DRIVE ;AD003;
1209 ;;; JZ GDFI_40 ; count 2 for redir ;AD003;
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;
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;
1224 MOV AX,error_invalid_parameter ; user index too high ;AN000;
1225 JMP GDFI_980 ; go return w/carry already set ;AN000;
1227 LDS SI,CS:[DFLAddr] ;AN000;
1228 MOV BL,SIZE DFLL_list ; size in convenient spot ;AN000;
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
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;
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;
1255 JMP GDFI_1000 ;AN000;
1259 RestoreReg <DX,CX,SI,DS> ; restore regs ;AC007;
1260 ; (removed ax from above) ;AN007;
1263 EndProc GET_DFL_FROM_INDEX ;AN000;