From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/IFSFUNC/IFSDEV.ASM | 1267 +++++++++++++++++ v4.0/src/CMD/IFSFUNC/IFSDIR.ASM | 313 +++++ v4.0/src/CMD/IFSFUNC/IFSERROR.ASM | 637 +++++++++ v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM | 476 +++++++ v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | 1778 ++++++++++++++++++++++++ v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM | 202 +++ v4.0/src/CMD/IFSFUNC/IFSFSYM.INC | 162 +++ v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK | 12 + v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL | 49 + v4.0/src/CMD/IFSFUNC/IFSHAND.ASM | 903 ++++++++++++ v4.0/src/CMD/IFSFUNC/IFSINIT.ASM | 1373 +++++++++++++++++++ v4.0/src/CMD/IFSFUNC/IFSPARSE.INC | 92 ++ v4.0/src/CMD/IFSFUNC/IFSSESS.ASM | 2187 +++++++++++++++++++++++++++++ v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM | 2739 +++++++++++++++++++++++++++++++++++++ v4.0/src/CMD/IFSFUNC/MAKEFILE | 127 ++ 15 files changed, 12317 insertions(+) create mode 100644 v4.0/src/CMD/IFSFUNC/IFSDEV.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSDIR.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSERROR.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFILE.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFSYM.INC create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK create mode 100644 v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL create mode 100644 v4.0/src/CMD/IFSFUNC/IFSHAND.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSINIT.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSPARSE.INC create mode 100644 v4.0/src/CMD/IFSFUNC/IFSSESS.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM create mode 100644 v4.0/src/CMD/IFSFUNC/MAKEFILE (limited to 'v4.0/src/CMD/IFSFUNC') 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 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsdev.asm 1.0 87/05/11 ;AN000; +TITLE IFSFUNC DEVICE ROUTINES - Device/IOCTL routines ;AN000; +NAME IFSDEV ;AN000; + ;AN000; +;****************************************************************************** +; +; Device related IFS calls +; +; Printer_GetSet_String +; IFS_Device_Check +; IFS_Device_Close +; IFS_Device_Oper +; IFS_Spool_Echo_Check +; IFS_DEPENDENT_IOCTL +; DEVICE_IOCTL +; GET_DFL_FROM_INDEX +; +; Programming notes: +; Old redirector segmentation and DOS interface preserved. +; Routine prologues are accurate for input/output. +; However, the pseudocode was not kept up to date. +; Use it for a rough idea of the routine function. +; +; REVISION HISTORY: +; A000 Original version 4.00 May 1987 +; A001 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA +; A002 PTM 764 - printer attach problems 8/87 RGAZZIA +; A003 PTM 849 - printer open problems 8/87 RGAZZIA +; A004 PTM 1244- Net Print problems 8/87 RGAZZIA +; A005 PTM 1600- dev ioctl ds bug 8/87 RGAZZIA +; A006 PTM 3619- thiscds,thissft not set in ifs dep ioctl 2/88 RGazzia +; A007 PTM 3971 Austin Print bug raid 3/88 RMG +; A008 PTM 4055 UNC problems (make sure thisdfl null on error) 3/30/88 RMG +; A009 PTM 4188 Names=0 problems 4/08/88 RMG +; A010 PTM 4554 Echo across network in vitt alt task 5/12/88 RMG +; A011 PTM 4841 Ctrl ptrsc problems 5/13/88 RMG +; A012 PTM 4885 ifs dept ioctl not recog non-ifs drive 5/17/88 RMG +; A013 PTM 4791 problem with ax error code overwrite 5/19/88 RMG +; A014 PTM 4946 net - no ptrs 5E02 doesn't return error 5/20/88 RMG +; A015 PTM 5005 get truncate flag faulty - ret on user stack 6/02/88 RMG +; LOC - 477 +; +;****************************************************************************** + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; include THE REST Of the segment definitions for normal MSDOS ;AN000; + ;AN000; +.xlist ;AN000; +include dosseg.asm ;AN000; +.list ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ; DOSGROUP Data ;AN000; + Extrn THISCDS:DWORD ;AN000; + Extrn THISSFT:DWORD ;AN000; + Extrn CDSAddr:DWORD ;AN000; + Extrn CDSCount:BYTE ;AN000; + Extrn CurrentPDB:WORD ;AN000; +DATA ENDS ;AN000; + ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ; IFS data ;AN000; +;;;aliasExtrn NLAddr:DWORD ;AN000; + Extrn TEMPBUF:BYTE ;AN000; + Extrn UNC_FS_HDR:DWORD ;AN000; + Extrn THISIFS:DWORD ;AN000; + Extrn THISDFL:DWORD ;AN000; + Extrn DFLCount:BYTE ;AN000; + Extrn DFLAddr:DWORD ;AN000; + Extrn IFSDRV:BYTE ;AN000; + Extrn fAssign:BYTE ;AN000; + Extrn CDSAlt:DWORD ;AN000; + Extrn TRUNCATE_FLAG:BYTE ;AN000; + Extrn IFSPROC_FLAGS:WORD ;AN000; + Extrn IFSFUNC_FLAGS:WORD ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn LPT1_NAME:BYTE ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; PRINTER_GETSET_STRING Get or Set the printer string and flag word ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS DOS: Get_User_Stack ;AN000; +; GET_DFL_FROM_INDEX ;AN000; +; DF_TO_DFL ;AN000; +; ;AN000; +; Inputs: ;AN000; +; AL has function type (2-printer-set 3-printer-get ;AN000; +; 4-printer-set-flags 5-printer-get-flags ;AN000; +; VALUE ALREADY RANGE CHECKED BY CALLER ;AN000; +; DS:SI is user string pointer (call 2) ;AN000; +; ES:DI is user buffer (call 3) ;AN000; +; BX is assign index (calls 2,3,4,5) ;AN000; +; CX is length DS:SI (call 2) ;AN000; +; DX is flag word (call 4) ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; REDIR IOCTL (Printer Getset String) ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; DFL entry found by IFSFUNC ;AN000; +; ; Step through CDS & DFL lists counting ;AN000; +; ; (0,1,2,...) ones with IFS bit set. ;AN000; +; ; Stop at BXth one. Pass that in ;AN000; +; ; IFSR_DEVICE_CB@. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB 0 ; subfunction: ;AN000; +; ; 00 Generic IOCTL by device number ;AN000; +; IFSR_RESV3 DB 0 ;AN000; +; * IFSR_BUFFER@ DD ? ; user buffer (see below) ;AN000; +; * IFSR_BUFSIZE DW ? ; length ;AN000; +; * IFSR_CATEGORY DB 1 ; category 1 for REDIR ;AN000; +; * IFSR_CTLFUNC DB ? ; For AL=2,3 00F00001H F=0 GET,F=1 SET ;AN000; +; ; printer string ;AN000; +; ; For AL=4,5 00F00010H F=0 GET,F=1 SET ;AN000; +; ; printer flag ;AN000; +; ;AN000; +; BUFFER LABEL WORD ; AL=2,3 ;AN000; +; DATA DB ... ;AN000; +; ;AN000; +; BUFFER LABEL WORD ; AL=4,5 ;AN000; +; DW FLAGS ; Printer mode flags ;AN000; +; ; 8000H=binary (vs.ascii) ;AN000; +; ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to UNC capable IFS header ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; IF AL=5 THEN DX = Flags ;AN000; +; Call DF_TO_DFL ;AN000; +; ENDDO ;AN000; +; ELSE ;AN000; +; Set carry ;AN000; +; Put error code in AX ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; If AL = 3 then CX bytes have been put at input ES:DI ;AN000; +; If AL = 5 then DX is the flag word ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +; Notes: This request is a REDIR.SYS dependent ioctl request ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure PRINTER_GETSET_STRING,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; unc (redir.sys) must be ;AN000; + JNZ PGS_05 ; installed, else do nothing ;AN000; + MOV AX,error_invalid_function ;AN000; + transfer ifs_980 ;AN000; + ;AN000; +PGS_05: ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; + ; right ;AN000; + SaveReg ; preserve input es since ;AC007; + ; next call destroys it ;AN000; + ; preserve ax too ;AN007; + CALL GET_DFL_FROM_INDEX ; sets [THISDFL], ;AN000; + ; ifsr_device_cb@ & ;AN000; + ; [THISIFS] ;AN000; + JNC PGS_10 ; error on carry - no dfl ;AN000; + ADD SP,4 ; restore stack and ;AC007; + transfer IFS_980 ; go return in ifsutil ;AC007; + ;AN000; +PGS_10: ;AN000; + RestoreReg ; restore input al ;AN007; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_CATEGORY],CATEGORY_REDIR ;AN000; + CMP AL,PRINTER_SET_STRING ;AN000; + JNE PGS_20 ;AN000; + ; printer set string ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ; ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ; ;AN000; + MOV ES:[BX.IFSR_BUFSIZE],CX ; ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_STRING ;AN000; + ADD SP,2 ; restore stack (es) & ;AN000; + JMP SHORT PGS_100 ; go call redir.sys ;AN000; + ;AN000; +PGS_20: ;AN000; + CMP AL,PRINTER_GET_STRING ; printer get string ;AN000; + JNE PGS_40 ;AN000; + POP CX ; retrieve es in cx ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ; ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_STRING ;AN000; + JMP SHORT PGS_100 ;AN000; + ;AN000; +PGS_40: ; flags ;AN000; + ADD SP,2 ; 1st clean stack of es ;AN000; + PUSH CS ; not needed here ;AN000; + POP DS ; must set up buffer ;AN000; +ASSUME DS:IFSSEG ; to hold flag word ;AN000; + MOV SI,OFFSET TEMPBUF ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; + CMP AL,PRINTER_SET_FLAGS ;AN000; + JNE PGS_60 ;AN000; + MOV DS:[SI],DX ; printer set flags ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_SET_FLAGS ;AN000; + JMP PGS_100 ;AN000; + ;AN000; +PGS_60: ; printer get flags ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINTER_GET_FLAGS ;AN000; + ;AN000; +PGS_100: ;AN000; + PUSH AX ; save function ;AN000; + ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + invoke SET_THISIFS_UNC ; set thisifs to unc ;AN000; + ;AN000; + invoke CALL_IFS ; call ifs driver w/request ;AN000; + ;AN000; + JNC PGS_120 ;AN000; + ADD SP,2 ; clean stack of ax (fcn #) ;AN013; + transfer ifs_980 ; go ret on error ;AN000; + ;AN000; +PGS_120: ;AN000; + POP AX ; restore original input fcn ;AN000;;AM013; + invoke DF_TO_DFL ; Update dfl entry ;AN000; + ;AN000; + CMP AL,PRINTER_GET_FLAGS ; if printer get flags ;AN000; + JE PGS_140 ; put flags in DX ;AN000; + CMP AL,PRINTER_GET_STRING ; if printer get string ;AN000; + JE PGS_160 ; put stg size in CX ;AN000; + ;AN000; + transfer ifs_990 ;AN000; +PGS_140: ;AN000; + LES DI,ES:[BX.IFSR_BUFFER@] ;AN000; + MOV DX,WORD PTR ES:[DI] ;AC004; + CallInstall Get_User_Stack,multDOS,24 ;AN000; + MOV [SI].User_DX,DX ; return user flags to dos ;AN000; + transfer ifs_990 ; go return with no carry ;AN000; + ;AN000; +PGS_160: ;AN000; + MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000; + CallInstall Get_User_Stack,multDOS,24 ;AN000; + MOV [SI].User_CX,CX ; Size of pre string just transferred ;AN000; + transfer ifs_990 ; go return with no carry ;AN000; + ;AN000; +EndProc PRINTER_GETSET_STRING ;AN000; + ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_DEVICE_CHECK ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: DFL_MATCH DOS: PathChrCmp ;AN000; +; DFL_TO_DF StrCpy ;AN000; +; CALL_IFS ;AN000; +; Inputs: ;AN000; +; DS:SI -> name ;AN000; +; ES:DI -> buffer ;AN000; +; ;AN000; +; Function: ;AN000; +; Search DFL for match on name. ;AN000; +; IF match found THEN ;AN000; +; DO /* match found */ ;AN000; +; IF DFL_TYPE = 3 (net device) THEN ;AN000; +; ES:DI -> parms ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE /* no match found */ ;AN000; +; Set carry ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; no match: carry set ;AN000; +; match: carry clear, es:di -> parms if unc ;AN000; +; ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +; Programming notes: Most of this code lifted right out of the Redirector. ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_DEVICE_CHECK,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def ATTSTAT ;AN000; + ;AN000; + LocalVar Src,DWORD ; ** netprn parse code begins ;AN000; + LocalVar Dst,DWORD ;AN000; + LocalVar DotPos,WORD ;AN000; + Enter ;AN000; +; ;AN000; +; Preserve all of the input quantities ;AN000; +; ;AN000; + MOV SrcL,SI ;AN000; + MOV SrcH,DS ;AN000; + MOV DstL,DI ;AN000; + MOV DstH,ES ;AN000; + MOV DotPos,-1 ;AN000; +; ;AN000; +; Check for a UNC string. If UNC, is not spooled. ;AN000; +; ;AN000; + MOV AX,[SI] ;AN000; + CallInstall PathChrCmp,multDOS,4,, ;AN000; + JNZ NOT_UNC ;AN000; + XCHG AH,AL ;AN000; + CallInstall PathChrCmp,multDOS,4,, ;AN000; + JZ NOTSpool ;AN000; +NOT_UNC: ;AN000; +; ;AN000; +; Scan string remembering previous path separator char. ;AN000; +; ;AN000; + MOV DI,SI ; remember first character ;AN000; +PathSkip: ;AN000; + LODSB ;AN000; + OR AL,AL ;AN000; + JZ FoundEnd ;AN000; +IF Kanji ;AN000; + kanji load of next char too ;AN000; +ENDIF ;AN000; + CallInstall PathChrCmp,multDOS,4,, ;AN000; + JZ SaveSI ;AN000; + CMP AL,':' ;AN000; + JNZ TestDot ;AN000; +SaveSI: ;AN000; + MOV DI,SI ;AN000; + JMP PathSkip ;AN000; +TestDot: ;AN000; + CMP AL,'.' ;AN000; + JNZ PathSkip ;AN000; + MOV DotPos,SI ;AN000; + JMP PathSkip ;AN000; + ;AN000; +; ;AN000; +; Better check for trailing :. They are ILLEGAL (read this comment, IBM) in ;AN000; +; file names. ;AN000; +; ;AN000; +FoundEnd: ;AN000; + CMP BYTE PTR [SI-2],':' ;AN000; + JNZ NOCOL ;AN000; +NotSpool: ;AN000; + SaveReg ;AN008; + RestoreReg ;AN008; + MOV AX,NULL_PTR ;AN008; + MOV WORD PTR [THISDFL],AX ;AN008; + MOV WORD PTR [THISDFL+2],AX ;AN008; + RestoreReg ;AN008; + LDS SI,Src ;AN000; + STC ;AN000; +Done: ;AN000; + LES DI,Dst ;AN000; + Leave ;AN000; + return ;AN000; + ;AN000; +NotSpoolLv: ;AN000; + LeaveCrit critNet ;AN000; + JMP NotSpool ;AN000; + ;AN000; +NOCOL: ;AN000; + XCHG SI,DI ;AN000; +; ;AN000; +; DS:SI points to remainder of string. DS:DI points to 1 past NUL. AL = 0 ;AN000; +; ;AN000; + CMP DotPos,-1 ;AN000; + JZ GetP ;AN000; + MOV DI,DotPos ;AN000; + XCHG AL,[DI-1] ;AN000; +; ;AN000; +; DI points to 1 past either former . (now NUL) or terminating NUL. AL has ;AN000; +; former character (. or NUL) ;AN000; +; ;AN000; + ; ** end of netprn code ;AN000; +GETP: ; ds:si -> parsed string ;AN000; + invoke DFL_MATCH ;AN000; + MOV ES,SrcH ;AN000; + MOV ES:[DI-1],AL ; replace original character ;AN000; + JNC IDC_100 ; not in dfl; set bl=ff ;AN000; + JMP NotSpool ;AN000; + ;AN000; +IDC_100: ; match found ;AN000; + LES DI,[THISDFL] ;AN000; + CMP ES:[DI.DFL_TYPE],TYPE_NET_DEVICE ;AN000; + JE IDC_120 ;AN000; + LES DI,Dst ;AN000; + JMP IDC_220 ;AN000; + ;AN000; +IDC_120: ; ifs: get parms ;AN000; + invoke PREP_IFSR ; clear ifsr ;AN003; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN003; + invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AN000; + invoke SET_CATEGORY ; this has nothing to do w/catrgory ;AN000; + ; want to determine if unc or not ;AN000; + OR CL,CL ; unc cl=1, other cl=0 ;AN000; + JNE IDC_140 ;AN000; + MOV ES:[BX.IFSR_TYPE],TYPE_DEVICE ;AN000; + JMP SHORT IDC_160 ;AN000; +IDC_140: ;AN000; + MOV ES:[BX.IFSR_TYPE],TYPE_NET_DEVICE ;AN000; +IDC_160: ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV SI,OFFSET TEMPBUF ;AN000; + MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000; + ;AN000; + invoke CALL_IFS ;AN000; + JNC IDC_200 ;AN008; + JMP NotSpool ;AC008; + ;AN000; +IDC_200: ;AN000; + MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AN000; + MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AN000; + MOV BL,ES:[BX.IFSR_TYPE] ;AC001; + XOR BH,BH ;AN001; + INC SI ; ds:si -> parms returned by redir ;AN000; + INC SI ;AN000; + LES DI,Dst ;AN000; + CallInstall StrCpy,multDOS,17 ;AN000; + DEC DI ; now append device name to net path ;AN003; + MOV AL,'\' ; | ;AN003; + STOSB ; | ;AN003; + LDS SI,CS:[THISDFL] ; | ;AN003; + ADD SI,2 ; | ;AN003; + invoke CONVERT_NAME_ASCIIZ ; | mov name string over ;AN003; + +IDC_220: ;AN000; + LDS SI,Dst ;AN000; + CLC ;AN000; + JMP DONE ;AN000; + ;AN000; + ;AN000; +EndProc IFS_DEVICE_CHECK ;AN000; + ;AN000; + ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_DEVICE_CLOSE ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: ;AN000; +; SFT_TO_SFF ;AN000; +; SFF_TO_SFT ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ES:DI -> SFT ;AN000; +; ;AN000; +; Function: ;AN000; +; Send request below to IFS specified if SFT. ;AN000; +; ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000; +; * IFSR_OPEN_CB@ DD ? ; SF ;AN000; +; * IFSR_FUNC DB 0 ; generic IOCTL by handle ;AN000; +; IFSR_RESV3 DB 0 ;AN000; +; IFSR_BUFFER@ DD ? ;AN000; +; IFSR_BUFSIZE DW ? ;AN000; +; IFSR_CATEGORY DB 1 for UNC, 0 for all other FSs ;AN000; +; IFSR_CTLFUNC DB 00000101B ; device spool close ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry set - error code in AX ;AN000; +; ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_DEVICE_CLOSE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + SaveReg ; preserve these for dos - guesing ;AN011; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002; + MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000; + ;AN000; + Context DS ;AN000; + MOV WORD PTR [THISSFT],DI ;AN000; + MOV WORD PTR [THISSFT+2],ES ;AN000; + + invoke PREP_IFSR ; & ifsr ;AM011; + invoke SFT_TO_SFF ; sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; +;;;;;;;;INC ES:[BX.IFSR_FUNC] ; inc func from gen_ioctl_by_devnum ;AD011; +;;;;;;;; ; to gen_ioctl_by_handle ;AD011; + invoke SET_CATEGORY ;AN000; + MOV ES:[BX.IFSR_CATEGORY],CL ;AN002; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVCLOSE ;AN000; + ;AN000; + invoke CALL_IFS ; call ifs w/device close request ;AN000; + ;AN000; + JNC IDCL_60 ;AN000; + JMP IDCL_1000 ; go ret w/carry already set ;AC011; + ;AN000; +IDCL_60: ;AN000; + invoke SFF_TO_SFT ;AN000; +;;;;;;;;transfer ifs_990 ;AD011; +IDCL_1000: ;AN011; + RestoreReg ;AN011; + XOR CX,CX ; set zero flag ;AN011;;AC013; + return ;AN011; + ;AN000; + ;AN000; +EndProc IFS_DEVICE_CLOSE ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_DEVICE_OPER ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: PREP_IFSR ;AN000; +; CALL_IFS ;AN000; +; DFL_TO_DF ;AN000; +; ;AN000; +; Inputs: AL = 7 Get truncate flag ;AN000; +; AL = 8 Set truncate flag ;AN000; +; DL = value ;AN000; +; AL = 9 Close all spool files ;AN000; +; ;AN000; +; Function: ;AN000; +; IF AL=7 THEN DL = [TRUNCATE_FLAG] ;AN000; +; ELSE DO ;AN000; +; Get addr of 1st DFL entry. ;AN000; +; FOR I = 1 to last DFL entry in use ;AN000; +; Send request below to IFS specified if DFL. ;AN000; +; ENDDO ;AN000; +; ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by device number ;AN000; +; IFSR_RESV3 DB 0 ;AN000; +; * IFSR_BUFFER@ DD ? ;AN000; +; * IFSR_BUFSIZE DW 1 ;AN000; +; IFSR_CATEGORY DB 1 for UNC, 0 for other FSs ;AN000; +; IFSR_CTLFUNC DB 00000110 ; device_oper ;AN000; +; ;AN000; +; BUFFER LABEL BYTE ;AN000; +; DB function ; 8 set truncate flag ;AN000; +; ; 9 close all spool files ;AN000; +; DB truncate flag on set ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry clear - DL = truncate flag on get ;AN000; +; Carry set - AX = error code ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +; Notes: DFL not updated ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_DEVICE_OPER,NEAR ;AN000; + ;AN000; + CMP AL,GET_TRUNCATE_FLAG ;AN000; + JNE IDO_20 ;AN000; + MOV DL,[TRUNCATE_FLAG] ; Get truncate flag ;AN000; + XOR DH,DH ;AN015; + CallInstall Get_User_Stack,multDOS,24 ;AN015; + MOV [SI].User_DX,DX ;AN015; + transfer ifs_990 ; go ret no carry ;AN000; + ;AN000; +IDO_20: ; Set truncate flag or close all ;AN000; + ifsr_fcn_def EXECAPI ; spool files ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + PUSH CS ; get addressability to IFSSEG ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG,ES:NOTHING ;AN000; + ;AN000; + MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN002; + CMP AL,SET_TRUNCATE_FLAG ; Set local storage of truncate_flag ;AN000; + JNE IDO_30 ;AN000; + MOV [TRUNCATE_FLAG],DL ;AC002; + MOV AH,DL ; for safekeeping ;AN002; + ;AN000; +IDO_30: ;AN000; + MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000; + OR CL,CL ; check for no dfl ;AN009; + JNZ IDO_35 ;AN009; + transfer ifs_990 ; no dfl - just go successfully ;AN009; +IDO_35: + XOR CH,CH ;AN000; + MOV DX,SIZE DFLL_LIST ;AN000; + LDS SI,[DFLAddr] ;AN000; + ;AN000; +IDO_40: ; ** Loop here thru DFL list entries ;AN000; +;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ;AN000; +;;;aliasJE IDO_100 ; skip alias dfl entries ;AN000; +;;;alias ;AN000; + TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ; skip unused dfl entries ;AN000; + JZ IDO_100 ;AN000; + MOV WORD PTR [THISDFL],SI ; Prep IFSRH ;AN000; + MOV WORD PTR [THISDFL+2],DS ;AN000; + invoke PREP_IFSR ;AN000; + invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; + MOV SI,OFFSET TEMPBUF ; prep devoper buffer ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],SI ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; + MOV BYTE PTR DS:[SI],AL ; buffer contains: db fcn ;AN000; + MOV ES:[BX.IFSR_BUFSIZE],1 ;AN002; + CMP AL,CLOSE_SPOOL_FILES ; db truncate flag ;AN000; + JE IDO_60 ;AN000; + MOV BYTE PTR DS:[SI+1],AH ;AC002; + INC ES:[BX.IFSR_BUFSIZE] +IDO_60: ;AN000; + invoke SET_CATEGORY ;AN000; + MOV ES:[BX.IFSR_CATEGORY],CL ;AN002; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVOPER ;AN000; + ;AN000; + SaveReg ; save count ;AN000; + invoke CALL_IFS ; call ifs with device oper request ;AN000; + RestoreReg ; restore count ;AN000; + ;AN000; +IDO_100: ;AN000; + ADD SI,DX ; prep for next dfl ;AN000; + LOOP IDO_40 ; go process next dfl ;AN000; + transfer ifs_990 ; Finished. Go ret no carry. ;AN000; + ;AN000; + ;AN000; +EndProc IFS_DEVICE_OPER ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_SPOOL_ECHO_CHECK ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: DFL_MATCH ;AN000; +; DFL_TO_DF ;AN000; +; CALL_IFS ;AN000; +; Inputs: None ;AN000; +; ;AN000; +; Function: ;AN000; +; Call DFL_MATCH for match on "LPT1". ;AN000; +; IF match found THEN ;AN000; +; DO ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; DF ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB 0 ; 00 Generic IOCTL by devnum ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; * IFSR_BUFFER@ DD ? ;AN000; +; * IFSR_BUFSIZE DW ? ;AN000; +; IFSR_CATEGORY DB ? ; 0 non-unc, 1 unc ;AN000; +; IFSR_CTLFUNC DB 00000011B ;AN000; +; ;AN000; +; BUFFER LABEL BYTE ;AN000; +; DB VALUE,0 ; 0 echo allowed ;AN000; +; ; 1 echo not allowed ;AN000; +; ;AN000; +; ;AN000; +; Call routine, CALL_IFS, with DFL_IFSR_HDR ;AN000; +; ENDDO ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry clear - echo allowed ;AN000; +; Carry set - echo NOT allowed ;AN000; +; ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +; Programming notes: DFL FSDA not updated ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_SPOOL_ECHO_CHECK,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + SaveReg ; save these for ibmdos (guessing which) ;AN011; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; + ; right ;AN000; + PUSH CS ; Set ds:si -> "lpt1",0 ;AN000; + POP DS ; want to find dfl entry with ;AN000; +ASSUME DS:IFSSEG ; this dev name ;AN000; + MOV SI,OFFSET LPT1_NAME ;AN000; + ;AN000; + invoke DFL_MATCH ;AN000; + JNC ISEC_10 ;AN000; + CLC ; not in dfl; assume echo ok ;AN011; + JMP ISEC_1000 ;AC011; + ;AN000; +ISEC_10: ;AN000; + LES DI,[THISDFL] ;AN000; +;;;aliasCMP ES:[DI.DFL_TYPE],TYPE_ALIAS ;AN000; +;;;aliasJNE ISEC_15 ;AN000; +;;;aliastransfer ifs_980 ; lpt1 is alias, assume no echo ;AN000; + ;AN000; +ISEC_15: ;AN000; + invoke PREP_IFSR ; zero out ifsr ;AN000; + invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; + MOV SI,OFFSET TEMPBUF ;AN000; + MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ; use tempbuf for ;AN000; + MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ; return byte value ;AN000; + MOV ES:[BX.IFSR_BUFSIZE],LENGTH_DEVECHOCHECK_BUFFER ; (1) ;AN000; + ;AN000; + invoke SET_CATEGORY ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_DEVECHOCHECK ; (00000011) ;AN000; + ;AN000; + invoke CALL_IFS ;AN000; + ;AN000; + JNC ISEC_60 ;AN000; + JMP SHORT ISEC_1000 ; no echo on err, cf set ;AC011; + ;AN000; +ISEC_60: ;AN000; + CMP BYTE PTR DS:[SI],0 ; else byte returned in buffr ;AN000; + JE ISEC_80 ; determines echo (0-yes,1-no) ;AN000; + STC ;AN011; + JMP SHORT ISEC_1000 ; no echo ret ;AC011; +ISEC_80: ;AN000; + CLC ;AN011; + + +ISEC_1000: ; echo ret ;AN011; + RestoreReg ;AN011; + RET ;AN011; + + ;AN000; +EndProc IFS_SPOOL_ECHO_CHECK ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_DEPENDENT_IOCTL ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS ;AN000; +; CDS_TO_CD SFT_TO_SFF ;AN000; +; CD_TO_CDS SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; AL = 0 - Generic by device number ;AN000; +; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000; +; CX = private subfunction ;AN000; +; DS:DX -> buffer ;AN000; +; AL = 1 - Generic by handle ;AN000; +; BX = handle [THISSFT] set ;AN000; +; CX = private subfunction ;AN000; +; DS:DX -> buffer ;AN000; +; AL = 2 - Query OS type ;AN000; +; BH = 0, BL = device number (0-def,1=a,2=b,...) [THISCDS] set ;AN000; +; CX = buffer size ;AN000; +; ES:DI -> buffer ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (subfs 0,2) ;AN000; +; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SFF (subf 1) ;AN000; +; * IFSR_FUNC DB 0 ; AL - 0,1,or 2 ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000; +; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000; +;;;; for al=0,1 ;AN000; +; * IFSR_CATEGORY DB 1 ; 1 for UNC, 0 for non-UNC ;AN000; +; * IFSR_CTLFUNC DB ? ; al-2 ???, else cx ;AN000; +; ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; IF CDS THEN ;AN000; +; Call CD_TO_CDS ;AN000; +; ELSE Call SFF_TO_SFT ;AN000; +; ENDDO ;AN000; +; ELSE ;AN000; +; Set carry ;AN000; +; Put error code in AX ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: function dependent ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_DEPENDENT_IOCTL,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; + ; right ;AN000; + SaveReg ; save input es for query os type ;AC006; + ; and bx for drive # / handle ;AN006; + ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; init ifsfunc flags ;AN000; + invoke PREP_IFSR ; & IFSR ;AN000; + ;AN000; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNC],AL ; 0,1, or 2 ;AN000; + CMP AL,QUERY_OS_TYPE ;AN000; + JE IDI_10 ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ; ioctl generic ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CL ;AN000; + ADD SP,2 ; ditch es stored on stack ;AN000; + JMP SHORT IDI_15 ;AN000; +IDI_10: ; query os type ;AN000; + MOV ES:[BX.IFSR_BUFSIZE],CX ; cx is bufsize ;AN000; + POP CX ; pop input es in cx ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],DI ;AN000; + MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],CX ;AN000; +IDI_15: ;AN000; + CMP AL,GEN_IOCTL_BY_HANDLE ;AN000; + RestoreReg ; restore input bx into ax, no cx ;AN006;;AC012; + ; (drive # or handle) ;AN006; + JE IDI_20 ;AN000; + ;AN000; +;;;;;;; LDS SI,[THISCDS] ; have device number (block only???) ;AD006; + ; Now get CDS: ;AN006; + SaveReg ; function 0,1,2 ;AN012; + MOV AX,CX ; input bx ;AN012; + DEC AL ; make 0-based ;AN006; + MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN006; + CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN006; + RestoreReg ; fcn 0,1,2 ;AN012; + JNC IDI_17 ;AN006; +IDI_16: ;AN012; + MOV AX,error_invalid_drive ; no cds, set error & ret ;AN006; + JMP IDI_120 ; ret up in FA to preserve DS ;AN006; +IDI_17: ; (welcome lock) ;AN006; + TEST DS:[SI.curdir_flags],curdir_isifs ; check if drive ifs ;AN012; + JZ IDI_16 + SaveReg ; save cds ptr al=0,2 ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - netwrk ;AN000; + CMP AL,QUERY_OS_TYPE ;AN000; + JNE IDI_40 ;AN000; + JMP SHORT IDI_60 ;AN000; + ;AN000; +IDI_20: ; al=1 ;AN000; + Context DS ;AN000; + OR IFSPROC_FLAGS,SETDEVICECB ;AN000; + ; Now, need to get THISSFT set: ;AN006; + SaveReg ; these about to be clobbered ;AN006; + MOV BX,CX ; put handle in bx ;AC012; + CallInstall pJFNFromHandle,multDOS,32 ; intermediate step to getting sft ;AN006; + JC IDI_25 ;AN006; + CMP BYTE PTR ES:[DI],-1 ; unused handle ;AN006; + JE IDI_25 ;AN006; + MOV BL,BYTE PTR ES:[DI] ; get SFN ;AN006; + XOR BH,BH ; ignore upper half ;AN006; + CallInstall SFFromSFN,multDOS,22 ; get real sf spot ;AN006; + MOV WORD PTR [THISSFT],DI ;AN006; + MOV WORD PTR [THISSFT+2],ES ;AN006; + RestoreReg ;AN006; + JMP SHORT IDI_30 ;AN006; +IDI_25: ; sft error ;AN006; + RestoreReg ; restore regs ;AN006; + MOV AX,error_invalid_handle ;AN006; + JMP IDI_120 ;AN006; + +IDI_30: ;AN006; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - netwrk ;AN000; +IDI_40: ;AN000; + invoke SET_CATEGORY ; set category 1-unc 0-other ;AN000; + MOV ES:[BX.IFSR_CATEGORY],CL ;AN000; +IDI_60: + MOV DX,IFSIOCTL ; check if fs supports fs ioctl + invoke CHECK_IFS_ATTRIBUTE + JZ IDI_80 ; Z = no support, NZ = yes support + JMP DI_70 ; continues in device_ioctl ;AN000; + ;AN000; +IDI_80: ; error invalid fcn - fs doesn't support ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; if cds, must clean stack of ;AN000; + JZ IDI_100 ; cds ptr ;AN000; + ADD SP,4 ;AN000; +IDI_100: ;AN000; + MOV AX,error_invalid_function ;AN000; +IDI_120: ;AN006; + invoke SET_EXTERR_INFO ; set error info ;AN006; + transfer ifs_980 ; go to general error return ;AN000; + ;AN000; +EndProc IFS_DEPENDENT_IOCTL ;AN000; + + +BREAK ;AN000; + ;AN000; +;****************************************************************************** +; +; DEVICE_IOCTL +; +; Called by: Dispatcher +; +; Routines called: CALL_IFS +; CDS_TO_CD SFT_TO_SFF +; CD_TO_CDS SFF_TO_SFT +; +; Inputs: +; AL = 02H(03H0 Read from(Write to) character device +; BX = handle [THISSFT] set +; CX = number of bytes to read(write) +; DS:DX -> buffer +; AL = 0CH Character Generic IOCTL +; CH = 1-async, 3-display, 5-printer +; CL = 5F-set, 7F-get +; DS:DX -> buffer +; AL = 0DH Block Generic IOCTL +; BH = 0 +; BL = Drive number [THISCDS] set (0-based) +; CH = 08 +; CL = 43-set, 63-get media id +; DS:DX -> buffer +; +; Function: +; Prep IFSRH: +; * IFSR_LENGTH DW 48 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; IFSR_RETCODE DW ? +; IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 17 ; IFS device IOCTL +; IFSR_ERROR_CLASS DB ? +; IFSR_ERROR_ACTION DB ? +; IFSR_ERROR_LOCUS DB ? +; IFSR_ALLOWED DB ? +; IFSR_I24_RETRY DB ? +; IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; * IFSR_DEVICE_CB@ DD ? ; Set by CDS_TO_CD (0DH) +; * IFSR_OPEN_CB@ DD ? ; Set by SFT_TO_SF (0CH) +; * IFSR_FUNC DB 0 ; AL 2,3,12,or 13 +; IFSR_RESV2 DB 0 +; * IFSR_BUFFER@ DD ? ; ds:dx +; * IFSR_BUFSIZE DW ? ; cx for al=2,3 +; * IFSR_CATEGORY DB 1 ; ch for al=12,13 +; * IFSR_CTLFUNC DB ? ; cl for al=12,13 +; +; +; CALL routine, CALL_IFS +; IF IFSR_RETCODE = 0 THEN +; DO +; IF CDS THEN +; Call CD_TO_CDS +; ELSE Call SFF_TO_SFT +; ENDDO +; ELSE +; Set carry +; Put error code in AX +; ENDIF +; +; Outputs: function dependent +; +; Regs: nothing preserved +; +;****************************************************************************** + ;AN000; + procedure DEVICE_IOCTL,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; +; mov ax,26 ; these two instrs temporary +; transfer ifs_980 + + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEVIOCTL ;AN000; + ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ; make sure this positioned ;AN000; + ; right ;AN000; + PUSH DS ; save input ds ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000; + invoke PREP_IFSR ; & ifsr ;AN000; + POP ES:WORD PTR [BX.IFSR_BUFFER@+2] ; put input ds in now before clobber it ;AN005; + ;AN000; + CMP AL,BLOCK_GENERIC ;AN000; + JNE DI_20 ;AN000; + ;AN000; + LDS SI,[THISCDS] ; block generic - cds processing ;AN000; + SaveReg ; save cds ptr ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - netwrk ;AN000; + JMP SHORT DI_40 ;AN000; + ;AN000; +DI_20: ; handle function ;AN000; + OR CS:IFSPROC_FLAGS,SetDeviceCB ; to get possible related cd or df ;AN000; + Context DS ;AN000; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - netwrk ;AN000; +DI_40: ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_DEVIOCTL ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSDEVIOCTL ;AN000; + MOV ES:[BX.IFSR_FUNC],AL ; 2,3,12 or 13 ;AN000; +;;;;; POP DS ; retrieve input ds ;AD005; + MOV ES:WORD PTR [BX.IFSR_BUFFER@],DX ;AN000; +;;;;; MOV ES:WORD PTR [BX.IFSR_BUFFER@+2],DS ;AD005; + CMP AL,CHAR_GENERIC ; fork 2,3 vs 12,13 ;AN000; + JGE DI_60 ; go if 12,13 + MOV ES:[BX.IFSR_BUFSIZE],CX ; 2,3 processing + JMP SHORT DI_70 +DI_60: ; 12,13 processing + MOV ES:[BX.IFSR_CATEGORY],CH ; 1,3,5,or 8 + MOV ES:[BX.IFSR_CTLFUNC],CL ; 5F,7F,4E,or 6E + ;AN000; +DI_70: ;AN000; +;----------------------------------------------------------------------------------------- + invoke CALL_IFS ; call ifs driver w/request ;AN000; +;----------------------------------------------------------------------------------------- + ;AN000; + JNC DI_100 ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; error return ;AN000; + JNZ DI_80 ; if cds clean up stack ;AN000; + transfer ifs_1000 ; go return in ifsutil ;AN000; +DI_80: ;AN000; + ADD SP,4 ; restore stack ;AN000; + transfer ifs_980 ;AN000; + ;AN000; +DI_100: ;AN000; + TEST IFSPROC_FLAGS,ISCDS ;AN000; + JNZ DI_120 ;AN000; + MOV AX,ES:[BX.IFSR_BUFSIZE] ; set return size for 2,3 (won't hurt ;AN000; + invoke SFF_TO_SFT ; for 12 either ;AN000; + transfer ifs_990 ;AN000; +DI_120: ;AN000; + MOV CX,ES:[BX.IFSR_BUFSIZE] ;AN000; + RestoreReg ; restore cds ptr into esdi ;AN000; + invoke CD_TO_CDS ;AN000; + transfer ifs_990 ;AN000; + ;AN000; + ;AN000; +EndProc DEVICE_IOCTL ;AN000; + ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; GET_DFL_FROM_INDEX ;AN000; +; ;AN000; +; Called by: PRINTER_GETSET_STRING ;AN000; +; ;AN000; +; Routines called: none ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BX is index number (as in GetIFSFUNCItem) ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry Clear ;AN000; +; [THISDFL] set ;AN000; +; Carry Set ;AN000; +; Bad index number ;AN000; +; ;AN000; +; Regs: Preserves Printer Get/Set String input regs ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure GET_DFL_FROM_INDEX,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save Ptr GetSet Str input regs ;AC007; + ; (removed ax from above) ;AN007; + PUSH BX ;AN000; +; Compute index # of first device ;AN000; + XOR BX,BX ;AN000; + MOV CX,BX ;AN000; + Context DS ; DS-Dosgroup ;AN003; + MOV CL,[CDSCount] ;AN000; + LDS SI,[CDSAddr] ; Assume not paused ;AN000; + CMP CS:[fAssign],0 ;AN000; + JNZ GDFI_20 ;AN000; + LDS SI,CS:[CDSAlt] ; Paused, get REAL CDSs from here ;AN000; +GDFI_20: ;AN000; + TEST [SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000; + JZ GDFI_40 ;AN000; + INC BX ;AN000; +;;; TEST [SI.CURDIR_TYPE],TYPE_NET_DRIVE ;AD003; +;;; JZ GDFI_40 ; count 2 for redir ;AD003; +;;; INC BX ;AD003; +GDFI_40: ;AN000; + ADD SI,SIZE CURDIR_LIST ; Next CDS ;AN000; + LOOP GDFI_20 ;AN000; + ; BX is index # of first device ;AN000; + POP AX ; Get user index # ;AN000; + SUB AX,BX ;AN000; + JB GDFI_60 ; if carry set (JB), user index < ;AN000; + ; 1st device index - too low ;AN000; + ; go return w/carry already set ;AN000; + MOV CL,CS:[DFLCount] ;AN000; + CMP CL,AL ; AL is now device index # ;AN000; + JAE GDFI_80 ;AN000; +GDFI_60: ;AN000; + MOV AX,error_invalid_parameter ; user index too high ;AN000; + JMP GDFI_980 ; go return w/carry already set ;AN000; +GDFI_80: ;AN000; + LDS SI,CS:[DFLAddr] ;AN000; + MOV BL,SIZE DFLL_list ; size in convenient spot ;AN000; +;;; DEC AX ;AD003 + MUL BL ; get net offset ;AN000; + ADD SI,AX ; convert to true pointer ;AN000; + TEST DS:[SI.DFLL_FLAGS],dfl_inuse ; is this device attached????? ;AN014; + JZ GDFI_60 ; error if not + ;AN000; + PUSH DS ;AN000; + POP DX ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV WORD PTR [THISDFL],SI ;AN000; + MOV WORD PTR [THISDFL+2],DX ;AN000; + invoke PREP_IFSR ; init ifsr ;AN000; + invoke DFL_TO_DF ;AN000; + JMP GDFI_990 ;AN000; + ;AN000; + ;AN000; +GDFI_980: ; Return area ;AN000; + SaveReg ; set thisdfl null on error ;AN008; + RestoreReg ;AN008; + MOV AX,NULL_PTR ;AN008; + MOV WORD PTR [THISDFL],AX ;AN008; + MOV WORD PTR [THISDFL+2],AX ;AN008; + RestoreReg ;AN008; + STC ;AN000; + JMP GDFI_1000 ;AN000; +GDFI_990: ;AN000; + CLC ;AN000; +GDFI_1000: ;AN000; + RestoreReg ; restore regs ;AC007; + ; (removed ax from above) ;AN007; + return ;AN000; + ;AN000; +EndProc GET_DFL_FROM_INDEX ;AN000; + ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM new file mode 100644 index 0000000..dc64893 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSDIR.ASM @@ -0,0 +1,313 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsdir.asm 1.0 87/05/11 ;AN000; +TITLE IFSFUNC DIRECTORY ROUTINES - Routines for IFS driver dispatch ;AN000; +NAME NETDIR ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DIRECTORY related IFS driver calls ;AN000; +; ;AN000; +; IFS_RMDIR ;AN000; +; IFS_MKDIR ;AN000; +; IFS_CHDIR ;AN000; +; ;AN000; +; Programming notes: ;AN000; +; Old redirector segmentation preserved. ;AN000; +; Directory routines do not generate critical errors. ;AN000; +; ;AN000; +; REVISION HISTORY: ;AN000; +; A000 Original version 4.00 May 1987 +; A001 PTM 3671- check for null cds 3/88 RPS/RMG +; ;AN000; +; LOC - 67 ;AN000; +; LOD - 4 ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000; +ifsseg ENDS ;AN000; + ;AN000; +; include the rest of the segment definitions for normal MSDOS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ;AN000; + ; DOSGROUP data ;AN000; + Extrn WFP_START:WORD ;AN000; + Extrn THISCDS:DWORD ;AN000; + ;AN000; +DATA ENDS ;AN000; + ;AN000; + ;AN000; +; define our own code segment ;AN000; + ;AN000; +ifsseg SEGMENT BYTE PUBLIC 'ifsseg' ;AN000; + ASSUME SS:DOSGROUP,CS:ifsseg ;AN000; + ;AN000; + ;IFS Data ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + ;AN000; +BREAK ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_RMDIR ;AN000; +; ;AN000; +;Called by: ;AN000; +; IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: ;AN000; +; CDS_TO_CD ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH as follows: (* indicate which fields set) ;AN000; +; * IFSR_LENGTH DW 42 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 4 ; Remove Directory ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; +; ; and set this as pointer to it. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; Call CD_TO_CDS ;AN000; +; Clear carry ;AN000; +; ELSE ;AN000; +; Set carry ;AN000; +; Put error code in AX ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry clear: CDS FSDA updated ;AN000; +; Carry set on error: error_path_not_found (bad path) ;AN000; +; error_access_denied (file/device not empty) ;AN000; +; ;AN000; +; Notes: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + ;AN000; + procedure IFS_RMDIR,NEAR ;AN000; + ;AN000; + entry IFS_SEQ_RMDIR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr fields for rmdir ;AN000; + ifsr_api_def RMDIR ;AN000; + ;AN000; + PUSH DS ; preserve DS ;AN000; + ;AN000; + invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; + ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSRMDIR ;AN000; + JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000; + ;AN000; +EndProc IFS_RMDIR ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_MKDIR ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: CDS_TO_CD ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ;AN000; +; [THISCDS] Points to CDS being used. Not NULL. ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH as follows: (* indicate which fields set) ;AN000; +; * IFSR_LENGTH DW 42 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 3 ; Create Directory ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; +; ; and set this as pointer to it. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; Call CD_TO_CDS ;AN000; +; Clear carry ;AN000; +; ELSE ;AN000; +; Set carry ;AN000; +; Put error code in AX ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry clear: CDS FSDA updated ;AN000; +; Carry set on error: error_path_not_found (bad path) ;AN000; +; error_access_denied ;AN000; +; (Attempt to re-create read only file , or ;AN000; +; create a second volume id or create a dir) ;AN000; +; ;AN000; +; Notes: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_MKDIR,NEAR ;AN000; + ;AN000; + entry IFS_SEQ_MKDIR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr fields for mkdir ;AN000; + ifsr_api_def MKDIR ;AN000; + ;AN000; + PUSH DS ; preserve DS ;AN000; + ;AN000; + invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; + ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSMKDIR ;AN000; + JMP SHORT CHDIR_10 ; go finish in ifs_chdir ;AN000; + ;AN000; +EndProc IFS_MKDIR ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_CHDIR ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: CDS_TO_CD ;AN000; +; CD_TO_CDS ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ;AN000; +; [THISCDS] Points to CDS being used. Not NUL. ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH as follows: (* indicate which fields set) ;AN000; +; * IFSR_LENGTH DW 42 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 5 ; Change Directory ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; +; ; and set this as pointer to it. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_NAME@ DD ? ; [WFP_START] ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; Call CD_TO_CDS to update CDS ;AN000; +; Clear carry ;AN000; +; ELSE ;AN000; +; Set carry ;AN000; +; Put error code in AX ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry clear: CDS updated. ;AN000; +; Carry set on error: error_path_not_found (bad path) ;AN000; +; error_access_denied ;AN000; +; ;AN000; +; Notes: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_CHDIR,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr fields for chdir ;AN000; + ifsr_api_def CHDIR ;AN000; + ;AN000; + PUSH DS ; preserve DS ;AN000; + ;AN000; + invoke PREP_IFSR ; init ifsr, sets es:bx -> ifsr ;AN000; + ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSCHDIR ;AN000; + ;AN000; +CHDIR_10: ; Welcome rmdir/mkdir code ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_CHDIR ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + ; ds -> dosgroup ;AN000; + MOV SI,WORD PTR [WFP_START] ; to access thiscds & wfp ;AN000; + invoke STRIP_WFP_START ; ditch leading d:\ ;AN000; + MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000; + MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000; + LDS SI,[THISCDS] ;AN000; + SaveReg ;AN000; + MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + CMP SI,NULL_PTR ; skip cds work if cds null ;AN001; + JE CHDIR_20 ;AN001; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - ifsseg ;AN000; +CHDIR_20: ;AN001; + SaveReg ; make sure ds = ifsseg ;AN001; + RestoreReg ;AN001; +;************************************************ + invoke CALL_IFS ; call fs with dir request ;AN000; +;************************************************ + ;AN000; + RestoreReg ; restore cds ptr into es:di ;AN000; + JC CHDIR_1000 ;AN000; + CMP DI,NULL_PTR ; skip cds work if cds null ;AN001; + JE CHDIR_40 ;AN001; + invoke CD_TO_CDS ; update cds ;AN000; + +CHDIR_40: ;AN001; + CLC ;AN000; + ;AN000; +CHDIR_1000: ; finished ;AN000; + POP DS ; restore DS ;AN000; + return ;AN000; + ;AN000; +EndProc IFS_CHDIR ;AN000; + ;AN000; +ifsseg ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM new file mode 100644 index 0000000..5240556 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSERROR.ASM @@ -0,0 +1,637 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)IFSERROR.INC 1.0 87/05/11 ;AN000; +TITLE IFSFUNC ERROR ROUTINES ;AN000; +NAME IFSERROR ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS error Routines ;AN000; +; ;AN000; +; INT_2F_5 ;AN000; +; ;AN000; +; IFS_I24 ;AN000; +; SET_EXTERR_INFO ;AN000; +; PHONEY_DPB ;AN000; +; ;AN000; +; REVISION HISTORY: ;AN000; +; Evolved from Network Redirector NETERROR: MAY 11 1987 ;AN000; +; A000 - Original version 4.00 MAY 1987 ;AN000; +; A001 - PTM 842 Messages +; A002 - PTM 1602 INT 2f-5 interface ds bug RG 10/87 +; A003 - PTM 1683/1769 error msg problems RG 10/87 +; A004 - PTM 2827 error proc chgs RG 1/88 +; A005 - PTM 4140 int 2f 5 interface change RMG 4/12/88 +; A006 - P4789 message problems w/no ifs drivers loaded 5/18/88 RMG +; A007 - P4962 I24 AH not set right for printer 5/24/88 RMG +; A008 - P5030 I24 tempbuf conflict 6/03/88 RMG +; ;AN000; +; LOC - 167 ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +INCLUDE SYSMSG.INC +msg_utilname +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; include the rest of the segment definitions for normal MSDOS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ; DOSGROUP Data ;AN000; + Extrn THISDPB:DWORD ;AN000; + Extrn EXTERR:WORD ;AN000; + Extrn EXTERR_ACTION:BYTE ;AN000; + Extrn EXTERR_CLASS:BYTE ;AN000; + Extrn EXTERR_LOCUS:BYTE ;AN000; + Extrn ALLOWED:BYTE ;AN000; + Extrn ExitHold:DWORD ;AN000; + Extrn ERR_TABLE_21:BYTE +DATA ENDS ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ; IFS Data ;AN000; + Extrn IFSDRV:BYTE ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn TEMPBUF:BYTE ;AN003; + Extrn IFSPROC_FLAGS:WORD ;AN003; + Extrn SYSGetMsg:NEAR + Extrn IFSSEM:BYTE + Extrn THISIFS:DWORD ;AN006; + ;AN000; +; Phoney DPB used by IFS Share/Lock errors ;AN000; + ;AN000; +DUMMY_DPB LABEL BYTE ;AN000; + DB 0 ; dpb_drive ;AN000; + DB 0 ; dpb_UNIT ;AN000; + DW 512 ; dpb_sector_size ;AN000; + DB 0 ; dpb_cluster_mask ;AN000; + DB 0 ; dpb_cluster_shift ;AN000; + DW 1 ; dpb_first_FAT ;AN000; + DB 1 ; dpb_FAT_count ;AN000; + DW 16 ; dpb_root_entries ;AN000; + DW 3 ; dpb_first_sector ;AN000; + DW 3 ; dpb_max_cluster ;AN000; + DB 1 ; dpb_FAT_size ;AN000; + DW 2 ; dpb_dir_sector ;AN000; + DD ? ; dpb_driver_addr ;AN000; + DB 0F8H ; dpb_media ;AN000; + DB -1 ; dpb_first_access ;AN000; + DW -1 ; dpb_next_dpb low ;AN000; + DW -1 ; dpb_next_dpb high ;AN000; + DW 0 ; dpb_next_free ;AN000; + DW -1 ; dpb_free_cnt ;AN000; + ;AN000; +; Phoney device headers used by IFS INT 24H ;AN000; + ;AN000; +PHONEY_BLOCK LABEL BYTE ;AN000; + DD ? ; Pointer ;AN000; + DW ISNET ; Block net dev ;AN000; + DW ? ; Strat entry ;AN000; + DW ? ; Int entry ;AN000; + DB 8 DUP (0) ;AN000; + ;AN000; +PHONEY_DEVICE LABEL BYTE ;AN000; + DD ? ; Pointer ;AN000; + DW DEVTYP + ISNET ; Char net dev ;AN000; + DW ? ; Strat entry ;AN000; + DW ? ; Int entry ;AN000; + ;AN000; + PUBLIC PHONEY_NAME ;AN000; +PHONEY_NAME DB " " ;AN000; + ;AN000; + ;AN000; +NEXT_2F_5 DD ? ;AN000; +PUBLIC NEXT_2F_5 ;AN000; + ;AN000; +; ;AN000; +; ;AN000; +MAXERR EQU 89 ; Don't know errors above 79 ;AN000; + ;AN000; + PUBLIC RODS_LABEL +RODS_LABEL LABEL BYTE +.xcref ;AN000; +.xlist +MSG_SERVICES +.cref ;AN000; +.list + +; +; The following table defines CLASS ACTION and LOCUS info for the INT 21H/24H +; errors. Each entry is 5 bytes long: +; +; Err#,Class,Action,Locus,Allowed_Val +; + +ERR_TABLE_IFS LABEL BYTE + DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;50 ;AN003; + DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;51 ;AN003; + DB errCLASS_Already, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;52 ;AN003; + DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;53 ;AN003; + DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;54 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;55 ;AN003; + DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;56 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;57 ;AN003; + DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;58 ;AN003; + DB errCLASS_SysFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;59 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;60 ;AN003; + DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;61 ;AN003; + DB errCLASS_OutRes, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;62 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;63 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;64 ;AN003; + DB errCLASS_Auth, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;65 ;AN003; + DB errCLASS_BadFmt, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;66 ;AN003; + DB errCLASS_NotFnd, errACT_User, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;67 ;AN003; + DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;68 ;AN003; + DB errCLASS_OutRes, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;69 ;AN003; + DB errCLASS_TempSit, errACT_DlyRet, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;70 ;AN003; + DB errCLASS_BadFmt, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;71 ;AN003; + DB errCLASS_TempSit, errACT_Retry, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;72 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;73 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;74 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;75 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;76 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;77 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;78 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;79 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;80 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;81 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;82 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;83 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;84 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;85 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;86 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;87 ;AN003; + DB errCLASS_HrdFail, errACT_Abort, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;88 ;AN003; + DB errCLASS_Unk, errACT_Panic, errLOC_Disk, Allowed_FAIL+Allowed_RETRY ;?? ;AN003; + +; +; We need to map old int 24 errors and device driver errors into the new set +; of errors. The following table is indexed by the new errors +; +ErrMap24 Label BYTE + DB error_write_protect ; 0 + DB error_bad_unit ; 1 + DB error_not_ready ; 2 + DB error_bad_command ; 3 + DB error_CRC ; 4 + DB error_bad_length ; 5 + DB error_Seek ; 6 + DB error_not_DOS_disk ; 7 + DB error_sector_not_found ; 8 + DB error_out_of_paper ; 9 + DB error_write_fault ; A + DB error_read_fault ; B + DB error_gen_failure ; C + DB error_gen_failure ; D RESERVED + DB error_gen_failure ; E RESERVED + DB error_wrong_disk ; F + +ErrMap24End LABEL BYTE + + +BREAK + +;************************************************************************************ +; +; INT_2F_5 +; +; Called by: COMMAND.COM +; +; Routines called: CALL_IFS +; +; Input: [THISIFS] set +; BX = extended error number ;AN005; +; AL = component ID 0 - install check ;AN005; +; 1 - command.com ;AN005; +; 2 - message retriever ;AN005; +; Function: +; This handler uses 2F multiplex number 5. It allows the INT 24H +; Handler in COMMAND to get message texts for NET extended errors. +; +; IF AH = 5 THEN +; DO +; IF AL < 0F8H THEN +; DO +; ³ IF AL .NE. 0 THEN +; ³ DO +; ³ ³ IF AL >= 50 .AND. AL <= 74 THEN /* or AL = 88 */ +; ³ ³ DO +; ³ ³ ³ Prep IFSRH below +; ³ ³ ³ * IFSR_LENGTH DW 28 ; Request length +; ³ ³ ³ * IFSR_FUNCTION DB 6 ; Get Criter Text +; ³ ³ ³ *+ IFSR_RETCODE DB ? ; AL +; ³ ³ ³ IFSR_RETCLASS DB ? +; ³ ³ ³ IFSR_RESV1 DB 17 DUP(0) +; ³ ³ ³ *+ IFSR_MSG@ DD ? ; Msg buffer address +; ³ ³ ³ *+ IFSR_MSG_TYPE DB ? ; Msg type +; ³ ³ ³ IFSR_RESV2 DB ? +; ³ ³ ³ +; ³ ³ ³ Call IFS specified in [THISIFS] +; ³ ³ ³ IF IFSR_RETCODE = 0 THEN +; ³ ³ ³ DO +; ³ ³ ³ ES:DI = IFSR_MSG@ +; ³ ³ ³ AL = IFSR_MSG_TYPE +; ³ ³ ³ ENDDO +; ³ ³ ³ ELSE get ifsfunc standard msg +; ³ ³ ³ ENDIF +; ³ ³ ³ RET 2 +; ³ ³ ENDDO +; ³ ³ ELSE RET 2 +; ³ ³ ENDIF +; ³ ENDDO +; ³ ELSE DO +; ³ AL = 0FFH /* install check */ +; ³ iret +; ³ ENDDO +; ³ ENDIF +; ENDDO +; ELSE iret +; ENDIF +; ENDDO +; ELSE jump far to [NEXT_2F_5] +; ENDIF +; +; Output: carry clear - AL = msg type (0 or 1) +; If EType is 1 then message is printed in form +; +; Abort, Retry Ignore +; If EType is 0 then message is printed in form +; error (read/writ)ing (drive/device) XXX +; Abort, Retry Ignore +; The message is ASCIZ and DOES NOT +; include a trailing CR,LF +; ES:DI -> message text +; carry set - no message +; +; Notes: all destroyed +; +;************************************************************************************ + ;AN000; + procedure INT_2F_5,FAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def CRITMSG ;AN000; + ;AN000; + CMP AH,5 ; check for IFS error 2F call ;AN000; + JZ I2F5_20 ;AN000; + JMP [NEXT_2F_5] ;AN000; + ;AN000; +I2F5_20: ; call ok ;AN000; + STI ; INTs OK ;AN000; + CMP AL,0F8H ;AN000; + JB I2F5_40 ;AN000; + IRET ; IRET on reserved functions ;AN000; +I2F5_40: ;AN000; + OR AL,AL ;AN000; + JNZ I2F5_60 ;AN000; + MOV AL,0FFH ; Tell Ellen I'm here ;AN000; + IRET ;AN000; +I2F5_60: ;AN000; +;;;;;;;;CMP AL,error_NET_write_fault ; check for special error ;AN000; +;;;;;;;;JE I2F5_80 ;AN000; + CMP BX,50 ;AC005; + JAE I2F5_70 + JMP I2F5_1000 ; Carry set ;AN000; +I2F5_70: + CMP BX,MAXERR ;AC005; + JBE I2F5_80 ;AN000; +I2F5_75: ;AN005; + STC ;AN000; + JMP I2F5_1000 ;AN000; + ;AN000; +I2F5_80: ;AN000; + CMP WORD PTR CS:[THISIFS+2],NULL_PTR ;if no ifs driver set, quit w/carry ;AN006; + JNE I2F5_85 ;AN006; + CMP WORD PTR CS:[THISIFS],NULL_PTR ;AN006; + JZ I2F5_75 ;AN006; +I2F5_85: ;AN006; + TEST CS:IFSSEM,MR_ERRMSG_SEM ; if already in msgret loop, exit fast ;AN005; + JNZ I2F5_75 ;AN005; + MOV CS:IFSPROC_FLAGS,0 ;AN005; + CMP AL,I2F5_MsgRet ;AN005; + JNE I2F5_90 ;AN005; + OR CS:IFSPROC_FLAGS,IsMsgRet ;AN005; + OR CS:IFSSEM,MR_ERRMSG_SEM ; set msgret error msg semaphore ;AN005; +I2F5_90: ;AN005; + SaveReg ; save command.com regs ;AN002;AC003; + RestoreReg ; set ds-ifsseg ;AN002; + MOV AX,BX ; whole ax now ext error ;AN003;;AC005; + SaveReg ; save ext err # ;AN000; + invoke PREP_IFSR ; zero out ifsr, sets es:bx -> ifsr ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_CRITMSG ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSCRITMSG ;AN000; + MOV ES:[BX.IFSR_RETCODE],AX ;AN003; + +;*********************************************************************************************** + invoke CALL_IFS ; call ifs with chance to set errmsg ;AN000; +;*********************************************************************************************** + + JNC I2F5_200 ;AN000; + POP AX ; fs error set - get ifsfunc msg ;AN000; + TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret don't call msg ret for ;AN005; + JZ I2F5_95 ; default msg - just fail ;AN005; + STC ;AN005; + JMP SHORT I2F5_220 ;AN005; +I2F5_95: ;AN005; + MOV DH,1 ;AN000; + CALL SYSGETMSG ; puts msg in dssi,cx=msg size ;AN000; + MOV AH,1 ; set al = msg type 0 or 1 ;AN000; + CMP AL,55 ; all but 55,64,65,88 are 1 ;AN000; + JL I2F5_120 ;AN000; + JE I2F5_100 ;AN000; + CMP AL,64 ;AN000; + JL I2F5_120 ;AN000; + JE I2F5_100 ;AN000; + CMP AL,65 ;AN000; + JE I2F5_100 ;AN000; + CMP AL,88 ;AN000; + JNE I2F5_120 ;AN000; + ;AN000; +I2F5_100: ;AN000; + DEC AH ;AN000; + ;AN000; +I2F5_120: ;AN000; + MOV AL,AH ;AN000; + SaveReg ; msg ret has 0D0A24 at end of msg ;AN003; + RestoreReg ; must change this to asciiz ;AN003; + MOV DI,OFFSET CS:TEMPBUF+80 ; move to temp buff and put 0 at 0DH ;AN003;;AC008;(80) + SaveReg ; preserve msg offset and msg type ;AN003; + REP MOVSB ; move msg to temp buff ;AN003; + XOR AL,AL ;AN003; + STOSB ; store zero at end ;AN003; +I2F5_160: ;AN003; + RestoreReg ; msg type/ msg offset ;AN003; + JMP SHORT I2F5_220 ;AN000; + ;AN000; + ;AN000; +I2F5_200: ; fs supplies error msg ;AN000; + MOV AL,ES:[BX.IFSR_MSG_TYPE] ; grab ifs msg info ;AN000; + MOV DI,WORD PTR ES:[BX.IFSR_MSG@] ;AN000; + MOV ES,WORD PTR ES:[BX.IFSR_MSG@+2] ;AN000; + ADD SP,2 ; restore stack ;AN000; +I2F5_220: ;AN000; + PUSHF ; save carry ;AN005; + TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msgret reset semaphore ;AN005; + JZ I2F5_240 ;AN005; + AND CS:IFSSEM,NOT MR_ERRMSG_SEM ;AN005; +I2F5_240: ;AN005; + POPF ; restore carry ;AN005; + RestoreReg ; retrieve command.com regs ;AN002;AC003; + ;AN000; +I2F5_1000: ;AN000; + RET 2 ; Fakey IRET ;AN000; + ;AN000; +EndProc INT_2F_5 ;AN000; + ;AN000; +ASSUME SS:DOSGROUP ;AN000; + ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SET_EXTERR_INFO ;AN000; +; ;AN000; +; Inputs: ;AN000; +; AL is extended error ;AN000; +; IFSR ;AN000; +; ;AN000; +; Function: ;AN000; +; Set all the EXTERR stuff and ALLOWED ;AN000; +; ;AN000; +; Outputs: ;AN000; +; following set: ;AN000; +; EXTERR word ;AN000; +; EXTERR_ACTION byte ;AN000; +; EXTERR_CLASS " ;AN000; +; EXTERR_LOCUS " ;AN000; +; ALLOWED " ;AN000; +; ;AN000; +; Regs: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SET_EXTERR_INFO,NEAR ;AN000; + ASSUME DS:IFSSEG,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ;AN000; + PUSHF ;AN000; + SaveReg ;AC003; + ;AN000; + XOR AH,AH ; set unknown ah=0 ;AN003; + MOV SS:[EXTERR],AX ; Set extended error ;AC003; + MOV SI,OFFSET ERR_TABLE_IFS ;AC003; + SaveReg ;AN003; + RestoreReg ; ds-ifsseg to access err_table_ifs ;AN003; + CMP AL,50 ; if err not in range, set to ?? ;AN003; + JL SEI_10 ;AN003; + CMP AL,88 ;AN003; + JLE SEI_20 ;AN003; +SEI_10: ;AN003; + MOV AL,89 ;AN003; + ;AN003; +SEI_20: ;AN003; + SUB AL,50 ; space to correct table entry ;AN003; + MOV CL,4 + MUL CL ;AN003; + ADD SI,AX ;AN003; + +SEI_40: ;AN003; + LODSW ; AL is CLASS, AH is ACTION ;AN003; + MOV [EXTERR_ACTION],AH ; Set ACTION ;AN003; + MOV [EXTERR_CLASS],AL ; Set CLASS ;AN003; + LODSW ; al- LOCUS ah- ALLOWED ;AN003; + TEST IFSPROC_FLAGS,ISCDS ;AN003; + JNZ SEI_50 ;AN003; + ADD AL,2 ;AN003; +SEI_50: ;AN003; + MOV [EXTERR_LOCUS],AL ;AN003; + MOV [ALLOWED],AH ;AN003; + ;AN003; + MOV SI,BX ; Set ds:si -> ifsr so can use ;AN003; + SaveReg ; lodsw to get cl,act,loc,allowed ;AN003; + RestoreReg ;AN003; + ADD SI,IFSR_ERROR_CLASS ;AN003; + ; only set if ifs set (not -1) ;AN000; + LODSW ; AH = action, AL = class ;AN000; + CMP AL,ERROR_INFO_NOT_SET ;AN000; + JE SEI_60 ;AN000; + MOV [EXTERR_CLASS],AL ; set class ;AN000; +SEI_60: ;AN000; + CMP AH,ERROR_INFO_NOT_SET ;AN000; + JE SEI_80 ;AN000; + MOV [EXTERR_ACTION],AH ; set action ;AN000; +SEI_80: ;AN000; + LODSW ; AH = allowed, AL = locus ;AN000; + CMP AL,ERROR_INFO_NOT_SET ;AN000; + JE SEI_100 ;AN000; + MOV [EXTERR_LOCUS],AL ; Set locus ;AN000; +SEI_100: ;AN000; + CMP AH,ERROR_INFO_NOT_SET ;AN000; + JE SEI_1000 ;AN000; + MOV [ALLOWED],AH ;AN000; + +SEI_1000: ;AN003; + RestoreReg ;AN000; + POPF ;AN000; + return ;AN000; + +EndProc SET_EXTERR_INFO ;AN000; + + +BREAK ;AN004; + +;************************************************************************************ +; +; DEVICE2EXTERR +; +; Inputs: +; AX is device error +; +; Function: +; Convert device error to extended error +; This is essentially the same routine as in IBMDOS +; +; Outputs: +; AX = extended error +; +; Regs: all preserved +; +;************************************************************************************ + + procedure DEVICE2EXTERR,NEAR ;AN004; + ;AN004; + SaveReg ;AN004; + MOV DI,AX ;AN004; + MOV AX,OFFSET ErrMap24End ;AN004; + SUB AX,OFFSET ErrMap24 ; AX is the index of the first ;AN004; + ; unavailable error. ;AN004; + ; Do not translate if >= AX. ;AN004; + CMP DI,AX ;AN004; + MOV AX,DI ;AN004; + JAE D2E_20 ;AN004; + MOV AL,ErrMap24[DI] ;AN004; + XOR AH,AH ;AN004; +D2E_20: ;AN004; + RestoreReg ;AN004; + return ;AN004; + ;AN004; +EndProc DEVICE2EXTERR ;AN004; + +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_I24 ;AN000; +; ;AN000; +; Called by: CALL_IFS ;AN000; +; ;AN000; +; Routines called: DOS: NET_I24_ENTRY ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [IFSDRV] set (-1 = device, PHONEY_NAME set) ;AN000; +; [EXTERR...] Set ;AN000; +; [ALLOWED] Set ;AN000; +; IFSR ;AN000; +; ;AN000; +; Function: ;AN000; +; DI = Mapped I 24 error code (0-12) ;AN000; +; AH is bit info (if block) ;AN000; +; Perform I 24 error to get user response ;AN000; +; ;AN000; +; Outputs: ;AN000; +; AL = 0 ;AN000; +; Ignore ;AN000; +; AL = 1 ;AN000; +; Retry ;AN000; +; AL = 3 ;AN000; +; Fail ;AN000; +; ;AN000; +; Regs: DI, AX Revised ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_I24,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + XOR AH,AH ; AL - extended error (retcode) ;AD007; + MOV DI,AX ; set DI = i24 error code C-general fail ;AC007; + MOV WORD PTR [EXITHOLD+2],ES ; save es:bp here since fetchi ;AN000; + MOV WORD PTR [EXITHOLD],BP ; restores in NET_I24_ENTRY ;AN000; + PUSH CS ;AN000; + POP BP ; BP=seg part of BP:SI dev ptr ;AN000; + ;AN000; + MOV AL,[IFSDRV] ; set dev hdr offset ;AN000; + CMP AL,-1 ;AN000; + JZ I24_20 ;AN000; + MOV SI,OFFSET PHONEY_BLOCK ; block device ;AN000; + JMP SHORT I24_40 ;AN000; +I24_20: ;AN000; + MOV SI,OFFSET PHONEY_DEVICE ; char device ;AN000; + MOV AH,87H ; char dev, write, data area ;AN007; + ;AN000; +I24_40: ;AN000; + OR AH,ES:[BX.IFSR_ALLOWED] ; bit 7 = 0-disk or 1(other),... ;AC007; + ;AN000; + CallInstall NET_I24_ENTRY,MultDOS,6,, ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc IFS_I24 ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; PHONEY_DPB ;AN000; +; ;AN000; +; Input: ;AN000; +; [IFSDRV] Set ;AN000; +; ;AN000; +; Function: ;AN000; +; Build a phoney DPB for IFS Share/Lock errors ;AN000; +; ;AN000; +; Outputs: ;AN000; +; [THISDPB] Set ;AN000; +; ;AN000; +; Regs: ALL preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure PHONEY_DPB,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + PUSH AX ;AN000; + MOV WORD PTR [THISDPB],OFFSET DUMMY_DPB ;AN000; + MOV WORD PTR [THISDPB+2],CS ;AN000; + MOV AL,[IFSDRV] ;AN000; + MOV BYTE PTR [DUMMY_DPB + dpb_drive],AL ;AN000; + MOV WORD PTR [DUMMY_DPB + dpb_driver_addr],OFFSET PHONEY_BLOCK ;AN000; + MOV WORD PTR [DUMMY_DPB + dpb_driver_addr + 2],CS ;AN000; + POP AX ;AN000; + return ;AN000; + ;AN000; +EndProc PHONEY_DPB ;AN000; + +include msgdcl.inc ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM new file mode 100644 index 0000000..6f3ff2d --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFDOS.ASM @@ -0,0 +1,476 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsfdos.asm 1.0 87/08/29 ;AN000; +TITLE IFSFUNC DOS CALLBACK ROUTINES - Routines for ifs ;AN000; +NAME IFSFDOS ;AN000; +;*********************************************************************************** ;AN000; +; ;AN000; +; IFS DOS Callback Routines ;AN000; +; ;AN000; +; IFSFDOS ;AN000; +; ;AN000; +; REVISION HISTORY: ;AN000; +; A000 - Original version 4.00 AUG 1987 DCR - 96 ;AN000; +; A001 - DCR 47 Get disk/device pause status AUG '87 RG ;AN000; +; A002 - PTM 2610 Time/date problems DEC '87 RG ;AN000; +; ;AN000; +; LOC - ;AN000; +; ;AN000; +;*********************************************************************************** ;AN000; + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +.cref ;AN000; +.list ;AN000; +.sall ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ; DOSGROUP data ;AN000; + Extrn YEAR:WORD + Extrn YRTAB:BYTE + Extrn MONTAB:BYTE +DATA ENDS ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data ;AN000; + ;AN000; + Extrn IFSFUNC_FLAGS:WORD ;AN000; + Extrn DOSCALL@:DWORD ;AN000; + Extrn fAssign:BYTE ;AN001; + Extrn fPrint:BYTE ;AN001; + ;AN000; + ;AN000; +BREAK ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SET_IFS_DOSCALL@ ;AN000; +; ;AN000; +;Called by: ;AN000; +; IFSFUNCINIT ;AN000; +; ;AN000; +; Routines called: ;AN000; +; none ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS-ifsseg ;AN000; +; ;AN000; +; Function: ;AN000; +; replace ifs_doscall@ addresses in all ifs driver headers with ;AN000; +; ifsfunc address ;AN000; +; ;AN000; +; Outputs: ;AN000; +; none ;AN000; +; ;AN000; +; Notes: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SET_IFS_DOSCALL@,NEAR ;AN000; +ASSUME DS:IFSSEG ;AN000; + TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; + JZ SID_20 ;AN000; + transfer ifs_1000 ;AN000; +SID_20: ;AN000; + SaveReg ;AN000; + MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; + INT 21h ; es:bx -> sysinitvars ;AN000; + LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; + SaveReg ;AN000; + LES DI,ES:[DI.IFS_DOSCALL@] ;AN000; + MOV WORD PTR [DOSCALL@],DI ;AN000; + MOV WORD PTR [DOSCALL@+2],ES ;AN000; + RestoreReg ; 1st driver addr ;AN000; + MOV SI,OFFSET IFSFUNC_DOSCALL@ ;AN000; +SID_40: ; *** loop here on ifs_doscall@ fixing ;AN000; + MOV WORD PTR ES:[DI.IFS_DOSCALL@],SI ;AN000; + MOV WORD PTR ES:[DI.IFS_DOSCALL@+2],DS ;AN000; + LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000; + CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000; + JNE SID_40 ;AN000; + MOV AX,ES ;AN000; + CMP AX,NULL_PTR ;AN000; + JNE SID_40 ;AN000; + ;AN000; +SID_1000: ;AN000; + RestoreReg ;AN000; + return ;AN000; + ;AN000; +EndProc SET_IFS_DOSCALL@ ;AN000; + ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFSFUNC_DOSCALL@ ;AN000; +; ;AN000; +;Called by: ;AN000; +; IFS Drivers ;AN000; +; ;AN000; +; Routines called: ;AN000; +; none ;AN000; +; ;AN000; +; Inputs: ;AN000; +; SS-dosgroup ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Outputs: ;AN000; +; none ;AN000; +; ;AN000; +; Notes: none preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFSFUNC_DOSCALL@,FAR ;AN000; + ;AN000; + CMP AH,33 ;AN001; + JNE ID_20 ;AN000; + CALL DOS_RETURN_ASSIGN_MODE ;AN001; + JMP SHORT ID_1000 ;AN001; +ID_20: ;AN001; + CMP AH,34 ;AN000; + JNE ID_40 ;AN000; + CALL DOS_TO_NET_DATE ;AN000; + JMP SHORT ID_1000 ;AN000; +ID_40: ;AN000; + CMP AH,35 ;AN000; + JNE ID_100 ;AN000; + CALL NET_TO_DOS_DATE ;AN000; + JMP SHORT ID_1000 ;AN000; +ID_100: ;AN000; + CALL CS:[DOSCALL@] ;AN000; + ;AN000; +ID_1000: ;AN000; + RET ;AN000; + ;AN000; + ;AN000; +EndProc IFSFUNC_DOSCALL@ ;AN000; + + +BREAK ;AN000; + +;************************************************************************************ +; +; DOS_RETURN_ASSIGN_MODE +; +; Called by: IFSFUNC_DOSCALL@ +; +; Routines called: None +; +; Inputs: +; BL = macro type +; 3 - device +; 4 - drive +; Function: +; If macro type = 3 (network printer) THEN +; BX = fPrint .AND. 1 +; Elseif macro type = 4 (network disk) THEN +; BX = fAssign .AND. 1 +; Else set error_invalid_function +; +; Output: +; Carry clear - BH = mode (0 - off, 1 - on) +; Carry set - AL error code +; +; Notes: This routine needed only for UNC file system. This is the +; only FS that supports pause. +; +;************************************************************************************ + + Procedure DOS_RETURN_ASSIGN_MODE,NEAR ;AN001; +ASSUME DS:NOTHING,ES:NOTHING ;AN001; + ;AN001; + CMP BL,3 ; if (type == drive) ;AN001; + JZ DRAM_20 ;AN001; + CMP BL,4 ;AN001; + JNZ DRAM_60 ;AN001; + MOV BH,fAssign ; t = fAssign; ;AN001; + JMP Short DRAM_40 ; else ;AN001; +DRAM_20: ; if (type == print) ;AN001; + MOV BH,fPrint ; t = fPrint; ;AN001; +DRAM_40: ;AN001; + AND BH,1 ; return t&1; ;AN001; + transfer ifs_990 ; go to general good ret in util ;AN001; + ;AN001; +DRAM_60: ;AN001; + MOV AL,error_invalid_function ;AN001; + transfer ifs_980 ; go to general bad ret in util ;AN001; + ;AN001; +EndProc DOS_RETURN_ASSIGN_MODE ;AN001; + +BREAK ;AN000; + +;************************************************************************************ +; +; DOS_TO_NET +; +; Called by: IFSFUNC_DOSCALL@ +; +; Routines called: None +; +; Inputs: ;AN000; +; DX = MS-DOS Date ;AN000; +; CX = MS-DOS Time ;AN000; +; Function: ;AN000; +; Convert DOS Date Time to Network date ;AN000; +; Outputs: ;AN000; +; DX:CX = Seconds since 1-1-70 ;AN000; +; No other registers Revised ;AN000; +; +;************************************************************************************ + +FOURYEARS = (3*365) + 366 ; Days in four years ;AN000; + + procedure DOS_TO_NET_DATE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + OR AL,AL ; check where to get dos date/time ;AN002; + JNZ DTND_20 ;AN002; + CallInstall DATE16,MultDOS,13 ; Get local date/time ;AN000; + MOV CX,DX ;AN000; + XCHG AX,DX ;AN000; + ;AN000; +DTND_20: ;AN002; + PUSH DS ;AN000; + PUSH SS ;AN000; + POP DS ;AN000; +ASSUME DS:DOSGROUP ;AN000; + PUSH [YEAR] ; The routines in DOS (in particular ;AN000; + ; GET_DATE) do not like [YEAR] ;AN000; + ; getting changed by the call ;AN000; + ; to SETYEAR. ;AN000; + PUSH SI ;AN000; + PUSH BX ;AN000; + PUSH AX ;AN000; + PUSH CX ;AN000; + PUSH DX ;AN000; + ;AN000; + MOV CL,9 ;AN000; + SHR DX,CL ; Year to DL ;AN000; + MOV CX,DX ; Year in CX (CL) ;AN000; + POP DX ;AN000; + AND DX,1FFH ; Mask off year ;AN000; + SHL DX,1 ;AN000; + SHL DX,1 ;AN000; + SHL DX,1 ; Month in DH ;AN000; + SHR DL,1 ;AN000; + SHR DL,1 ;AN000; + SHR DL,1 ; Right justify day in DL ;AN000; + CallInstall SetYear,MultDOS,27 ; Set [YEAR] and # days in FEB ;AN000; + SHR CX,1 ;AN000; + SHR CX,1 ; Divide year by 4, chuck remainder ;AN000; + MOV AX,FOURYEARS ;AN000; + MOV BX,DX ; Get DX out of way ;AN000; + MUL CX ; # days in AX ;AN000; + MOV CL,BYTE PTR [YEAR] ;AN000; + AND CL,3 ; Get remainder from / by 4 ;AN000; + MOV SI,OFFSET DOSGROUP:YRTAB ;AN000; + MOV DX,AX ;AN000; + SHL CX,1 ; Two entries/year ;AN000; + CallInstall DSum,MultDOS,28,, ;AN000; + MOV CL,BH ; Month ;AN000; + DEC CX ; Make 0 indexed ;AN000; + MOV SI,OFFSET DOSGROUP:MONTAB ;AN000; + CallInstall DSum,MultDOS,28,, ;AN000; + MOV CL,BL ; day of month ;AN000; + DEC CX ; Make 0 indexed ;AN000; + ADD CX,DX ; CX is days since 1-1-80 ;AN000; +; ;AN000; +; The following three instructions implement this: ;AN000; +; ;AN000; +; CX * 15180H sec/day = (CX * 5180H) + (CX * 10000H) ;AN000; +; ;AN000; + MOV AX,5180h ;AN000; + MUL CX ; (DX:AX) = days * 5180h ;AN000; + ADD DX,CX ; (DX:AX) = days * 15180h = seconds ;AN000; + ;AN000; + ADD AX,0A600H ;AN000; + ADC DX,012CEH ; Bias by # seconds from 1-1-70 to ;AN000; + ; 1-1-80 (12CEA600H) ;AN000; + POP BX ; Get DOS time ;AN000; + PUSH AX ;AN000; + PUSH DX ; Save date seconds ;AN000; + PUSH BX ;AN000; + MOV CL,11 ;AN000; + SHR BX,CL ; BX is hours ;AN000; + MOV AX,60 ;AN000; + MUL BX ; AX hours converted to minutes ;AN000; + ; 5A0H min/day so DX = 0 ;AN000; + POP BX ;AN000; + PUSH BX ;AN000; + AND BX,7FFH ; Mask off hours ;AN000; + MOV CL,5 ;AN000; + SHR BX,CL ; BX is minutes ;AN000; + ADD AX,BX ; AX is minutes ;AN000; + MOV BX,60 ;AN000; + MUL BX ; DX:AX is hours:min converted to sec ;AN000; + POP BX ;AN000; + AND BX,1FH ; BX is seconds/2 ;AN000; + SHL BX,1 ; BX is seconds ;AN000; + ADD AX,BX ;AN000; + ADC DX,0 ;AN000; + MOV CX,AX ; DX:CX is DOS time in seconds ;AN000; + POP BX ;AN000; + POP SI ; BX:SI is DOS Date in seconds ;AN000; + ADD CX,SI ;AN000; + ADC DX,BX ; DX:CX is NET time ;AN000; + POP AX ;AN000; + POP BX ;AN000; + POP SI ;AN000; + POP [YEAR] ;AN000; + POP DS ;AN000; + return ;AN000; + ;AN000; +EndProc DOS_TO_NET_DATE ;AN000; + ;AN000; +; Inputs: ;AN000; +; DX:CX = Seconds since 1-1-70 ;AN000; +; Function: ;AN000; +; Convert Network date to DOS Date Time ;AN000; +; NOTE: WARNING!!!!!!! ;AN000; +; This routine WILL NOT convert network times > 92CEA5FFH ;AN000; +; (7FFFFFFF + 12CEA600). If such a time is encountered this ;AN000; +; routine returns 1-1-80 0:0:0. ;AN000; +; Outputs: ;AN000; +; DX = MS-DOS Date ;AN000; +; CX = MS-DOS Time ;AN000; +; No other registers Revised ;AN000; + ;AN000; + procedure NET_TO_DOS_DATE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + SUB CX,0A600H ;AN000; + SBB DX,012CEH ; UnBias by # seconds from 1-1-70 to ;AN000; + ; 1-1-80 (12CEA600H) ;AN000; + JNC GO_ON ;AN000; + ; Date is before 1-1-80 ;AN000; +TO_BIG_LITTLE_TIME: ;AN000; + XOR DX,DX ;AN000; + MOV CX,DX ; Set 1-1-80 0:0:0 ;AN000; + return ;AN000; + ;AN000; +GO_ON: ;AN000; + TEST DX,8000H ; Check for high bit ;AN000; + JNZ TO_BIG_LITTLE_TIME ;AN000; + PUSH DS ;AN000; + PUSH SS ;AN000; + POP DS ;AN000; +ASSUME DS:DOSGROUP ;AN000; + PUSH [YEAR] ; The routines in DOS (in particular ;AN000; + ; GET_DATE) do not like [YEAR] ;AN000; + ; getting changed by the call ;AN000; + ; to SETYEAR. ;AN000; + PUSH AX ;AN000; + PUSH BX ;AN000; + PUSH SI ;AN000; + PUSH BP ;AN000; + XCHG AX,CX ; DX:AX # seconds ;AN000; + MOV SI,0A8C0h ; (si) = seconds in a half day ;AN000; + ; 15180H/2 ;AN000; +; ;AN000; +; NOTE: The following DIV is the reason we can't convert times with the ;AN000; +; high bit set (after they're unbiased by 1-1-80 - 1-1-70). ;AN000; +; If we tried one it MIGHT overflow. The cutoff is ;AN000; +; actually (A8C0 * FFFF) + A8BF = A8BFFFFF but we choose a smaller ;AN000; +; number (7FFFFFFF) because it's easier to test for. 7FFFFFFF = ;AN000; +; about 68 years from 1-1-80 which is 1-1-2048. ;AN000; +; ;AN000; + DIV SI ; (AX) = 2*days ;AN000; + ; (CX) = half-day remainder ;AN000; + MOV BX,DX ;AN000; + XOR DX,DX ;AN000; + MOV CX,DX ;AN000; + SHR AX,1 ; DX:AX = days ;AN000; + JNC NTDD1 ; didn't shift off a bit, no extra rem ;AN000; + ADD BX,0A8C0h ; did shift bit, adjust remainder ;AN000; + ADC CX,0 ; by extra 1/2 day of seconds ;AN000; + ;AN000; + ;DX:AX is # days since 1-1-80 ;AN000; + ;CX:BX is seconds into that day ;AN000; +NTDD1: ;AN000; + PUSH DX ;AN000; + PUSH AX ;AN000; + MOV DX,CX ;AN000; + MOV AX,BX ;AN000; + MOV CX,60 ; 60 sec/min ;AN000; + DIV CX ;AN000; + ;AX is min, DX(DL) is secs ;AN000; + DIV CL ; 60 min/hr ;AN000; + ;AH is Min, AL is hrs ;AN000; + SHR DL,1 ; Div seconds by 2 ;AN000; + AND DL,1FH ; DL is seconds/2 ;AN000; + MOV DH,AH ; Copy min to DH ;AN000; + MOV CL,5 ;AN000; + SHL AH,CL ; Low 3 bits of min in high 3 bits ;AN000; + OR DL,AH ; DL is now low byte of time ;AN000; + MOV CL,3 ;AN000; + SHR DH,CL ; High 3 bits of min to low 3 bits ;AN000; + AND DH,7 ;AN000; + MOV CL,3 ;AN000; + SHL AL,CL ; Hours to high 5 bits ;AN000; + AND AL,0F8H ;AN000; + OR DH,AL ; DX is now DOS time ;AN000; + MOV CX,DX ;AN000; + POP AX ;AN000; + POP DX ; DX:AX days since 1-1-80 ;AN000; + PUSH CX ; Stash time ;AN000; + MOV CX,FOURYEARS ;AN000; + DIV CX ; AX # four year increments ;AN000; + ; DX remainder days ;AN000; + SHL AX,1 ;AN000; + SHL AX,1 ;AN000; + SHL AX,1 ; Mult by 8 (AX # 1/2 years) ;AN000; + MOV CX,AX ;AN000; + MOV SI,OFFSET DOSGROUP:YRTAB ;AN000; + CallInstall DSlide,MultDOS,29,, ;AN000; + SHR CX,1 ; 1/2 years to whole years ;AN000; + JNC SK ;AN000; + ADD DX,200 ; Extra 1/2 year ;AN000; +SK: ;AN000; + CallInstall SetYear,multDOS,27 ;AN000; + PUSH CX ;AN000; + MOV CL,1 ; At least at first month in year ;AN000; + MOV SI,OFFSET DOSGROUP:MONTAB ;AN000; + CallInstall DSlide,MultDOS,29,, ;AN000; + INC DX ; Days start at 1 ;AN000; + POP AX ;AN000; + MOV CH,CL ;AN000; + ; DL is day, CH is month, AL is year ;AN000; + SHL AL,1 ; Year to high 7 bits ;AN000; + AND AL,0FEH ;AN000; + MOV AH,CH ;AN000; + MOV CL,3 ;AN000; + SHR AH,CL ; High bit of month to bit 0 ;AN000; + AND AH,1 ;AN000; + OR AH,AL ; AH is high byte of date ;AN000; + AND DL,1FH ; Day is low 5 bits ;AN000; + MOV CL,5 ;AN000; + SHL CH,CL ; Low 3 bits of month to high 3 bits ;AN000; + AND CH,0E0H ;AN000; + OR DL,CH ;AN000; + MOV DH,AH ; Date in DX ;AN000; + POP CX ; Time to CX ;AN000; + POP BP ;AN000; + POP SI ;AN000; + POP BX ;AN000; + POP AX ;AN000; + POP [YEAR] ;AN000; + POP DS ;AN000; + return ;AN000; + ;AN000; +EndProc NET_TO_DOS_DATE ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; +END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM new file mode 100644 index 0000000..5b0188f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM @@ -0,0 +1,1778 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsfile.asm 1.0 87/05/11 ;AN000; +TITLE IFS FILE ROUTINES - Routines for IFS dispatch ;AN000; +NAME IFSFILE ;AN000; +;************************************************************************************ +; +; FILE (WFP_START) related Network calls +; +; IFS_DISK_INFO +; IFS_SEQ_SET_FILE_ATTRIBUTE +; IFS_SET_FILE_ATTRIBUTE +; IFS_SEQ_GET_FILE_INFO +; IFS_GET_FILE_INFO +; IFS_SEQ_RENAME +; IFS_RENAME +; IFS_SEQ_DELETE +; IFS_DELETE +; IFS_SEQ_OPEN +; IFS_OPEN +; IFS_SEQ_CREATE +; IFS_CREATE +; IFS_SEQ_XOPEN +; IFS_XOPEN +; IFS_SEQ_SEARCH_FIRST +; IFS_SEQ_SEARCH_NEXT +; IFS_SEARCH_FIRST +; IFS_SEARCH_NEXT +; OPEN_CHECK_SEQ +; +; Programming notes: +; Old redirector segmentation and DOS interface preserved. +; Routine prologues are accurate for input/output. +; However, the pseudocode was not kept up to date. +; Use it for a rough idea of the routine function. +; +; REVISION HISTORY: +; A000 Original version 4.00 - May 1987 +; A001 PTM 316 - Fix search next drive byte interpretation +; Set drive number in DMAADD +; A002 PTM 845 - Disk info ignored +; A003 PTM 869 - Lock failure due to sf_ifs_hdr not set +; A004 DCR 213 - SFT Serial number +; A005 PTM 849 - Printer open problems +; A006 PTM 1518- open mode/flag finalized +; A007 PTM ????- Action Taken not set on Extended open 10/27 FEIGENBAUM +; A008 PTM ????- Old Open/Creates pass parms list 10/27 FEIGENBAUM +; A009 PTM 2247- Delete does not return carry on error 11/3 RG +; A010 PTM 2248- Old Create mode incorrect - must be 2 11/3 RG +; A011 DCR 285 - Remove Extended Attribute/Lock support 1/88 RG +; A012 PTM 3968- set sft time/date on create 3/25/88 RMG +; A013 - sft analysis changes 3/25/88 RMG +; A014 Austin Deviceless Attach problems 3/28/88 RMG +; A015 P4392 SFT change - attr_hi gone 4/19/88 RMG +; A016 P4801 File size segment not right 5/10/88 RMG +; A017 P???? DS not preserved during CALLBACK 5/13/88 RPS +; LOC - 486 +; +;************************************************************************************ + +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +INCLUDE DOSCNTRY.INC +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; then define the base code segment of the ifsfunc support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; include the rest of the segment definitions for normal MSDOS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ;DOSGROUP Data ;AN000; + Extrn REN_WFP:WORD ;AN000; + Extrn WFP_START:WORD ;AN000; + Extrn SATTRIB:BYTE ;AN000; + Extrn ATTRIB:BYTE ;AN000; + Extrn THISCDS:DWORD ;AN000; + Extrn THISSFT:DWORD ;AN000; + Extrn DMAADD:DWORD ;AN000; + Extrn CDSADDR:DWORD ;AN000; + Extrn SAVE_BX:WORD ;AN000; + Extrn SAVE_CX:WORD ;AN000; + Extrn SAVE_DX:WORD ;AN000; + Extrn SAVE_SI:WORD ;AN000; + Extrn SAVE_DI:WORD ;AN000; + Extrn SAVE_DS:WORD ;AN000; + Extrn SAVE_ES:WORD ;AN000; + Extrn Name1:BYTE ;AN000; + Extrn DEVPT:DWORD ;AN000; + Extrn CPSWFLAG:BYTE + Extrn COUNTRY_CDPG:BYTE +if debug ;AN000; + Extrn BugLev:WORD ;AN000; + Extrn BugTyp:WORD ;AN000; + include bugtyp.asm ;AN000; +endif ;AN000; +DATA ENDS ;AN000; + ;AN000; + ;AN000; +; define our own code segment ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn IFSDRV:BYTE ;AN000; + Extrn IFSPROC_FLAGS:WORD ;AN000; + Extrn UNC_FS_HDR:DWORD ;AN000; + Extrn THISIFS:DWORD ;AN000; + Extrn THISDFL:DWORD ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + Extrn SFT_SERIAL_NUMBER:WORD ;AN004; + Extrn fAssign:BYTE ;AN014; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_DISK_INFO ;AN000; +; ;AN000; +; Input: ;AN000; +; ES:DI -> CDS (not NULL) ;AN000; +; DS -> DOSGROUP ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Total length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 2 ; Disk Attributes ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; +; ; and set this as pointer to it. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; + IFSR_ALLOCUNITS DW number of allocation units ;AN000; +; + IFSR_ALLOCSIZE DW allocation unit sectors ;AN000; +; + IFSR_SECTSIZE DW sector size ;AN000; +; + IFSR_AVAILALLOC DW free allocation units ;AN000; +; + IFSR_FSID DB file system media id ;AN000; +; IFSR_RESV3 DB 0 ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call CD_TO_CDS to update CDS ;AN000; +; Set: ;AN000; +; DX = IFSR_AVAILALLOC ;AN000; +; BX = IFSR_ALLOCUNITS ;AN000; +; CX = IFSR_SECTSIZE ;AN000; +; AL = IFSR_ALLOCSIZE ;AN000; +; AH = IFSR_FSID ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Put error code in AX ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Output: ;AN000; +; DX = Number of free allocation units ;AN000; +; BX = Total Number of allocation units on disk ;AN000; +; CX = Sector size ;AN000; +; AL = Sectors per allocation unit ;AN000; +; AH = Media ID BYTE ;AN000; +; Carry set if error ;AN000; +; ;AN000; +; Regs: Segs and DI preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_DISK_INFO,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + MOV AX,DI ; set ifsDrv for possible I24 ;AN000; + invoke IFSDrvFromCDS ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for diskattr ;AN000; + ifsr_api_def DISKATTR ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; & processing flags ;AN000; + ;AN000; + PUSH ES ; set ds:si -> cds ;AN000; + POP DS ;AN000; + MOV SI,DI ;AN000; + ;AN000; + invoke PREP_IFSR ; init ifsr ;AN000; + SaveReg ; save for cd_to_cds ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_DISKATTR ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSDISKATTR ;AN000; + ;AN000; + invoke CALL_IFS ; call fs with diskattr request ;AN000; + ;AN000; + JNC DA_20 ;AN000; + RestoreReg ; error - restore stack ;AN000; + JMP FA_1000 ; go return ;AN000; +DA_20: ;AN000; + MOV DX,ES:[BX.IFSR_AVAILALLOC] ; no error - load return regs ;AN000; + MOV CX,ES:[BX.IFSR_SECTSIZE] ;AN000; + MOV AX,ES:[BX.IFSR_ALLOCSIZE] ;AN000; + MOV AH,ES:[BX.IFSR_FSID] ;AN000; + MOV BX,ES:[BX.IFSR_ALLOCUNITS] ;AM002; + RestoreReg ; restore cds into es:di ;AN000; + invoke CD_TO_CDS ;AN000; + CLC ;AN000; + JMP FA_1000 ; go ret in file attr routine ;AN000; + ; since it restores ds-dosgroup ;AN000; + ;AN000; +EndProc IFS_DISK_INFO ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; +; ;AN000; +; see IFS_GET_FILE_INFO for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_SET_FILE_ATTRIBUTE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def FILEATTR ;AN000; + ;AN000; + PUSH AX ; save file attrs ;AN000; + ;AN000; + invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; + JC SA_20 ; cf=0 unc, cf=1 device ;AN000; + ;AN000; + PUSH CS ; get addressability to IFSSEG ;AN000; + POP DS ; prep ifsflags for set ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV IFSPROC_FLAGS,ZERO ;AN000; + JMP SHORT SFA_20 ; cont. in ifs_seq_get_fa ;AN000; + ;AN000; +EndProc IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SET_FILE_ATTRIBUTE ;AN000; +; ;AN000; +; see IFS_GET_FILE_INFO for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SET_FILE_ATTRIBUTE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def FILEATTR ;AN000; + ;AN000; + PUSH AX ; save file attrs ;AN000; +SA_20: ;AN000; + MOV CS:IFSPROC_FLAGS,0 ; prep ifsflags ;AN000; + JMP SHORT FA_20 ; cont. in ifs_get_file_info ;AN000; + ;AN000; +EndProc IFS_SET_FILE_ATTRIBUTE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_GET_FILE_ATTRIBUTE ;AN000; +; ;AN000; +; see IFS_GET_FILE_INFO for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_GET_FILE_INFO,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def FILEATTR ;AN000; + ;AN000; + invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; + JC FA_10 ; cf=0 unc, cf=1 device ;AN000; + ;AN000; + PUSH CS ; prep ifsflags for get & seq ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV IFSPROC_FLAGS,ISGET ;AN000; + ;AN000; +SFA_20: ;AN000; + OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; + invoke SET_THISIFS_UNC ; set thisifs = unc ;AN000; + invoke PREP_IFSR ; init ifsr ;AN000; + JMP SHORT FA_200 ; cont. in ifs_get_file_info ;AN000; + ;AN000; +EndProc IFS_SEQ_GET_FILE_INFO ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; GET_FILE_INFO ;AN000; +; ;AN000; +; Routines called: DFL_SINGLE_FILE_CHECK ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; +; terminated) ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; (Low word = -1 if NUL CDS (dfl)) ;AN000; +; [SATTRIB] is attribute of search (determines what files may be found) ;AN000; +; AX is new attributes to give to file (already checked for bad bits) ;AN000; +; Function: ;AN000; +; ;AN000; +; IF seq call THEN ;AN000; +; DO ;AN000; +; Set IFS Header pointer to UNC IFS ;AN000; +; Set IFSR_DEVICE_CB@ = null ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; IF [THISCDS] .NOT. NULL THEN ;AN000; +; CALL CDS_TO_CD ;AN000; +; ELSE DO ;AN000; +; CALL DFL_SINGLE_FILE_CHECK ;AN000; +; IF have DFL that supports single file fcns THEN ;AN000; +; call DFL_TO_DF ;AN000; +; ELSE set error - device not IFS or no single file support ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; IF no error THEN ;AN000; +; DO ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 66 ; Total length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB ? ; 2=get 3=set depends on INT 2FH ;AN000; +; * IFSR_RESV3 DB ? +; * IFSR_SUBFUNC DB 0 ; in-line parms ;AN000; +; * IFSR_RESV4 DB ? +; IFSR_BUFFER1@ DD ? ; not used here +; IFSR_BUFFER2@ DD ? ; not used here +; IFSR_COUNT DW ? ; not used here +; * IFSR_MATCHATTR DW ? ; format 0000000re0advshr ;AN000; +; * IFSR_NAME@ DD ? ; ASCIIZ file name ptr ;AN000; +; + IFSR_SIZE DD ? ; file size ;AN000; +; + IFSR_DATE DW ? ; file date ;AN000; +; + IFSR_TIME DW ? ; file time ;AN000; +; *+ IFSR_ATTR DW ? ; file attribute ;AN000; +; ; format 0000000re0advshr ;AN000; +; ; Set to AX on set ;AN000; +; ;AN000; +; IF set THEN ;AN000; +; DO ;AN000; +; IFSR_FUNC = 3 ;AN000; +; IFSR_ATTR = AX ;AN000; +; ENDDO ;AN000; +; ELSE IFSR_FUNC = 2 ;AN000; +; ENDIF ;AN000; +; CALL routine, CALL_IFS, with pointer to IFS Header ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; IF cds THEN Call CD_TO_CDS ;AN000; +; IF dfl THEN Call DF_TO_DFL ;AN000; +; IF get THEN ;AN000; +; DO ;AN000; +; AX = IFSR_ATTR ;AN000; +; CX = IFSR_TIME ;AN000; +; DX = IFSR_DATE ;AN000; +; BX:DI = IFSR_SIZE ;AN000; +; ENDDO ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; AX = IFSR_RETCODE ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ELSE Set carry ;AN000; +; ENDIF ;AN000; +; Outputs: ;AN000; +; CARRY CLEAR ;AN000; +; AX = ATTR ;AN000; +; CX = TIME ;AN000; +; DX = DATE ;AN000; +; BX:DI = SIZE ;AN000; +; CARRY SET ;AN000; +; AX is error code ;AN000; +; error_file_not_found ;AN000; +; Last element of path not found ;AN000; +; error_path_not_found ;AN000; +; Bad path (not in curr dir part if present) ;AN000; +; error_access_denied ;AN000; +; Attempt to set an attribute which cannot be set ;AN000; +; (attr_directory, attr_volume_ID) ;AN000; +; error_sharing_violation ;AN000; +; Sharing mode of file did not allow the change ;AN000; +; (this request requires exclusive write/read access) ;AN000; +; (INT 24H generated) ;AN000; +; ;AN000; +; Regs: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_GET_FILE_INFO,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000; + ifsr_api_def FILEATTR ;AN000; + ;AN000; +FA_10: ;AN000; + MOV CS:IFSPROC_FLAGS,ISGET ; set for get ;AN000; + ;AN000; +FA_20: ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; + JE FA_100 ;AN000; + LDS SI,[THISCDS] ;AN000; +ASSUME DS:NOTHING ;AN000; + TEST CS:IFSPROC_FLAGS,ISGET ;AN000; + JZ FA_40 ;AN000; + SaveReg ; preserve ds:si -> cds ;AN000; + JMP SHORT FA_60 ;AN000; +FA_40: ;AN000; + RestoreReg ; want attr on stack to stay on top ;AN000; + SaveReg ; stack - ax,si,ds ;AN000; + ;AN000; +FA_60: ;AN000; + invoke PREP_IFSR ; clear ifsrh ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; DS - IFSSEG ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + JMP FA_200 ;AN000; + ;AN000; +FA_100: ;AN000; + invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; DS - IFSSEG ;AN000; + JNC SHORT FA_200 ;AN000; + MOV AX,error_invalid_function ; error - invalid fcn ;AN000; + invoke SET_EXTERR_INFO ; set error info & ;AN000; + JMP FA_980 ; go return ;AN000; + ;AN000; +FA_200: ;AN000; + invoke DRIVE_FROM_CDS ; set IFSDrv for possible I24 ;AN000; + ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; continue prepping ifsr ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000; + TEST IFSPROC_FLAGS,ISGET ;AN000; + JNZ FA_220 ;AN000; + MOV ES:[BX.IFSR_FUNC],FUNC_SET_BY_NAME ;AN000; + POP ES:[BX.IFSR_ATTR] ; retrieve attr from stack ;AN000; + JMP SHORT FA_240 ;AN000; +FA_220: ;AN000; + MOV ES:[BX.IFSR_FUNC],FUNC_GET_BY_NAME ; get file info ;AN000; + ;AN000; +FA_240: ;AN000; + PUSH DS ; save ds - IFSSEG ;AN000; + PUSH SS ; get ds = dosgroup so can access ;AN000; + POP DS ; wfp_start, sattrib ;AN000; +ASSUME DS:DOSGROUP ;AN000; + ;AN000; + MOV SI,[WFP_START] ;AN000; + invoke STRIP_WFP_START ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; + MOV AL,[SATTRIB] ;AN000; + XOR AH,AH ;AN000; + MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; + ;AN000; + POP DS ; restore ds=IFSSEG ;AN000; +ASSUME DS:IFSSEG ;AN000; + +;************************************************ + invoke CALL_IFS ; call ifs with file attr request ;AN000; +;************************************************ + ;AN000; + JNC FA_260 ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; request failed - ;AN000; + JZ FA_980 ; go set carry & return ;AN000; + ADD SP,4 ; if cds, restore stack first ;AN000; + JMP FA_980 ;AN000; + ;AN000; +FA_260: ; request successful ;AN000; + TEST IFSPROC_FLAGS,ISGET ; if get - prep return regs with ;AN000; + JZ FA_270 ; file info ;AN000; + MOV AX,ES:[BX.IFSR_ATTR] ;AN000; + MOV CX,ES:[BX.IFSR_TIME] ;AN000; + MOV DX,ES:[BX.IFSR_DATE] ;AN000; + MOV DI,ES:WORD PTR [BX.IFSR_SIZE] ;AN000; + MOV BX,ES:WORD PTR [BX.IFSR_SIZE+2] ;AC016; +FA_270: ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; if cds - update cds w/cd ;AN000; + JZ FA_280 ;AN000; + RestoreReg ; restore cds ptr into es:di ;AN000; + invoke CD_TO_CDS ; cd-cds ;AN000; + JMP SHORT FA_990 ; go clc & return ;AN000; +FA_280: ;AN000; + TEST IFSPROC_FLAGS,ISSEQ ;AN000; + JNZ FA_990 ;AN000; + invoke DF_TO_DFL ; update dfl w/df ;AN000; + JMP SHORT FA_990 ;AN000; + ;AN000; +FA_980: ;AN000; + STC ;AN000; + JMP SHORT FA_1000 ;AN000; +FA_990: ;AN000; + CLC ;AN000; +FA_1000: ;AN000; + PUSH SS ; restore original ds (dosgroup) ;AN000; + POP DS ; since this routine preserves ds ;AN000; + return ;AN000; + ;AN000; + ;AN000; +EndProc IFS_GET_FILE_INFO ;AN000; + ;AN000; +BREAK ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_RENAME ;AN000; +; ;AN000; +; see ifs_rename for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + procedure IFS_SEQ_RENAME,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def RENFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ISREN ; set for rename and cont. ;AN000; + JMP SHORT SD_10 ; in ifs_seq_delete ;AN000; + ;AN000; + ;AN000; +EndProc IFS_SEQ_RENAME ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_RENAME ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to SOURCE WFP string ("//" must be first 2 ;AN000; +; chars, NUL terminated) ;AN000; +; [REN_WFP] Points to DEST WFP string ("//" must be first 2 ;AN000; +; chars, NUL terminated) ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; +; Function: ;AN000; +; same processing as delete except for following parms: ;AN000; +; * IFSR_LENGTH DB 48 ;AN000; +; * IFSR_APIFUNC DB 7 ; Rename file ;AN000; +; * IFSR_NAME1@ DD ? ; addr of WFP_START ;AN000; +; * IFSR_NAME2@ DD ? ; addr of REN_WFP ;AN000; +; ;AN000; +; Outputs: ;AN000; +; CARRY CLEAR ;AN000; +; OK ;AN000; +; CARRY SET ;AN000; +; AX is error code ;AN000; +; error_file_not_found ;AN000; +; No match for source, or dest path invalid ;AN000; +; error_not_same_device ;AN000; +; Source and dest are on different devices ;AN000; +; error_access_denied ;AN000; +; Directory specified (not simple rename), ;AN000; +; Device name given, Destination exists. ;AN000; +; NOTE: In third case some renames may have ;AN000; +; been done if metas. ;AN000; +; error_path_not_found ;AN000; +; Bad path (not in curr dir part if present) ;AN000; +; SOURCE ONLY ;AN000; +; error_sharing_violation ;AN000; +; Deny both access required, generates an INT 24. ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_RENAME,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def RENFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ISREN ; set for rename ;AN000; + JMP SHORT D_20 ; processing continues in ifs_delete ;AN000; + ;AN000; +EndProc IFS_RENAME ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_DELETE ;AN000; +; ;AN000; +; see ifs_delete for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + procedure IFS_SEQ_DELETE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DELFILE ;AN000; + ;AN000; + MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; +SD_10: ;AN000; + invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; + JC D_20 ; cf=0 unc, cf=1 device ;AN000; + ;AN000; +SD_20: ; welcome ifs_seq_rename code ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; + invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; + JMP SHORT D_30 ; cont. in ifs_delete ;AN000; + ;AN000; +EndProc IFS_SEQ_DELETE ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_DELETE ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: CDS_TO_CD ;AN000; +; CD_TO_CDS CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; +; terminated) ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; +; Function: ;AN000; +; IF INT 2FH call .NOT. SEQ version THEN ;AN000; +; DO ;AN000; +; IF [THISCDS] .NOT. NULL THEN ;AN000; +; DO ;AN000; +; CALL CDS_TO_CD ;AN000; +; Set IFS_DEVICE_CB@ as pointer to CD ;AN000; +; Set IFS_HDR_PTR = CURDIR_IFS_HDR ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Set AX = invalid function ;AN000; +; Set extended error info ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Set IFS_DEVICE_CB@ to NULL ;AN000; +; Set IFS_HDR_PTR = [UNC_FS_HDR] ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; IF no error THEN ;AN000; +; DO ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 44 ; Total length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 6 ; Delete file ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ; CD ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_MATCHATTR DW ? ; attribute - format 00000000e0a00shr ;AN000; +; * IFSR_NAME@ DD ? ; filename to delete ;AN000; +; ;AN000; +; Call routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call CD_TO_CDS or DF_TO_DFL ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; AX = IFSR_RETCODE ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ELSE set carry ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; CARRY CLEAR ;AN000; +; OK ;AN000; +; CARRY SET ;AN000; +; AX is error code ;AN000; +; error_file_not_found ;AN000; +; Last element of path not found ;AN000; +; error_path_not_found ;AN000; +; Bad path ;AN000; +; error_access_denied ;AN000; +; Attempt to delete device or directory ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_DELETE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DELFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; + ;AN000; +D_20: ; (Welcome ifs_ren) ;AN000; +ASSUME DS:DOSGROUP ;AN000; + invoke DRIVE_FROM_CDS ; ds - dosgroup ;AN000; + CMP WORD PTR [THISCDS],NULL_PTR ; CDS must not be null ;AN000; + JNE D_30 ;AN000; + MOV AX,error_invalid_function ;AN000; + invoke SET_EXTERR_INFO ;AN000; + JMP FA_980 ; go up, preserve ds, ret w/carry ;AN000; +D_30: ; (Welcome seq ren/del code) ;AN000; + invoke PREP_IFSR ; zero ifsr, es:bx -> ifsr ;AN000; + MOV SI,[WFP_START] ;AN000; + invoke STRIP_WFP_START ;AN000; + TEST CS:IFSPROC_FLAGS,ISREN ;AN000; + JZ D_40 ; rename ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME1@],SI ; ifsr_name1@ & 2@ ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME1@+2],DS ;AN000; + MOV SI,[REN_WFP] ;AN000; + CMP BYTE PTR DS:[SI+1],":" ;AN000; + JNE D_36 ;AN000; + ADD SI,2 ;AN000; +D_36: ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME2@],SI ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME2@+2],DS ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_RENFILE ; ifsr_length ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSRENFILE ; ifsr_apifunc ;AN000; + JMP SHORT D_60 ;AN000; +D_40: ; delete ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; + MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_DELFILE ; ifsr_length ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSDELFILE ; ifsr_apifunc ;AN000; +D_60: ;AN000; + MOV AL,[SATTRIB] ;AN000; + XOR AH,AH ;AN000; + MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ; ifsr_function ;AN000; + ;AN000; + TEST CS:IFSPROC_FLAGS,ISSEQ ; if unc, don't do cds stuff ;AN000; + JNZ D_70 ;AN000; + LDS SI,[THISCDS] ;AN000; +ASSUME DS:NOTHING ;AN000; + SaveReg ; preserve ds:si -> cds ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + ;AN000; +D_70: ;AN000; + invoke CALL_IFS ; call ifs w/request ;AN000; + ;AN000; + JNC D_80 ;AN000; + TEST IFSPROC_FLAGS,ISSEQ ; fs error - restore stack ;AN000; + JZ D_75 ; if not unc - go ret ;AN000; + JMP FA_980 ;AC009; +D_75: ;AN000; + ADD SP,4 ;AN000; + JMP FA_980 ;AC009; + ;AN000; +D_80: ;AN000; + TEST IFSPROC_FLAGS,ISSEQ ; fs successful ;AN000; + JZ D_90 ; if seq, just ret ;AN000; + JMP FA_990 ;AN000; +D_90: ; else - ;AN000; + RestoreReg ; restore cds ptr into es:di ;AN000; + invoke CD_TO_CDS ;AN000; + JMP FA_990 ; go up & ret in fa to preserve ds ;AN000; + ;AN000; + ;AN000; +EndProc IFS_DELETE ;AN000; + ;AN000; +BREAK ;AN000; +;************************************************************************************ ;AN000; +; see IFS_OPEN for details ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_OPEN,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + PUSH AX ; save access/share byte ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; remember this is old open ;AN000; + JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; + ;AN000; +EndProc IFS_SEQ_OPEN ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_OPEN ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; +; terminated) ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; [THISSFT] Points to SFT to fill in if file found ;AN000; +; (sf_mode field set so that FCB may be detected) ;AN000; +; ES:DI = [THISSFT] ;AN000; +; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; +; AX is Access and Sharing mode ;AN000; +; High NIBBLE of AL (Sharing Mode) ;AN000; +; sharing_compat file is opened in compatibility mode ;AN000; +; sharing_deny_none file is opened Multi reader, Multi writer ;AN000; +; sharing_deny_read file is opened Only reader, Multi writer ;AN000; +; sharing_deny_write file is opened Multi reader, Only writer ;AN000; +; sharing_deny_both file is opened Only reader, Only writer ;AN000; +; Low NIBBLE of AL (Access Mode) ;AN000; +; open_for_read file is opened for reading ;AN000; +; open_for_write file is opened for writing ;AN000; +; open_for_both file is opened for both reading and writing. ;AN000; +; ;AN000; +; For FCB SFTs AL should = -1 ;AN000; +; (not checked) ;AN000; +; Function: ;AN000; +; see IFS_XOPEN ;AN000; +; Outputs: ;AN000; +; sf_ref_count is NOT altered ;AN000; +; CARRY CLEAR ;AN000; +; THISSFT filled in. ;AN000; +; CARRY SET ;AN000; +; AX is error code ;AN000; +; error_file_not_found ;AN000; +; Last element of path not found ;AN000; +; error_path_not_found ;AN000; +; Bad path ;AN000; +; error_access_denied ;AN000; +; Attempt to open read only file for writting, or ;AN000; +; open a directory ;AN000; +; error_sharing_violation ;AN000; +; The sharing mode was correct but not allowed ;AN000; +; generates an INT 24 on compatibility mode SFTs ;AN000; +; Regs: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_OPEN,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + PUSH AX ; save access/share mode ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; set for old open ;AN000; + JMP SHORT XO_20 ; Rest of processing in ;AN000; + ; extended open routine. ;AN000; +EndProc IFS_Open ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_CREATE ;AN000; +; ;AN000; +; see IFS_CREATE for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_CREATE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + PUSH AX ; save attribute ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,IsOldCreate + IsCreate ; remember is old create ;AN012; + JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; + ;AN000; +EndProc IFS_SEQ_CREATE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_CREATE ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; +; terminated) ;AN000; +; [CURR_DIR_END] Points to end of Current dir part of string ;AN000; +; ( = -1 if current dir not involved, else ;AN000; +; Points to first char after last "/" of current dir part) ;AN000; +; [THISCDS] Points to CDS being used ;AN000; +; [THISSFT] Points to SFT to fill in if file created ;AN000; +; (sf_mode field set so that FCB may be detected) ;AN000; +; ES:DI = [THISSFT] ;AN000; +; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; +; AL is Attribute to create ;AN000; +; AH is 0 if CREATE, non zero if CREATE_NEW ;AN000; +; Function: ;AN000; +; See IFS_XOPEN for details ;AN000; +; Outputs: ;AN000; +; sf_ref_count is NOT altered ;AN000; +; CARRY CLEAR ;AN000; +; THISSFT filled in. ;AN000; +; sf_mode = sharing_compat + open_for_both for Non-FCB SFT ;AN000; +; CARRY SET ;AN000; +; AX is error code ;AN000; +; error_path_not_found ;AN000; +; Bad path (not in curr dir part if present) ;AN000; +; error_access_denied ;AN000; +; Attempt to re-create read only file , or ;AN000; +; create a second volume id or create a dir ;AN000; +; error_sharing_violation ;AN000; +; The sharing mode was correct but not allowed ;AN000; +; generates an INT 24 ;AN000; +; Regs: DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_CREATE,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + PUSH AX ; save attribute ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ISOLDCREATE ; remember is old create ;AN000; + JMP SHORT XO_20 ; cont. in ifs_xopen ;AN000; + ;AN000; +EndProc IFS_Create ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_XOPEN ;AN000; +; ;AN000; +; see IFS_XOPEN for details ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_XOPEN,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; +SXO_10: ;AN000; + invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; + JC XO_20 ; cf=0 unc, cf=1 device ;AN000; + ;AN000; +SXO_20: ;AN000; + PUSH CS ; ds-ifsseg ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + OR IFSPROC_FLAGS,ISSEQ ; SEQ = UNC ;AN000; + invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; + invoke PREP_IFSR ; zero out ifsr ;AN000; + JMP XO_200 ; cont. in ifs_xopen ;AN000; + ;AN000; +EndProc IFS_SEQ_XOPEN ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ +; +; IFS_XOPEN +; +; Called by: IFSFUNC dispatcher +; +; Routines called: CALL_IFS DFL_MATCH +; CD_TO_CDS DFL_TO_DF +; CDS_TO_CD DF_TO_DFL +; SFT_TO_SFF +; SF_TO_SFT +; +; Inputs: +; [THISCDS] Set +; [THISSFT] Set +; [SAVE_DX] = FLAG: FUNCTION CONTROL, FORMAT=0000000C NNNN EEEE +; C 0=VALIDATE CODE PAGE, 1=NO CODE PAGE CHECK +; NNNN=DOES NOT EXIST ACTION: 0=FAIL, 1=CREATE +; EEEE=EXISTS ACTION : 0=FAIL, 1=OPEN, 2=REPLACE/OPEN +; [SAVE_BX] = MODE OPEN MODE FORMAT : 0WF00000ISSS0AAA +; AAA = ACCESS CODE: 0=READ, 1=WRITE, 2=READ/WRITE +; 3=EXECUTE (UNDOCUMENTED) +; 7=FCB (UNDOCUMENTED) +; SSS=SHARING MODE : 0=COMPATIBILITY, 1=DENY READ/WRITE +; 2=DENY WRITE, 3=DENY READ, +; 4=DENY NONE +; I 0=PASS HANDLE TO CHILD, 1=NO INHERIT +; F 0=INT 24H, 1=RETURN ERROR +; ON THIS OPEN AND ANY IO TO THIS HANDLE +; W 0=NO COMMIT, 1=AUTO-COMMIT ON WRITE +; AX = ATTR SEARCH/CREATE ATTRIBUTE +; [SAVE_DS]:[SAVE_SI] = Full path name +; [SAVE_ES]:[SAVE_DI] = Parameter list +; Null list if DI=-1 +; +; Function: +; IF SEQ THEN +; prep for UNC +; ELSE DO +; IF [THISCDS] .NOT. NULL THEN +; DO +; Call CDS_TO_CD +; Set IFSR_DEVICE_CB@ as pointer to CD +; Set IFS pointer to CURDIR_IFSR_HDR +; DFL_FLAG = 0 +; ENDDO +; ELSE DO +; Call DFL_TO_DF +; Set IFSR_DEVICE_CB@ as pointer to DF +; Set IFS pointer to DFL_IFSR_HDR +; DFL_FLAG = 1 +; ENDDO +; ENDIF +; ENDDO +; ENDIF +; Prep IFSRH: +; * IFSR_LENGTH DW 62 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; + IFSR_RETCODE DW ? +; + IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 9 ; Open/Create File +; + IFSR_ERROR_CLASS DB ? +; + IFSR_ERROR_ACTION DB ? +; + IFSR_ERROR_LOCUS DB ? +; + IFSR_ALLOWED DB ? +; + IFSR_I24_RETRY DB ? +; + IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF +; *+ IFSR_OPEN_CB@ DD ? ; convert SFT to SFF +; ; and set this as pointer to it. +; * IFSR_MODE DW ? ; BX - open mode +; * IFSR_FLAG DW ? ; AL +; * IFSR_CP DW ? ; Global code page +; * IFSR_CPSW DB 0 ; Code page switch flag +; IFSR_RESV3 DB 0 +; * IFSR_NAME@ DD ? ; ptr to full asciiz filename +; * IFSR_PARMS@ DD ? ; ES:DI +; * IFSR_MATCHATTR DW ? ; CX +; + IFSR_ACTION DW 0 ; Action taken code: 1=file opened +; ; 2=file created/opened +; ; 3=file replaced/opened +; +; CALL routine, CALL_IFS, with IFS pointer +; IF IFSR_RETCODE = 0 THEN +; DO +; IF DFL_FLAG = 0 THEN +; Call CD_TO_CDS +; ELSE Call DF_TO_DFL +; Call SF_TO_SFT +; CX = IFSR_ACTION +; ENDDO +; ELSE DO /* error */ +; AX = IFSR_RETCODE +; Set carry +; ENDDO +; ENDIF +; +; Outputs: +; CX=ACTION TAKEN CODE +; 1 = FILE OPENED +; 2 = FILE CREATED/OPENED +; 3 = FILE REPLACED/OPENED +; sf_ref_count is NOT altered +; THISSFT filled in or updated +; AX set on error: +; error_file_not_found +; Last element of path not found +; error_path_not_found +; Bad path +; error_access_denied +; Attempt to open read only file for writing, +; or open a directory +; error_sharing_violation +; The sharing mode was correct but not allowed +; generates an INT 24 on compatibility mode SFTs +; DS preserved, others destroyed +; +;************************************************************************************ + ;AN000; + procedure IFS_XOPEN,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; + ifsr_api_def OPENFILE ;AN000; + ;AN000; + PUSH AX ; srch attr/create attr + MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; + JMP SHORT XO_25 ;AN008; BAF + ;AN000; +XO_20: ; (welcome all old open/create calls) ;AN000; +ASSUME DS:DOSGROUP ;AN000; + MOV [SAVE_DI],-1 ; set no parms list on old calls ;AN008; BAF +XO_25: ;AN008; BAF + invoke PREP_IFSR ; zero out ifsr ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + ;AN000; + LEA SI,COUNTRY_CDPG ; load cp and cpsw ;AN000; + MOV AX,DS:[SI.ccDosCodePage] ; | ;AN000; + MOV ES:[BX.IFSR_CP],AX ; | ;AN000; + MOV AL,[CPSWFLAG] ; | ;AN000; + MOV ES:[BX.IFSR_CPSW],AL ; | ;AN000; + + CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; + JE XO_100 ;AN000; + ;AN000; + LDS SI,[THISCDS] ; cds--cds--cds--cds--cds--cds ;AN000; + MOV AX,SI ; set ifsDrv for possible I24 ;AN000; + invoke IFSDrvFromCDS ;AN000; + RestoreReg ; must have ax 1st on stack ;AN000; + SaveReg ; cds ptr, attr ;AN000; +XO_60: ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + JMP SHORT XO_200 ; go prep IFSRH ;AN000; + ;AN000; +XO_100: ;AN000; + SaveReg ; if deviceless attach, skip device stuff;AN014; + LES DI,CS:[THISDFL] ;AN014; + CMP WORD PTR [THISDFL],NULL_PTR ;AN014; + RestoreReg ;AN014; + JNE XO_110 ;AN014; + OR CS:IFSPROC_FLAGS,IsSeq ;AN014; + CMP CS:[fAssign],ZERO + JNE XO_200 + ADD SP,2 + MOV AX,72 + JMP XO_120 ;AN014; +XO_110: ;AN014; + invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + JNC XO_200 ;AN000; +;;;;;;;;TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; new open also pushes ax ;AD014; +;;;;;;;;JZ XO_120 ; dfl error ;AD014; + ADD SP,2 ; get saved ax off stack if old ;AN000; +;XO_120: ;AD014; + MOV AX,error_invalid_function ; set error info and quit ;AN000; +XO_120: ;AN014; + invoke SET_EXTERR_INFO ;AN000; + JMP FA_980 ; ret up in FA to preserve DS ;AN000; + ;AN000; +XO_200: ; (welcome seq open/create) ;AN000; + Context DS ; get addressability to dosgroup ;AN000; + invoke SFT_TO_SFF ; SFT: sets IFSR_OPEN_CB@ ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; ds - IFSSEG ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_OPENFILE ; prep IFRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSOPENFILE ;AN000; + POP AX ; restore input AX ;AN000; + TEST IFSPROC_FLAGS,ISOLDOPEN ; check for old open/create ;AN000; + JZ XO_220 ;AN000; +;;;;;; OR AX,OLDOPEN_MODE ; why did I do this???? scrap ;AD006; + + SaveReg ; old redirector does this ;AN013; + Context DS ;AN013; + LDS SI,[THISSFT] ;AN013; + TEST DS:[SI.SF_MODE],sf_isFCB ;AN013; + RestoreReg ;AN013; + JZ XO_210 ;AN013; + MOV AL,-1 ;AN013; +XO_210: ;AN013; + + MOV ES:[BX.IFSR_MODE],AX ;AN000; + MOV ES:[BX.IFSR_FLAG],OLDOPEN_FLAG ;AN000; + XOR AH,AH ;AN000; + JMP SHORT XO_240 ;AN000; +XO_220: ;AN000; + TEST IFSPROC_FLAGS,ISOLDCREATE ;AN000; + JZ XO_260 ;AN000; + MOV ES:[BX.IFSR_MODE],OLDCREATE_MODE ; old create ;AC006;AC010; + MOV ES:[BX.IFSR_FLAG],OLDCREATE_FLAG ;AN000; + OR AH,AH ; is this create new?? ;AN000; + JZ XO_230 ;AN000; + MOV ES:[BX.IFSR_FLAG],OLDCREATENEW_FLAG ;AN000; +XO_230: ;AN000; + XCHG AH,AL ;AN000; +XO_240: ;AN000; + PUSH SS ; get ds = dosgroup so can access ;AN000; + POP DS ; wfp_start ;AN000; +ASSUME DS:DOSGROUP ;AN000; + MOV AL,[SATTRIB] ;AN000; + MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; + JMP SHORT XO_280 ; go call FS ;AN000; + ;AN000; +XO_260: ; -------extended open/create------------;AN000; + Context DS ; set ds-dosgroup ;AN000; +;;;;;;;;PUSH [SAVE_DX] ;AD012; +;;;;;;;;POP ES:[BX.IFSR_FLAG] ; input dx - flag ;AD012; + SaveReg ; check if create, if so set flag ;AN012; + MOV AX,[SAVE_DX] ;AN012; + MOV ES:[BX.IFSR_FLAG],AX + MOV AH,AL ;AN012; + AND AX,0FF0H ;AN012; + CMP AL,NOTEXIST_ACT_CREATE*16 ;AN012; + RestoreReg ;AN012; + JNE XO_270 ;AN012; + OR IFSPROC_FLAGS,IsCreate ;AN012; +XO_270: ;AN012; + + PUSH [SAVE_BX] ;AN000; + POP ES:[BX.IFSR_MODE] ; input bx - mode ;AN000; + XCHG AH,AL ; attr ;AN000; + MOV AL,[SATTRIB] ;AN000; + MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; +; MOV DI,[SAVE_DI] ; parm list ;AD011; +; CMP DI,NULL_PTR ; if offset -1, then no parm list ;AD011; +; JE XO_280 ; | ;AD011; +; MOV ES:WORD PTR[BX.IFSR_PARMS@],DI ; | ;AD011; +; PUSH [SAVE_ES] ; | ;AD011; +; POP ES:WORD PTR[BX.IFSR_PARMS@+2] ; | ;AD011; + +XO_280: ;AN000; + MOV SI,[WFP_START] ;AN000; + invoke STRIP_WFP_START ;AN000; + MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000; + MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; +;****************************************************************************** ;AN000; + invoke CALL_IFS ; call fs with open/create request ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + JNC XO_300 ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; request FAILED - ;AN000; + JNZ XO_290 ;AN000; + JMP FA_980 ; go up, set carry & return ;AN000; +XO_290: ;AN000; + RestoreReg ; if cds, restore stack first ;AN000; + JMP FA_980 ;AN000; + ;AN000; +XO_300: ; request SUCCEEDED - ;AN000; + TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; check for old open/create ;AN007; BAF + JNZ XO_310 ;AN007; BAF + SaveReg ;AN007; BAF + CallInstall Get_User_Stack,multDOS,24 ; Set action take back into CX ;AN007; BAF ;AN000; +ASSUME DS:DOSGROUP ;AN007; BAF + MOV AX,ES:[BX.IFSR_ACTION] ; action take only if Ext Open ;AN007; BAF + MOV DS:[SI].USER_CX,AX ;AN007; BAF + RestoreReg ;AN007; BAF +ASSUME DS:IFSSEG ;AN007; BAF +XO_310: ; request SUCCEEDED - ;AN007; BAF + MOV AX,ES:[BX.IFSR_MATCHATTR] ;AN000; + ;AN000; + invoke SFF_TO_SFT ; update sft ;AN000; + TEST IFSPROC_FLAGS,ISCDS ;AN000; + JZ XO_320 ;AN000; + RestoreReg ; cds-restore cds ptr into es:di ;AN000; + invoke CD_TO_CDS ; update cds ;AN000; + JMP XO_360 ;AN000; +XO_320: ;AN000; + TEST IFSPROC_FLAGS,ISSEQ ;AN000; + JZ XO_340 ;AN000; + MOV DI,NULL_PTR ; set seq devptr to null ;AN000; + SaveReg ; this for sf_devptr ;AN000; + RestoreReg ;AN000; + JMP SHORT XO_360 ;AN000; + ;AN000; +XO_340: ;AN000; + invoke DF_TO_DFL ; update dfl ;AN000; + LES DI,[THISDFL] ; this for sf_devptr ;AN000; + XOR AX,AX ; attr 0 for devices ;AN000; + ;AN000; +XO_360: ;AN000; + Context DS ;AN000; + LDS SI,[THISSFT] ; set some fields in sft ;AN000; + MOV DS:[SI.sf_attr],AL ;AN000; +;;;;;;;;MOV DS:[SI.sf_attr_hi],AH ;AD015; + MOV WORD PTR DS:[SI.sf_devptr],DI ;AN000; + MOV WORD PTR DS:[SI.sf_devptr+2],ES ;AN000; + TEST CS:IFSPROC_FLAGS,IsCDS + IsSeq ; let deviceless attach stuff thru here ;AC014; + JZ XO_380 ;AN000; + MOV AL,CS:[IFSDRV] ; drive ;AN000; + AND AX,devid_file_mask_drive ; Drive in correct bits ;AN000; + OR AX,sf_isnet + devid_file_clean ;AN000; + MOV DS:[SI.sf_flags],AX ;AN000; + ; now set sf_name to filename in form: ;AN000; + ; filename ext (8 char fn spaced out - ;AN000; + ; 3 char ext spaced out) ;AN000; + SaveReg ; save dssi->sf for later pop & action ;AN000; + RestoreReg ;AN000; + MOV DI,SI ; esdi->sft ;AN000; + ;AN000; + ADD DI,sf_name ; blank out sf_name ;AN000; + SaveReg ; | ;AN000; + MOV AX,2020H ; | ;AN000; + MOV CX,5 ; | ;AN000; + CLD ; | ;AN000; + REP STOSW ; | ;AN000; + STOSB ; | ;AN000; + RestoreReg ; | ;AN000; + ;AN000; + Context DS ;AN000; + MOV SI,[WFP_START] ; dssi->wfp_start ;AN000; + CallInstall DStrlen,multDOS,37 ; get length of full path name (in cx) ;AN000; + ADD SI,CX ; mov si to end of name ;AN000; + DEC SI ; si now on null ;AN000; +XO_362: ;AN000; + DEC SI ; mov back one ;AN000; + CMP BYTE PTR DS:[SI],"\" ; looking for \ just before fn ;AN000; + JNE XO_362 ;AN000; + ;AN000; + INC SI ; si now pointing to 1st char fn ;AN000; + MOV CX,8 ; esdi -> sf_name ;AN000; +XO_364: ;AN000; + LODSB ;AN000; + STOSB ;AN000; + DEC CX ;AN000; + CMP AL,"." ;AN000; + JE XO_368 ;AN000; + OR AL,AL ;AN000; + JZ XO_366 ;AN000; + JCXZ XO_369 ;AN000; + JMP SHORT XO_364 ;AN000; + ;AN000; +XO_366: ;AN000; + MOV BYTE PTR ES:[DI-1]," " ;AN000; + JMP SHORT XO_378 ;AN000; + ;AN000; +XO_368: ;AN000; + MOV BYTE PTR ES:[DI-1]," " ;AN000; + ADD DI,CX ;AN000; +XO_369: ;AN000; + MOV CX,3 ;AN000; +XO_370: ;AN000; + LODSB ;AN000; + STOSB ;AN000; + DEC CX ;AN000; + OR AL,AL ;AN000; + JZ XO_372 ;AN000; + JCXZ XO_378 ;AN000; + JMP SHORT XO_370 ;AN000; +XO_372: ;AN000; + MOV BYTE PTR ES:[DI-1]," " ;AN000; + ;AN000; +XO_378: ;AN000; + RestoreReg ; dssi -> sft, cx=action code ;AN000; + JMP SHORT XO_500 ;AN000; + ;AN000; +XO_380: ;AN000; +;;;;;;;;TEST CS:IFSPROC_FLAGS,ISSEQ ;AD014; +;;;;;;;;JNZ XO_500 ;AD014; + MOV DS:[SI.sf_flags],sf_isnet+devid_file_clean+sf_net_spool+devid_device ;AN000; + SaveReg ; sft ptr, action ;AN003; + invoke XCHGP ; dssi -> dfl, esdi -> sft ;AN000; + ADD DI,sf_name ;AN000; + ADD SI,DFL_DEV_NAME ; Skip over path sep, now pointing to name ;AN000; + MOV CX,4 ;AN000; + REP MOVSW ;AN000; + MOV AX,2020H ;AN000; + STOSW ;AN000; + STOSB ;AN000; + RestoreReg ; sft ptr, action ;AN003/AC005; + +XO_500: ;AN000; + MOV AX,WORD PTR CS:[THISIFS] ; set sf_ifs_hdr ;AN003; + MOV WORD PTR DS:[SI.SF_IFS_HDR],AX ;AN003; + MOV AX,WORD PTR CS:[THISIFS+2] ;AN003; + MOV WORD PTR DS:[SI.SF_IFS_HDR+2],AX ;AN003; + + MOV AX,CS:[SFT_SERIAL_NUMBER] ; give new sft serial number for ;AN004; + MOV DS:[SI.SF_FIRCLUS],AX ; fcb processing ;AN004; + INC CS:[SFT_SERIAL_NUMBER] ;AN004; + + MOV WORD PTR DS:[SI.SF_POSITION],0 ;AN012; + MOV WORD PTR DS:[SI.SF_POSITION+2],0 ;AN012; + + TEST CS:IFSPROC_FLAGS,IsCreate ; if create, set sf time/date ;AN012; + JZ XO_520 ;AN012; + push ds ;AN017: SAVE DS **RPS + CallInstall DATE16,MultDOS,13 ;AN012; + pop ds ;AN017: SAVE DS **RPS + MOV DS:[SI.SF_TIME],DX ;AN012; + MOV DS:[SI.SF_DATE],AX ;AN012; + MOV WORD PTR DS:[SI.SF_SIZE],0 ;AN012; + MOV WORD PTR DS:[SI.SF_SIZE+2],0 ;AN012; +XO_520: ;AN012; + + PUSH SS ; Preserve input DS ;AN000; + POP DS ;AN000; + MOV AX,(multDOS SHL 8) OR 12 ;AN000; + INT 2FH ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc IFS_XOPEN ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_SEARCH ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; +; terminated) ;AN000; +; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; +; [DMAADD] Points to 53 byte buffer ;AN000; +; Function: ;AN000; +; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; +; Outputs: ;AN000; +; CARRY SET ;AN000; +; AX = error_path_not_found ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_SEARCH_FIRST,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + MOV AX,error_path_not_found ;AN000; + STC ;AN000; + return ;AN000; + ;AN000; +EndProc IFS_SEQ_SEARCH_FIRST ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEQ_SEARCH_NEXT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; +; (only first 21 bytes must have valid information) ;AN000; +; Function: ;AN000; +; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; +; Outputs: ;AN000; +; CARRY SET ;AN000; +; AX = error_no_more_files ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEQ_SEARCH_NEXT,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + JMP IFS_SEQ_SEARCH_FIRST ;AN000; + ;AN000; +EndProc IFS_SEQ_SEARCH_NEXT ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ +; +; IFS_SEARCH_FIRST +; +; Inputs: +; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL +; terminated) +; [THISCDS] Points to CDS being used may not be NUL +; [SATTRIB] Is attribute of search, determines what files can be found +; [DMAADD] Points to 53 byte buffer +; DS - dosgroup +; +; Function: +; Prep IFSRH: +; * IFSR_LENGTH DW 50 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; + IFSR_RETCODE DW ? +; + IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 8 ; Search file +; + IFSR_ERROR_CLASS DB ? +; + IFSR_ERROR_ACTION DB ? +; + IFSR_ERROR_LOCUS DB ? +; + IFSR_ALLOWED DB ? +; + IFSR_I24_RETRY DB ? +; + IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; *+ IFSR_DEVICE_CB@ DD ? ; CD +; IFSR_OPEN_CB@ DD ? ; null +; * IFSR_SUBFUNC DB subfunction ; 1=first, 2=next +; ; 4=last (CP/DOS only) +; * IFSR_RESV3 DB ? ; DOS Reserved +; *+ IFSR_CONTINFO@ DD continuation info address (always set): +; * DB 8 DUP(?) ; SEARCH FILE NAME +; * DB 3 DUP(?) ; SEARCH FILE EXTENSION +; * DB ? ; SEARCH ATTRIBUTE +; DB 8 DUP(?) ; FSDA +; DIRECTORY ENTRY +; + DB 8 DUP(?) ; FOUND FILE NAME +; + DB 3 DUP(?) ; FOUND FILE EXTENSION +; + DB ? ; FOUND ATTRIBUTE LOW ??? DB/DD +; + DW ? ; FILE CODE PAGE (OR 0) +; + DW ? ; RESERVED +; + DB ? ; FOUND ATTRIBUTE HIGH +; + DB 5 DUP(?) ; RESERVED +; + DW ? ; FILE TIME +; + DW ? ; FILE DATE +; + DW ? ; MEANING FILE SYSTEM SPECIFIC +; ; (STARTING CLUSTER IN FAT) +; + DD ? ; FILE SIZE +; following on search first only +; * IFSR_MATCHATTR DW ; search attribute ; format 0000000re0advshr +; * IFSR_NAME@ DD ; asciiz name to process +; +; IF search first THEN +; DO +; IFSR_SUBFUNC = 1 +; Get CDS from [THISCDS] +; Call CDS_TO_CD +; ENDDO +; ELSE DO +; IFSR_SUBFUNC = 2 +; Get CDS from drive byte in DMAADD +; Call CDS_TO_CD +; ENDDO +; ENDIF +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR +; IF IFSR_RETCODE = 0 THEN +; DO +; Call CD_TO_CDS +; DMAADD = IFSR_CONTINFO +; Clear carry +; ENDDO +; ELSE DO {error} +; AX = error code +; Set carry +; ENDDO +; ENDIF +; +; Outputs: +; CARRY CLEAR +; The 53 bytes ot DMAADD are filled in as follows: +; +; Drive Byte (A=1, B=2, ...) High bit = 1 --| +; 11 byte search name with Meta chars in it | From +; Search Attribute Byte, attribute of search | Server +; WORD LastEnt value | +; WORD DirStart ------------------------------| +; DWORD Local CDS +; 32 bytes of the directory entry found +; CARRY SET +; AX = error code +; error_no_more_files +; No match for this file +; error_access_denied +; Device name given +; error_path_not_found +; Bad path +; DS preserved, others destroyed +; +;************************************************************************************ + ;AN000; + procedure IFS_SEARCH_FIRST,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; + ifsr_api_def SEARCHFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ;AN000; + invoke PREP_IFSR ; zero ifsr ;AN000; + ;AN000; +ASSUME DS:DOSGROUP ;AN000; + LES DI,[DMAADD] ; esdi -> dmaadd ;AN001; + LDS SI,[THISCDS] ; dssi -> cds ;AN000; + + invoke DRIVE_FROM_CDS ; set ifsdrv (0-based) ;AN001; + MOV AL,CS:[IFSDRV] ; put 1-based drive # in dmaadd ;AN001; + INC AL ;AN001; + OR AL,80H ; turn on ifs indicator ;AN001; + STOSB ;AN001; + + SaveReg ; preserve ds:si -> cds ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + PUSH DS ; save ds-ifsseg ;AN000; + Context DS ; ds-dosgroup ;AN000; + ;AN000; + MOV SI,[WFP_START] ;AN000; + invoke STRIP_WFP_START ; remove leading d:\ if present ;AN000; + MOV ES:WORD PTR[BX.IFSR_NAME@],SI ;AN000; + MOV ES:WORD PTR[BX.IFSR_NAME@+2],DS ;AN000; + MOV AL,[SATTRIB] ;AN000; + XOR AH,AH ;AN000; + MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; + ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; + ;AN000; + MOV AL,IFSSEARCH_FIRST ;AN000; + JMP SHORT SN_60 ; rest of processing is in ;AN000; + ; search_next routine ;AN000; + ;AN000; +EndProc IFS_SEARCH_FIRST ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_SEARCH_NEXT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; +; (only first 21 bytes must have valid information) ;AN000; +; Function: ;AN000; +; Look for subsequent matches ;AN000; +; Outputs: ;AN000; +; CARRY CLEAR ;AN000; +; The 53 bytes at DMAADD are updated for next call ;AN000; +; (see NET_SEARCH_FIRST) ;AN000; +; CARRY SET ;AN000; +; AX = error code ;AN000; +; error_no_more_files ;AN000; +; No more files to find ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFS_SEARCH_NEXT,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; + ifsr_api_def SEARCHFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; clear processing flags ;AN000; + invoke PREP_IFSR ; zero out ifsr ;AN000; + ;AN000; +SN_20: ;AN000; + LDS SI,[DMAADD] ;AN000; + LODSB ;AN000; + AND AL,NOT 80H ; turn off ifs indicator ;AN000; + DEC AL ; make 0-based ;AN000; + MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN000; + CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; +ASSUME DS:NOTHING ;AN000; + JNC SN_40 ;AN000; + MOV AX,error_invalid_drive ; no cds, set error & ;AN000; + invoke SET_EXTERR_INFO ;AN000; + JMP FA_1000 ; ret up in FA to preserve DS ;AN000; +SN_40: ; (welcome lock) ;AN000; + SaveReg ; save cds ptr ;AN000; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + MOV AL,IFSSEARCH_NEXT ; start with subfunc=search next ;AN000; +; TEST IFSPROC_FLAGS,ISADD ;AD011; +; JZ SN_60 ;AD011; +; INC AL ; inc subfunc to search same ;AD011; +SN_60: ;AN000; + MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_SEARCHFILE ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSSEARCHFILE ;AN000; + ;AN000; + PUSH DS ;AN000; + Context DS ;AN000; + MOV AX,WORD PTR [DMAADD] ;AN000; + INC AX ;AN000; + MOV ES:WORD PTR[BX.IFSR_CONTINFO@],AX ;AN000; + MOV AX,WORD PTR [DMAADD+2] ;AN000; + MOV ES:WORD PTR[BX.IFSR_CONTINFO@+2],AX ;AN000; + ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + invoke CALL_IFS ; call FS ;AN000; + RestoreReg ; restore cds ptr into es:di ;AN000; + JC SN_1000 ;AN000; + invoke CD_TO_CDS ;AN000; + CLC ;AN000; + ;AN000; +SN_1000: ;AN000; + JMP FA_1000 ; go up & preserve ds, ret ;AN000; + ;AN000; +EndProc IFS_SEARCH_NEXT ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CHECK_OPEN_DEVICE ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [WFP_START] ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Outputs: ;AN000; +; ;AN000; +; ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure OPEN_CHECK_DEVICE,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + MOV SI,[WFP_START] ; dssi -> path to open ;AN000; +; invoke PARSE_DEVICE_PATH ; dssi -> device name (asciiz) ;AN000; + ;AN000; + PUSH SS ; Now check if this device is real ;AN000; + POP ES ;AN000; + MOV DI,OFFSET DOSGROUP:NAME1 ;AN000; + MOV CX,4 ;AN000; + REP MOVSW ; Transfer name to NAME1 ;AN000; + MOV AX,2020H ;AN000; + STOSW ;AN000; + STOSB ;AN000; + ;AN000; + PUSH ES ;AN000; + POP DS ;AN000; +ASSUME DS:DOSGROUP ;AN000; + MOV [ATTRIB],attr_hidden + attr_system + attr_directory ;AN000; + ; Must set this to something interesting ;AN000; + ; to call DEVNAME. ;AN000; + CallInstall DEVNAME,multDOS,35 ;AN000; + JNC OCD_120 ;AN000; + MOV AX,error_file_not_found ;AN000; + transfer ifs_980 ;AN000; + ;AN000; +OCD_120: ;AN000; + transfer ifs_990 ;AN000; + ;AN000; +EndProc OPEN_CHECK_DEVICE ;AN000; + ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM new file mode 100644 index 0000000..7649951 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFLINK.ASM @@ -0,0 +1,202 @@ + PAGE ,132 ;  +; SCCSID = @(#)ifsflink.asm 1.0 87/05/11 +TITLE IFSFUNC LINK FIX ROUTINES - Routines to resolve ifsfunc externals +NAME IFSFLINK + +.xlist +.xcref +INCLUDE DOSSYM.INC +INCLUDE DEVSYM.INC +.cref +.list + +CODE SEGMENT BYTE PUBLIC 'CODE' +code ENDS + +include dosseg.asm + +code SEGMENT BYTE PUBLIC 'code' + ASSUME CS:dosgroup + + procedure OUTT,FAR + entry $DUP + entry MSG_RETRIEVAL + entry $ECS_CALL + entry $EXTENDED_OPEN + entry FASTINIT + entry $IFS_IOCTL + entry IFS_DOSCALL + entry $QUERY_DOS_VALUE + entry $STD_AUX_INPUT,FAR + entry LCRITDEVICE,FAR + entry $ABORT,FAR + entry $SET_TIME,FAR + entry $ALLOC,FAR + entry SETMEM,FAR + entry SKIPONE,FAR + entry $SET_DMA,FAR + entry $PARSE_FILE_DESCRIPTOR,FAR + entry $CREATETEMPFILE,FAR + entry $SLEAZEFUNCDL,FAR + entry $CHDIR,FAR + entry TWOESC,FAR + entry $GET_INTERRUPT_VECTOR,FAR + entry $FCB_SEQ_WRITE,FAR + entry DEVNAME,FAR + entry $GET_DEFAULT_DRIVE,FAR + entry $STD_CON_STRING_INPUT,FAR + entry $CLOSE,FAR + entry $RAW_CON_IO,FAR + entry $INTERNATIONAL,FAR + entry IDLE,FAR + entry $STD_CON_INPUT_NO_ECHO,FAR + entry $ASSIGNOPER,FAR + entry $LOCKOPER,FAR + entry $FCB_CLOSE,FAR + entry $STD_CON_STRING_OUTPUT,FAR + entry $DUP_PDB,FAR + entry GETCH,FAR + entry STRLEN,FAR + entry INITCDS,FAR + entry COPYONE,FAR + entry PJFNFROMHANDLE,FAR + entry $GET_VERIFY_ON_WRITE,FAR + entry $KEEP_PROCESS,FAR + entry STRCMP,FAR + entry $SET_INTERRUPT_VECTOR,FAR + entry $FCB_DELETE,FAR + entry $RAW_CON_INPUT,FAR + entry $RENAME,FAR + entry $FIND_FIRST,FAR + entry $FCB_RANDOM_WRITE,FAR + entry $SET_DEFAULT_DRIVE,FAR + entry $SETDPB,FAR + entry $STD_PRINTER_OUTPUT,FAR + entry $MKDIR,FAR + entry $DUP2,FAR + entry SET_SFT_MODE,FAR + entry $GET_DATE,FAR + entry $FCB_RENAME,FAR + entry $CREATE_PROCESS_DATA_BLOCK,FAR + entry $CREAT,FAR + entry ECRITDISK,FAR + entry PLACEBUF,FAR + entry $IOCTL,FAR + entry $READ,FAR + entry PATHCHRCMP,FAR + entry $GET_VERSION,FAR + entry COPYLIN,FAR + entry LCRITDISK,FAR + entry $LSEEK,FAR + entry STRCPY,FAR + entry $FILE_TIMES,FAR + entry BACKSP,FAR + entry $SET_VERIFY_ON_WRITE,FAR + entry SETYEAR,FAR + entry FASTRET,FAR + entry $RMDIR,FAR + entry DIVOV,FAR + entry $GET_FCB_POSITION,FAR + entry $DISK_RESET,FAR + entry $DIR_SEARCH_FIRST,FAR + entry $WAIT,FAR + entry FASTOPENCOM,FAR + entry STAY_RESIDENT,FAR + entry $ALLOCOPER,FAR + entry $GET_DEFAULT_DPB,FAR + entry DSTRLEN,FAR + entry CTRLZ,FAR + entry $USEROPER,FAR + entry $SET_DATE,FAR + entry $FCB_RANDOM_WRITE_BLOCK,FAR + entry EXITINS,FAR + entry $GET_IN_VARS,FAR + entry GETDEVLIST,FAR + entry DATE16,FAR + entry POINTCOMP,FAR + entry SFFROMSFN,FAR + entry SKIPSTR,FAR + entry FREE_SFT,FAR + entry SHARE_ERROR,FAR + entry NLS_IOCTL,FAR + entry $CURRENT_DIR,FAR + entry $FCB_CREATE,FAR + entry $WRITE,FAR + entry $GET_INDOS_FLAG,FAR + entry RECSET,FAR + entry $CREATENEWFILE,FAR + entry $STD_CON_INPUT_STATUS,FAR + entry REEDIT,FAR + entry GETTHISDRV,FAR + entry DSUM,FAR + entry $GETEXTENDEDERROR,FAR + entry $EXTHANDLE,FAR + entry $NAMETRANS,FAR + entry NLS_LSEEK,FAR + entry SCANPLACE,FAR + entry GETCDSFROMDRV,FAR + entry DSLIDE,FAR + entry UCASE,FAR + entry $STD_CON_OUTPUT,FAR + entry $FCB_RANDOM_READ_BLOCK,FAR + entry CHECKFLUSH,FAR + entry COPYSTR,FAR + entry $GETSETCDPG,FAR + entry $DIR_SEARCH_NEXT,FAR + entry $OPEN,FAR + entry SKIPVISIT,FAR + entry $EXEC,FAR + entry $DEALLOC,FAR + entry DOS_CLOSE,FAR + entry $STD_CON_INPUT,FAR + entry NLS_GETEXT,FAR + entry BUFWRITE,FAR + entry $GET_TIME,FAR + entry $SLEAZEFUNC,FAR + entry $CHAR_OPER,FAR + entry NET_I24_ENTRY,FAR + entry $COMMIT,FAR + entry $SETBLOCK,FAR + entry $FCB_OPEN,FAR + entry NLS_OPEN,FAR + entry $GET_DMA,FAR + entry $UNLINK,FAR + entry $FCB_SEQ_READ,FAR + entry $STD_CON_INPUT_FLUSH,FAR + entry $GET_DRIVE_FREESPACE,FAR + entry DRIVEFROMTEXT,FAR + entry $GETEXTCNTRY,FAR + entry SETVISIT,FAR + entry $EXIT,FAR + entry $STD_AUX_OUTPUT,FAR + entry KILNEW,FAR + entry $CHMOD,FAR + entry $FCB_RANDOM_READ,FAR + entry SHARE_VIOLATION,FAR + entry ECRITDEVICE,FAR + entry $GET_DPB,FAR + entry $FIND_NEXT,FAR + entry $GET_FCB_FILE_LENGTH,FAR + entry ENTERINS,FAR + entry DEVIOCALL2,FAR + entry $SERVERCALL,FAR + entry $GSETMEDIAID,FAR + entry FETCHI_CHECK,FAR + entry TABLEDISPATCH,FAR + entry DSKSTATCHK,FAR + entry SET_RQ_SC_PARMS,FAR + entry SAVE_MAP,FAR + entry RESTORE_MAP,FAR + entry DSKREAD,FAR + entry FAST_DISPATCH,FAR + entry DSKWRITE,FAR + entry INTCNE0,FAR + entry SHARE_INSTALL,FAR ;P3568 + entry FAKE_VERSION,FAR ;D503 + NOP +EndProc OUTT + + code ENDS + END + + diff --git a/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC new file mode 100644 index 0000000..70a0a65 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFSYM.INC @@ -0,0 +1,162 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsfsym.inc 1.0 87/05/11 ;AN000; + +;************************************************************************************ +; +; IFSFUNC Symbols +; +; Modification history: +; Created: MAY 11 1987 +; +; LOD = 80 (IFS added) +; REVISION HISTORY: +; A000 Original version 4.00 May 1987 +; A001 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA +; A002 PTM ??? - 80H bit on Lock functions ignorred 10/27 FEIGENBAUM +; A003 PTM 2270- filesys/network attach problem 11/27 RGAZZIA +; A004 DCR 285 - remove Extended Attribute/Lock support 1/88 RGAZZIA +; A005 PTM 2827- error msg problems 1/88 RMG +; A006 PTM 3334- new ifsresetenv call 2/88 RMG +; A007 PTM 3657- don't want val code page in flag 2/88 RGazzia +; A008 PTM 3692- net use xxx /d error msg wrong 3/88 RGazzia +; A009 PTM 3673- filesys problems again, undo a003 3/14/88 RMG +; A010 PTM 3968- time/date stamping problems 3/25/88 RMG +; A011 PTM 4140- INT 2F 5 interface change 4/12/88 RMG +; A012 PTM 5006- need save original device ptr - new dfl field 6/02/88 RMG +; +;************************************************************************************ +; ;AN000; +; Old Redirector Stuff ;AN000; +; ;AN000; +TRUE EQU 0FFFFh ;AN000; +FALSE EQU 0 ;AN000; + ;AN000; +PATHGEN = TRUE ;AN000; +DEBUG = FALSE ;AN000; +REDIRECTOR = TRUE ;AN000; +Installed = TRUE ;AN000; + ;AN000; +MSNET_TIMING = FALSE ;AN000; + ;AN000; + ;AN000; +IF1 ;AN000; + IF MSNET_TIMING ;AN000; + %out MSNET_TIMING version ;AN000; + ENDIF ;AN000; + IF DEBUG ;AN000; + %out DEBUGGING version ;AN000; + ENDIF ;AN000; + %out INSTALLED version ;AN000; +ENDIF ;AN000; +; Structures and equates for the network support ;AN000; + ;AN000; +;Net call interrupt - used to generate critical sections ;AN000; +NET_CALL_INT EQU 2AH ;AN000; + ;AN000; +;Max size of PRINT_PRE_STRING ;AN000; +MAX_PRE_STRING EQU 64 ;AN000; + ;AN000; + ;AN000; +;AH function code for $GET_IN_VARS INT 21 function ;AN000; +GET_IN_VAR EQU 52H ;AN000; + ;AN000; + ;AN000; +; The following EQUates control the replacement of the FCB SFT cache by ;AN000; +; IFSFUNC. If the current FCB Cache Size,Keepcount is DefNumFCB,DefKeepVal ;AN000; +; then IFSFUNC will set up a new cache of NewNumFCB,NewKeepVal. ;AN000; +DefNumFCB EQU 4 ;AN000; +DefKeepVal EQU 0 ;AN000; + ;AN000; +NewNumFCB EQU 16 ;AN000; +NewKeepVal EQU 8 ;AN000; + ;AN000; +SUBTTL IFSFUNC Data ;AN000; +PAGE ;AN000; +; miscellaneous IFS equates ;AN000; +MINUS_ONE EQU -1 ;AN000; +NULL_PTR EQU -1 ;AN000; +ERROR_INFO_NOT_SET EQU -1 ;AN000; +CHECK_REMOVABLE EQU 4408H ;AN000; +ICOLON EQU ":" ;AN000; +ZERO EQU 0 ;AN000; +OLDOPEN_MODE EQU 2180H ;AN000; +OLDOPEN_FLAG EQU 0101H ;AN000; +OLDCREATE_MODE EQU 0002H ;AC007; +OLDCREATE_FLAG EQU 0112H ;AC007; +OLDCREATENEW_FLAG EQU 10H ;AN000; +;INT21AL_LOCK_READ EQU 4 ;AD004; +;INT21AL_WRITE_UNLOCK EQU 5 ;AD004; +IFSFINSTALLED EQU 0FFH ;AN000; +GET_TRUNCATE_FLAG EQU 7 ;AN000; +SET_TRUNCATE_FLAG EQU 8 ;AN000; +;;;alias COMPLEX EQU 4 ;AN000; +PARSE_ERR_1 EQU 1 ;AN000; +PARSE_ERR_5 EQU 5 ;AN000; +PARSE_ERR_6 EQU 6 ;AN000; +PARSE_ERR_10 EQU 10 ;AN000; +COMMON_ERR_2 EQU 2 ;AN000; +COMMON_ERR_3 EQU 3 ;AN000; +UTIL_ERR_4 EQU 4 ;AN000; +RETRY EQU 1 ;AN000; +I2F5_MsgRet EQU 2 ;AN011; + ;AN000; +; ifsproc flags ;AN000; +IsCDS EQU 80H ;AN000; +IsSFT EQU 40H ;AN000; +IsSEQ EQU 20H ;AN000; +IsGet EQU 10H ; vs. set ;AN000; +IsOldOpen EQU 10H ;AN000; +IsOldCreate EQU 08H ;AN000; +IsCreate EQU 8000H ; used in IFS_OPEN in setting sf date/time ;AN010; +IsClose EQU 10H ; vs. commit ;AN000; +IsRen EQU 10H ; vs. delete ;AN000; +;IsLockRead EQU 10H ;AD005; +;IsWriteUnlock EQU 08H ;AD005; +;IsAdd EQU 04H ;AD005; +THISIFS_SET EQU 02H ;AN000; +IsShare EQU 80H ; used by auto-attach ;AN000; +IsCTLFCN EQU 01H ; used by IFS_UPDATE_CB@ ;AN000; +IsCritIFS EQU 02H ; indicates ifs cs ;AN000; +Print_On EQU 80H ; sess ;AN000; +SetDeviceCB EQU 0100H ; indicates to sft_to_sff to set ifs_device_cb@ ;AN000; +IsDummyCDS EQU 0200H ; used to indicate dummy cds (AttStrt/CDS-CD) ;AN000; +IsNetwork EQU 0400H ; indicates types 3 or 4 attach ;AN001; +SetBP EQU 0800H ; set if return lsn ;AN001; +Filesys_Status EQU 1000H ; indicates new style get ifsfunc item ;AN001; +;Filesys_Network_Attach EQU 1000H ; flag used to determine if move ptr direct to parms ;AN003;;AD009; +;IsWOLock EQU 2000H ; write operation only lock - flag moved RMG ;AD004; +IsInit EQU 2000H ; this set in AutoAttach for CI-error area ;AN005; +IsResetEnvirn EQU 4000H ; used in sess - diff abort from reset environment ;AN006; +IsMsgRet EQU 8000H ; used in ifserror - int2f5 to distinguish msg ret ;AN011; + ; from command.com ;AN011; +; ifsfunc flags ;AN000; +UNC_INSTALLED EQU 80H ; unc file system installed ;AN000; +NO_IFS_DRIVERS EQU 40H ; no ifs drivers installed ;AN000; + +; ifs semaphores IFSSEM equates ;AN011; +MR_ERRMSG_SEM EQU 80H ; used by ifserror INT2F AH=5 as gate for msgret entry ;AN011; +; ;AN000; +; DFL - This structure stores IFS/NETUSE/ALIAS Device information ;AN000; +; to IFS driver. ;AN000; + +DFLL_LIST STRUC ;AN000; +DFLL_FLAGS DB ? ; Flags ;AN000; +DFLL_TYPE DB ? ; 1=IFS, 3=NETUSE, 0=ALIAS ;AN000; +DFLL_DEV_NAME DB 8 DUP (?) ; Device name ;AN000; +DFLL_USER_WORD DW ? ; attach user word ;AN001; +DFLL_ALIAS_INDEX DW ? ; Byte index into alias names list (resv) ;AN000; +DFLL_IFS_HDR DD ? ; Pointer to IFSHDR ;AN000; +DFLL_FSDA DB 8 DUP (?) ; File System Dependent Data Area ;AN000; +DFLL_DEVPTR DD ? ; sft_devptr ;AN012; +DFLL_LIST ENDS ;AN000; + ;AN000; +; dfl flags ;AN000; +DFL_INPROG EQU 80H ; in progress ;AN000; +DFL_INUSE EQU 40H ; in use ;AN000; +DFL_PAUSED EQU 20H ; device is paused ;AN000; +DFL_DEV_REAL EQU 10H ; device is real ;AN000; + ;AN000; +; error codes ;AN000; +device_not_attached equ 0FH ; ;AC008; +fs_driver_not_found equ 67 ; ;AN000; +error_out_of_structs equ 56 ; ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK new file mode 100644 index 0000000..f7b9623 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.LNK @@ -0,0 +1,12 @@ +IFSSESS.OBJ IFSDIR.OBJ IFSFILE.OBJ IFSHAND.OBJ + +IFSDEV.OBJ IFSUTIL.OBJ IFSERROR.OBJ IFSFDOS.OBJ IFSINIT.OBJ + +..\..\inc\NIBDOS.OBJ+ +..\..\inc\CONST2.OBJ+ +..\..\inc\msDATA.OBJ+ +..\..\inc\msTABLE.OBJ+ +..\..\dos\msDISP.OBJ + +..\..\dos\msCODE.OBJ + +..\..\inc\msDOSME.OBJ+ +IFSFLINK.OBJ +IFSFUNC.EXE,IFSFUNC.MAP /EX; + \ No newline at end of file diff --git a/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL new file mode 100644 index 0000000..4188c7f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFUNC.SKL @@ -0,0 +1,49 @@ +:util IFSFUNC ;AN000; +:class 1 ;Extended Error messages ;AN007; +:use EXTEND50 ; file system extended error msg #s ;AN007; +:use EXTEND51 ;AN007; +:use EXTEND52 ;AN007; +:use EXTEND53 ;AN007; +:use EXTEND54 ;AN007; +:use EXTEND55 ;AN007; +:use EXTEND56 ;AN007; +:use EXTEND57 ;AN007; +:use EXTEND58 ;AN007; +:use EXTEND59 ;AN007; +:use EXTEND60 ;AN007; +:use EXTEND61 ;AN007; +:use EXTEND62 ;AN007; +:use EXTEND63 ;AN007; +:use EXTEND64 ;AN007; +:use EXTEND65 ;AN007; +:use EXTEND66 ;AN007; +:use EXTEND67 ;AN007; +:use EXTEND68 ;AN007; +:use EXTEND69 ;AN007; +:use EXTEND70 ;AN007; +:use EXTEND71 ;AN007; +:use EXTEND72 ;AN007; +:use EXTEND73 ;AN007; +:use EXTEND74 ;AN007; +:use EXTEND80 ;AN007; +:use EXTEND82 ;AN007; +:use EXTEND83 ;AN007; +:use EXTEND84 ;AN007; +:use EXTEND85 ;AN007; +:use EXTEND86 ;AN007; +:use EXTEND87 ;AN007; +:use EXTEND88 ;AN007; +:use EXTEND89 ;AN007; +:class 2 ;parse errors: ;AN000; +:use PARSE1 ;Too many parameters ;AN000; +:use PARSE4 ;Invalid keyword ;AN000; +:use PARSE6 ;Parameter value not in allowed range ;AN002; +:use PARSE7 ;Parameter value not allowed ;AN002; +:use PARSE9 ;Parameter format not correct ;AN002; +:use PARSE10 ;Invalid parameter ;AN000; +:class A ;AN000; +:use 1 COMMON1 ;Incorrect DOS version ;AN000; +:use 2 COMMON2 ;%1 already installed ;AN000; +:use 3 COMMON10 ;%1 not installed ;AN000; +:def 4 "Invalid configuration",CR,LF ;AN00?; +:end ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM new file mode 100644 index 0000000..19a997f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM @@ -0,0 +1,903 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifshand.asm 1.0 87/05/11 ;AN000; +TITLE IFSFUNC HANDLE ROUTINES - Routines for FS dispatch ;AN000; +NAME IFSHANDLE ;AN000; +;****************************************************************************** +; +; HANDLE (SFT) related FS calls +; +; +; IFS_CLOSE +; IFS_COMMIT +; IFS_LSEEK +; IFS_READ +; IFS_WRITE +; IFS_LOCK +; IFS_XATTR +; +; REVISION HISTORY: +; A000 Original version 4.00 May 1987 +; A001 P635 - Correct Read problem - restore es:di -> sft +; RG Sept 1,1987 +; A002 P659 - Copy cmd problems (xattr) +; RG Sept 1,1987 +; A003 P868 - Lock problems R.G +; A004 P849 - Printer problems R.G +; A005 P1601- lock/xattr problems R.G +; A006 P????- Write Only Lock support in Lock Read/Write 10/27 FEIGENBAUM +; A007 P2339- Not getting count back to user in xattr call 11/09 RG +; A008 P2433- redir copy problem (Xattr) 11/17 RG +; A009 P2566- xattrs not propagated across network 12/3 RG +; (due to size check on set that does not offer size) +; A010 D285 - Remove Extended Attributes/Lock 1/88 RG +; A011 P2994- double close problem 1/88 RG +; A012 P3149- basica file redirection - seek problem 1/88 RMG +; A013 P3185- get ea cx check 1/88 RMG +; A014 P3249- lock problem 1/88 RMG +; A015 P3432- copy to remote ptr problem - write 2/88 RMG +; A016 P3513- return cx on xattr wrong 2/88 RMG +; A017 P3968- set sf time/date on close 3/25/88 RMG +; A018 P4839- fcb open/ren/term problem on abort close 5/13/88 RMG +; A019 P4791- don't overwrite ax on error 5/19/88 RMG +; A020 P5003- LSEEK hang using Austin Test tool 6/01/88 RPS +; +; LOC - 251 +; Programming note: In the prologues to the routines, the input/output are +; accurate. The pseudocode, however, is outdated and does +; not reflect the code. +; +;****************************************************************************** + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; + ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; include THE REST of the segment definitions for normal MSDOS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ;DOSGROUP Data ;AN000; + Extrn THISSFT:DWORD ;AN000; + Extrn DMAADD:DWORD ;AN000; + Extrn CurrentPDB:WORD ;AN000; + Extrn SAVE_BX:WORD + Extrn SAVE_CX:WORD + Extrn SAVE_DS:WORD + Extrn SAVE_SI:WORD + Extrn SAVE_ES:WORD + Extrn SAVE_DI:WORD +DATA ENDS ;AN000; + ;AN000; + ;AN000; +; define our own code segment ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data ;AN000; + Extrn THISDFL:DWORD ;AN000; + Extrn THISIFS:DWORD ;AN000; + Extrn IFSPROC_FLAGS:WORD ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_CLOSE - see IFS_COMMIT for details ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_CLOSE,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for close ;AN000; + ifsr_api_def CLOSEFILE ;AN000; + ;AN000; + TEST ES:[DI.SF_FLAGS],devid_file_clean + sf_close_nodate ;AN017; + JNZ C_05 ;AN017; + CallInstall DATE16,MultDOS,13 ; set sf date/time on close ;AN017; + MOV ES:[DI.SF_DATE],AX ;AN017; + MOV ES:[DI.SF_TIME],DX ;AN017; +C_05: ;AN017; + + SaveReg ; save SFT ptr ;AN000; + CallInstall FREE_SFT,MultDOS,8 ; set SFT busy ;AN000; + PUSH AX ; save old ref count ;AN000; + ;AN000; + TEST ES:[DI.SF_MODE],SF_ISFCB ; always close fcb ;AN011; + JNZ C_10 ; only do real close when ;AN011; + CMP AX,1 ; sft being freed ;AN011; + JE C_10 ;AN011; + JMP C_80 ;AN011; +C_10: ;AN011; + MOV CS:IFSPROC_FLAGS,ISCLOSE + SETDEVICECB ;AN000; + ; 2nd flag causes sft_to_sff to ;AN000; + ; set device cb@ ;AN000; + JMP C_20 ; cont. in ifs_commit ;AN000; + ;AN000; +EndProc IFS_CLOSE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_COMMIT ;AN000; +; ;AN000; +; Called by: IFSFUNC dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000; +; SFT_TO_SFF ;AN000; +; SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISSFT] set to the SFT for the file being used ;AN000; +; ES:DI = [THISSFT] (date time are NOT correct) ;AN000; +; SFT must never be for an FCB on commit (error not detected) ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 40 ; Total length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 14 ; Close/commit file ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ;AN000; +; *+ IFSR_OPEN_CB@ DD ? ; SF ;AN000; +; * IFSR_FUNC DB ? ; 0=CLOSE, 1=COMMIT ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; ;AN000; +; IF close THEN ;AN000; +; IFSR_FUNC = 0 ;AN000; +; ELSE IFSR_FUNC = 1 ;AN000; +; CALL routine, CALL_IFS, with pointer to SF_IFS_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call SFF_TO_SFT ;AN000; +; Decrement SF_REF_COUNT if close ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO {error} ;AN000; +; AX = IFSR_RETCODE ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; sf_ref_count decremented on close unless FAIL ;AN000; +; (AX has old value for COMMIT) ;AN000; +; ES:DI point to SFT ;AN000; +; Carry set if error (file deleted or disk changed) ;AN000; +; ;AN000; +; DS preserved, others destroyed ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_COMMIT,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def CLOSEFILE ;AN000; + ;AN000; + MOV CS:IFSPROC_FLAGS,SETDEVICECB ; set ifsproc_flags ;AN000; +C_20: ; (welcome ifs_close) ;AN000; + invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000; + invoke PREP_IFSR ; clear ifsrh ;AN000; + MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_CLOSEFILE ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSCLOSEFILE ;AN000; + XOR AL,AL ;AN000; + TEST IFSPROC_FLAGS,ISCLOSE ;AN000; + JNZ C_40 ;AN000; + INC AL ;AN000; +C_40: ;AN000; + MOV ES:[BX.IFSR_FUNC],AL ;AN000; + ;AN000; + invoke CALL_IFS ; *** call fs with close request ;AN000; + ;AN000; + JNC C_60 ;AN000; + TEST IFSPROC_FLAGS,ISCLOSE ; ifs error ;AN000; + JZ C_980 ; return w/carry, if close ;AN000; +;;;;;;;;ADD SP,6 ; restore stack first ;AD018; + RestoreReg ; old ref count & sft ;AN018;;AC019; + CMP CX,1 ;AN018;;AC019; + JNE C_980 ;AN018; + MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN018; + JMP C_980 ;AN000; +C_60: ;AN000; + invoke SFF_TO_SFT ;AN000; + TEST IFSPROC_FLAGS,ISCLOSE ;AN000; + JZ C_990 ; finished w/commit ;AN000; +C_80: ;AN011; + RestoreReg ; old ref count & sft ;AN000; + CMP AX,1 ;AN000; + JNE C_990 ;AN000; + MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN000; + JMP C_990 ; busy mark ;AN000; + ;AN000; + ;AN000; +C_980: ; Return area ;AN000; + STC ;AN000; + JMP C_1000 ;AN000; +C_990: ;AN000; + CLC ;AN000; +C_1000: ; preserve ds - dosgroup ;AN000; + PUSH SS ;AN000; + POP DS ;AN000; + return ;AN000; + ;AN000; +EndProc IFS_COMMIT ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_LSEEK ;AN000; +; ;AN000; +; Inputs: ;AN000; +; ES:DI -> SFT ;AN000; +; CX:DX = Input CX:DX to $Lseek (offset) ;AN000; +; NOTE: THIS LSEEK IS ALWAYS ASSUMED TO BE A TYPE 2 (relative to EOF) ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 44 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 10 ; Lseek file ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; IFSR_DEVICE_CB@ DD ? ;AN000; +; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000; +; ; and set this as pointer to it. ;AN000; +; * IFSR_MODE DB 2 ; Position mode: - BL ;AN000; +; ; 2 = ptr moved eof + offset ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; * IFSR_POSITION DD ? ; displacement of LSEEK - CX:DX ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call SFF_TO_SFT ;AN000; +; Set DX:AX = IFSR_POSITION ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO {error} ;AN000; +; AX = IFSR_RETCODE ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Returns: ;AN000; +; ES:DI -> SFT ;AN000; +; Carry clear ;AN000; +; DX:AX return as with local $Lseek ;AN000; +; Carry Set ;AN000; +; AX is error code ;AN000; +; All destroyed ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_LSEEK,NEAR ;AN000; +ASSUME DS:Nothing,ES:NOTHING ; Initially DS is unknown ;AN020; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for lseek ;AN000; + ifsr_api_def LSEEKFILE ;AN000; + ;AN000; + PUSH SS ; Set DS to DOSGROUP ;AN020; + POP DS ; ;AN020; +ASSUME DS:DOSGROUP ; ;AN020; + + MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000; + MOV WORD PTR [THISSFT],DI ;AN020; + MOV WORD PTR [THISSFT+2],ES ;AN020; + SaveReg ; save for later restore before leave ;AN012;;AN020; + + invoke PREP_IFSR ;AN000; + ;AN000; + invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_LSEEKFILE ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSLSEEKFILE ;AN000; + MOV ES:[BX.IFSR_MODE],MODE2 ;AN000; + MOV WORD PTR ES:[BX.IFSR_POSITION],DX ;AN000; + MOV WORD PTR ES:[BX.IFSR_POSITION+2],CX ;AN000; + ;AN000; + invoke CALL_IFS ; call fs with lseek request ;AN000; + ;AN000; + JC LS_1000 ;AN000; + MOV AX,WORD PTR ES:[BX.IFSR_POSITION] ;AN000; + MOV DX,WORD PTR ES:[BX.IFSR_POSITION+2] ;AN000; + invoke SFF_TO_SFT ;AN000; + ;AN000; + CLC ;AN000; +LS_1000: ;AN000; + RestoreReg ; restore sft ptr for ibmdos ;AN012; + return ;AN000; + ;AN000; +EndProc IFS_LSEEK ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_READ ;AN000; +; ;AN000; +; Called by: IFSFUNC dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS ;AN000; +; SFT_TO_SFF ;AN000; +; SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; Outputs of SETUP: ;AN000; +; CX = byte count ;AN000; +; ES:DI Points to SFT ;AN000; +; [DMAADD] = transfer addr ;AN000; +; SFT checked for access mode ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 46 ; Total length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 11 ; Read Byte Block ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF - specified in SF_DEVPTR ;AN000; +; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000; +; ; and set this as pointer to it. ;AN000; +; IFSR_RESV3 DW 0 ;AN000; +; IFSR_COUNT DW 0 ;AN000; +; *+ IFSR_BUFFER@ DD ? ; [DMAADD] ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call SFF_TO_SFT ;AN000; +; CX = IFSR_COUNT ;AN000; +; ES:DI -> SFT ;AN000; +; ENDDO ;AN000; +; ELSE DO {error} ;AN000; +; AX = IFSR_RETCODE ;AN000; +; CX = 0 ;AN000; +; ES:DI -> SFT ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Outputs: ;AN000; +; Carry clear ;AN000; +; SFT Position updated ;AN000; +; CX = No. of bytes read ;AN000; +; ES:DI point to SFT ;AN000; +; [DMAADD] filled with info read ;AN000; +; Carry set ;AN000; +; AX is error code ;AN000; +; CX = 0 ;AN000; +; ES:DI point to SFT ;AN000; +; DS preserved, all other registers destroyed ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_READ,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for read ;AN000; + MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AN000; + MOV WORD PTR [THISSFT],DI ; set thissft ;AN000; + MOV WORD PTR [THISSFT+2],ES ;AN000; + ;AN000; +R_20: ; (welcome lock/read) ;AN000; + ifsr_api_def READFILE ;AN000; + invoke PREP_IFSR ; zero out ifsr, es:bx -> ifsr ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_READFILE ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSREADFILE ;AN000; +; XOR AL,AL ; for now, set mode = read (0) ;AD010; +; TEST CS:IFSPROC_FLAGS,ISLOCKREAD ;AD010; +; JZ W_80 ;AD010; +; INC AL ; inc mode to mode_lock_read ;AD010; + JMP W_80 ; cont. read/write common code ;AN000; + ; in ifs_write below ;AN000; + ;AN000; +EndProc IFS_READ ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_WRITE ;AN000; +; ;AN000; +; Called by: IFSFUNC dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS ;AN000; +; SFT_TO_SFF ;AN000; +; SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; Outputs of SETUP: ;AN000; +; CX = byte count ;AN000; +; ES:DI Points to SFT ;AN000; +; [DMAADD] = transfer addr ;AN000; +; SFT checked for access mode ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 46 ; Length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 12 ; Write Byte Block ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ;AN000; +; *+ IFSR_OPEN_CB@ DD ? ; call SFT_TO_SFF & set this as ptr ;AN000; +; IFSR_RESV3 DW 0 ;AN000; +; * IFSR_COUNT DW ? ; # bytes to write - CX ;AN000; +; * IFSR_BUFFER@ DD ? ; Data buffer - [DMAADD] ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call SFF_TO_SFT ;AN000; +; CX = IFSR_COUNT ;AN000; +; ES:DI -> SFT ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO {error} ;AN000; +; AX = IFSR_RETCODE ;AN000; +; CX = 0 ;AN000; +; ES:DI -> SFT ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Outputs: ;AN000; +; Carry clear ;AN000; +; SFT Position updated ;AN000; +; CX = No. of bytes written ;AN000; +; ES:DI point to SFT ;AN000; +; Carry set ;AN000; +; AX is error code ;AN000; +; CX = 0 ;AN000; +; ES:DI point to SFT ;AN000; +; DS preserved, all other registers destroyed ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_WRITE,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for write ;AN000; + MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000; + MOV WORD PTR [THISSFT],DI ; set thissft ;AN000; + MOV WORD PTR [THISSFT+2],ES ;AN000; + ;AN000; +W_20: ; (welcome write/unlock) ;AN000; + ifsr_api_def WRITEFILE ;AN000; + invoke PREP_IFSR ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_WRITEFILE ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSWRITEFILE ;AN000; +; XOR AL,AL ; for now set mode to write (bit0=0) ;AD010; +; TEST CS:IFSPROC_FLAGS,ISWRITEUNLOCK ;AD010; +; JZ W_40 ;AD010; +; INC AL ; set mode to write/unlock (bit0=1) ;AD010; +;W_40: ;AD010; +; TEST CS:IFSPROC_FLAGS,ISADD ;AD010; +; JZ W_80 ;AD010; +; OR AL,MODE_ADD_MASK ; set mode to add (bit 1) ;AD010; +;W_80: ; (welcome read) ;AD010; +; TEST CS:IFSPROC_FLAGS,ISWOLOCK ;AD010; BAF +; JZ W_90 ;AD010; BAF +; OR AL,MODE_WO_MASK ; set mode to Write Only Lock ;AD010; BAF +;W_90: ;AD010; BAF +; MOV ES:[BX.IFSR_MODE],AL ;AD010; +W_80: ; (welcome read) ;AN010; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC015; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_COUNT],CX ;AN000; + ;AN000; + MOV AX,WORD PTR [DMAADD] ; to access dmaadd ;AN000; + MOV WORD PTR ES:[BX.IFSR_BUFFER@],AX ;AN000; + MOV AX,WORD PTR [DMAADD+2] ;AN000; + MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],AX ;AN000; + ;AN000; + invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + ;AN000; + invoke CALL_IFS ; *** call fs with read/write request ;AN000; + ;AN000; + JNC W_100 ;AN000; + Context DS ; restore ds-dosgroup ;AN001; + LES DI,[THISSFT] ; restore esdi-sft ;AN001; + transfer ifs_1000 ; transfer to general ret as carry set ;AC001; +W_100: ;AN000; + MOV CX,ES:[BX.IFSR_COUNT] ; prep reg output ;AN000; + invoke SFF_TO_SFT ;AN000; + + Context DS ; restore ds-dosgroup ;AN001; + LES DI,[THISSFT] ; restore esdi-sft ;AN001; + transfer ifs_990 ; transfer to general good ret in util ;AN001; + ;AN000; +EndProc IFS_WRITE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_XLOCK ;AN000; +; ;AN000; +; Called by: IFSFUNC dispatcher ;AN000; +; ;AN000; +; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000; +; SFT_TO_SFF ;AN000; +; SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BL = 80H bit: 0 lock all operations ;AN000; +; 1 lock write operations only ;AN000; +; 0 Lock +; 1 Unlock +; 2 lock multiple range ;AN000; +; 3 unlock multiple range ;AN000; +; 4 lock/read ;AN000; +; 5 write/unlock ;AN000; +; 6 add (lseek eof/lock/write/unlock) ;AN000; +; ES:DI -> SFT ;AN000; +; CX = count/size Number of ranges/block size ;AN000; +; DS:DX -> BUFFER LABEL DWORD ;AN000; +; DD POSITION ; lock range, repeats CX times ;AN000; +; DD LENGTH ; ;AN000; +; ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 46+ ; Length of request ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 13 ; Lock Function ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ;AN000; +; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SFF ;AN000; +; ; and set this as pointer to it. ;AN000; +; * IFSR_FUNC DB subfunction ; 0=LOCK, 1=UNLOCK ;AN000; +; IFSR_RESV3 DB DOS reserved ;AN000; +; * IFSR_POSITION DD range start ; single range ;AN000; +; * IFSR_LENGTH DD range length ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; Call SFF_TO_SFT ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO {error} ;AN000; +; AX = IFSR_RETCODE ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: ;AN000; +; AX set on error: Lock conflict ;AN000; +; Too many locks ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_XLOCK,NEAR ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def LOCKFILE ;AN000; + ;AN000; + SaveReg ; save input bl ;AN014; + MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AC002; +;;;;;;;;TEST BL,80H ;AN006;AD010; +; JZ L_10 ;AN006;AD010; +; OR CS:IFSPROC_FLAGS,IsWOLock ; This is Write Only lock ;AN006;AD010; +;L_10: ;AN006;AD010; +; SaveReg ; save function (int 21h al value) ;AD010; +; AND BL,07FH ; ditch 80h bit for now ;AD010; +; CMP BL,INT21AL_LOCK_READ ; Check for special case locks ;AD010; +; JB L_60 ; these generate different ;AD010; +; JNE L_20 ; ifsrh's. ;AD010; +; OR CS:IFSPROC_FLAGS,IsLockRead ; This is lock/read request ;AD010; +; RestoreReg ; restore bx with 80 bit ;AD010; +; Context DS ;AD010; +; JMP R_20 ; let ifs_read above handle this ;AD010; +;L_20: ;AD010; +; CMP BL,INT21AL_WRITE_UNLOCK ;AD010; +; RestoreReg ; restore bx with 80 bit ;AD010; +; JNE L_40 ;AD010; +; OR CS:IFSPROC_FLAGS,IsWriteUnlock ; This is write/unlock request ;AD010; +; JMP SHORT L_50 ; cont. ifs_write above ;AD010; +;L_40: ;AD010; +; OR IFSPROC_FLAGS,IsAdd ;AD010; +;L_50: ;AD010; +; Context DS ;AD010; +;;;;;;;;JMP W_20 ; cont. in ifs_write above ;AD010; + ;AN000; +L_60: ;AN000; + SaveReg ; save input ds (buffer ptr) ;AN000; + Context DS ; ds-dosgroup to access thissft ;AN000; + MOV WORD PTR [THISSFT],DI ; set [THISSFT] ;AN000; + MOV WORD PTR [THISSFT+2],ES ;AN000; + invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000; + invoke PREP_IFSR ; clear ifsrh ;AM003; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_OPEN_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_LOCKFILE ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSLOCKFILE ;AN000; +;;;;;;;;MOV ES:[BX.IFSR_COUNT],CX ;AN003;AD010; + RestoreReg ; range segment, mode (input bl) ;AC003;AC010; +;;;;;;;;MOV AL,CL ;AN003;AD010; +; AND AL,07FH ; mask off hi 80 bit ;AN003;AD010; +; CMP AL,2 ;AN003;AD010; +; JGE L_70 ;AN003;AD010; +; ADD CL,2 ;AN003;AD010; +;L_70: ;AN003;AD010; +; MOV ES:[BX.IFSR_MODE],CL ;AN000;AD010; +; AND ES:[BX.IFSR_MODE],80H ; ditch input bl in low nibble ;AN005;AD010; +; AND CL,07FH ;AN003;AD010; +;;;;;;;;SUB CL,2 ; set func (0-lock,1-unlock) ;AC003;AD010; + RestoreReg ; restore input bl into al ;AN014; + MOV ES:[BX.IFSR_FUNC],AL ;AC003;AC010; +;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@],DX ;AD010; +;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@+2],DS ;AD010; + SaveReg ;AN010; + RestoreReg ;AN010; + MOV AX,WORD PTR DS:[SI] ;AN010; + MOV WORD PTR ES:[BX.IFSR_LK_POSITION],AX ;AN010; + MOV AX,WORD PTR DS:[SI+2] ;AN010; + MOV WORD PTR ES:[BX.IFSR_LK_POSITION+2],AX ;AN010; + MOV AX,WORD PTR DS:[SI+4] ;AN010; + MOV WORD PTR ES:[BX.IFSR_LK_LENGTH],AX ;AN010; + MOV AX,WORD PTR DS:[SI+6] ;AN010; + MOV WORD PTR ES:[BX.IFSR_LK_LENGTH+2],AX ;AN010; + RestoreReg + SaveReg ; set ds=ifsseg for ifs call ;AN003; + RestoreReg ;AN003; + + invoke CALL_IFS ; *** call fs with lock request ;AN000; + ;AN000; + JNC L_100 ;AN000; + transfer ifs_1000 ; go to general return (util) ;AN000; +L_100: ;AN000; + invoke SFF_TO_SFT ;AN000; + transfer ifs_990 ; go to general good ret (util) ;AN000; + ;AN000; + ;AN000; +EndProc IFS_XLOCK ;AN000; + ;AN000; +BREAK ;AN000; + +;****************************************************************************** +; +; IFS_FILE_XATTRIBUTES +; +; Called by: IFSFUNC dispatcher +; +; Routines called: CALL_IFS DRIVE_FROM_SFT +; SFT_TO_SFF +; SFF_TO_SFT +; +; Inputs: +; [THISSFT] Points to SFT being used +; [SAVE_ES:DI] -> Buffer for EA or EA names list +; [SAVE_DS:SI] -> Query List (BL=2) +; [SAVE_CX] = buffer size (BL=2,3) +; BL = function - 2=Get EA +; 3=Get EA Names +; 4=Set EA +; +; Function: +; This call is driven by the new INT 21H call 57H. *** REMOVED +; Prep IFSRH: +; * IFSR_LENGTH DW 50 ; Total length of request +; * IFSR_FUNCTION DB 4 ; Execute API function +; + IFSR_RETCODE DW ? +; + IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name +; + IFSR_ERROR_CLASS DB ? +; + IFSR_ERROR_ACTION DB ? +; + IFSR_ERROR_LOCUS DB ? +; + IFSR_ALLOWED DB ? +; + IFSR_I24_RETRY DB ? +; + IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; IFSR_DEVICE_CB@ DD ? +; *+ IFSR_OPEN_CB@ DD ? +; * IFSR_FUNC DB ? ; 0-get 1-set +; * IFSR_SUBFUNC DB ? ; 2-EA 3-EA names +; *+ IFSR_BUFFER1@ DD ? ; Query List +; *+ IFSR_BUFFER2@ DD ? ; EA List +; *+ IFSR_COUNT DW ? ; count +; +; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR +; IF IFSR_RETCODE = 0 THEN +; DO +; Call SFF_TO_SFT +; Clear carry +; ENDDO +; ELSE DO +; AX = IFSR_RETCODE +; Set carry +; ENDDO +; ENDIF +; ENDDO +; +; Outputs: +; Carry clear: On Get: +; QUERY LIST or LIST filled in. +; On Set: +; Extended attributes set. All SFTs are updated. +; CARRY SET +; Carry set: AX is error code +; error_file_not_found +; Last element of path not found +; error_path_not_found +; Bad path (not in curr dir part if present) +; error_access_denied +; Attempt to set an attribute which cannot be set +; (attr_directory, attr_volume_ID) +; error_sharing_violation +; Sharing mode of file did not allow the change +; (this request requires exclusive write/read access) +; (INT 24H generated) +; DS preserved, others destroyed +; +;****************************************************************************** + ;AN000; + procedure IFS_FILE_XATTRIBUTES,NEAR ;AN000; + ;AN000; +;;;;;;;;ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000; +; ifsr_api_def FILEATTR ;AN000; +; ;AN000; +; MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000; +; SaveReg ; save input function (2,3,4) ;AN000; +; ;AN000; +; invoke PREP_IFSR ; init ifsr ;AN000; +; Context DS ; ds - dosgroup ;AN000; +; ;AN000; +; invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000; +; MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; +; MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; prep IFSRH ;AN000; +; MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; +; MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000; +; MOV AL,FUNC_GET_BY_HANDLE ; start ifsr_func with get ;AN000; +;;;;;;;;RestoreReg ; get original BX - func ;AN000; + + CMP BL,4 ; ;AC010; + JNE XFA_40 ; ;AC010; + JMP C_990 ; just ret success if set ;AC010; +XFA_40: ;AN000; + +;;;;;;;;MOV ES:[BX.IFSR_FUNC],AL ;AN000; +; MOV AL,SUBFUNC_EA ; start ifsr_subfunc w/ea list ;AN000; +; CMP CL,3 ; (input get ea names) ;AN000; +; JNE XFA_80 ;AN000; +; INC AL ; inc ifsr_subfunc to ea names ;AN000; +;FA_80: ;AN000; +; MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; +; CMP CL,4 ; no size offered on set so don't check ;AN009; +; JE XFA_82 ;AN009; +; +;FA_82: ;AN009; +; MOV AX,[SAVE_DI] ;AN000; +; MOV WORD PTR ES:[BX.IFSR_BUFFER2@],AX ; get list ptr into buffer2@ ;AC002; +; MOV AX,[SAVE_ES] ;AN000; +; MOV WORD PTR ES:[BX.IFSR_BUFFER2@+2],AX ; get list ptr into buffer2@ ;AC002; +;FA_85: ;AN008; +; CMP CL,2 ; get ea list with qlist ;AN000; +; JNE XFA_90 ;AN000; +; MOV AX,[SAVE_SI] ;AN000; +; CMP AX,NULL_PTR ; if null, don't set buffer1 ;AN005; +; JE XFA_90 ;AN005; +; MOV WORD PTR ES:[BX.IFSR_BUFFER1@],AX ; get list ptr into buffer2@ ;AC002; +; MOV AX,[SAVE_DS] ;AN000; +; MOV WORD PTR ES:[BX.IFSR_BUFFER1@+2],AX ; get list ptr into buffer2@ ;AC002; +;FA_90: ;AN000; +; PUSH [SAVE_CX] ; buffer size ;AN000; +; POP ES:[BX.IFSR_COUNT] ;AN000; +; invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000; +; ; ES:BX -> IFSRH ;AN000; +; ; IFSR_OPEN_CB@ ;AN000; +; ; ds - IFSSEG ;AN000; +;************************************************ +; invoke CALL_IFS ; *** call fs with fileattr request ;AN000; +;************************************************ +; JNC XFA_100 ;AN000; +; JMP C_1000 ;AN000; +;FA_100: ;AN000; +;;;;;;;;invoke SFF_TO_SFT ;AN000; + + + Context DS ; on get - set size to 2 and count=0 ;AN010; + MOV AX,[SAVE_CX] ; if count < 2 than no buffer2 ;AN008;;AC013; + CMP AX,2 ;AN008;;AC013; + JGE XFA_120 ;AN008;;AC013; + XOR AX,AX + JMP SHORT XFA_140 +XFA_120: ;AN013; + PUSH [SAVE_ES] ;AN010; + POP ES ;AN010; + MOV DI,[SAVE_DI] ;AN010; + XOR AX,AX ;AN010; + STOSW ; count in buffer ;AN010; + MOV AX,2 ;AN007;AC010; +XFA_140: ;AN013; + SaveReg ; preserve future cx ;AN016; + CallInstall Get_User_Stack,multDOS,24 ; put size in user cx ;AN007; + RestoreReg ; restore future cx ;AN016; + MOV DS:[SI.USER_CX],AX ;AN007; + JMP C_990 ; go ret in close to get ds-dosgroup ;AN000; + ;AN000; + ;AN000; +EndProc IFS_FILE_XATTRIBUTES ;AN000; + ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM new file mode 100644 index 0000000..96fb591 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSINIT.ASM @@ -0,0 +1,1373 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsinit.asm 1.0 87/05/11 ;AN000; +TITLE IFSFUNC INITIALIZATION ROUTINES - Routines for ifs ;AN000; +NAME IFSINIT ;AN000; +;*********************************************************************************** ;AN000; +; ;AN000; +; IFS Initialization Routines ;AN000; +; ;AN000; +; IFSINIT ;AN000; +; ;AN000; +; REVISION HISTORY: ;AN000; +; A000 - Original version 4.00 MAY 1987 ;AN000; +; A001 - PTM 331 Entry point for device ioctl +; A002 - PTM 430 Renumber parse errors +; A003 - DCR 96 Transfer IFS DOS callbacks to IFSFUNC +; A004 - PTM 696 IFSFUNC hang w/no drivers +; A005 - PTM 541 Parse problem +; A006 - PTM 1227 DOS Version Check problem +; A007 - PTM 842 Error messages in ifsfunc +; A008 - PTM 1950 Autoattach when 2 ifs drivers loaded & 1st fails attach +; A009 - PTM 2249 Autoattach must set isifs bit in cds +; A010 - PTM 2827 Error proc problems 1/88 RMG +; A011 - PTM 3334 put back reset environment call 2/88 rmg +; A012 - PTM 4140 dos ext error msg enhancement - semaphore processing 4/19/88 RMG +; A013 - DCR 526 New INT 2FH Share interface not to trigger logic install 4/19/88 RMG +; +; LOC - +; +;*********************************************************************************** + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +include sysmsg.inc ;AN000; +msg_utilname ; resident msgret stuff ;AN000; +.cref ;AN000; +.list ;AN000; +.sall ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ; DOSGROUP data ;AN000; + extrn DataVersion:WORD ; version number of DOS data. ;AN000; + extrn SFTFCB:DWORD ; FCB SFT cache ;AN000; + extrn KeepCount:WORD ; FCB SFT cache ;AN000; + Extrn CDSAddr:DWORD ;AN000; + Extrn CDSCount:BYTE ;AN000; + Extrn DummyCDS:BYTE ;AN000; + Extrn CritPatch:WORD ;AN000; +DATA ENDS ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data ;AN000; + ;AN000; + Extrn CDSAlt:DWORD ;AN000; + Extrn DFLAddr:DWORD ;AN000; + Extrn DFLCount:BYTE ;AN000; +;;;aliasExtrn NLAddr:DWORD ;AN000; +;;;aliasExtrn NLSIZE:WORD ;AN000; + Extrn INT_2F_5:BYTE ;AN000; + Extrn NEXT_2F_5:DWORD ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn CD1:WORD ;AN000; + Extrn DF1:WORD ;AN000; + Extrn SFF1:WORD ;AN000; + Extrn THISIFS:DWORD ;AN000; + Extrn IFSPROC_FLAGS:WORD ;AN000; + Extrn IFSFUNC_FLAGS:WORD ;AN000; + Extrn UNC_FS_HDR:DWORD ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + Extrn IFS_ATTRS:WORD + Extrn RODS_LABEL:BYTE ;AN000; + Extrn IFSSEM:BYTE + ;AN000; + PUBLIC CODESIZE ;AN000; +CODESIZE DB 'RMG' ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 20H ;AN000; + PUBLIC TOTSIZE ;AN000; +TOTSIZE DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 30H ;AN000; + DB 20H ;AN000; + ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +IF DEBUG ;AN000; +Procedure NetPointers,NEAR ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + LDS SI,[DFLAddr] ;AN000; +;;;aliasLES DI,[NLAddr] ;AN000; + return ;AN000; +EndProc NetPointers ;AN000; + ;AN000; +Procedure NetPointers2,NEAR ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV CX,[DFLCount] ;AN000; +;;;aliasMOV DX,[NLSIZE] ;AN000; + return ;AN000; +EndProc NetPointers2 ;AN000; +ENDIF ;AN000; + ;AN000; +IF PATHGEN ;AN000; +Procedure GetIFSFCSinES,NEAR ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + PUSH CS ;AN000; + POP ES ;AN000; + return ;AN000; +EndProc GetIFSFCSinES ;AN000; +ENDIF ;AN000; + ;AN000; +Procedure UnusedFunc,NEAR ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + fmt <>,<>,<"Unused IFSFUNC function issued\n"> ;AN000; + MOV AX,error_invalid_function ;AN000; + STC ;AN000; + return ;AN000; +EndProc UnusedFunc ;AN000; + ;AN000; +; the following multiplex functions are implemented: ;AN000; + ;AN000; +retn1 DD ? ;AN000; +DMY DW ? ;AN000; +CONT DD ? ;AN000; +FOO DW Leave2F ;AN000; + ;AN000; +INT2F PROC FAR ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; + CMP AH,multIFS ;AN000; + JZ IDispatch ;AN000; + JMP CONT ;AN000; +Leave2F: ;AN000; + RET ;AN000; +INT2F ENDP ;AN000; + ;AN000; +Procedure IDispatch,NEAR ;AN000; + POP WORD PTR retn1 ; remove long return ;AN000; + POP WORD PTR retn1+2 ;AN000; + POP DMY ; remove flags ;AN000; + XCHG AX,BX ; save bx/move index to index reg ;AN000; + SHL BL,1 ; convert byte to word index ;AN000; + XOR BH,BH ; convert to word index ;AN000; + POP DMY ; save fictitious AX ;AN000; + PUSH DMY ; restore spot on stack ;AN000; + PUSH WORD PTR retn1+2 ; restore long return ;AN000; + PUSH WORD PTR retn1 ;AN000; + PUSH FOO ; place near address of far return ;AN000; + PUSH CS:IFStable[BX] ; place destination routine ;AN000; + XCHG AX,BX ; restore BX ;AN000; + MOV AX,DMY ; restore AX ;AN000; + STI ; let Mani see Clock ticks ;AN000; +ShortReturn: ;AN000; + return ; go to routine (dispatch for Aaron) ;AN000; + ;AN000; +EDW MACRO name ;AN000; + extrn name:near ;AN000; + DW name ;AN000; +ENDM ;AN000; + ;AN000; +IFSTable LABEL WORD ;AN000; + DW IFSInstall ;AN000; + EDW IFS_RMDIR ; 1 IFS_RMDIR ;AN000; + EDW IFS_SEQ_RMDIR ; 2 IFS_SEQ_RMDIR ;AN000; + EDW IFS_MKDIR ; 3 IFS_MKDIR ;AN000; + EDW IFS_SEQ_MKDIR ; 4 IFS_SEQ_MKDIR ;AN000; + EDW IFS_CHDIR ; 5 IFS_CHDIR ;AN000; + EDW IFS_CLOSE ; 6 IFS_CLOSE ;AN000; + EDW IFS_COMMIT ; 7 IFS_COMMIT ;AN000; + EDW IFS_READ ; 8 IFS_READ ;AN000; + EDW IFS_WRITE ; 9 IFS_WRITE ;AN000; + EDW IFS_XLOCK ; 10 IFS_XLOCK ;AN000; + DW UnusedFunc ; 11 ;AN000; + EDW IFS_DISK_INFO ; 12 IFS_DISK_INFO ;AN000; + EDW IFS_SET_FILE_ATTRIBUTE ; 13 IFS_SET_FILE_ATTRIBUTE ;AN000; + EDW IFS_SEQ_SET_FILE_ATTRIBUTE ; 14 IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; + EDW IFS_GET_FILE_INFO ; 15 IFS_GET_FILE_INFO ;AN000; + EDW IFS_SEQ_GET_FILE_INFO ; 16 IFS_SEQ_GET_FILE_INFO ;AN000; + EDW IFS_RENAME ; 17 IFS_RENAME ;AN000; + EDW IFS_SEQ_RENAME ; 18 IFS_SEQ_RENAME ;AN000; + EDW IFS_DELETE ; 19 IFS_DELETE ;AN000; + EDW IFS_SEQ_DELETE ; 20 IFS_SEQ_DELETE ;AN000; + EDW IFS_OPEN ; 21 IFS_OPEN ;AN000; + EDW IFS_SEQ_OPEN ; 22 IFS_SEQ_OPEN ;AN000; + EDW IFS_CREATE ; 23 IFS_CREATE ;AN000; + EDW IFS_SEQ_CREATE ; 24 IFS_SEQ_CREATE ;AN000; + EDW IFS_SEQ_SEARCH_FIRST ; 25 IFS_SEQ_SEARCH_FIRST ;AN000; + EDW IFS_SEQ_SEARCH_NEXT ; 26 IFS_SEQ_SEARCH_NEXT ;AN000; + EDW IFS_SEARCH_FIRST ; 27 IFS_SEARCH_FIRST ;AN000; + EDW IFS_SEARCH_NEXT ; 28 IFS_SEARCH_NEXT ;AN000; + EDW IFS_ABORT ; 29 IFS_ABORT ;AN000; + EDW IFS_ASSOPER ; 30 IFS_ASSOPER ;AN000; + EDW Printer_GETSET_STRING ; 31 Printer_GETSET_STRING ;AN000; + EDW IFSFlushBuf ; 32 IFS_Flush_Buf ;AN000; + EDW IFS_LSEEK ; 33 IFS_LSEEK ;AN000; + EDW IFS_RESET_ENVIRONMENT ; 34 IFS_RESET_ENVIRONMENT ;AN000; + EDW IFS_DEVICE_CHECK ; 35 IFSDeviceCheck ;AN000; + EDW IFS_DEVICE_CLOSE ; 36 IFSDeviceClose ;AN000; + EDW IFS_DEVICE_OPER ; 37 IFSDeviceOper ;AN000; + EDW IFS_SPOOL_ECHO_CHECK ; 38 IFSSpoolEchoCheck ;AN000; + DW UnusedFunc ; 39 ;AN000; + DW UnusedFunc ; 40 ;AN000; + DW UnusedFunc ; 41 ;AN000; + EDW SERVER_DOSCALL_CLOSEFILES_FOR_UID ; 42 util ;AN000; + EDW DEVICE_IOCTL ; 43 dev ;AN001; + EDW IFS_UPDATE_CB ; 44 UPDATECB util ;AN000; + EDW IFS_FILE_XATTRIBUTES ; 45 hand ;AN000; + EDW IFS_XOPEN ; 46 XOPEN file ;AN000; + EDW IFS_DEPENDENT_IOCTL ; 47 util ;AN000; + ;AN000; + IF DEBUG ;AN000; + DW NetPointers ; 47 NetPointers ;AN000; + DW NetPointers2 ; 48 NetPointers2 ;AN000; + ENDIF ;AN000; + ;AN000; + IF PATHGEN ;AN000; + DW GetIFSFCSinES ; 49 (if debug) GetRedirCSinES ;AN000; + ; 47 (if NOT debug) GetRedirCSinES ;AN000; + ENDIF ;AN000; + ;AN000; +IFSInstall: ;AN000; + MOV AL,0FFh ;AN000; + MOV BX,IFS_ATTRS + return ;AN000; +EndProc IDispatch ;AN000; + ;AN000; +Procedure EcritNet,NEAR ;AN000; + ASSUME SS:NOTHING ;AN000; + PUSHF ;AN000; + CLI ;AN000; + PUSH AX ;AN000; + MOV AX,8000h+CritNet ;AN000; + INT int_ibm ;AN000; + POP AX ;AN000; +IF DEBUG ;AN000; + JNC NoCarry ;AN000; + fmt <>,<>,<"$p: ECritNet overflowed semaphore\n"> ;AN000; +NoCarry: ;AN000; +ENDIF ;AN000; + STI ;AN000; + POPF ;AN000; + return ;AN000; +EndProc EcritNet ;AN000; + ;AN000; +; ;AN000; +; Leave critical section for network. Note that the first instruction (PUSH ;AN000; +; AX) here is used as the patch byte to enable the DOS critical section ;AN000; +; routines... ;AN000; +; ;AN000; +; NOTE!!! On a 286, this instruction issues POPF!!! ;AN000; +; ;AN000; +Procedure LcritNet,NEAR ;AN000; + PUSH AX ;AN000; + PUSHF ;AN000; + CLI ;AN000; +IF DEBUG ;AN000; + JGE NoWrap ;AN000; + fmt <>,<>,<"$p: LCritNet decrementing semaphore through zero\n"> ;AN000; +NoWrap: ;AN000; +ENDIF ;AN000; + ;AN000; + MOV AX,8100h+critNet ;AN000; + INT int_ibm ;AN000; + STI ;AN000; + POPF ; NOTE that this restores entry ;AN000; + POP AX ;AN000; + return ;AN000; +EndProc LcritNet ;AN000; + ;AN000; + ;AN000; +Procedure EcritIFS,NEAR ;AN000; + ASSUME SS:NOTHING ;AN000; + PUSHF ;AN000; + CLI ;AN000; + PUSH AX ;AN000; + MOV AX,8000h+CritIFS ;AN000; + INT int_ibm ;AN000; + POP AX ;AN000; + STI ;AN000; + POPF ;AN000; + return ;AN000; +EndProc EcritIFS ;AN000; + ;AN000; +Procedure LcritIFS,NEAR ;AN000; + PUSH AX ;AN000; + PUSHF ;AN000; + CLI ;AN000; + MOV AX,8100h+critIFS ;AN000; + INT int_ibm ;AN000; + STI ;AN000; + POPF ; NOTE that this restores entry ;AN000; + POP AX ;AN000; + return ;AN000; +EndProc LcritIFS ;AN000; + ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:DOSGroup ;AN000; + ;AN000; +INTERR: ;AN000; +INTERRL:jmp INTERRL ; hang here - we're sick ;AN000; + ;AN000; + ;AN000; + PUBLIC TEMPBUF ;AN000; +TEMPBUF LABEL BYTE ;AN000; +; THE SPACE FROM HERE TO NETEND CONSTITUTES THE TEMP AREA OF IFSFUNC. ;AN000; +; WARNING DANGER!!!!!!!!! ;AN000; +; DO NOT reduce the size of this area without first checking ;AN000; +; all users of it. It is OK to make it BIGGER without checking. ;AN000; +; Current size: ?? ;AN000; + ;AN000; +Break ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; map: Resident: ;AN000; +; IF_40 - (contifsinit) 2nd half of ifsfinit procedure = tempbuf area ;AN000; +; allocate: DFL_LIST, altcds, sftfcb, ;AN000; +; set TOTALSIZE ;AN000; +; IFSFUNCINIT start ;AN000; +; I_700 - INIT: 2nd half of IFSFUNCINIT ;AN000; +; INT 23,24 stuff ;AN000; +; call IFSFINIT ;AN000; +; close std handles ;AN000; +; enable critical section ;AN000; +; terms & stays ;AN000; +; tempbuf ends ;AN000; +; Transient: ;AN000; +; IFSFINIT procedure ;AN000; +; Set interrupt vectors - 2F ;AN000; +; Call AUTO_ATTACH ;AN000; +; allocate stuff (write over code) ;AN000; +; jumps up to 2nd half ;AN000; +; IFSFUNCINIT init code ;AN000; +; version checks ;AN000; +; error msg processing ;AN000; +; free environment ;AN000; +; parsing ;AN000; +; move stack ;AN000; +; check size for everything ;AN000; +; ifsfunc code size calculation ;AN000; +; ifsfunc total size calculation ;AN000; +; jmps to I_700 ;AN000; +; AutoAttach ;AN000; +; CheckUNCpresence ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +; This Code must be protected from overwrite when the structures are ;AN000; +; initialized ;AN000; + ;AN000; + ;AN000; +IF_40: ; CONTIFSINIT ;AN000; +ASSUME DS:IFSSEG,ES:NOTHING,SS:NOTHING ;AN000; + ;AN000; +; ;AN000; +; Allocate and init DFL_LIST ;AN000; +; ;AN000; + MOV WORD PTR DFLAddr,DI ;AN000; + MOV WORD PTR DFLAddr+2,ES ;AN000; + MOV AL,DFLCount ;AN000; + XOR AH,AH ;AN000; + MOV BX,SIZE DFLL_LIST ;AN000; + MUL BX ;AN000; + MOV CX,AX ;AN000; + XOR AX,AX ;AN000; + REP STOSB ;AN000; + ;AN000; +;;;aliasMOV WORD PTR NLAddr,DI ;AN000; +;;; MOV WORD PTR NLAddr+2,ES ;AN000; +;;; MOV AX,NLSIZE ;AN000; +;;; STOSW ;AN000; +;;; XOR AX,AX ;AN000; +;;; STOSW ;AN000; +;;;aliasADD DI,NLSIZE-4 ;AN000; +; ;AN000; +; Allocate alt CDSs area ;AN000; +; ;AN000; + TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; + JZ IF_50 ;AN000; + MOV WORD PTR CDSAlt,DI ;AN000; + MOV WORD PTR CDSAlt+2,ES ;AN000; + PUSH DS ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; + MOV AL,CDSCount ; Alt = Alloc ((sizeof(CDS)+1)*CDSCount); ;AN000; + XOR AH,AH ;AN000; + INC AX ;AN000; + MOV BX,SIZE curdir_list ;AN000; + MUL BX ;AN000; + ADD DI,AX ;AN000; + JMP SHORT IF_55 ;AN000; +IF_50: ;AN000; + PUSH DS ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; +; ;AN000; +; Allocate new FCB cache if appropriate ;AN000; +; ;AN000; +IF_55: ;AN000; + CMP BYTE PTR CS:NEWFCBCACHE,0 ; Damn forward reference ;AN000; + JZ IF_80 ; JZ NO_FCB_CACHE ;AN000; +; ;AN000; +; We need to allocate (NewNumFCB * size of SF_entry) + size of sfTable. ;AN000; +; ;AN000; + CLI ; Diddling a DOS table, make sure ;AN000; +; ;AN000; +; Make dos point to new table ;AN000; +; ;AN000; + MOV WORD PTR SFTFCB,DI ;AN000; + MOV WORD PTR SFTFCB+2,ES ;AN000; +; ;AN000; +; Initialize table parts, next link and size ;AN000; +; ;AN000; + MOV WORD PTR ES:[DI.sfLink],-1 ;AN000; + MOV WORD PTR ES:[DI.sfLink+2],-1 ;AN000; + MOV CX,NewNumFCB ;AN000; + MOV ES:[DI.sfcount],CX ;AN000; +; ;AN000; +; Set up keepcount ;AN000; +; ;AN000; + MOV KeepCount,NewKeepVal ;AN000; +; ;AN000; +; Clean out the new FCB Cache ;AN000; +; ;AN000; + LEA DI,[DI].SFTable ; Point to the FCB SFTs ;AN000; +IF_60: ; CleanScan: ;AN000; + MOV ES:[DI.sf_ref_count],0 ;AN000; + MOV WORD PTR ES:[DI.sf_position],0 ;AN000; + MOV WORD PTR ES:[DI.sf_position+2],0 ;AN000; + ADD DI,SIZE sf_entry ;AN000; + LOOP IF_60 ;AN000; + STI ;AN000; +IF_80: ; NO_FCB_CACHE: ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + MOV [TOTALSIZE],DI ; Offset of 1st free byte ;AN000; + POP AX ;AN000; + POP BX ;AN000; + POP CX ;AN000; + POP DX ;AN000; + POP DI ;AN000; + POP SI ;AN000; + POP ES ;AN000; + POP DS ;AN000; + return ;AN000; + ;AN000; + ;AN000; + ;AN000; + ASSUME CS:IFSSEG,DS:IFSSEG,ES:NOTHING,SS:STACK ;AN000; + ;AN000; +.xlist ;AN000; +.xcref ;AN000; + msg_services ;AN007; + PUBLIC SYSGETMSG + msg_services +.cref ;AN000; +.list ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +Totalsize DW ? ;AN000; + ;AN000; +NEWFCBCACHE DB 0 ;AN000; + ;AN000; +INT_24: ; INT 24 handler used during INIT. ;AN000; + MOV AL,3 ; FAIL any INT 24s ;AN000; +INT_23: ; ^C handler used during INIT. ;AN000; + IRET ; ignores any ^C. ;AN000; + ;AN000; +I_700: ; Init ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; +; ;AN000; +; We are now going to set lots of INT vectors and other stuff. We need ;AN000; +; to make ourselves immune to INT 24 and ^C ;AN000; +; ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + MOV DX,OFFSET INT_23 ;AN000; + MOV AX,(Set_Interrupt_Vector SHL 8) + 23H ;AN000; + INT 21H ;AN000; + MOV DX,OFFSET INT_24 ;AN000; + MOV AX,(Set_Interrupt_Vector SHL 8) + 24H ;AN000; + INT 21H ;AN000; + invoke IFSFINIT ; Do general INIT ;AN000; + ;AN000; + XOR BX,BX ;AN000; + MOV CX,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN ;AN000; +I_720: ; Close STD handles before ;AN000; + ; keep process ;AN000; + MOV AH,CLOSE ;AN000; + INT 21H ;AN000; + INC BX ;AN000; + LOOP I_720 ;AN000; + ;AN000; +; ;AN000; +; Enable the critical section code. This consists of replacing the RETs at ;AN000; +; the beginning of each critical section routine with a PUSH AX ;AN000; +; ;AN000; + PUSH CS ;AN000; + POP DS ; ds - ifsseg ;AN000; + ;AN000; + TEST IFSFUNC_FLAGS,UNC_INSTALLED ; 1st check if unc fs loaded ;AN000; + JZ I_800 ; only do this for unc ;AN000; + MOV AH,Get_In_Vars ; do crit patch ;AN000; + INT 21h ;AN000; + cld ;AN000; + ASSUME ES:DOSGroup ;AN000; + MOV AL,BYTE PTR LCritNet ;AN000; + MOV BX,OFFSET DOSGROUP:CritPatch ;AN000; + CLI ;AN000; +I_760: ; Scan ;AN000; + MOV DI,ES:[BX] ;AN000; + ADD BX,2 ;AN000; + OR DI,DI ;AN000; + JZ I_780 ;AN000; + stosb ;AN000; + JMP I_760 ;AN000; +I_780: ;AN000; + STI ;AN000; +I_800: ;AC012;moved + MOV CS:IFSSEM,0 ; initialize ifs semaphores ;AN012; +; ;AN000; +; Compute total size for residency. ;AN000; +; ;AN000; + MOV DX,TotalSize ; size of code and structs ;AN000; + ADD DX,100H+0Fh ; Add size of header ;AN000; + RCR DX,1 ;AN000; + MOV CL,3 ;AN000; + SHR DX,CL ;AN000; + MOV AX,(Keep_Process SHL 8) + 0 ;AN000; + INT 21h ;AN000; + MOV AX,(EXIT SHL 8) + 1 ;AN000; + INT 21h ;AN000; + ;AN000; + ;AN000; +; %%%% CODE/DATA BELOW IS OVERLAYED WHEN STRUCTURES ARE SET UP ;AN000; + ;AN000; +NETEND LABEL BYTE ;AN000; + ;AN000; + procedure IFSFINIT,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + ;AN000; +; Perform initialization at DOSINIT time ;AN000; + ;AN000; + PUSH DS ;AN000; + PUSH ES ;AN000; + PUSH SI ;AN000; + PUSH DI ;AN000; + PUSH DX ;AN000; + PUSH CX ;AN000; + PUSH BX ;AN000; + PUSH AX ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; +; SET INTERRUPT VECTORS ;AN000; + ;AN000; + MOV AL,2FH ;AN000; + PUSH AX ;AN000; + MOV AX,(multDOS SHL 8) OR 2 ;AN000; + INT 2FH ;AN000; + POP AX ; no know contents ;AN000; + ;AN000; + PUSH ES ;AN000; + PUSH BX ;AN000; + LES BX,DWORD PTR ES:[BX] ; setting int 2f mult 5 ;AN000; + MOV WORD PTR [NEXT_2F_5],BX ;AN000; + MOV WORD PTR [NEXT_2F_5+2],ES ;AN000; + POP BX ;AN000; + POP ES ;AN000; + ;AN000; + MOV DX,OFFSET INT_2F_5 ;AN000; + MOV ES:[BX],DX ;AN000; + MOV ES:[BX+2],DS ;AN000; + ;AN000; + MOV AX,(Get_Interrupt_Vector SHL 8) + 2Fh ;AN000; + INT 21h ;AN000; + MOV WORD PTR CONT,BX ;AN000; + MOV WORD PTR CONT+2,ES ;AN000; + MOV AX,(Set_Interrupt_Vector SHL 8) + 2Fh ;AN000; + MOV DX,OFFSET INT2F ; multIFS handler ;AN000; + INT 21h ;AN000; +; ;AN000; +; auto - attach ;AN000; +; ;AN000; + CALL AUTO_ATTACH ;AN000; +; ;AN000; +; call swap setup ;AN000; +; ;AN000; + PUSH DS ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; + invoke SERVER_IFSFUNC_DATA_AREA ;AN000; + POP DS ;AN000; + invoke SET_IFS_DOSCALL@ ;AN003; + ;AN000; + PUSH CS ;AN000; + POP ES ;AN000; +; ;AN007; +; Prep error messages ;AN007; +; ;AN007; + LEA DI,Rods_label ;AN007; + SaveReg ;AN007; + RestoreReg ;AN007; + MOV AX,DOS_GET_EXT_PARSE_ADD ;AN007; + MOV DL,7 ; set msg addr ;AN007; + INT 2FH ;AN007; +; ;AN000; +; Now start clobbering code ;AN000; +; ;AN000; + MOV DI,OFFSET NETEND ; Start strucs here ;AN000; + TEST DI,1 ; Word aligned? ;AN000; + JZ IF_20 ; Yes, ok ;AN000; + INC DI ; Bump to word align ;AN000; +IF_20: ; NOADJ1 ;AN000; + JMP IF_40 ; jmp CONTIFSINIT ;AN000; + ;AN000; +EndProc IFSFINIT ;AN000; + ;AN000; +;************* ifsfuncinit transient portion ****************************** ;AN000; + AA_PARMS_BUF DB 6 DUP(0) ; temp storage used by auto-attach ;AN000; + S_SIZE1 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; + DB 0 ; Reserved ;AN000; + DD SUB_IFSFUNC ; Ptr to substituted string ;AN000; + DB 1 ; n of %n ;AN000; + DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; + DB 7 ; Maximum field width ;AN000; + DB 5 ; Minimum field width ;AN000; + DB " " ; Character for Pad field ;AN000; + S_SIZE2 DB 11 ; Sublist size(PTR next SUBLIST) ;AN000; + DB 0 ; Reserved ;AN000; + DD SUB_SHARE ; Ptr to substituted string ;AN000; + DB 1 ; n of %n ;AN000; + DB Left_Align+Char_Field_ASCIIZ ; Data-type flags ;AN000; + DB 7 ; Maximum field width ;AN000; + DB 5 ; Minimum field width ;AN000; + DB " " ; Character for Pad field ;AN000; + ;AN000; +SUB_IFSFUNC DB "IFSFUNC",0 ;AN000; +SUB_SHARE DB "SHARE",0 ;AN000; + ;AN000; +DEFAULT_DFLCount DB 4 ;AN000; +;;;alias DEFAULT_NLSize DW 172 ; 4 * 43 ;AN000; + ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING ;AN000; +.xlist ;AN000; +.xcref ;AN000; + INCLUDE IFSPARSE.INC ;AN000; + msg_services ;AN000; + msg_services ; parse/install msgs ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; !!!!!!! IFSFUNC starts here !!!!!!! (see END statement) ;AN000; +;****************************************************************************** ;AN000; + ;AN000; +IFSFUNCINIT: ;AN000; + ;AN000; + CALL SYSLOADMSG ;AN000; + JNC I_20 ;AN000; + SaveReg ;AN006; + RestoreReg ;AN006; + CALL SYSDISPMSG ;AN000; + ;AN000; +Badver_msg proc far ;AN000; + MOV AL,0FFh ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + MOV AH,EXIT ;AN000; + INT 21h ;AN000; + PUSH ES ;AN000; + XOR AX,AX ;AN000; + PUSH AX ;AN000; + RET ;AN000; +badver_msg ENDP ;AN000; + ;AN000; +Badmes proc far ;AN000; + ASSUME CS:IFSSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING ;AN000; + MOV BX,STDERR ;AN000; + XOR DL,DL ;AN000; + CALL SYSDISPMSG ;AN000; + MOV AX,(EXIT SHL 8) + 0FFH ;AN000; + INT 21h ;AN000; +badmes ENDP ;AN000; + ;AN000; + ;AN000; +I_20: ; Version OK ;AN000; + MOV AX,(multIFS SHL 8)+0 ; Check if IFSFUNC already installed ;AN000; + INT 2Fh ;AN000; + CMP AL,0 ;AN000; + JE I_40 ;AN000; + MOV AX,COMMON_ERR_2 ; yes - already installed - error 2 ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + MOV SI,OFFSET S_SIZE1 ; prep for sysdispmsg call ;AN000; + MOV CX,1 ;AN000; + MOV DH,UTILITY_MSG_CLASS ;AN000; +I_30: ;AN005; + PUSH CS ;AN000; + POP DS ;AN000; + JMP BADMES ;AN000; + ; no error on install check, ;AN000; +I_40: ; free environment - no longer needed ;AN000; + MOV AX,DS:[PDB_ENVIRON] ;AN000; + OR AX,AX ;AN000; + JZ I_60 ;AN000; + PUSH ES ;AN000; + MOV ES,AX ;AN000; + MOV AH,DEALLOC ;AN000; + INT 21H ;AN000; + POP ES ;AN000; +I_60: ;AN000; +;************************************************************************************ ;AN000; +; Parse IFSFUNC parameter : ;AN000; +; NAMES = n ;;;alias[n | (n {m})] ;AN000; +;************************************************************************************ ;AN000; + ; Set default n and m ;AN000; + MOV AL,DEFAULT_DFLCount ;AN000; + MOV [DFLCount],AL ; 4 (n) ;AN000; +;;;aliasMOV AX,DEFAULT_NLSize ;AN000; +;;;aliasMOV NLSize,AX ; 4 * 43 (m) ;AN000; + ;AN000; + MOV SI,81h ; ds:si -> cmd parameter ;AN000; + XOR CX,CX ; no operands parsed yet ;AN000; + PUSH CS ;AN000; + POP ES ;AN000; +ASSUME ES:IFSSEG ;AN000; + MOV DI,OFFSET IFSF_PARMS ; es:di -> parse control blocks ;AN000; + XOR DX,DX ; reserved ;AN000; + ;AN000; + CALL SYSPARSE ; call parser ;AN000; + ;AN000; + CMP AX,-1 ; End of cmd? ;AN000; + JNE I_70 ;AN000; + JMP I_160 ; if so continue w/init ;AN000; +I_70: ;AN000; + CMP AX,0 ; Error? ;AN000; + JNE I_140 ; yes - go display parse error ;AN000; + ;AN000; +;;;aliasCMP IFSF_RESULT,COMPLEX ; complex? ;AN000; +;;;aliasJE I_80 ;AN000; + CMP IFSF_TAG,"N" ; no - n only ;AN000; + MOV AX,PARSE_ERR_6 ;AN002; + JNE I_140 ;AN000; + ;AN000; + MOV AL,IFSF_NM ;AN000; + MOV [DFLCount],AL ;AN000; + ;AN000; + CALL SYSPARSE ;AN000; + CMP AX,-1 ;AN000; + JE I_160 ;AN000; + MOV AX,PARSE_ERR_1 ;AN000; +;;;aliasJMP I_140 ; go display parse error ;AN000; +;;; ;AN000; +;;;aliasI_80: ; process complex (n,m) ;AN000; +;;; XOR CX,CX ; prep for new parse call ;AN000; +;;; XOR DX,DX ;AN000; +;;; CALL SYSPARSE ;AN000; +;;; CMP AX,-1 ; End of cmd? ;AN000; +;;; JE I_160 ; if so continue w/init ;AN000; +;;; CMP AX,0 ; Error? ;AN000; +;;; JNE I_140 ; if so go display error ;AN000; +;;; CMP IFSF_TAG,"N" ; check if n or m parm ;AN000; +;;; JNE I_100 ;AN000; +;;; MOV AL,IFSF_NM ; n parm ;AN000; +;;; MOV DFLCount,AL ;AN000; +;;; CALL SYSPARSE ; go back for m ;AN000; +;;; CMP AX,-1 ; End of cmd? ;AN000; +;;; JE I_160 ; if so continue w/init ;AN000; +;;; CMP AX,0 ; Error? ;AN000; +;;; JNE I_140 ; if so go display error ;AN000; +;;; ;AN000; +;;;00: ;AN000; +;;; CMP IFSF_TAG,"M" ; check if m parm ;AN000; +;;; JE I_120 ;AN000; +;;; MOV AX,PARSE_ERR_7 ; not m - error ;AN002; +;;; JMP I_140 ;AN000; +;;;20: ;AN000; +;;; MOV AX,WORD PTR IFSF_NM ; m parm ;AN000; +;;; MOV NLSize,AX ;AN000; +;;; ;AN000; +;;; CALL SYSPARSE ; call parser again to check for ;AN000; +;;; CMP AX,-1 ; possible garbage ;AN000; +;;; JE I_160 ;AN000; +;;; MOV AX,PARSE_ERR_1 ;AN000; +;;;alias ;AN000; +I_140: ; display parse error ;AN000; + MOV DH,PARSE_ERR_CLASS ; then continue w/defaults ;AN000; + XOR CX,CX ;AN000; +;;; MOV BX,STDERR ;AD005; +;;; XOR DL,DL ;AD005; +;;; CALL SYSDISPMSG ;AD005; + JMP I_30 ;AN005; + ;AN000; +I_160: ;AN000; + ; doinit ;AN000; + MOV AX,DS ; Move the stack so it doesn't ;AN000; + ; get blasted by structure init ;AN000; + MOV SS,AX ; Set stack in the PSP overlaying ;AN000; + MOV SP,100H ; parms just processed ;AN000; +; ;AN000; +; We must now do some computation. We have to check if there is enough room ;AN000; +; for everything. We must do this here BEFORE we start overlaying this ;AN000; +; code ;AN000; +; ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + MOV DI,OFFSET NETEND ; We have this much code ;AN000; + TEST DI,1 ; Word aligned? ;AN000; + JZ I_180 ; Yes, OK. ;AN000; + INC DI ; Make word aligned ;AN000; +I_180: ; no adjust 5 label ;AN000; + ;AN000; +; This code is added to make it easy to determine the code size ;AN000; +; of IFSFUNC for debug purposes. It is overlayed, so does not use extra ;AN000; +; storage. ;AN000; + PUSH DI ; ;AN000; + PUSH SI ; ;AN000; + LEA SI,CODESIZE+3 ; ;AN000; +I_200: ; TENT ;AN000; + SUB DI,10000 ; ;AN000; + JC I_220 ; ;AN000; + INC BYTE PTR [SI] ; ;AN000; + JMP I_200 ; ;AN000; +I_220: ; NEG1 ;AN000; + ADD DI,10000 ; ;AN000; + INC SI ; ;AN000; +I_240: ; THOU ;AN000; + SUB DI,1000 ; ;AN000; + JC I_260 ; ;AN000; + INC BYTE PTR [SI] ; ;AN000; + JMP I_240 ; ;AN000; +I_260: ; NEG2 ;AN000; + ADD DI,1000 ; ;AN000; + INC SI ; ;AN000; +I_280: ; HUND ;AN000; + SUB DI,100 ; ;AN000; + JC I_300 ; ;AN000; + INC BYTE PTR [SI] ; ;AN000; + JMP I_280 ; ;AN000; +I_300: ; NEG3 ;AN000; + ADD DI,100 ; ;AN000; + INC SI ; ;AN000; +I_320: ; TENS ;AN000; + SUB DI,10 ; ;AN000; + JC I_340 ; ;AN000; + INC BYTE PTR [SI] ; ;AN000; + JMP I_320 ; ;AN000; +I_340: ; NEG4 ;AN000; + ADD DI,10 ; ;AN000; + INC SI ; ;AN000; +I_360: ; ONES ;AN000; + SUB DI,1 ; ;AN000; + JC I_380 ; ;AN000; + INC BYTE PTR [SI] ; ;AN000; + JMP I_360 ; ;AN000; +I_380: ; DONE ;AN000; + POP SI ; ;AN000; + POP DI ; ;AN000; +; ;AN000; +; Allocate the DFL ;AN000; +; ;AN000; + MOV AL,DFLCount ;AN000; + XOR AH,AH ;AN000; + MOV CX,SIZE DFLL_LIST ;AN000; + MUL CX ;AN000; + OR DX,DX ;AN000; + JZ I_402 ;AN000; + JMP I_640 ; out of memp ;AN000; +I_402: ;AN000; + ADD DI,AX ;AN000; + JNC I_403 ;AN000; + JMP I_640 ; out of memp ;AN000; +I_403: ;AN000; +;;;aliasADD DI,NLSIZE ;AN000; +;;;aliasJNC I_404 ;AN000; +;;;aliasJMP I_640 ; out of memp ;AN000; +I_404: ;AN000; + CALL CHECK_UNC_PRESENCE ; check if unc present, if not, ;AN000; + TEST IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; + JZ I_415 ; no need to allocate altcds ;AN000; +; ;AN000; +; Allocate the TEMP CDS area ;AN000; +; ;AN000; + PUSH DS ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; + MOV CL,CDSCount ;AN000; + XOR CH,CH ;AN000; + INC CX ;AN000; + MOV AX,SIZE curdir_list ;AN000; + MUL CX ;AN000; + OR DX,DX ;AN000; + JZ I_410 ;AN000; + JMP I_640 ;AN000; +I_410: ;AN000; + ADD DI,AX ; Temp CDS area ;AN000; + JNC I_417 ;AN000; + JMP I_640 ;AN000; +I_415: ;AN000; +; ;AN000; +; Determine if need new FCB cache and Allocate it if appropriate ;AN000; +; ;AN000; + PUSH DS ; get addressability to DOSGROUP ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; +I_417: ;AN000; + CMP KeepCount,DefKeepVal ;AN000; + JNZ I_420 ;AN000; + LDS SI,SFTFCB ;AN000; +ASSUME DS:NOTHING ;AN000; + CMP [SI].sfCount,DefNumFCB ;AN000; + JNZ I_420 ;AN000; + INC NEWFCBCACHE ; Flag ourselves ;AN000; + ADD DI,((SIZE sf_entry) * NewNumFCB)+((SIZE sf)-2) ; New cache ;AN000; + JC I_640 ; out of memp ;AN000; +I_420: ; no fcb ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; +; This code is added to make it easy to determine the total size @A1A ;AN000; +; of IFSFUNC. It is overlayed, so does not use extra storage. @A1A ;AN000; + ; @A1A ;AN000; + PUSH DI ; @A1A ;AN000; + PUSH SI ; @A1A ;AN000; + LEA SI,TOTSIZE ; @A1A ;AN000; +I_440: ; TENT2 @A1A ;AN000; + SUB DI,10000 ; @A1A ;AN000; + JC I_460 ; @A1A ;AN000; + INC BYTE PTR [SI] ; @A1A ;AN000; + JMP I_440 ; @A1A ;AN000; +I_460: ; NEG5 @A1A ;AN000; + ADD DI,10000 ; @A1A ;AN000; + INC SI ; @A1A ;AN000; +I_480: ; THOU2 @A1A ;AN000; + SUB DI,1000 ; @A1A ;AN000; + JC I_500 ; @A1A ;AN000; + INC BYTE PTR [SI] ; @A1A ;AN000; + JMP I_480 ; @A1A ;AN000; +I_500: ; NEG6 @A1A ;AN000; + ADD DI,1000 ; @A1A ;AN000; + INC SI ; @A1A ;AN000; +I_520: ; HUND2 @A1A ;AN000; + SUB DI,100 ; @A1A ;AN000; + JC I_540 ; @A1A ;AN000; + INC BYTE PTR [SI] ; @A1A ;AN000; + JMP I_520 ; @A1A ;AN000; +I_540: ; NEG7 @A1A ;AN000; + ADD DI,100 ; @A1A ;AN000; + INC SI ; @A1A ;AN000; +I_560: ; TENS2 @A1A ;AN000; + SUB DI,10 ; @A1A ;AN000; + JC I_580 ; @A1A ;AN000; + INC BYTE PTR [SI] ; @A1A ;AN000; + JMP I_560 ; @A1A ;AN000; +I_580: ; NEG8 @A1A ;AN000; + ADD DI,10 ; @A1A ;AN000; + INC SI ; @A1A ;AN000; +I_600: ; ONES2 @A1A ;AN000; + SUB DI,1 ; @A1A ;AN000; + JC I_620 ; @A1A ;AN000; + INC BYTE PTR [SI] ; @A1A ;AN000; + JMP I_600 ; @A1A ;AN000; +I_620: ; DONE2 @A1A ;AN000; + POP SI ; @A1A ;AN000; + POP DI ; @A1A ;AN000; + ;AN000; + ;AN000; + JMP I_700 ;AN000; + ;AN000; +I_640: ; OUT_OF_MEMP ;AN000; + POP DS ;AN000; +I_660: ; OUT_OF_MEM ;AN000; + MOV AX,PARSE_ERR_10 ;AN000; + XOR CX,CX ;AN000; + JMP BADMES ;AN000; + ;AN000; +ASSUME DS:NOTHING ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; AUTO_ATTACH ;AN000; +; ;AN000; +; Called by: init ;AN000; +; ;AN000; +; Routines called: CALL_IFS ;AN000; +; CDS_TO_CD ;AN000; +; CD_TO_CDS ;AN000; +; FIND_IFS_DRIVER ;AN000; +; Inputs: ;AN000; +; None ;AN000; +; ;AN000; +; Function: ;AN000; +; Get addressability to CDS structure (SYSVARS - IBMDOS/BIO) ;AN000; +; FOR I = 1 to # CDS ;AN000; +; DO ;AN000; +; ³ Drive = I - 1 (0-A,1-B,...) ;AN000; +; ³ IF (curdir_inuse == 0 & curdir_devptr .NOT. 0) THEN ;AN000; +; ³ DO ;AN000; +; ³ ³ Get pointer to 1st IFS header ;AN000; +; ³ ³ WHILE pointer .NOT. 0FFFFH ;AN000; +; ³ ³ DO ;AN000; +; ³ ³ START ATTACH ;AN000; +; ³ ³ (IFSR_TYPE = 2 ;AN000; +; ³ ³ IFSR_PARMS@ -> IFS name, 0 parms) ;AN000; +; ³ ³ IF Attach successful THEN ;AN000; +; ³ ³ DO ;AN000; +; ³ ³ IF IFSUSESHARE set THEN ;AN000; +; ³ ³ Set share flag ;AN000; +; ³ ³ ENDIF ;AN000; +; ³ ³ LEAVE While ;AN000; +; ³ ³ ENDDO ;AN000; +; ³ ³ ELSE ;AN000; +; ³ ³ Get pointer to next IFS header ;AN000; +; ³ ³ ENDIF ;AN000; +; ³ ³ ENDDO ;AN000; +; ³ ³ ENDWHILE ;AN000; +; ³ ENDDO ;AN000; +; ³ ENDIF ;AN000; +; ENDDO ;AN000; +; IF Share flag set THEN ;AN000; +; DO ;AN000; +; IF SHARE .NOT. loaded THEN ;AN000; +; issue warning msg: "SHARE not loaded" using msg retriever ;AN000; +; END ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: Successful auto-attachments in effect ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure AUTO_ATTACH,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + TEST IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; + JZ AA_05 ;AN000; + JMP AA_1000 ;AN000; + ;AN000; +AA_05: ;AN000; + SaveReg ; preserve ds - psp,es di storage ;AN000; + ifsr_fcn_def ATTSTART ;AN000; + MOV CS:IFSPROC_FLAGS,THISIFS_SET+IsInit ; set this so that cds_to_cd doesn't ;AC010; + ; set thisifs ;AN000; + ;AN000; + MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; + INT 21h ; es:bx -> sysinitvars ;AN000; + LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; + ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ; get addressability to dosgroup ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; + ;AN000; + MOV CL,[CDSCount] ; prep cds loop ;AN000; + XOR CH,CH ;AN000; + MOV DX,SIZE CURDIR_LIST ;AN000; + LDS SI,[CDSAddr] ; ds:si -> CDS list ;AN000; +ASSUME DS:NOTHING ;AN000; + ;AN000; +AA_10: ; ** Loop here on cds entries ;AN000; + + TEST DS:[SI.CURDIR_FLAGS],CURDIR_INUSE ; check for ifs-able drive ;AN000; + JZ AA_13 ;AN000; + JMP AA_120 ; cds already inuse, try next cds ;AN000; +AA_13: ;AN000; + CMP WORD PTR DS:[SI.CURDIR_DEVPTR],0 ;AN000; + JNZ AA_16 ;AN000; + CMP WORD PTR DS:[SI.CURDIR_DEVPTR+2],0 ;AN000; + JNZ AA_16 ;AN000; + JMP AA_120 ; cds not real, try next cds ;AN000; +AA_16: ;AN000; + MOV AX,SI ; attempt ;AN000; + SaveReg ; cds seg, offset ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ; get dosgroup in ds to access cdsaddr ;AN000; + INT 2FH ;AN000; +ASSUME DS:DOSGROUP ;AN000; + RestoreReg ; cds offset ;AN000; + SUB AX,WORD PTR [CDSADDR] ; get drive # (0-based) in al ;AN000; + MOV BL,SIZE CurDir_list ;AN000; + DIV BL ;AN000; + RestoreReg ; cds segment ;AN000; + SaveReg ; drive # (0-based 0=A) ;AN000; + MOV BL,AL ;AN000; + INC BL ; change to 1-based (1=A) ;AN000; + MOV AX,CHECK_REMOVABLE ; 4408H (device ioctl) ;AN000; + INT 21H ;AN000; + OR AX,AX ; ax 0 - drive removable ;AN000; + RestoreReg ; drive # (0-based) ;AN000; + JNZ AA_19 ;AN000; + JMP AA_120 ; drive removable, don't auto-attach ;AN000; + ;AN000; +AA_19: ; cds ok, proceed with autoattach ;AN000; + CBW ; convert al to word (ax) ;AN000; + MOV BL,10 ;AN000; + DIV BL ; convert number (ex.14) to char ;AN000; + ADD AX,3030H ; (3134) (ah-remain,al-quot) ;AN000; + ;AN000; + SaveReg ; Save 1st ifs driver ;AN000; + MOV CS:WORD PTR [THISIFS],DI ; Send attach start request ;AN000; + MOV CS:WORD PTR [THISIFS+2],ES ; to all fs drivers. Stop when ;AN000; + ; one clicks. ;AN000; +AA_20: ;AN000; + SaveReg ; ifs ptr, cds count-size-ptr ;AN000; + ;AN000; + SaveReg ; get ES -> dosgroup (save char drv#) ;AN000; + MOV AX,(multDOS SHL 8) OR 3 ;AN000; + INT 2FH ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; +ASSUME DS:DOSGROUP,ES:DOSGROUP ;AN000; + ; do attach w/dummy cds so as not ;AN000; + MOV DI,OFFSET DOSGROUP:DummyCDS ; to ruin valid cds ;AN000; + RestoreReg ;AN000; +ASSUME DS:NOTHING ;AN000; + PUSH DI ;AN000; + MOV CX,SIZE curdir_list ;AN000; + REP MOVSB ;AN000; + PUSH ES ;AN000; + POP DS ;AN000; + POP SI ; DS:SI -> dummy CDS ;AN000; + MOV [SI.curdir_flags],curdir_isifs + curdir_inuse ;AN000; + MOV [SI.curdir_type],type_drive ;AN000; + MOV AX,WORD PTR CS:[THISIFS] ;AN000; + MOV WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; + MOV AX,WORD PTR CS:[THISIFS+2] ;AN000; + MOV WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; + RestoreReg ; char drive # ;AN000; + SaveReg ; dummy cds ptr ;AN000; + ;AN000; + invoke PREP_IFSR ; sets es:bx -> ifsr, 0s fields, ;AN000; + ; ds - ifsseg ;AN000; + MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ; sets ifsr_device_cb@ ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; + MOV ES:[BX.IFSR_TYPE],TYPE_DRIVE ;AN000; + ;AN000; + MOV SI,OFFSET AA_PARMS_BUF ; set up attach parameter buffer ;AN000; + MOV WORD PTR DS:[SI],1 ; in tempbuf = dw 1 ;AN000; + MOV WORD PTR DS:[SI+2],AX ; db 3134,0 ;AN000; + XOR AL,AL ;AN000; + MOV BYTE PTR DS:[SI+4],AL ; asciiz ;AN000; + MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AN000; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AN000; + ;AN000; +AA_40: ; ** Loop here on ifs drivers ;AN000; + invoke CALL_IFS ; call ifs driver w/attach start req ;AN000; + ;AN000; + JC AA_60 ; jmp on no click ;AN000; + ; click: ;AN000; + RestoreReg ; restore cds ptr to es:di ;AN000; + invoke CD_TO_CDS ; update cds entry ;AN000; + SaveReg ; move dummy cds ptr back to ds:si ;AN000; + RestoreReg ;AN000; + MOV SI,DI ; ds:si -> dummy cds ;AN000; + RestoreReg ; es:di -> real cds ;AN000; + MOV CX,SIZE CURDIR_LIST ; copy dummy into real - ok to ;AN000; + SaveReg ;AN000; + OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; set this cds as ifs ;AN009; + REP MOVSB ; clobber now ;AN000; + RestoreReg ; move real cds ptr back to ds:si ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + RestoreReg ; restore cds size, count, ;AN000; + ; ifs ptr ;AN000; + TEST CS:IFSPROC_FLAGS,ISSHARE ; check if share checked ;AN000; + JNZ AA_100 ; go process next cds ;AN000; + TEST ES:[DI.IFS_ATTRIBUTE],IFSUSESHARE ;AN000; + JZ AA_100 ; ifs driver needs share ;AN000; +;; D526 CallInstall SHAREInstall,multSHARE,0 ; check that share loaded ;AN000; + CallInstall SHAREInstall,multSHARE,40H ; check that share loaded ;AN013; + CMP AL,INSTALLED ; if not generate warning ;AN000; + JE AA_50 ;AN000; + SaveReg ;AN000; + MOV AX,COMMON_ERR_3 ; "SHARE not installed" ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + MOV SI,OFFSET S_SIZE2 ;AN000; + MOV CX,1 ;AN000; + MOV DH,UTILITY_MSG_CLASS ;AN000; + MOV BX,STDERR ;AN000; + XOR DL,DL ;AN000; + CALL SYSDISPMSG ;AN000; + RestoreReg ;AN000; + ;AN000; +AA_50: ;AN000; + OR CS:IFSPROC_FLAGS,ISSHARE ; set this so won't check share again ;AN000; + JMP AA_100 ;AN000; + ;AN000; +AA_60: ; ** Next driver ;AN000; + RestoreReg ; dummy cds ptr ;AN000; + RestoreReg ; restore: ifs and cds ptrs, ;AN000; + ; cds count and size ;AN000; + LES DI,ES:[DI.IFS_NEXT] ; check next fs driver ;AN000; + CMP DI,NULL_PTR ; if ptr null, end of ifs drivers ;AN000; + JNE AA_80 ;AN000; + PUSH AX ; dummy cds offset ;AN000; + MOV AX,ES ;AN000; + CMP AX,NULL_PTR ;AN000; + POP AX ; dummy cds offset ;AN000; + JE AA_100 ; go process next cds if no more ifs ;AN000; +AA_80: ;AN000; + MOV CS:WORD PTR [THISIFS],DI ; prep next ifs driver ;AN000; + MOV CS:WORD PTR [THISIFS+2],ES ;AN000; + SaveReg ; Save regs ;AN000; + SaveReg ; dummy cds ptr ;AN000; + SaveReg ; get esdi back to ifsrh ;AN008; + RestoreReg ; and ds-ifsseg ;AN008; + MOV BX,OFFSET IFSR ;AN008; + XOR AX,AX ;AN008; + MOV ES:[BX.IFSR_RETCODE],AX ; restore error fields ;AN008; + MOV ES:[BX.IFSR_RETCLASS],AL ;AN008; + JMP AA_40 ; go process next ifs driver ;AN000; + ;AN000; +AA_100: ;AN000; + RestoreReg ; restore 1st ifs driver ;AN000; +AA_120: ;AN000; + ADD SI,DX ; ** Next CDS ;AN000; + DEC CX ;AN000; + JZ AA_990 ;AC004; + JMP AA_10 ;AN000; + ;AN000; + ;AN000; +AA_990: ;AC004; + RestoreReg ; restore ds - psp,esdi - storage ;AN000; +AA_1000: ;AN004; + AND CS:IFSPROC_FLAGS,NOT IsInit ; reset isinit ;AN010; + return ;AN000; + ;AN000; +EndProc AUTO_ATTACH ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CHECK_UNC_PRESENCE ;AN000; +; ;AN000; +; Called by: init - general ;AN000; +; ;AN000; +; Routines called: SYSDISPMSG ;AN000; +; ;AN000; +; Inputs: ;AN000; +; None ;AN000; +; ;AN000; +; Function: ;AN000; +; Get pointer to 1st IFS header ;AN000; +; IF no file systems THEN ;AN000; +; Display warning ;AN000; +; ELSE DO ;AN000; +; BX=0 +; WHILE pointer .NOT. 0FFFFH ;AN000; +; DO ;AN000; +; OR BX,IFS_ATTRIBUTES +; IF file system driver has unc bit set THEN ;AN000; +; DO ;AN000; +; Set unc_installed flag in IFSFUNC_FLAGS ;AN000; +; Set UNC_FS_HDR = unc file system driver header ;AN000; +; Set unc_found ;AN000; +; ENDDO ;AN000; +; ENDDO ;AN000; +; ENDWHILE ;AN000; +; IF unc not found THEN ;AN000; +; Set UNC_FS_HDR = null ptr ;AN000; +; ENDIF ;AN000; +; IFS_ATTRS=BX +; ENDDO ;AN000; +; ENDIF ;AN000; +; ;AN000; +; Outputs: unc_installed flag set in ifsfunc_flags in unc present ;AN000; +; IFS_ATTRS set +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure CHECK_UNC_PRESENCE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; preserve ds - psp,es di storage ;AN000; + MOV AH,Get_In_Vars ; Get ptr to ifs hdr chain ;AN000; + INT 21h ; es:bx -> sysinitvars ;AN000; + LES DI,ES:[BX.SYSI_IFS] ; es:di -> 1st ifs driver ;AN000; + XOR BX,BX ;AN000; + CMP DI,NULL_PTR ; if 1st null, then no drivers ;AN000; + JNE CUP_20 ; must display no driver msg ;AN000; + MOV AX,ES ;AN000; + CMP AX,NULL_PTR ;AN000; + JNE CUP_20 ;AN000; + ;AN000; + MOV AX,UTIL_ERR_4 ; def 4 "No IFS drivers found",CR,LF ;AN000; + MOV BX,STDERR ;AN000; + XOR CX,CX ;AN000; + MOV DL,NO_INPUT ;AN000; + MOV DH,UTILITY_MSG_CLASS ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + CALL SYSDISPMSG ;AN000; + MOV CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ;AN000; + ;AN000; + JMP SHORT CUP_1000 ;AN000; + ;AN000; +CUP_20: ;AN000; + OR BX,ES:[DI.IFS_ATTRIBUTE] + TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ; now set UNC_FS_HDR ;AN000; + JNZ CUP_40 ;AN000; +CUP_30: + LES DI,ES:[DI.IFS_NEXT] ;AN000; + CMP DI,NULL_PTR ;AN000; + JNE CUP_20 ;AN000; + MOV AX,ES ;AN000; + CMP AX,NULL_PTR ;AN000; + JNE CUP_20 ;AN000; + TEST IFSFUNC_FLAGS,UNC_INSTALLED + JNZ CUP_1000 + MOV WORD PTR [UNC_FS_HDR],NULL_PTR ; no unc - set unc ptr null ;AN000; + MOV WORD PTR [UNC_FS_HDR+2],NULL_PTR ;AN000; + JMP SHORT CUP_1000 ;AN000; + ;AN000; +CUP_40: ; found unc - set unc ptr ;AN000; + MOV WORD PTR [UNC_FS_HDR],DI ; and unc flag ;AN000; + MOV WORD PTR [UNC_FS_HDR+2],ES ;AN000; + OR IFSFUNC_FLAGS,UNC_INSTALLED ;AN000; + JMP SHORT CUP_30 ;AN000; + ;AN000; + ;AN000; +CUP_1000: ;AN000; + RestoreReg ; restore ds - psp,esdi - storage ;AN000; + return ;AN000; + +include msgdcl.inc + ;AN000; +EndProc CHECK_UNC_PRESENCE ;AN000; + ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +STACK SEGMENT STACK ;AN000; +DB 278 + 128 DUP (?) ; 278 == IBM's ROM requirements ;AN000; +STACK ENDS ;AN000; + ;AN000; +END IFSFUNCinit ;AN000; +END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC new file mode 100644 index 0000000..d986ca9 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSPARSE.INC @@ -0,0 +1,92 @@ +;****************************************************************************** ;AN000; +; IFSFUNC Parse Symbol File ;AN000; +; ;AN000; +; Parsing: NAMES = n ;;;alias[n | (n {m})] ;AN000; +; ;AN000; +; Modification history: ;AN000; +; Created: May 30 1987 ;AN000; +; ;AN000; +; LOD - 35 ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; +IFSF_PARMS LABEL WORD ; IFSFUNC parms input block ;AN000; + DW IFSF_PARMSX ; offset of ifsfunc parms extension block ;AN000; + DB 0 ; No extra delimeters or eol chars ;AN000; + ;AN000; +IFSF_PARMSX LABEL BYTE ; IFSFUNC parm extension block ;AN000; + DB 0,0,0 ; 0 positionals, 0 switches ;AN000; + DB 1 ; 1 keyword (NAMES=) ;AN000; + DW IFSF_K1 ;AN000; + ;AN000; +IFSF_K1 LABEL WORD ; IFSFUNC 1 keyword ;AN000; + DW 8001h ; Numeric/optional(NAMES= ok) ;AN000; + DW 0 ; no function ;AN000; + DW IFSF_RESULT ; Result buffer ;AN000; + DW IFSF_K1_VAL ; value list ;AN000; + DB 1 ; 1 keyword ;AN000; + DB "NAMES=",0 ;AN000; + ;AN000; +IFSF_K1_VAL LABEL BYTE ; value definition ;AN000; + DB 1 ; # value defns: get one: n or (n,m) ;AN000; + DB 1 ; # ranges ;AN000; + DB "N" ; value to return if n in range ;AN000; + DD 0,255 ; range ;AN000; + ;AN000; + ;AN000; +;;;alias Complex control blocks ;AN000; +; ;AN000; +; IFSF_COMPLEX_PARMS LABEL WORD ;AN000; +; DW IFSF_COMPLEX_PARMSX ;AN000; +; DB 0 ; No extra delimeters or eol chars ;AN000; +; ;AN000; +; IFSF_COMPLEX_PARMSX LABEL BYTE ; ;AN000; +; DB 1,2 ; Min 1, Max 2 positionals ;AN000; +; DW IFSF_COMPLEX_POS1 ;AN000; +; DW IFSF_COMPLEX_POS2 ;AN000; +; DB 0,0 ; 0 switches, 0 keywords ;AN000; +; ;AN000; +; IFSF_COMPLEX_POS1 LABEL WORD ; ;AN000; +; DW 8001h ; N - optional ;AN000; +; DW 0 ; no function ;AN000; +; DW IFSF_RESULT ; Result buffer ;AN000; +; DW IFSF_POS_VAL ; value list ;AN000; +; DB 0 ; no switches/keywords ;AN000; +; ;AN000; +; IFSF_COMPLEX_POS2 LABEL WORD ; ;AN000; +; DW 8001H ; Numeric value, optional ;AN000; +; DW 0 ; no function ;AN000; +; DW IFSF_RESULT ; Result value buffer ;AN000; +; DW IFSF_POS_VAL ; value list ;AN000; +;;;alias DB 0 ; no switches/keywords ;AN000; +; ;AN000; +;FSF_POS_VAL LABEL BYTE ; value definition ;AN000; +; DB 2 ; N and M ;AN000; +; DB 2 ; 2 ranges ;AN000; +; DB "N" ; item tag for N ;AN000; +; DD 0,255 ; range of N ;AN000; +; DB "M" ; item tag for M ;AN000; +;;;aliasDD 0,8160 ; range of M ;AN000; + ;AN000; +IFSF_RESULT LABEL BYTE ;AN000; + DB ? ; type - 1=number, 4=complex ;AN000; +IFSF_TAG DB ? ; item tag returned: N,M or FF ;AN000; + DW ? ;AN000; +IFSF_NM DB ? ; actual n or m value ;AN000; + DB ? ;AN000; + DB ? ;AN000; + DB ? ;AN000; + ;AN000; + ;AN000; +; parser assemble switches ;AN000; +DateSW equ 0 ;AN000; +TimeSW equ 0 ;AN000; +FileSW equ 0 ;AN000; +CAPSW equ 0 ;AN000; +DrvSW equ 0 ;AN000; +QusSW equ 0 ;AN000; +SwSW equ 0 ;AN000; +Val3SW equ 0 ;AN000; + ;AN000; + ;AN000; + include PARSE.ASM ;together with PSDATA.INC ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM new file mode 100644 index 0000000..8eba357 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSSESS.ASM @@ -0,0 +1,2187 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifssess.asm 1.0 87/05/11 ;AN000; +TITLE IFSFUNC SESSION ROUTINES - IFS Attach Routines ;AN000; +NAME IFSSESS ;AN000; +;************************************************************************************ +; +; IFSSESS +; +; Session related IFS calls (Session = attachment) +; +; IFS_ASSOPER +; RETURN_ASSIGN_MODE +; SET_ASSIGN_MODE +; GET_IFSFUNC_ITEM +; ATTACH_START +; ATTACH_END +; IFS_RESET_ENVIRONMENT +; IFS_ABORT +; GET_IFS_DRIVER_NAME +; FIND_IFS_DRIVER +; AssignOn/AssignOff +; PrintOn/PrintOff +; GET_UNC_ITEM_INFO +; +; REVISION HISTORY: +; A000 Original version 4.00 May 1987 +; A001 DCR 158 - merge unc info in attach start/status requests 8/87 RGAZZIA +; A002 DCR 187 - ctrl req renumber, make attach type byte 8/87 RGAZZIA +; A003 DCR 188 - design correction of Get IFSFUNC Item 8/87 RGAZZIA +; A004 PTM 764 - Printer attach problems 8/87 RGAZZIA +; A005 DCR 213 - SFT Serial Number 9/87 RGazzia +; A006 PTM 849 - Printer open problems 9/87 RGazzia +; A007 P242 - IFSFUNC hangs on 2nd install. 8/87 rg +; A008 P1244- Net Print problems 8/87 rg +; A009 P1411- Net Use erroneous pause 10/87 rg +; A010 P2270- Filesys network drive problems 11/87 RG +; A011 P2312- Allow Net Use status to show FILESYSed network devices 11/87 RG +; Do this via user word: 0001 without password +; 8001 with password +; A012 P2307- Critical error problems 11/87 RG +; A013 P2379- Filesys status fails without network installed 11/87 RGazzia +; A014 P2952- dfl problem 1/88 RG +; A015 P3251- net trans problem (library.exe) 1/88 RG +; A016 P3334- new abort subfunc - reset environment 2/88 RMG +; A017 P3673- Filesys problems again. A010 not fixed right....3/14/88 RMG +; A018 Austin deviceless attach problems 3/29/88 RMG +; A019 P4188- names=0 problems 4/08/88 RMG +; A020 Austin garbage attach problem 4/11/88 RMG +; A021 P4140 dos ext err msgs enhancement 4/19/88 RMG +; A022 P4249 filesys problems related to gii bx ret on user stack 4/21/88 RMG +; A023 P4540 fAssign,fPrint out of swappable area 4/28/88 RMG +; A024 P4731 find ifs driver must check for none 5/4/88 RMG +; A025 P4839 ctrl ptrsc problems 5/13/88 RMG +; A026 P4789 message problems w/no ifs drivers loaded 5/18/88 RMG +; A027 P4791 Don't overwrite ax on error 5/19/88 RMG +; A028 Error code problems w/no ifs drivers 5/20/88 RMG +; A029 GII error path fixup 5/24/88 RMG +; A030 P5005 Print stream problems 6/1/88 RMG +; +; LOC - 871 +; LOD - 63 +; +;************************************************************************************ + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; ;AN000; +; NOTE: We cannot include DOSSEG here because the START seg is not declared ;AN000; +; as PARA aligned in DOSSEG. ;AN000; +; ;AN000; + ;AN000; +START SEGMENT PARA PUBLIC 'START' ;AN000; +START ENDS ;AN000; + ;AN000; +CONSTANTS SEGMENT WORD PUBLIC 'CONST' ;AN000; +CONSTANTS ENDS ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; +DATA ENDS ;AN000; + ;AN000; +TABLE SEGMENT BYTE PUBLIC 'TABLE' ;AN000; +TABLE ENDS ;AN000; + ;AN000; +CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000; +CODE ENDS ;AN000; + ;AN000; +LAST SEGMENT PARA PUBLIC 'LAST' ;AN000; +LAST ENDS ;AN000; + ;AN000; +DOSGROUP GROUP START,CONSTANTS,DATA,TABLE,CODE,LAST ;AN000; + ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ;DOSGROUP Data ;AN000; + Extrn CurrentPDB:WORD ;AN000; + Extrn THISCDS:DWORD ;AN000; + Extrn CDSAddr:DWORD ;AN000; + Extrn CDSCount:BYTE ;AN000; + Extrn MYNAME:BYTE ;AN000; + Extrn DummyCDS:BYTE ;AN000; + Extrn sftFCB:DWORD ;AN000; + Extrn THISSFT:DWORD ;AN000; + Extrn SysInitTable:BYTE ;AN000; + Extrn EXIT_TYPE:BYTE ;AN000; + Extrn IFS_HEADER:DWORD ;AN000; +if debug ;AN000; + Extrn BugLev:WORD ;AN000; + Extrn BugTyp:WORD ;AN000; + include bugtyp.asm ;AN000; +endif ;AN000; +DATA ENDS ;AN000; + ;AN000; + ;AN000; +; define our own code segment ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data - external ;AN000; + Extrn TEMPBUF:BYTE ;AN000; + ;AN000; + ;IFS Data - public - *** IFSFUNC SWAPPABLE DATA AREA *** ;AN000; + ;AN000; +PUBLIC IFSF_SWAP_START ;AN000; +IFSF_SWAP_START LABEL BYTE ;AN000; + ;AN000; + PUBLIC THISIFS ;AN000; +THISIFS DD -1 ;AN000; + + PUBLIC THISDFL ;AN000; +THISDFL DD -1 ;AN000; + + PUBLIC IFSR ;AN000; +IFSR DB 72 DUP (0) ;AN000; + + PUBLIC SFF1 ;AN000; +SFF1 DB 62 DUP (0) ;AN000; + + PUBLIC CD1 ;AN000; +CD1 DW 84 DUP (0) ;AN000; + + PUBLIC DF1 ;AN000; +DF1 DW 18 DUP (0) ;AN000; + + PUBLIC IFSPROC_FLAGS ;AN000; +IFSPROC_FLAGS DW 0 ;AN000; + +; Number of net drive (0=A) for use on net I 24 ;AN000; + PUBLIC IFSDRV ;AN000; +IFSDRV DB -1 ;AN000; + + PUBLIC DEVICE_CB@_OFFSET ;AN000; +; This used to set offset of ifsr_device_cb@ in common routine cds_to_cd ;AN000; +; in ifsutil. If not used, offset always 1EH since that's what it is at ;AN000; +; ifsutil assembly time. This not good for control fcns (attstart,attstat). ;AN000; +DEVICE_CB@_OFFSET DW 0 ; offset in ifsrh of device cb@ ;AN000; + + PUBLIC SAVE_CB@ ;AN000; +; This used by SFT_TO_SFF and SFF_TO_SFT routines in IFSUTIL to save cds ptr. ;AN000; +SAVE_CB@ DD -1 ;AN000; + + PUBLIC IFSSEM ;AN021; +; This used as byte of semaphores. ;AN021; +IFSSEM DB 0 ;AN021; + +IFSF_SWAP_END LABEL BYTE ;AN000; +PUBLIC IFSF_SWAP_END ;AN000; + ;AN000; + ;IFS Data - public ;AN000; + ;AN000; + PUBLIC DFLAddr ;AN000; +DFLAddr DD -1 ;AN000; + + PUBLIC DFLCount ;AN000; +DFLCount DB 0 ;AN000; + +;;;aliasPUBLIC NLAddr ;AN000; +;;;aliasNLAddr DD -1 ;AN000; + +;;;aliasPUBLIC NLSIZE ;AN000; +;;;aliasNLSIZE DW 0 ;AN000; + + PUBLIC CDSAlt ;AN000; +CDSAlt DD -1 ;AN000; + + PUBLIC UNC_FS_HDR ;AN000; +UNC_FS_HDR DD -1 ;AN000; + + PUBLIC IFSFUNC_FLAGS ;AN000; +IFSFUNC_FLAGS DW 0 ;AN000; + + PUBLIC IFS_ATTRS ;AN000; +IFS_ATTRS DW 0 ; all ifs_attribute words from ifs ;AN000; + ; headers or'ed together (ifsinit) ;AN000; + PUBLIC DOSCALL@ ;AN000; +DOSCALL@ DD 0 ; IFS_DOSCALL@ set by ibmbio ;AN000; + + PUBLIC SFT_SERIAL_NUMBER ;AN005; +SFT_SERIAL_NUMBER DW 0 ; to get sfts unique for fcb reasons ;AN005; + + PUBLIC fAssign ;AC023; +fAssign DB -1 ;AC023; + + PUBLIC fPrint ;AC023; +fPrint DB -1 ;AC023; + + PUBLIC TRUNCATE_FLAG ;AC030;moved out of swap +TRUNCATE_FLAG DB 0 ;AC030; " " + + + ;IFS Data - local ;AN000; + ;AN000; +;SetBP DB 0 ; flag indicates whether to return ;AD003; + ; LSN on getuncitem call (GII) ;AN000; +;ERROR_STATUS DW 1 ; Status returned on error return ;AD029; +ERROR_STATUS DB "ERROR",0 ; from fs (GII) ;AC029; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +copyright db " IFSFUNC.EXE " ;AN000; +INCLUDE copyrigh.inc + +;************************************************************************************ ;AN000; +; ;AN000; +; IFS_ASSOPER ;AN000; +; ;AN000; +; Called by: IFSFUNC dispatcher ;AN000; +; ;AN000; +; Routines called: ;AN000; +; RETURN_ASSIGN_MODE ;AN000; +; SET_ASSIGN_MODE ;AN000; +; GET_IFSFUNC_ITEM ;AN000; +; ATTACH_START ;AN000; +; ATTACH_END ;AN000; +; ;AN000; +; Inputs: ;AN000; +; AL = 00 get / 01 set - redir assign mode (Return/Set Mode) ;AN000; +; AL = 02 get attach list entry (Get ifsfunc item) ;AN000; +; AL = 03 Define Macro (attach start) ;AN000; +; AL = 04 Cancel Attach (attach end) ;AN000; +; AL = 05 Revised get assign list entry (Getifsfuncitem2) ;AN000; +; AL = 06 Get IFSFUNC Item (Getifsfuncitem3) ;AN003; +; Function: ;AN000; +; IF AL=0 call RETURN_ASSIGN_MODE ;AN000; +; ELSE IF AL=1 call SET_ASSIGN_MODE ;AN000; +; ELSE IF AL=2 call GET_IFSFUNC_ITEM ;AN000; +; ELSE IF AL=3 call ATTACH_START ;AN000; +; ELSE IF AL=4 call ATTACH_END ;AN000; +; ;AN000; +; Outputs: ;AN000; +; see subroutines ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +AO_TABLE LABEL WORD ;AN000; + DW RETURN_ASSIGN_MODE ;AN000; + DW SET_ASSIGN_MODE ;AN000; + DW GET_IFSFUNC_ITEM ;AN000; + DW ATTACH_START ;AN000; + DW ATTACH_END ;AN000; + DW GET_IFSFUNC_ITEM2 ;AN000; + DW GET_IFSFUNC_ITEM3 ;AN003; + ;AN000; + Procedure IFS_ASSOPER,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + TEST CS:IFSFUNC_FLAGS,no_ifs_drivers + JZ AO_20 +AO_10: + MOV AX,error_not_supported + transfer ifs_980 +AO_20: + CMP AL,0 + JNE AO_40 + CMP AL,1 + JNE AO_40 + TEST CS:IFSFUNC_FLAGS,unc_installed + JZ AO_10 +AO_40: + MOV CS:IFSPROC_FLAGS,ZERO ;AN000; + PUSH BX ; save macro type ;AN000; + XOR AH,AH ;AN000; + SHL AL,1 ; AL x 2 ;AN000; + MOV BX,AX ;AN000; + JMP CS:AO_TABLE[BX] ;AN000; + ;AN000; +EndProc IFS_ASSOPER ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; RETURN_ASSIGN_MODE ;AN000; +; ;AN000; +; Called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: DOS: Get_User_Stack ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BL = macro type ;AN000; +; Function: ;AN000; +; If macro type = 3 (network printer) THEN ;AN000; +; BX = fPrint .AND. 1 ;AN000; +; Elseif macro type = 4 (network disk) THEN ;AN000; +; BX = fAssign .AND. 1 ;AN000; +; Else set error_invalid_function ;AN000; +; ;AN000; +; Output: ;AN000; +; IF AL==0 BX value on user stack ;AN000; +; ;AN000; +; Notes: This routine is used only for UNC file system. This is the ;AN000; +; only FS that supports pause. ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure RETURN_ASSIGN_MODE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + POP BX ; macro type ;AN000; + CMP BL,3 ; if (type == drive) ;AN000; + JZ GAM_20 ;AN000; + CMP BL,4 ;AN000; + JNZ GAM_60 ;AN000; + MOV BH,fAssign ; t = fAssign; ;AN000; + JMP Short GAM_40 ; else ;AN000; + ;AN000; +GAM_20: ; if (type == print) ;AN000; + MOV BH,fPrint ; t = fPrint; ;AN000; +GAM_40: ;AN000; + AND BH,1 ; return t&1; ;AN000; + CallInstall Get_User_Stack,multDOS,24 ;AN000; + MOV [SI].User_BX,BX ;AN000; + transfer ifs_990 ; go to general good ret in util ;AN000; + ;AN000; +GAM_60: ;AN000; + MOV AL,error_invalid_function ;AN000; + transfer ifs_980 ; go to general bad ret in util ;AN000; + ;AN000; + ;AN000; +EndProc RETURN_ASSIGN_MODE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SET_ASSIGN_MODE ;AN000; +; ;AN000; +; Called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BL = macro type ;AN000; +; BH = assign mode (0 = off - pause, 1 = on - no pause) ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Output: ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure SET_ASSIGN_MODE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + POP BX ; restore macro type (3 or 4) ;AN000; + ;AN000; + CMP BL,3 ; check if printer or drive ;AN000; + JNZ SAM_40 ; ;AN000; + OR BH,BH ; printer - check mode ;AN000; + JZ SAM_20 ; off - go pause ;AN000; + CMP BH,1 ;AN000; + JNZ SAM_80 ; jump on parm error ;AN000; + CALL PrintOn ; turn print on ;AN000; + transfer ifs_990 ; go to general good ret in util ;AN000; + ;AN000; +SAM_20: ; print off - pause ;AN000; + CALL PrintOff ;AN000; + transfer ifs_990 ; go to general good ret in util ;AN000; + ;AN000; +SAM_40: ; Drive ;AN000; + CMP BL,4 ;AN000; + JNZ SAM_80 ; jump on parm error ;AN000; + OR BH,BH ;AN000; + JZ SAM_60 ;AN000; + CMP BH,1 ;AN000; + JNZ SAM_80 ; jump on parm error ;AN000; + CALL AssignOn ; drive on ;AN000; + transfer ifs_990 ; go to general good ret in util ;AN000; + ;AN000; +SAM_60: ; drive off ;AN000; + invoke AssignOff ; turn drives off (pause) ;AN000; + transfer ifs_990 ; go to general good ret in util ;AN000; + ;AN000; + ;AN000; +SAM_80: ;AN000; + MOV AX,error_invalid_parameter ;AN000; + invoke SET_EXTERR_INFO ;AN000; + transfer ifs_980 ; go to general bad ret in util ;AN000; + ;AN000; + ;AN000; +EndProc SET_ASSIGN_MODE ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; GET_IFSFUNC_ITEM ;AN000; +; ;AN000; +; Called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: ;AN000; +; GET_IFS_DRIVER_NAME DOS: STRCPY ;AN000; +; CDS_TO_CD GET_USER_STACK ;AN000; +; DFL_TO_DF ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BL = redirection index ;AN000; +; DS:SI -> Device name buffer ;AN000; +; ES:DI -> Target buffer: old - net path string ;AN000; +; new - dw file system driver name +; dw # parms +; db parms +; Function: ;AN000; +; STRUCTURE = 1st CDS ;AN000; +; INDEX = 0 ;AN000; +; WHILE CDS structures ;AN000; +; DO ;AN000; +; IF curdir_isIFS TRUE THEN ;AN000; +; DO ;AN000; +; IF INDEX = BL THEN ;AN000; +; DO ;AN000; +; DS:SI = Letter version of Index (0=A:, 1=B:, ...) ;AN000; +; IF IFS .NOT. UNC THEN ;AN000; +; DO ;AN000; +; ES:[DI] = IFS name (retrieved from CURDIR_IFSR_HDR) ;AN000; +; Send ATTACH_STAT request to IFS for parms ;AN000; +; ES:DI+2 = IFS parms ;AN000; +; FOUND = true ;AN000; +; TYPE = 2 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; +; Move parms into one buffer and point with ES:DI ;AN000; +; FOUND = true ;AN000; +; TYPE = 4 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; IF IFS UNC THEN ;AN000; +; DO ;AN000; +; INDEX=INDEX+1 ;AN000; +; IF INDEX = BL THEN ;AN000; +; DO ;AN000; +; DS:SI = Letter version of Index (0=A:, 1=B:, ;AN000; +; ES:DI = "REDIR" ;AN000; +; FOUND = true ;AN000; +; TYPE = 2 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Get next CDS structure ;AN000; +; ENDDO ;AN000; +; ENDWHILE ;AN000; +; IF FOUND = false THEN ;AN000; +; DO ;AN000; +; STRUCTURE = 1st DFL ;AN000; +; WHILE DFL structures ;AN000; +; DO ;AN000; +; IF INDEX = BL THEN ;AN000; +; DO ;AN000; +; DS:SI = name pointed to by DFLL_NAME_PTR ;AN000; +; IF IFS .NOT. UNC THEN ;AN000; +; DO ;AN000; +; ES:[DI] = IFS name (retrieved from DFLL_IFSR_HDR) ;AN000; +; Send ATTACH_STAT request to IFS for parms ;AN000; +; ES:DI+2 = IFS parms ;AN000; +; FOUND = true ;AN000; +; TYPE = 1 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Send ATTACH_STAT request to REDIR.SYS for parms ;AN000; +; Move parms into one buffer and point with ES:DI ;AN000; +; FOUND = true ;AN000; +; TYPE = 3 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; IF IFS UNC THEN ;AN000; +; DO ;AN000; +; INDEX=INDEX+1 ;AN000; +; IF INDEX = BL THEN ;AN000; +; DO ;AN000; +; ES:DI = "REDIR" ;AN000; +; FOUND = true ;AN000; +; TYPE = 3 ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Get next DFL structure ;AN000; +; ENDWHILE ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; IF FOUND = FALSE THEN ;AN000; +; DO ;AN000; +; Set carry ;AN000; +; AX = 18 ;AN000; +; ENDDO ;AN000; +; ELSE Clear carry ;AN000; +; ENDIF ;AN000; +; +; IFSRH for Attach Start: +; * IFSR_LENGTH DW 32 ; Request length +; * IFSR_FUNCTION DB 3 ; Attach Start +; + IFSR_RETCODE DW 0 +; + IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; + IFSR_TYPE DB ? ; BL (1,2,3,or 4) +; IFSR_RESV2 DB ? +; *+ IFSR_PARMS@ DD PARMS ; See below +; *+ IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) +; + IFSR_USER_WORD DW ? +; + IFSR_MAX_XMITT_SIZE DW ? +; + IFSR_NET_NAME_ID DW ? +; + IFSR_LSN DW ? +; + IFSR_DEVICE_STATUS DB ? +; IFSR_RESV3 DB ? +; +; +; +; *+ PARMS LABEL WORD +; DW PARMCOUNT ; Number of parms. (only for new style) +; DB ASCIIZ,...; Parms +; +; ;AN000; +; Outputs: ;AN000; +; No Carry - BH = device status flag ;AN000; +; bit 0=0 is device valid ;AN000; +; 1 if device invalid ;AN000; +; BL = device type ;AN000; +; DS:SI = ASCIIZ local device name ;AN000; +; ES:DI = ASCIIZ network name ;AN000; +; For old style call: +; CX = user word ;AN000; +; DX = max xmitt size +; BP = Low 8 bits has LSN from NCB_LIST if input AL ^=0 +; AX = Net name ID +; +; Carry - AX = Error code ;AN000; +; 18 - end of list ;AN000; +; Regs: ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + USER_WORD DW 0 ; i give in - temp storage + ;AN000; + Procedure GET_IFSFUNC_ITEM ;AC003; +ASSUME DS:NOTHING,ES:NOTHING ;AC003; + ; get_ifsfunc_item and get_ifsfunc_item2 ;AC003; + MOV CS:IFSPROC_FLAGS,ZERO ; are old style - types 3,4 only ;AC003; + JMP SHORT GII_20 ;AC003; + ;AC003; + entry GET_IFSFUNC_ITEM2 ;AC003; + MOV CS:IFSPROC_FLAGS,SetBP ; set this to get lsn ;AC003; + JMP SHORT GII_20 ;AC003; + ;AC003; + entry GET_IFSFUNC_ITEM3 ; new style get ifsfunc item ;AC003; + MOV CS:IFSPROC_FLAGS,Filesys_Status ; gets types 1,2,3,4 ;AC003; + ;AC003; +;----------------------------------------------------------------------------------------;AC003; +; drive loop ;AC003; +;----------------------------------------------------------------------------------------;AC003; + ;AC003; +GII_20: ;AC003; + ifsr_fcn_def ATTSTAT ; define ifsr for attach status ;AC003; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN006; + ;AC003; + POP BX ; index ;AC003; + XOR AX,AX ; ax will be counter through CDSs ;AC003; + SaveReg ; save device/drive name buffer ;AC003; +GII_40: ;AC003; + CMP AL,SS:[CDSCount] ; if run out of CDSs, ;AC003; + JB GII_60 ; go to devices ;AC003; + XOR AL,AL ; reset for dfl count ;AC003; + JMP GII_400 ;AC003; +GII_60: ;AC003; + SaveReg ; save ax-cds count, bx-index ;AC003; + ;AC003; + LDS SI,[CDSAddr] ; Point ds:si to correct CDS entry ;AC003; + CMP [fAssign],ZERO ; if pause in effect, must use ;AC003; + JNZ GII_80 ; alternate cds list ;AC003; + LDS SI,[CDSAlt] ;AC003; + ;AC003; +GII_80: ;AC003; + MOV BL,SIZE CurDir_list ; size in convenient spot ;AC003; + MUL BL ; get net offset ;AC003; + ADD SI,AX ; convert to true pointer ;AC003; + RestoreReg ;AC003; + TEST [SI].curdir_flags,curdir_isnet ; make sure ifs drive ;AC003; + JNZ GII_100 ;AC003; + JMP GII_280 ; next drive ;AC003; +GII_100: ;AC003; + SUB BX,1 ; jae jumps if CF=0, CF=1 when ;AC003; + ; index hit ;AC003; + JB GII_120 ;AC003; + JMP GII_280 ; next drive ;AC003; +GII_120: ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; + JNZ GII_140 ;AC003; + CMP [SI.CURDIR_TYPE],TYPE_NET_DRIVE ; old style: check for type 4 ;AC003; + JE GII_140 ;AC003; + JMP GII_280 ; not type 4, go get next one ;AC003; +GII_140: ;AC003; + RestoreReg ; get devname ptr into es:di, ;AC003; + SaveReg ; (push back for end ds:si setup) ;AC003; + SaveReg ; while preserving es:di - target ;AC003; + MOV ES,CX ;AC003; + MOV DI,DX ;AC003; + ADD AL,'A' ; storing d:0 in devname buffer ;AC003; + STOSB ;AC003; + MOV AX,(0 SHL 8) + ':' ;AC003; + STOSW ;AC003; + RestoreReg ; restore target ptr ;AC003; + ;AC003; + MOV BL,[SI.CURDIR_TYPE] ; set bx=type (1,2,3,4) ;AC003; + XOR BH,BH ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_status ; target different for new style ;AC003; + JNZ GII_150 ;AC003; + PUSH [SI.CURDIR_USER_WORD] ;AC003; + POP CS:[USER_WORD] ;AC003; + JMP GII_160 ;AC003; +GII_150: ;AC003; + PUSH DI ; ifs drive; save target offset ;AC003; + MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; + OR IFSPROC_FLAGS,ISCDS ; get ifs driver name into target ;AC003; + CALL GET_IFS_DRIVER_NAME ;AC003; + ;AC003; + POP DI ; retrieve target offset from stack ;AC003; + PUSH DI ;AC003; + INC DI ; es:di -> parm buffer ;AC003; + INC DI ;AC003; + ;AC003; +GII_160: ;AC003; + SaveReg ; save target segment, type ;AC003; + ; go to IFS to fill in rest of tgt ;AC003; + invoke PREP_IFSR ; init ifsr ;AC003; + ;AC003; + MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC003; + invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AC003; + ; ES:BX -> IFSRH ;AC003; + ; IFSR_DEVICE_CB@ ;AC003; + ; ds - IFSSEG ;AC003; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; + MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; + POP AX ; type (BX) ;AC003; + MOV ES:[BX.IFSR_TYPE],AL ;AC003; + POP DX ; target segment (ES) ;AC003; + ;AC003; + TEST IFSPROC_FLAGS,Filesys_status ;AC003; + JNZ GII_180 ;AC003; + PUSH CS ;AC003; + POP DS ;AC003; +ASSUME DS:IFSSEG ;AC003; + MOV SI,OFFSET TEMPBUF ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; + PUSH DI ; push tgt offset here for later pop ;AC003; + JMP GII_200 ;AC003; +GII_180: ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; +GII_200: ;AC003; + PUSH AX ; push type back (BX) ;AC003; + ;AC003; +;*********************************************************************************************** + invoke CALL_IFS ; call fs with attach status request ;AC003; +;*********************************************************************************************** + ;AC003; + JNC GII_220 ;AC003; + ; attach status error: ;AC003; + RestoreReg ; type,target offset ;AC003; + MOV ES,DX ;AC003; + SaveReg ; put "ERROR" in parms display ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; + JZ GII_210 ;AN029; + ADD DI,2 ;AC003; + MOV AX,1 ;AC003; + STOSW ;AC003; +GII_210: ;AN029; + PUSH CS ;AC003; + POP DS ;AC003; +ASSUME DS:IFSSEG ;AC003; + MOV SI,OFFSET ERROR_STATUS ;AC003; + MOV CX,4 ;AC003; + REP MOVSW ;AC003; + RestoreReg ;AC003;;AC029; + transfer ifs_1000 ; go to general ret in util ;AC003; + ;AC003; +GII_220: ;AC003; + RestoreReg ; device type, target offset ;AC003; + TEST IFSPROC_FLAGS,Filesys_status ;AC003; + JZ GII_240 ;AC003; +;;;;;;;;RestoreReg ; IFS drive - devname ptr ;AC003;;AD022; +; MOV ES,DX ; target ;AC003;;AD022; +; MOV BX,AX ;AC003;;AD022; +;;;;;;;;transfer ifs_1000 ;AC003;;AD022; + JMP GII_630 ; want user bx set ;AN022; + ;AC003; +GII_240: ; NET drive: ;AC003; + JMP GII_640 ; go down to net device processing- ;AC003; + ; does the same thing ;AC003; +GII_280: ;AC003; + INC AX ; next drive ;AC003; + JMP GII_40 ;AC003; + ;AC003; +;----------------------------------------------------------------------------------------;AC003; +; device loop ;AC003; +;----------------------------------------------------------------------------------------;AC003; + ;AC003; +GII_400: ; Device loop ;AC003; + CMP AL,CS:[DFLCount] ; if run out of devices ;AC003; + JB GII_460 ;AC003; + JMP GII_800 ; go set no_more error ;AC003; +GII_460: ;AC003; + SaveReg ; save ax-dfl count, bx-index ;AC003; + LDS SI,CS:[DFLAddr] ; Point ds:si to correct DFL entry ;AC003; + MOV BL,SIZE DFLL_list ; size in convenient spot ;AC003; + MUL BL ; get net offset ;AC003; + ADD SI,AX ; convert to true pointer ;AC003; + RestoreReg ;AC003; + TEST [SI.DFLL_FLAGS],DFL_INUSE ; is dfl active??? ;AC003; + JNZ GII_480 ;AC003; + JMP GII_680 ;AC003; +GII_480: ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_Status ; check old vs. new style ;AC003; + JNZ GII_520 ;AC003; + CMP [SI.DFLL_TYPE],TYPE_NET_DEVICE ; old style: check for type 3 ;AC003; + JE GII_520 ;AC003; + JMP GII_680 ; not type 4, go get next one ;AC003; +GII_520: ;AC003; + SUB BX,1 ;AC003; + JB GII_540 ;AC003; + JMP GII_680 ; next device ;AC003; +GII_540: ;AC003; + MOV WORD PTR CS:[THISDFL],SI ; set thisdfl = dssi ;AN014; + PUSH DS ;AN014; + POP WORD PTR CS:[THISDFL+2] ;AN014; + RestoreReg ; get devname ptr into es:di, ;AC003; + SaveReg ; (push back for end ds:si setup) ;AC003; + SaveReg ; while preserving es:di - target ;AC003; + MOV ES,CX ;AC003; + MOV DI,DX ;AC003; + PUSH SI ; save DFL offset ;AC003; + ADD SI,DFLL_DEV_NAME ;AC003; + MOV CX,8 ;AC003; +GII_545: ; store device name in asciiz format ;AC003; + LODSB ;AC003; + CMP AL," " ;AC003; + JE GII_550 ;AC003; + STOSB ;AC003; + LOOP GII_545 ;AC003; +GII_550: ;AC003; + XOR AL,AL ;AC003; + STOSB ;AC003; + RestoreReg ; restore target ptr & DFL offset ;AC003; + ;AC003; + MOV BL,[SI.DFLL_TYPE] ;AC003; + XOR BH,BH ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; + JNZ GII_555 ;AC003; + PUSH [SI.DFLL_USER_WORD] ;AC003; + POP [USER_WORD] ;AC003; + JMP GII_560 ;AC003; +GII_555: ;AC003; + PUSH DI ; ifs device; save target offset ;AC003; + MOV DI,ES:[DI] ; es:di -> FS name buffer ;AC003; + invoke GET_IFS_DRIVER_NAME ;AC003; + ;AC003; + POP DI ; retrieve target offset from stack ;AC003; + PUSH DI ;AC003; + INC DI ; es:di -> parm buffer ;AC003; + INC DI ;AC003; + ;AC003; +GII_560: ;AC003; + SaveReg ; save target segment, type ;AC003; + ; now go to IFS to fill in rest of target;AC003; + invoke PREP_IFSR ; init ifsr ;AC003; + invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AC003; + ; ES:BX -> IFSRH ;AC003; + ; IFSR_DEVICE_CB@ ;AC003; + ; ds - IFSSEG ;AC003; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTAT ;AC003; + MOV ES:[BX.IFSR_FUNCTION],IFSATTSTAT ;AC003; + POP AX ; type (BX) ;AC003; + MOV ES:[BX.IFSR_TYPE],AL ;AC003; + POP DX ; target segment (ES) ;AC003; + ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_Status ;AC003; + JNZ GII_580 ;AC003; + PUSH CS ;AC003; + POP DS ;AC003; +ASSUME DS:IFSSEG ;AC003; + MOV SI,OFFSET TEMPBUF ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@],SI ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DS ;AC003; + PUSH DI ; push tgt offset here for later pop ;AC003; + JMP GII_600 ;AC003; +GII_580: ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@],DI ;AC003; + MOV WORD PTR ES:[BX.IFSR_PARMS@+2],DX ;AC003; +GII_600: ;AC003; + PUSH AX ; push type back (BX) ;AC003; + ;AC003; +;*********************************************************************************************** + invoke CALL_IFS ; call fs with attach status request ;AC003; +;*********************************************************************************************** + ;AC003; + JNC GII_620 ;AC003; + RestoreReg ; type,target offset,devname ptr ;AC003; + MOV ES,DX ; target ;AC003; + SaveReg ; put "ERROR" in parms display ;AC003; + TEST CS:IFSPROC_FLAGS,Filesys_status ; don't add if net use ;AN029; + JZ GII_610 ;AN029; + ADD DI,2 ;AC003; + MOV AX,1 ;AC003; + STOSW ;AC003; +GII_610: ;AN029; + PUSH CS ;AC003; + POP DS ;AC003; +ASSUME DS:IFSSEG ;AC003; + MOV SI,OFFSET ERROR_STATUS ;AC003; + MOV CX,4 ;AC003; + REP MOVSW ;AC003; + RestoreReg ;AC003;;AC027; + transfer ifs_1000 ; go to general ret in util ;AC003; + ;AC003; +GII_620: ;AC003; + RestoreReg ; device type, target offset ;AC003; + TEST IFSPROC_FLAGS,Filesys_Status ;AC003; + JZ GII_640 ; IFS device: ;AC003; +GII_630: ;AN022; + CallInstall Get_User_Stack,MULTdos,24,, ;AN022; + MOV AH,ES:[BX.IFSR_DEVICE_STATUS] ;AN022; + MOV [SI].USER_BX,AX ;AN022; + RestoreReg ; target offset,devname ptr ;AC003; + MOV ES,DX ; target ;AC003; +;;;;;;;;MOV BX,AX ;AC003;;AD022; + transfer ifs_1000 ;AC003; + ;AC003; +GII_640: ; NET device: ;AC003; + CallInstall Get_User_Stack,multDOS,24,, ;AC003; + PUSH CS:[USER_WORD] ;AC003; + POP [SI].User_CX ; User Word ;AC003; + PUSH ES:[BX.IFSR_MAX_XMITT_SIZE] ;AC003; + POP [SI].User_DX ; Max Xmitt size ;AC003; + PUSH ES:[BX.IFSR_NET_NAME_ID] ;AC003/AC008/AC009 + PUSH ES:[BX.IFSR_NET_NAME_ID] ; leave this on stack for later pop into ax ;AC009; + POP [SI].User_AX ; Net name ID ;AC003/AC008; +;;;;;;;;PUSH AX ;AN008/AD009; + + MOV CH,ES:[BX.IFSR_DEVICE_STATUS] ;AC003; + MOV CL,AL ;AC003; + MOV [SI].User_BX,CX ; Bits and macro type ;AC003; + TEST CS:IFSPROC_FLAGS,SetBP ;AC003; + JZ GII_660 ;AC003; + PUSH ES:[BX.IFSR_LSN] ;AC003; + POP [SI].User_BP ; LSN ;AC003; +GII_660: ;AC003; + MOV SI,ES:WORD PTR [BX.IFSR_PARMS@] ;AC003; + MOV DS,ES:WORD PTR [BX.IFSR_PARMS@+2] ;AC003; + INC SI ; ds:si -> parms returned by redir ;AC003; + INC SI ;AC003; + MOV ES,DX ; es:di -> input target buffer ;AC003; + SaveReg ; save offset ;AC003; + CallInstall StrCpy,MultDOS,17 ;AC003; + RestoreReg ; tgt offset,netpath id,devname ptr ;AC003/AC008; + transfer ifs_990 ;AC003; + ;AC003; +GII_680: ;AC003; + INC AX ; next drive ;AC003; + JMP GII_400 ;AC003; + ;AC003; + ;AC003; +GII_800: ; end of CDSs & devices ;AC003; + ; now check deviceless attaches ;AC003; +;----------------------------------------------------------------------------------------;AC003; +; deviceless loop ;AC003; +;----------------------------------------------------------------------------------------;AC003; + ;AC003; + CALL GET_UNC_ITEM_INFO ;AC003; + JC GII_820 ;AC003; + RestoreReg ; set dev ptr null ;AC003; + MOV BYTE PTR DS:[SI],ZERO ;AC003; + transfer ifs_990 ;AC003; +GII_820: ;AC003; + MOV AX,error_no_more_files ;AC003; + RestoreReg ; restore regs ;AC003; + ;AC003; + return ;AC003; + ;AC003; +EndProc GET_IFSFUNC_ITEM ;AC003; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; ATTACH_START ;AN000; +; ;AN000; +; Called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: CALL_IFS DOS: GetCDSFromDrv ;AN000; +; CDS_TO_CD ;AN000; +; CD_TO_CDS ;AN000; +; CREATE_DFL_ENTRY ;AN000; +; DELETE_DFL_ENTRY ;AN000; +; DFL_MATCH ;AN000; +; DFL_TO_DF ;AN000; +; DF_TO_DFL ;AN000; +; CALL_IFS ;AN000; +; FIND_IFS_DRIVER ;AN000; +;;; alias PROCESS_ALIAS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; BL = Macro type ;AN000; +;;; alias = 0 alias ;AN000; +; = 1 device/file ;AN000; +; = 2 drive ;AN000; +; = 3 Char device -> network ;AN000; +; = 4 File device -> network ;AN000; +; DS:SI -> ASCIIZ source name ;AN000; +; ES:DI -> Target driver to attach to and parms. ;AN000; +; DW ASCIIZ - asciiz name of driver ;AN000; +; DW n - number of parms ;AN000; +; DW ASCIIZ,... parms ;AN000; +; ;AN000; +; CX is reserved (user word for REDIR) ;AN000; +; ;AN000; +; Function: ;AN000; +; IF BL > 0 THEN ;AN000; +; DO ;AN000; +; Check that IFS driver exists ;AN000; +; IF found, set IFS header to that found ;AN000; +; ELSE set error_file_system_not_found ;AN000; +; ENDDO ;AN000; +; IF (BL=2 .OR. BL=4) & no error THEN ;AN000; +; DO ;AN000; +; Find CDS for this drive ;AN000; +; IF none exists, then set error_invalid_parameter ;AN000; +; ELSE Call CDS_TO_CD ;AN000; +; END ;AN000; +; ELSE DO ;AN000; +; IF source name not in DFL THEN ;AN000; +; Call CREATE_DFL_ENTRY ;AN000; +; ELSE Set error_device_already_attached ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; IF no error THEN ;AN000; +; DO ;AN000; +; Prep IFSRH for Attach Start: ;AN000; +; * IFSR_LENGTH DW 34 ; Request length ;AN000; +; * IFSR_FUNCTION DB 2 ; Attach Start ;AN000; +; IFSR_RETCODE DW 0 ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_TYPE DB ? ; BL (0,1,2,3,or 4) ;AN000; +; IFSR_RESV2 DB ? ; +; * IFSR_PARMS@ DD PARMS ; See below ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; CD or DF (See below) ;AN000; +; * IFSR_USER_WORD DW ? ; for deviceless attach ;AN000; +; ;AN000; +; * PARMS LABEL WORD ;AN000; +; DW PARMCOUNT ; Number of parms. May be 0. ;AN000; +; DB ASCIIZ,...; Parms ;AN000; +; ENDDO ;AN000; +; IF no error THEN ;AN000; +; DO ;AN000; +; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; +; IF IFSR_RETCODE = 0 THEN ;AN000; +; DO ;AN000; +; IF DFL flag set THEN ;AN000; +; DO ;AN000; +; Call DF_TO_DFL ;AN000; +; Set DFLL_PTR to IFS header ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Call CD_TO_CDS ;AN000; +; Set CDS_IFSR_PTR to IFS header ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; IF DFL flag set THEN ;AN000; +; Call DELETE_DFL_ENTRY ;AN000; +; Set carry ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ELSE Set carry ;AN000; +; ENDIF ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure ATTACH_START,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def ATTSTART ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + ;AN000; + POP BX ;AN000; + XOR BH,BH ; not interested in bh, but should ;AN000; + ; be 0 since later move type as word ;AN000; +AS_10: ;AN000; + CMP BL,TYPE_DRIVE ; check ifs vs. network ;AN000; + JLE AS_20 ;AN000; + CMP BL,TYPE_NET_DRIVE ;AN000; + JLE AS_30 ;AN000; + ;AN000; +AS_15: ;AN000; + MOV AX,error_invalid_function ; invalid fcn type ;AN000; + transfer ifs_980 ; go ret w/carry ;AN000; + ;AN000; +AS_20: ; IFS device/drive ;AN000; + SaveReg ; save target ptr for parms@ ;AN000; + MOV DI,ES:[DI] ; set ES:DI -> driver name ;AN000; + invoke FIND_IFS_DRIVER ; sets [THISIFS] ;AN000; + JC AS_25 ;AN000; + SaveReg ; save cx since next destroys ;AN000; + invoke SET_CATEGORY ; do this to determine unc or not ;AN000; + OR CL,CL ; cl=1 unc else ifs ;AN000; + RestoreReg ; restore before branch - zf preserved ;AN000; + JZ AS_50 ; jmp if not unc ;AN000; + ADD BL,2 ; change type from 1/2 to 3/4 ;AN000; + RestoreReg ; retrieve orig target ptr ;AN010; +;;;;;;;;OR CS:IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; + CMP WORD PTR ES:[DI+2],2 ; if # parms=2 then have password ;AN011; + JE AS_22 ;AN011; + MOV CX,0001H ; User word without password ;AN011; + JMP SHORT AS_23 ; go process as unc ;AN011;;AC017; +AS_22: ;AN011; + MOV CX,8001H ; User word with password ;AN011; +AS_23: ;AN017; + ADD DI,4 ; skip over ifs name offset & #parms ;AN017; + JMP SHORT AS_33 ; go process as unc ;AN000; + +AS_25: ; ifs driver not found ;AN000; + POP DI ; error, restore stack and return ;AN000; + POP ES ;AN000; + transfer ifs_1000 ;AN000; + ;AN000; +AS_30: ; NETWORK device/drive ;AN000; + TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ; check that unc installed ;AN000; + JZ AS_15 ;AN000; +AS_33: ; this label for unc already checked ;AN000; + OR IFSPROC_FLAGS,IsNetwork ; set network bit ;AN000; + CMP BL,TYPE_NET_DRIVE ; check pause status ;AN000; + JNE AS_35 ;AN000; + CMP CS:fAssign,-1 ;AN000; + JMP SHORT AS_37 ;AN000; +AS_35: ;AN000; + CMP CS:fPrint,-1 ;AN000; +AS_37: ;AN000; + JE AS_40 ; bad pause status ;AN000; + MOV AX,72 ; set error and ret w/carry ;AN000; +AS_38: ;AN020; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + invoke SET_EXTERR_INFO ;AN000; + transfer ifs_980 ;AN000; + ;AN000; +AS_40: ;AN000; + invoke SET_THISIFS_UNC ;AN000; + SaveReg ;AN004;;AC015; + invoke NET_TRANS ;AN000; + RestoreReg ;AN004;;AC015; + JNC SHORT AS_55 ;AC020; + MOV AX,error_path_not_found ; net trans failure = path not found ;AN020; + JMP AS_38 ;AN020; + ;AN000; +AS_50: ;AN000; + RestoreReg ; restore target parm ptr ;AN000; +AS_55: ;AN000; + OR CS:IFSPROC_FLAGS,THISIFS_SET ; do this so wont do in CDS_TO_CD ;AN000; + ; or DFL_TO_DF ;AN000; + CMP BL,TYPE_DEVICE ;AN000; + JNE AS_55_0 ;AN000; + JMP AS_200 ;AN000; +AS_55_0: ;AN000; + CMP BL,TYPE_NET_DEVICE ;AN000; + JNE AS_55_1 ;AN000; + JMP AS_200 ;AN000; +AS_55_1: ;AN000; + CMP BL,TYPE_NET_DRIVE ; deviceless attach check ;AN000; + JNE AS_56 ; jmp if no ;AN000; + CMP BYTE PTR [SI],0 ; DEVICELESS ATTACH ;AN000; + JNZ AS_56 ; Set dummy CDS and flag ;AN000; + Context DS ;AN000; + MOV SI,OFFSET DOSGROUP:DummyCDS ;AN000; + MOV WORD PTR [THISCDS+2],DS ;AN000; + MOV WORD PTR [THISCDS],SI ;AN000; + OR IFSPROC_FLAGS,ISDUMMYCDS ;AN000; + JMP SHORT AS_100 ;AN000; + ;AN000; +AS_56: ; DRIVE ATTACH ;AN000; + CMP WORD PTR [SI+1],ICOLON ; if 2nd char not ":" - error ;AN000; + JE AS_60 ; else - find CDS ;AN000; +AS_57: ;AN000; + MOV AX,error_invalid_drive ;AN000; + transfer ifs_980 ;AN000; + ;AN000; +AS_60: ;AN000; + LODSB ;AN000; + Context DS ; get addressability to DOSGROUP ;AN000; + OR AL,20H ;AN000; + SUB AL,"a" ; 0=A,1=B,... ;AN000; + CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; +ASSUME DS:NOTHING ;AN000; + JC AS_57 ; no cds - error ;AN000; + TEST [SI.curdir_flags],curdir_inuse ; DS:SI -> CDS ;AN000; + JZ AS_100 ;AN000; + TEST [SI.curdir_flags],curdir_isnet + curdir_splice + curdir_local ;AN000; + JZ AS_100 ;AN000; + MOV AX,error_already_assigned ; error - CDS already assigned ;AN000; + transfer ifs_980 ; go return with carry ;AN000; + ;AN000; +AS_100: ;AN000; + SaveReg ; save real cds and target parm ptr ;AN000; + ; If all goes OK this will be the "REAL" CDS ;AN000; + Context ES ;AN000; + MOV DI,OFFSET DOSGROUP:DummyCDS ;AN000; + SaveReg ; dummy cds offset, input user word ;AC001; + MOV CX,SIZE curdir_list ;AN000; + REP MOVSB ;AN000; + RestoreReg ; input user word ;AN001; + PUSH ES ;AN000; + POP DS ;AN000; + POP SI ; DS:SI -> dummy CDS ;AN000; + MOV [SI.curdir_flags],curdir_isnet + curdir_inuse ;AN000; + ;AN000; + MOV AX,WORD PTR [THISIFS] ; set ifs ptr in cds ;AN000; + MOV DS:WORD PTR [SI.CURDIR_IFS_HDR],AX ;AN000; + MOV AX,WORD PTR [THISIFS+2] ;AN000; + MOV DS:WORD PTR [SI.CURDIR_IFS_HDR+2],AX ;AN000; + ;AN000; + MOV DS:[SI.CURDIR_TYPE],BL ; set CDS type ;AN000; + MOV DS:[SI.CURDIR_USER_WORD],CX ; set CDS user word ;AN001; + MOV AX,CX + ;AN000; + RestoreReg ; get target parm ptr off stack ;AN000; + SaveReg ; save type and dummy cds ptr ;AN000; + invoke PREP_IFSR ; clear ifsrh ;AN000; + invoke CDS_TO_CD ; CDS: sets ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + TEST IFSPROC_FLAGS,ISDUMMYCDS + JZ AS_120 + MOV ES:[BX.IFSR_USER_WORD],AX +AS_120: + POP AX ; restore type in AL ;AN000; + MOV ES:[BX.IFSR_TYPE],AL ;AC002; + SaveReg ; put target parm ptr back on stack ;AN000; + JMP SHORT AS_400 ; go prep IFSRH ;AN000; + ;AN000; +AS_200: ; DEVICE ATTACH: ;AN000; + invoke DFL_MATCH ; check if device already assigned ;AN000; + JC AS_220 ; cf-0 match, cf-set no match ;AN000; + MOV AX,error_already_assigned ;AN000; + transfer ifs_980 ; go return with carry ;AN000; + ;AN000; +AS_220: ;AN000; + SaveReg ; save target parm ptr & type ;AN000; + invoke CREATE_DFL_ENTRY ; DFL: sets ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + JNC AS_240 ;AN000; + RestoreReg ; restore stack ;AC019; + invoke CONSIST_SFT ;AN000; + transfer ifs_980 ; error ret ;AC019; +AS_240: ;AN000; + POP AX ; restore type in AL ;AN000;moved ;AM019; + MOV ES:[BX.IFSR_TYPE],AL ;AC002; + ;AN000; + ;AN000; +AS_400: ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTSTART ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSATTSTART ;AN000; + POP AX ; old target DI ;AN000; +;;;;;;;;TEST IFSPROC_FLAGS,Filesys_Network_Attach ;AN010;;AD017; +; JZ AS_405 ;AN010;;AD017; +; ADD AX,4 ; filesys-net skip name offset ;AN010;;AD017; +;;;;;;;;JMP SHORT AS_410 ; and # parms - just want net path;AN010;;AD017; +;AS_405: ;AN010;;AD017; + TEST IFSPROC_FLAGS,IsNetwork ;AN000; + JNZ AS_410 ;AN000; + INC AX ;AN000; + INC AX ;AN000; +AS_410: + MOV ES:WORD PTR [BX.IFSR_PARMS@],AX ;AN000; + POP AX ; old target ES ;AN000; + MOV ES:WORD PTR [BX.IFSR_PARMS@+2],AX ;AN000; + +;*********************************************************************************************** + invoke CALL_IFS ;AN000; +;*********************************************************************************************** + + JNC AS_440 ;AN000; + ;AN000; + ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; ifs error: ;AN000; + JZ AS_420 ;AN000; + RestoreReg ; pop dummy & real cds ;AN000; + transfer ifs_980 ;AN000; +AS_420: ;AN000; + SaveReg ; preserve error code ;AN027; + invoke DELETE_DFL_ENTRY ;AN000; + invoke CONSIST_SFT ;AN025; + RestoreReg ;AN027; + transfer ifs_980 ;AN000; + ;AN000; +AS_440: ; successful attach ;AN000; + TEST IFSPROC_FLAGS,ISCDS ;AN000; + JZ AS_460 ;AN000; + RestoreReg ; restore ES:DI -> dummy cds ;AN000; + invoke CD_TO_CDS ;AN000; + RestoreReg ; ds:si - real cds ;AN000; + invoke XCHGP ;AN000; + MOV CX,SIZE CURDIR_LIST ;AN000; + OR DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ; make sure this flag set ;AN000; + REP MOVSB ;AN000; + transfer ifs_990 ;AN000; + ;AN000; +AS_460: ;AN000; + invoke DF_TO_DFL ;AN000; + invoke CONSIST_SFT ;AN025; + transfer ifs_990 ;AN000; + ;AN000; + ;AN000; +EndProc ATTACH_START ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; ATTACH_END ;AN000; +; ;AN000; +; Called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: DFL_MATCH DOS: StrCpy ;AN000; +; DFL_TO_DF DriveFromText ;AN000; +; DF_TO_DFL GetThisDrv ;AN000; +; CDS_TO_CD InitCDS ;AN000; +; CD_TO_CDS ;AN000; +; SET_EXTERR_INFO ;AN000; +; CALL_IFS ;AN000; +; DELETE_DFL_ENTRY ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> ASCIZ source name ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 30 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; End Attach ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_DEVICE_CB@ DD ? ; CD or DF ;AN000; +; * IFSR_NAME@ DD ? ; for deviceless detach (unc) ;AN000; +; ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure ATTACH_END,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def ATTEND ;AN000; + ;AN000; + POP BX ;AN000; + ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + MOV CS:IFSPROC_FLAGS,0 ;AN000; + invoke PREP_IFSR ;AN000; + ;AN000; + PUSH DS ;AN000; + POP ES ;AN000; + MOV DI,SI ; ES:DI=DS:SI=source name ;AN000; + PUSH SI ; Save SI ;AN000; + CallInstall StrCpy,multDOS,17 ; "Beautify" input string ;AN000; + ; (converts to uppercase & ;AN000; + ; / to \) ;AN000; + POP SI ; Recover string pointer ;AN000; + CMP WORD PTR [SI],"\\" ; Special Case - ;AN000; + JZ AE_300 ; deviceless detach ;AN000; + CMP WORD PTR [SI+1],":" ; check for drive ;AN000; + JNZ AE_200 ; no, go to device check ;AN000; + CMP fAssign,-1 ; BREAK DRIVE ATTACH ;AN000; + JZ AE_20 ;AN000; +AE_10: ;AN000; + MOV AX,72 ; pause error ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + invoke SET_EXTERR_INFO ;AN000; + transfer ifs_980 ;AN000; +AE_20: ;AN000; + CallInstall DriveFromText,multDOS,26 ; AL = drive # (0-not drive ;AN000; + context DS ; -1=a,1=b,2=c,...) ;AN000; + CallInstall GetThisDrv,multDOS,25,AX,BX ; ES:DI->CDS ;AN000; + JNC AE_40 ;AN000; + MOV AX,error_invalid_drive ;AN000; + transfer ifs_1000 ;AN000; +AE_40: ;AN000; + LES DI,[THISCDS] ;AN000; + TEST ES:[DI.curdir_flags],curdir_isnet ;AN000; + JNZ AE_60 ;AN000; + MOV AX,error_invalid_drive ; not redirected ;AN000; + transfer ifs_980 ;AN000; +AE_60: ;AN000; + PUSH AX ; drive # ;AN000; + PUSH ES ;AN000; + POP DS ;AN000; + MOV SI,DI ; move cds ptr to ds:si ;AN000; + invoke CDS_TO_CD ;AN000; + OR IFSPROC_FLAGS,ISCDS ;AN000; + JMP SHORT AE_400 ;AN000; + ;AN000; +AE_200: ; BREAK DEVICE ATTACH ;AN000; + CMP fPrint,-1 ; check for pause error ;AN000; + JZ AE_210 ;AN000; + JMP AE_10 ;AN000; +AE_210: ;AN000; + CALL DFL_MATCH ;AN000; + JNC AE_220 ;AN000; + MOV AX,device_not_attached ;AN000; + transfer ifs_1000 ;AN000; +AE_220: ;AN000; + MOV SI,WORD PTR [THISDFL] ;AN000; + MOV DS,WORD PTR [THISDFL+2] ;AN000; + ;AN000; + TEST DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000; +; ???????????? check with baf on what reverting to ... ;AN000; + ;AN000; + invoke DFL_TO_DF ; DFL: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_DEVICE_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + JMP SHORT AE_400 ;AN000; + ;AN000; +AE_300: ; deviceless detach ;AN000; + SaveReg ; restore es to ifsr & set seq flag ;AN018; + RestoreReg ;AN018; + OR CS:IFSPROC_FLAGS,IsSeq ;AN018; + CMP fAssign,-1 ;AN000; + JZ AE_320 ;AN000; + JMP AE_10 ; jump to pause error ;AN000; +AE_320: ;AN000; + SaveReg ; ifsr ptr ;AC004; + RestoreReg ; set esdi = dssi = net path ;AC004; +ASSUME ES:NOTHING ;AC004; + MOV DI,SI ;AC004; + invoke NET_TRANS ;AC004; + SaveReg ;AC004; + RestoreReg ; name string segment ;AC004; + MOV SI,DI ; name string offset ;AC004; + RestoreReg ; ifsr pointer ;AC004; +ASSUME ES:IFSSEG ;AC004; + MOV WORD PTR ES:[BX.IFSR_NAME@],DI ;AC004; + MOV WORD PTR ES:[BX.IFSR_NAME@+2],AX ;AC004; + SaveReg ;AC004; + RestoreReg ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; +AE_400: ; call ifs ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_ATTEND ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSATTEND ;AN000; + ;AN000; +;*********************************************************************************************** + invoke CALL_IFS ;AN000; +;*********************************************************************************************** + ;AN000; + JNC AE_410 ;AN000; + TEST IFSPROC_FLAGS,ISCDS ; att end error: ;AN000; + JZ AE_405 ;AN000; + ADD SP,2 ; clear ax (drive #) off stack ;AN000; +AE_405: ;AN000; + transfer ifs_980 ;AN000; +AE_410: ;AN000; + TEST CS:IFSPROC_FLAGS,ISCDS ;AN000; + JZ AE_420 ;AN000; + ;AN000; + POP AX ; drive ;AN000; + ADD AL,'A' ;AN000; + CallInstall InitCDS,multDOS,31,AX,AX ;AN000; + transfer ifs_990 ;AN000; +AE_420: ;AN000; + TEST CS:IFSPROC_FLAGS,IsSeq ;AN018; + JNZ AE_440 ;AN018; + CALL DELETE_DFL_ENTRY ;AN000; +AE_440: ;AN018; + transfer ifs_990 ;AN000; + ;AN000; + ;AN000; +EndProc ATTACH_END ;AN000; + ;AN000; + +BREAK ;AN016; + +;*********************************************************************************** +; +; IFS_RESET_ENVIRONMENT +; +; Called by: IFSFUNC Dispatcher +; +; Routines called: +; jumps into ifs_abort +; +; Inputs: +; [CurrentPDB] set to PID of process aborting +; +; Function: +; Get address of IFS driver chain. +; FOR I = 1 to last IFS driver +; Send request below to IFS driver +; +; IFSRH: +; * IFSR_LENGTH DW 42 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; IFSR_RETCODE DW ? +; IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 18 ; End of Process +; IFSR_ERROR_CLASS DB ? +; IFSR_ERROR_ACTION DB ? +; IFSR_ERROR_LOCUS DB ? +; IFSR_ALLOWED DB ? +; IFSR_I24_RETRY DB ? +; IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; IFSR_DEVICE_CB@ DD ? ; CD +; IFSR_OPEN_CB@ DD ? +; * IFSR_PID DW ? ; process ID +; * IFSR_SUBFUNC DB 2 ; 0=normal exit 1=abort exit +; ; 2=reset environment +; IFSR_RESV3 DB ? +; +; Call all IFSs with this info. +; Scan through SFTFCB +; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN +; Call SF_IFS_HDR with close request +; ENDIF +; +; Outputs: None +; DS Preserved, All others destroyed +; +;************************************************************************************ + + procedure IFS_RESET_ENVIRONMENT,NEAR ;AN016; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN016; + + ifsr_fcn_def EXECAPI ;AN016; + ifsr_api_def EOP ;AN016; + + MOV CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; + Context DS ; make sure ds=ss=dosgroup ;AN016; + JMP IA_70 ;AN016; + +EndProc IFS_RESET_ENVIRONMENT ;AN016; + + +BREAK ;AN016; + ;AN016; +;************************************************************************************ +; +; IFS_ABORT +; +; Called by: IFSFUNC Dispatcher +; +; Routines called: +; CALL_IFS +; IFS_CLOSE +; +; Inputs: +; [CurrentPDB] set to PID of process aborting +; +; Function: +; Get address of IFS driver chain. +; FOR I = 1 to last IFS driver +; Send request below to IFS driver +; +; IFSRH: +; * IFSR_LENGTH DW 42 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; IFSR_RETCODE DW ? +; IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 16 DUP(0) +; * IFSR_APIFUNC DB 18 ; End of Process +; IFSR_ERROR_CLASS DB ? +; IFSR_ERROR_ACTION DB ? +; IFSR_ERROR_LOCUS DB ? +; IFSR_ALLOWED DB ? +; IFSR_I24_RETRY DB ? +; IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; IFSR_DEVICE_CB@ DD ? ; CD +; IFSR_OPEN_CB@ DD ? +; * IFSR_PID DW ? ; process ID +; * IFSR_SUBFUNC DB ? ; 0=normal exit 1=abort exit +; ; 2=reset environment +; IFSR_RESV3 DB ? +; +; Call all IFSs with this info. +; Scan through SFTFCB +; IF (ref_count ^= 0 .AND. ^busy .AND. isifs .AND. SF_PID = currentPDB) THEN +; Call SF_IFS_HDR with close request +; ENDIF +; +; Outputs: None +; DS Preserved, All others destroyed +; +;************************************************************************************ + + procedure IFS_ABORT,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def EOP ;AN000; + + MOV CS:IFSPROC_FLAGS,ZERO + ;AN000; +; Scan the FCB Cache and close any NET FCBs ;AN000; +; belonging to this process. The reason we must do this is that ;AN000; +; NET FCBs are well behaved and must be closed on EXIT. ;AN000; + ;AN000; + LES DI,[SFTFCB] ;AN000; + MOV CX,ES:[DI].sfCount ;AN000; + LEA DI,[DI].sfTable ;AN000; + JCXZ IA_70 ;AN000; +IA_20: ; Loop through sftfcb's ;AN000; + CMP ES:[DI].sf_ref_count,0 ;AN000; + JZ IA_60 ; Ignore Free ones ;AN000; + CMP ES:[DI].sf_ref_count,sf_busy ;AN000; + JZ IA_60 ; Ignore busy ones ;AN000; + TEST ES:[DI].sf_flags,sf_isnet ;AN000; + JZ IA_60 ; Ignore non NET ones ;AN000; + MOV AX,[CurrentPDB] ;AN000; + CMP AX,ES:[DI].sf_PID ;AN000; + JNZ IA_60 ; Ignore FCBs not for this proc ;AN000; + MOV WORD PTR [THISSFT],DI ;AN000; + MOV WORD PTR [THISSFT+2],ES ;AN000; + PUSH CX ;AN000; +IA_40: ; CLOSE ;AN000; + invoke IFS_CLOSE ; IGNORE ANY ERRORS ON THIS. ;AN000; + CMP ES:[DI].sf_ref_count,0 ; Make sure it gets closed ;AN000; + JNE IA_40 ; Loop until closed ;AN000; + POP CX ;AN000; +IA_60: ;AN000; + ADD DI,size sf_entry ;AN000; + LOOP IA_20 ;AN000; +; ;AN000; +; Now loop through all ifs drivers with end of process request ;AN000; +; ;AN000; +IA_70: ;AN000; + LDS SI,IFS_HEADER ;AN000; +ASSUME DS:NOTHING ;AN000; + JMP SHORT IA_100 ; go check if null ;AN007; + ;AN000; +IA_80: ;AN000; + MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000; + MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000; + invoke PREP_IFSR ; sets esbx -> ifsrh ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_EOP ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSEOP ;AN000; + MOV AX,[CurrentPDB] ;AN000; + MOV ES:[BX.IFSR_PID],AX ; ????? ;AN000; + MOV AL,[EXIT_TYPE] ;AN000; + MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; + TEST CS:IFSPROC_FLAGS,IsResetEnvirn ;AN016; + JZ IA_90 ;AN016; + MOV ES:[BX.IFSR_SUBFUNC],RESET_ENVIRONMENT ;AN016; +IA_90: ;AN016; + SaveReg ; dssi - ifs driver ;AC012; + RestoreReg ; ds - ifsseg ;AN000; + ;AN000; +;*********************************************************************************************** + invoke CALL_IFS ;AN000; +;*********************************************************************************************** + ;AN000; + RestoreReg ; dssi - ifs driver ;AC012; + LDS SI,[SI.IFS_NEXT] ; check next fs driver ;AN000; +IA_100: ;AN007; + CMP SI,NULL_PTR ; if ptr null, no more ;AN000; + JNE IA_80 ;AN000; + PUSH DS ;AN000; + POP AX ;AN000; + CMP AX,NULL_PTR ;AN000; + JNE IA_80 ;AN000; + ;AN000; + ;AN000; +IA_1000: ;AN000; + SaveReg ; dosgroup ;AN000; + RestoreReg ;AN000; + return ;????????? may need redir ioctl to ;AN000; + ; consist_refs ;AN000; + ;AN000; +EndProc IFS_ABORT ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; GET_IFS_DRIVER_NAME ;AN000; +; ;AN000; +; Called by: GET_IFSFUNC_ITEM ;AN000; +; ;AN000; +; Routines called: ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> CDS/DFL ;AN000; +; ES:DI = buffer to place name ;AN000; +; Function: ;AN000; +; Find FS name in IFS header pointed to by CDS or DFL ;AN000; +; Place name in buffer pointed to by ES:DI ;AN000; +; Output: ;AN000; +; buffer filled, hopefully with ifs name ;AN000; +; pointer not checked for valid ifs driver hdr ptr ;AN000; +; Regs: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure GET_IFS_DRIVER_NAME,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; preserve cds/dfl ptr, cx, buffer ;AN000; + ; offset ;AN000; + TEST CS:IFSPROC_FLAGS,ISCDS ; get ifs hdr ptr from ;AN000; + JZ GIDN_20 ;AN000; + LDS SI,[SI.CURDIR_IFS_HDR] ; cds ;AN000; + JMP GIDN_40 ;AN000; +GIDN_20: ;AN000; + LDS SI,[SI.DFLL_IFS_HDR] ; dfl ;AN000; +GIDN_40: ;AN000; + invoke MOVE_DRIVER_NAME ; move ifs driver name into buffer ;AN000; + ;AN000; + RestoreReg ; restore cds/dfl ptr, cx, buffer ;AN000; + ; offset ;AN000; + return ;AN000; + ;AN000; +EndProc GET_IFS_DRIVER_NAME ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ +; +; FIND_IFS_DRIVER +; +; Called by: ATTACH_START +; +; Routines called: CHECK_END_SPACE +; +; Inputs: +; ES:DI -> IFS driver name +; Function: +; Loop through IFS driver chain until name match. +; If match found - set [THISIFS] and clear carry +; Else set carry. +; Output: +; carry clear - match found,[THISIFS] set +; carry set - no match found +; +; Regs: all but ax preserved +; +;************************************************************************************ + ;AN000; + Procedure FIND_IFS_DRIVER ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save registers (except ax for error) ;AC026; + ;AN000; + TEST CS:IFSFUNC_FLAGS,NO_IFS_DRIVERS ; check for no drivers first ;AN024; + JZ FID_10 ;AN024; + JMP FID_30 ;AN024; +FID_10: ;AN024; + + SaveReg ; get addressability to dosgroup ;AN000; + RestoreReg ; to get ifs driver chain ;AN000; + LDS SI,IFS_HEADER ;AN000; +ASSUME DS:NOTHING ; ds:si -> 1st ifs driver ;AN000; + ;AN000; +FID_20: ;AN000; + SaveReg ; save ds,si,es,di ;AN000; + RestoreReg ; set es=cs ;AN000; +ASSUME ES:IFSSEG ;AN000; + MOV DI,OFFSET TEMPBUF ; move ifs driver name into tempbuf ;AN000; + SaveReg ; so that can be asciiz form before ;AN000; + invoke MOVE_DRIVER_NAME ; strcmp ;AN000; + RestoreReg ; dssi -> tempbuf (ifs driver asciiz ;AN000; + SaveReg ; name) ;AN000; + RestoreReg ; esdi -> ifs driver name (input) ;AN000; + CALL CHECK_END_SPACE ; make sure ^ has no blanks ;AN000; + + CallInstall StrCmp,multDOS,30 ; check for match (regs preserved) ;AN000; + RestoreReg ; (ifs driver) ;AN000; + JZ FID_40 ; if match, go set thisifs & return ;AN000; + LDS SI,[SI.IFS_NEXT] ; else check next fs driver ;AN000; + CMP SI,MINUS_ONE ; if ptr null, no more = error ;AN000; + JNE FID_20 ;AN000; + PUSH DS ;AN000; + POP AX ;AN000; + CMP AX,MINUS_ONE ;AN000; + JNE FID_20 ;AN000; +FID_30: ;AN024; + MOV AX,fs_driver_not_found ;AN000; + JMP SHORT FID_980 ;AN000; +FID_40: ;AN000; + MOV WORD PTR CS:[THISIFS],SI ; match. Set [THISIFS] to this ;AN000; + MOV WORD PTR CS:[THISIFS+2],DS ; driver ;AN000; + JMP FID_990 ;AN000; + ;AN000; + ;AN000; +FID_980: ; Return area ;AN000; + STC ;AN000; + JMP SHORT FID_1000 ;AN000; +FID_990: ;AN000; + CLC ;AN000; +FID_1000: ;AN000; + RestoreReg ; restore registers ;AC026; + return ;AN000; + ;AN000; +EndProc FIND_IFS_DRIVER ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; AssignOn/AssignOff ;AN000; +; ;AN000; +; Called by: SET_ASSIGN_MODE ;AN000; +; ;AN000; +; AssignOn and AssignOFF copied from Network Redirector code ;AN000; +; PrintOn and PrintOff IFSFUNC new code ;AN000; +; ;AN000; +; Inputs: ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Output: ;AN000; +; ;AN000; +; Regs: none preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure AssignOn,Near ;AN000; +ASSUME ES:NOTHING, DS:NOTHING ;AN000; + EnterCrit CritNet ;AN000; + CMP fAssign,-1 ; if (fAssign) ;AN000; + JZ CrLvA ; return; ;AN000; + MOV fAssign,-1 ; fAssign = TRUE; ;AN000; + LDS SI,CDSAlt ; s = CDSAlt; ;AN000; + LES DI,CDSAddr ; d = CDSAddr; ;AN000; + MOV AL,CDSCount ;AN000; + MOV DX,SIZE curdir_list ;AN000; +OnLoop: ;AN000; + TEST [SI].curdir_flags,curdir_isnet ;AN000; + JNZ RestCDS ; Restore this NET guy ;AN000; + ADD SI,DX ; Skip to next CDS ;AN000; + ADD DI,DX ;AN000; +NextCDS: ;AN000; + DEC AL ;AN000; + JNZ OnLoop ;AN000; +CrLvA: ;AN000; + LeaveCrit CritNet ;AN000; + return ;AN000; + ;AN000; +RestCDS: ;AN000; + MOV CX,DX ;AN000; + REP MOVSB ; strcpy (d, s); ;AN000; + JMP NextCDS ;AN000; +EndProc AssignOn ;AN000; + ;AN000; +Procedure AssignOff,Near ;AN000; + ASSUME ES:NOTHING, DS:NOTHING ;AN000; + EnterCrit CritNet ;AN000; + CMP fAssign,0 ; if (!fAssign) ;AN000; + JZ CrLvB ; return; ;AN000; + LES DI,CDSAlt ; d = CDSAlt; ;AN000; + LDS SI,CDSAddr ; s = CDSAddr; ;AN000; + MOV AL,CDSCount ;AN000; + CBW ; always less or = 26 ;AN000; + MOV CX,SIZE curdir_list ;AN000; + MUL CX ;AN000; + MOV CX,AX ;AN000; + REP MOVSB ; Save current CDS state ;AN000; + XOR AL,AL ;AN000; +OffLoop: ; for (i=0; p1=getcds(i); i++) ;AN000; + CallInstall GetCDSFromDrv,multDOS,23,AX,AX ; Set THISCDS for possible ;AN000; + ; call to InitCDS ;AN000; + JC OffDone ; ;AN000; + TEST [SI].curdir_flags,curdir_isnet ;AN000; + JZ OffInc ;AN000; + SaveReg ;AN000; + ADD AX,'A' ;AN000; + CallInstall InitCDS,multDOS,31,AX,AX ; initcds (p1); ;AN000; + RestoreReg ;AN000; +OffInc: INC AL ;AN000; + JMP OffLoop ;AN000; + ;AN000; +OffDone: ;AN000; + MOV fAssign,0 ; fAssign = FALSE; ;AN000; +CrLvB: ;AN000; + LeaveCrit CritNet ;AN000; + return ;AN000; +EndProc AssignOff ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; PrintOn/PrintOff ;AN000; +; ;AN000; +; Called by: SET_ASSIGN_MODE ;AN000; +; ;AN000; +; Routines called: CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; ;AN000; +; Function: ;AN000; +; Print on - loop through dfl entries resetting pause flag to zero ;AN000; +; Print off- loop through dfl entries, set pause flag if unc ;AN000; +; ;AN000; +; Prep IFSRH: ;AN000; +; * IFSR_LENGTH DW 48 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DB ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 17 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; IFSR_ALLOWED DB ? ;AN000; +; IFSR_I24_RETRY DB ? ;AN000; +; IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; IFSR_DEVICE_CB@ DD ? ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB 0 ; 0 generic ioctl ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; * IFSR_BUFFER@ DD ? ; al-2 es:di, else ds:dx ;AN000; +; * IFSR_BUFSIZE DW ? ; al-2 cx, else ??? ;AN000; +; * IFSR_CATEGORY DB 1 ; 1 for UNC ;AN000; +; * IFSR_CTLFUNC DB ? ; x - print on, y - print off ;AN000; +; ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to IFS header ;AN000; +; ;AN000; +; Outputs: none ;AN000; +; ;AN000; +; Regs: nothing preserved ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; +Procedure PrintOn,Near ;AN000; + ASSUME DS:NOTHING, ES:NOTHING ;AN000; + ;AN000; + EnterCrit CritNet ;AN000; + CMP fPrint,-1 ; if (fPrint) ;AN000; + JNE PON_20 ;AN000; + JMP POF_1000 ; return; ;AN000; +PON_20: ;AN000; + MOV fPrint,-1 ; fPrint = TRUE; ;AN000; + MOV CS:IFSPROC_FLAGS,PRINT_ON ;AN000; + JMP POF_20 ; finish in printoff routine ;AN000; + ;AN000; + ;AN000; +EndProc PrintOn ;AN000; + ;AN000; +Procedure PrintOff,NEAR ;AN000; + ASSUME DS:NOTHING, ES:NOTHING ;AN000; + ;AN000; + EnterCrit CritNet ;AN000; + CMP fPrint,0 ; quit if already off ;AN000; + JZ POF_1000 ; return ;AN000; + MOV fPrint,0 ; set off ;AN000; + MOV CS:IFSPROC_FLAGS,ZERO ; init processing flags ;AN000; + ;AN000; +POF_20: ; (welcome print on) ;AN000; + PUSH CS ; get addressability to IFSSEG ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG,ES:NOTHING ;AN000; + ;AN000; + MOV CL,[DFLCount] ; Prep loop through DFL list ;AN000; + XOR CH,CH ; For all unc devices, set pause ;AN000; + XOR DH,DH ; flag ;AN000; + MOV DL,SIZE DFLL_LIST ;AN000; + LDS SI,[DFLAddr] ;AN000; +POF_40: ; *** loop on setting pause flag ;AN000; + TEST IFSPROC_FLAGS,PRINT_ON ; on print on, just reset all ;AN000; + JNZ POF_50 ;AN000; + LES DI,DS:[SI.DFLL_IFS_HDR] ; only set pause on unc devices ;AN000; + OR DI,DI ; make sure this dfl taken ;AN000; + JNZ POF_45 ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + OR AX,AX ;AN000; + RestoreReg ;AN000; + JZ POF_60 ;AN000; +POF_45: ;AN000; + TEST ES:[DI.IFS_ATTRIBUTE],IFSUNC ;AN000; + JZ POF_60 ;AN000; + OR DS:[SI.DFLL_FLAGS],DFL_PAUSED ;AN000; + JMP SHORT POF_60 ;AN000; +POF_50: ;AN000; + AND DS:[SI.DFLL_FLAGS],NOT DFL_PAUSED ;AN000; +POF_60: ;AN000; + ADD SI,DX ; prep for next dfl ;AN000; + LOOP POF_40 ; go process next dfl ;AN000; + ; now go tell unc, device pause ;AN000; + ; is in effect ;AN000; + invoke PREP_IFSR ; init ifsr ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ; define ifsr for dep ioctl ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + ;AN000; + invoke SET_DEPIOCTL_IFSR ;AN000; + TEST IFSPROC_FLAGS,PRINT_ON ;AN000; + JZ POF_80 ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_ON ;AN000; + JMP SHORT POF_100 ;AN000; +POF_80: ;AN000; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_PRINT_OFF ;AN000; +POF_100: ;AN000; + MOV ES:[BX.IFSR_CATEGORY],1 ;AN000; + invoke SET_THISIFS_UNC ;AN000; + +;*********************************************************************************************** + invoke CALL_IFS ; call ifs driver w/request ;AN000; +;*********************************************************************************************** + + invoke CONSIST_SFT ;AN000; + ;AN000; +POF_1000: ;AN000; + LeaveCrit CritNet ;AN000; + return ;AN000; + ;AN000; +EndProc PrintOff ;AN000; + ;AN000; + ;AN000; +BREAK ;AC000; + +;****************************************************************************** +; +; GET_UNC_ITEM_INFO +; +; Called by: GET_IFSFUNC_ITEM +; +; Routines called: CALL_IFS +; +; Inputs: +; BL = redirection index +; ES:DI -> Target buffer: old - net path string ;AN00 +; new - dw file system driver name +; dw # parms +; db parms +; +; Function: +; +; Prep IFSRH: +; * IFSR_LENGTH DW 48 ; Request length +; * IFSR_FUNCTION DB 4 ; Execute API function +; IFSR_RETCODE DB ? +; IFSR_RETCLASS DB ? +; IFSR_RESV1 DB 17 DUP(0) +; * IFSR_APIFUNC DB 16 ; IFS dependent IOCTL +; IFSR_ERROR_CLASS DB ? +; IFSR_ERROR_ACTION DB ? +; IFSR_ERROR_LOCUS DB ? +; IFSR_ALLOWED DB ? +; IFSR_I24_RETRY DB ? +; IFSR_I24_RESP DB ? +; IFSR_RESV2 DB ? +; IFSR_DEVICE_CB@ DD ? +; IFSR_OPEN_CB@ DD ? +; * IFSR_FUNC DB 0 ; 0 generic ioctl +; IFSR_RESV2 DB 0 +; * IFSR_BUFFER@ DD ? ; unc item info buffer +; IFSR_BUFSIZE DW 10 +; * IFSR_CATEGORY DB 1 ; 1 for UNC +; * IFSR_CTLFUNC DB ? ; 4 - get unc item +; +; buffer: dw index (bx) +; dw user word +; dw max xmitt size +; dw net name ID +; dw lower 8 bits lsn from ncb_list +; db redir reserved bits +; db net path...(asciiz) +; +; +; CALL routine, CALL_IFS, with pointer to IFS header +; +; Outputs: user stack contains info +; cx - user word +; bx - bits and macro type +; dx - max xmitt size +; ax - net name id +; bp - lsn (if specified) +; +; Regs: nothing preserved +; +;****************************************************************************** + ;AC003; + Procedure GET_UNC_ITEM_INFO,NEAR ;AC003; + ;AC003; + TEST CS:IFSFUNC_FLAGS,UNC_INSTALLED ;AN013; + JNZ GUI_05 ;AN013; + transfer ifs_980 ;AN013; + +GUI_05: ;AN013; + SaveReg ; target ptr and index ;AC003; + ;AC003; + invoke PREP_IFSR ; init ifsr ;AC003; + SaveReg ; prep ds for call ifs call ;AC003; + RestoreReg ;AC003; +ASSUME DS:IFSSEG ;AC003; + ;AC003; + invoke SET_DEPIOCTL_IFSR ; prep IFSRH ;AC003; + invoke SET_THISIFS_UNC ; prep IFSRH ;AC003; + MOV ES:[BX.IFSR_CATEGORY],1 ;AC003; + MOV ES:[BX.IFSR_CTLFUNC],CTLFUNC_GET_UNC_ITEM ;AC003; + ;AC003; + MOV SI,OFFSET TEMPBUF ;AC003; + MOV WORD PTR ES:[BX.IFSR_BUFFER@],SI ;AC003; + MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],DS ;AC003; + RestoreReg ; index ;AN003; + MOV WORD PTR DS:[SI],AX ;AN003; + +;*********************************************************************************************** + invoke CALL_IFS ; call redir w/get unc item request ;AC003; +;*********************************************************************************************** + + ;AC003; + JNC GUI_10 ;AC003; + RestoreReg ;AC003; + return ;AC003; +GUI_10: ;AC003; + MOV SI,WORD PTR ES:[BX.IFSR_BUFFER@] ;AC003; + MOV DS,WORD PTR ES:[BX.IFSR_BUFFER@+2] ;AC003; + SaveReg + ADD SI,2 ; space to user word (skip index) ;AN018; + LODSW ; user word ;AC003; + MOV CX,AX ;AC003; + LODSW ; max xmitt size ;AC003; + MOV DX,AX ;AC003; + LODSW ; net name id ;AC003; + PUSH AX ;AC003; + LODSW ; lsn ;AC003; + MOV BP,AX ;AC003; + LODSB ; redir bits ;AC003; + MOV BH,AL ;AC003; + MOV BL,4 ;AC003; + POP AX ; net name id ;AC003; + SaveReg ;AC003; + CallInstall Get_User_Stack,multDOS,24,, ;AC003; + MOV [SI].User_CX,CX ; User Word ;AC003; + MOV [SI].User_BX,BX ; Bits and macro type ;AC003; + MOV [SI].User_DX,DX ; Max Xmitt size ;AC003; + MOV [SI].User_AX,AX ; Net name ID ;AC003; + TEST CS:IFSPROC_FLAGS,SetBP ;AC003; + JZ GUI_15 ;AC003; + MOV [SI].User_BP,BP ; LSN ;AC003; +GUI_15: ;AN003; + RestoreReg + TEST IFSPROC_FLAGS,Filesys_status ;AC003; + JNZ GUI_20 ;AC003; + ADD SP,2 ; old si + RestoreReg ; buffer/target ptr (dssi - 18) ;AC003;;AC018; + SaveReg ;AC003;;AC008; + JMP SHORT GUI_40 ;AC003; + ;AC003; +GUI_20: ; new style ;AC003; + RestoreReg ; offset path + ADD SI,11 ;AC003; + RestoreReg ; target - dw fsname ;AC003; + ; dw # parms ;AC003; + ; db asciiz,... ;AC003; + SaveReg ;AC003; + MOV DI,ES:[DI] ;AC003; + invoke GET_UNC_FS_NAME ;AC003; + RestoreReg ;AC003; + SaveReg ;AC003; + INC DI ;AC003; + INC DI ;AC003; + MOV WORD PTR ES:[DI],1 ;AC003; + INC DI ;AC003; + INC DI ;AC003; + ;AC003; +GUI_40: ;AC003; + CallInstall StrCpy,MultDOS,17 ;AC003; + RestoreReg ;AC003; +;;;;;;;;TEST CS:IFSPROC_FLAGS,FILESYS_STATUS ;AN008;;AD018; +;;;;;;;;JZ GUI_1000 ;AN008;;AD018; + RestoreReg ;AN008; + +GUI_1000: + return ;AC003; + ;AC003; + ;AC003; +EndProc GET_UNC_ITEM_INFO ;AC003; + ;AN000; + +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CHECK_END_SPACE ;AN000; +; ;AN000; +; Called by: FIND_IFS_DRIVER ;AN000; +; ;AN000; +; Routines called: +; ;AN000; +; Inputs: ;AN000; +; ES:DI -> IFS driver name ;AN000; +; Function: ;AN000; +; Replace any blanks in asciiz ifs driver name with 0's. ;AN000; +; Output: ;AN000; +; none +; ;AN000; +; Regs: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure CHECK_END_SPACE ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save registers ;AN000; + RestoreReg ; set dssi -> asciiz ifs name ;AN000; + MOV SI,DI ;AN000; + CLD ; clear dir flag to count forward ;AN000; +CES_20: ; search LOOP ;AN000; + LODSB ; put char in al ;AN000; + OR AL,AL ; check for end of string ;AN000; + JZ CES_1000 ; if so go quit ;AN000; + CMP AL," " ; check for blank ;AN000; + JNE CES_20 ; cont loop if not ;AN000; + MOV BYTE PTR DS:[SI-1],0 ; replace blank with zero ;AN000; + ;AN000; + ;AN000; +CES_1000: ;AN000; + RestoreReg ; restore registers ;AN000; + return ;AN000; + ;AN000; +EndProc CHECK_END_SPACE ;AN000; + + ;AN000; + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM new file mode 100644 index 0000000..7c9e303 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSUTIL.ASM @@ -0,0 +1,2739 @@ + PAGE ,132 ;  ;AN000; +; SCCSID = @(#)ifsutil.asm 1.0 87/05/05 ;AN000; +TITLE IFSFUNC UTILITY ROUTINES - Routines for IFSFUNC ;AN000; +NAME IFSUTIL ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; Miscellaneous routines ;AN000; +; ;AN000; +; IFSFlushBuf ;AN000; +; IFS_UPDATE_CB (Part II) ;AN000; +; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; +; SERVER_IFSFUNC_DATA_AREA ;AN000; +; DRIVE_FROM_CDS ;AN000; +; DRIVE_FROM_SFT ;AN000; +; PREP_IFSR ;AN000; +; CALL_IFS ;AN000; +; CREATE_DFL_ENTRY ;AN000; +;;;alias ENTER_NAMES_LIST ;AN000; +; DELETE_DFL_ENTRY ;AN000; +;;;alias EXIT_NAMES_LIST ;AN000; +; DFL_MATCH ;AN000; +; DFL_SINGLE_FILE_CHECK ;AN000; +;;;alias PROCESS_ALIAS ;AN000; +; CDS_TO_CD ;AN000; +; CD_TO_CDS ;AN000; +; DFL_TO_DF ;AN000; +; DF_TO_DFL ;AN000; +; SFT_TO_SFF ;AN000; +; SF_TO_SFT ;AN000; +; XCHGP ;AN000; +; CONSIST_SFT ;AN000; +; CONSIST_DFL ;AN000; +; PRN_CHECK ;AN000; +; IFSDrvFromCDS ;AN000; +; SET_THISIFS_UNC ;AN000; +; SET_CATEGORY ;AN000; +; SET_DEPIOCTL_IFSR ;AN000; +; GET_UNC_FS_NAME +; MOVE_DRIVER_NAME ;AN000; +; CONVERT_NAME_ASCIIZ ;AN000; +; CHECK_SEQ ;AN000; +; CHECK_REAL_DEVICE ;AN000; +; NET_TRANS ;AN000; +; STRIP_WFP_START +; CHECK_IFS_ATTRIBUTE +; CHECK_IFS_SUPPORT +; ;AN000; +; REVISION HISTORY: ;AN000; +; A000 Original version 4.00 May 1987 ;AN000; +; A001 P453 - Correct $NameTrans processing on connect part of string ;AN000; +; RGazzia Aug 25,1987 +; A002 D158 - merge redir info into attach stuff 8/87 RGazzia +; A003 P635 - read problem - sff-to-sft problem 8/87 RGazzia +; A004 P764 - printer attach problem 8/87 RGazzia +; A005 P845 - Disk reset infinitely calls 8/87 RGazzia +; A006 P868 - Lock problems 8/87 RGazzia +; A007 P849 - Printer open problems 8/87 RGazzia +; A008 P2307- Critical error problems 11/87 RGazzia +; A009 P2364- Chkdsk fails if afs loaded 11/87 RGazzia +; due to losing cx in flush buf loop +; A010 P2385- check for ifs support of multifile/device fcns 11/87 RGazzia +; A011 P2827- ifs driver error mapping 12/87 RGazzia +; A012 P3225- prn to lpt1 problems 1/88 RGazzia +; A013 P3251- Net trans buffer problems 1/88 RGazzia +; A014 P3692- detach of attached ptr problem 3/88 RGazzia +; A015 P3745- commit problem due to sft flags problem 3/88 RGazzia +; A016 P3810- new sff field - sft entry id 3/88 RGazzia +; A017 P3680- sft changes 3/88 RGazzia +; A018 P3883- Share violation problems 3/16/88 RMG +; A019 P3971- pause problems 3/24/88 RMG +; A020 P4055 Make sure THISDFL reset to null 3/30/88 RMG +; A021 P4172 share violation fail - wrong dos extended error 4/08/88 RMG +; A022 P4188 names=0 problems 4/08/88 RMG +; A023 P4227 Austin garbage attach problem 4/11/88 RMG +; A024 P4392 Yet another sft change 4/18/88 RMG +; A025 P4751 retry logic fix 5/05/88 RMG +; A026 P4802 NET821 retry hang/ fail hang 5/10/88 RMG +; A027 P4839 ctrl-prtsc problems (consist_sft) 5/13/88 RMG +; A028 P4863 criter/parms problem 5/14/88 RMG +; A029 P4968 I24 DI not set right 5/25/88 RMG +; A030 P5004 Cap of device name corrupted 6/01/88 RMG +; A031 P5006 ctrl prtsc problems - pause back to real 6/02/88 RMG +; consist_sft +; +; LOC - 696 +;************************************************************************************ ;AN000; + ;AN000; +.xlist ;AN000; +.xcref ;AN000; +INCLUDE IFSSYM.INC ;AN000; +INCLUDE IFSFSYM.INC ;AN000; +INCLUDE DOSSYM.INC ;AN000; +INCLUDE DEVSYM.INC ;AN000; +.cref ;AN000; +.list ;AN000; + ;AN000; +AsmVars ;AN000; + ;AN000; +; define the base code segment of the network support first ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; +IFSSEG ENDS ;AN000; + ;AN000; +; include the rest of the segment definitions for normal MSDOS ;AN000; + ;AN000; +include dosseg.asm ;AN000; + ;AN000; +DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; + ;DOSGROUP Data ;AN000; + Extrn sft_addr:DWORD ;AN000; + Extrn sftFCB:DWORD ;AN000; + Extrn WFP_START:WORD ;AN000; + Extrn THISCDS:DWORD ;AN000; + Extrn THISSFT:DWORD ;AN000; + Extrn CDSADDR:DWORD ;AN000; + Extrn CDSCOUNT:BYTE ;AN000; + Extrn CurrentPDB:WORD ;AN000; + Extrn RetryCount:WORD ;AN000; + Extrn SysInitTable:BYTE ;AN000; + Extrn CurrentPDB:WORD ;AN000; + Extrn IFS_HEADER:DWORD ;AN000; + Extrn NULDEV:DWORD ;AN000; + Extrn SWAP_AREA_TABLE:BYTE ;AN000; + Extrn EXTERR:WORD ;AN011; + Extrn EXTERR_ACTION:BYTE ;AN011; + Extrn EXTERR_CLASS:BYTE ;AN011; + Extrn EXTERR_LOCUS:BYTE ;AN011; + Extrn ALLOWED:BYTE ;AN011; + Extrn ErrMap24End:BYTE + Extrn ErrMap24:BYTE +if debug ;AN000; + Extrn BugLev:WORD ;AN000; + Extrn BugTyp:WORD ;AN000; + include bugtyp.asm ;AN000; +endif ;AN000; +DATA ENDS ;AN000; + ;AN000; +; define our own code segment ;AN000; + ;AN000; +IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; + ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; + ;AN000; + ;IFS Data ;AN000; + Extrn IFSPROC_FLAGS:WORD ;AN000; + Extrn IFSFUNC_FLAGS:WORD ;AN000; +;;;aliasExtrn NLAddr:DWORD ;AN000; + Extrn TEMPBUF:BYTE ;AN000; + Extrn DFLAddr:DWORD ;AN000; + Extrn DFLCount:BYTE ;AN000; + Extrn UNC_FS_HDR:DWORD ;AN000; + Extrn THISIFS:DWORD ;AN000; + Extrn THISDFL:DWORD ;AN000; + Extrn IFSR:WORD ;AN000; + Extrn CD1:WORD ;AN000; + Extrn DF1:WORD ;AN000; + Extrn SFF1:WORD ;AN000; + Extrn IFSDRV:BYTE ;AN000; + Extrn PHONEY_NAME:BYTE ;AN000; + Extrn DEVICE_CB@_OFFSET:WORD ;AN000; + Extrn SAVE_CB@:DWORD ;AN000; + Extrn IFSF_SWAP_START:BYTE ;AN000; + Extrn IFSF_SWAP_END:BYTE ;AN000; + ;AN000; + PUBLIC LPT1_NAME ;AN000; +LPT1_NAME DB "LPT1",0 ;AN000; +PRN_NAME DB "PRN",0 ;AN000; + ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013; +; The following buffer was created 1/88 to temporarily hold canonicalized ;AN013; +; path name for $Nametrans call for Redir ;AN013; +; Some area of TEMPBUF should be used instead for optimized storage space but ;AN013; +; I didn't have time to research the best way to use it as time was short to ;AN013; +; fix ptm ;AN013; +; This buffer should later be taken out when time permits to do this right ;AN013; +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN013; +NET_TRANS_BUFFER DB 128 DUP (0) ; temporary buffer used for $Nametrans ;AN013; + ; storage of canonicalized pathname ;AN013; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFSFlushBuf ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: CD_TO_CDS ;AN000; +; CDS_TO_CD ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Input: AL = 0 Flush all Net buffers. ;AN000; +; -1 " " " plus invalidate them. ;AN000; +; ;AN000; +; Function: ;AN000; +; FOR I = 1 to # CDSs ;AN000; +; DO ;AN000; +; IF CURDIR_ISIFS = true THEN ;AN000; +; DO ;AN000; +; Prepare IFSRH: ;AN000; +; * IFSR_LENGTH DW 40 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; + IFSR_RETCODE DW ? ;AN000; +; + IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 1 ; Drive Reset ;AN000; +; + IFSR_ERROR_CLASS DB ? ;AN000; +; + IFSR_ERROR_ACTION DB ? ;AN000; +; + IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert ;AN000; +; ; CDS to CD and set this as ;AN000; +; ; pointer to it. ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_FUNC DB ? ; 0 IF AL=0. 1 IF AL=-1. ;AN000; +; IFSR_RESV2 DB 0 ;AN000; +; ;AN000; +; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ;AN000; +; Output: None ;AN000; +; ;AN000; +; Notes: all destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure IFSFlushBuf,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DRIVERESET ;AN000; + ;AN000; + MOV CL,CDSCount ; CX = # CDS's ;AN000; + MOV DX,SIZE curdir_list ; DX = size CDS entry ;AN000; + LDS SI,[CDSAddr] ; Get addr 1st CDS ;AN000; + ;AN000; +IFB_20: ;AN000; + TEST DS:[SI.curdir_flags],curdir_isnet ;AN000; + JZ IFB_60 ;AN000; + ; Is IFS. Send drive reset request ;AN000; + invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_DRIVERESET ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSDRIVERESET ;AN000; + SaveReg ; save cds ptr ;AN000; + MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; + invoke CDS_TO_CD ;AN000; + MOV ES:[BX.IFSR_FUNC],AL ;AN000; + ;AN000; + SaveReg ; preserve loop count + invoke CALL_IFS ; Call IFS ;AN000; + RestoreReg ; retrieve loop count + JNC IFB_30 ;AN000; + RestoreReg ; restore cds ptr ;AN000; + JMP SHORT IFB_60 ;AN000; +IFB_30: ;AN000; + RestoreReg ; restore cds ptr into es:di ;AN000; + CALL CD_TO_CDS ; update CDS if retcode ok ;AN000; + PUSH ES ; get cds ptr into ds:si ;AN000; + POP DS ;AN000; + MOV SI,DI ;AN000; + ;AN000; +IFB_60: ;AN000; + ADD SI,DX ; Skip to next CDS ;AN000; + LOOP IFB_20 ;AN000; + JMP IFS_990 ;AN000; + ;AN000; +;*********************************************************************************** ;AN000; +; ifs common return area ;AN000; +;*********************************************************************************** ;AN000; + entry IFS_980 ;AN000; + STC ;AN000; + return ;AN000; + entry IFS_990 ;AN000; + CLC ;AN000; + entry IFS_1000 ;AN000; + return ;AN000; + ;AN000; + ;AN000; +EndProc IFSFlushBuf ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;****************************************************************************** ;AN000; +; ;AN000; +; IFS_UPDATE_CB ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher (Share) ;AN000; +; ;AN000; +; Routines called: ;AN000; +; SFT_TO_SFF ;AN000; +; SF_TO_SFT ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> SFT ;AN000; +; ;AN000; +; Function: ;AN000; +; Prep IFSRH: ;AN000; +; * IFS_LENGTH DW 28 ; Request length ;AN000; +; * IFS_FUNCTION DB 6 ; Control Block Update ;AN000; +; IFS_RETCODE DW ? ;AN000; +; IFS_RETCLASS DB ? ;AN000; +; IFS_RESV1 DB 16 DUP(0) ;AN000; +; * IFS_CB@ DD ? ; Control Block Address ;AN000; +; * IFS_TYPE DB ? ; Control Block Type ;AN000; +; IFSOPEN EQU 0 ; Open instnce (SFT) entry ;AN000; +; IFSCB EQU -1 ; See CB Type Field ;AN000; +; IFS_RESV2 DB 0 ;AN000; +; ;AN000; +; Call IFS specified in SFT ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Carry set on error. Error code in AX. ;AN000; +; ;AN000; +; Regs: ;AN000; +; ;AN000; +; Programming notes: ;AN000; +; ;AN000; +;****************************************************************************** ;AN000; + ;AN000; + procedure IFS_UPDATE_CB,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def UPDATECB ;AN000; + ; Reset ifsfunc processing flags ;AN000; + MOV CS:IFSPROC_FLAGS,ISCTLFCN+ISSFT ; Set this so SFT_TO_SFF sets ;AN000; + ; ifsr_cb@ instead of ifsr_open_cb@ ;AN000; + ; ISSFT set so sft_to_sff sets ;AN000; + ; thisifs ;AN000; + invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; + Context DS ;AN000; + invoke SFT_TO_SFF ; SFT: sets [THISIFS] ;AN000; + ; ES:BX -> IFSRH ;AN000; + ; IFSR_CB@ ;AN000; + ; ds - IFSSEG ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_UPDATECB ; prep IFSRH ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSUPDATECB ;AN000; + MOV ES:[BX.IFSR_TYPE],IFSOPEN ;AN000; + ;AN000; + invoke CALL_IFS ;AN000; + JC ifs_1000 ; cf already set ;AN000; + invoke SFF_TO_SFT ;AN000; + JMP ifs_990 ;AN000; + ;AN000; +EndProc IFS_UPDATE_CB ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; +; ;AN000; +; Called by: IFSFUNC Dispatcher ;AN000; +; ;AN000; +; Routines called: ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [CurrentPDB] set to UID of user aborting ;AN000; +; Function: ;AN000; +; Get address of IFS driver chain. ;AN000; +; FOR I = 1 to last IFS driver ;AN000; +; Send request below to IFS driver ;AN000; +; ;AN000; +; IFSRH: ;AN000; +; * IFSR_LENGTH DW 40 ; Request length ;AN000; +; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; +; IFSR_RETCODE DW ? ;AN000; +; IFSR_RETCLASS DB ? ;AN000; +; IFSR_RESV1 DB 16 DUP(0) ;AN000; +; * IFSR_APIFUNC DB 19 ; End of Computer ID ;AN000; +; IFSR_ERROR_CLASS DB ? ;AN000; +; IFSR_ERROR_ACTION DB ? ;AN000; +; IFSR_ERROR_LOCUS DB ? ;AN000; +; + IFSR_ALLOWED DB ? ;AN000; +; + IFSR_I24_RETRY DB ? ;AN000; +; + IFSR_I24_RESP DB ? ;AN000; +; IFSR_RESV2 DB ? ;AN000; +; IFSR_DEVICE_CB@ DD ? ; CD ;AN000; +; IFSR_OPEN_CB@ DD ? ;AN000; +; * IFSR_UID DW ? ;AN000; +; ;AN000; +; Outputs: None ;AN000; +; ;AN000; +; Regs: All destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SERVER_DOSCALL_CLOSEFILES_FOR_UID,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def EOCID ;AN000; + ;AN000; + LDS SI,IFS_HEADER ; get 1st ifs driver ;AN000; +ASSUME DS:NOTHING ;AN000; + ;AN000; +SDC_20: ; ** Loop here on ifs drivers ;AN000; + MOV CS:WORD PTR [THISIFS],SI ; Send end of process request ;AN000; + MOV CS:WORD PTR [THISIFS+2],DS ; to all fs drivers. ;AN000; + ; Set thisifs for call_ifs ;AN000; + invoke PREP_IFSR ; sets es:bx -> ifsr (zeroed out) ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_EOCID ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSEOCID ;AN000; + MOV AX,[CurrentPDB] ;AN000; + MOV ES:[BX.IFSR_UID],AX ;AN000; + ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; +ASSUME DS:IFSSEG ; ds - ifsseg ;AN000; + ;AN000; + invoke CALL_IFS ;AN000; + ;AN000; + RestoreReg ; ds - fs driver ;AN000; + LDS SI,[SI.IFS_NEXT] ; Do next fs driver ;AN000; + CMP SI,NULL_PTR ; if ptr null, no more ;AN000; + JNE SDC_20 ;AN000; + PUSH DS ;AN000; + POP AX ;AN000; + CMP AX,NULL_PTR ;AN000; + JNE SDC_20 ;AN000; + ;AN000; + jmp ifs_1000 ; go return ;AN000; + ;AN000; + ;AN000; +EndProc SERVER_DOSCALL_CLOSEFILES_FOR_UID ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SERVER_IFSFUNC_DATA_AREA ;AN000; +; ;AN000; +; Called by: Dispatcher ;AN000; +; ;AN000; +; Routines called: None ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS - DOSGroup ;AN000; +; ;AN000; +; Function: ;AN000; +; Put IFSFUNC swappable data area info in ibmdos's swap_area_table +; ;AN000; +; Outputs: ;AN000; +; swap_area_table filled in: ;AN000; +; dw num areas - 3 ;AN000; +; dd ibmdos swap indos area address +; dw ibmdos swap indos area length +; dd ibmdos swap always area address +; dw ibmdos swap always area length +; dd ifsfunc swap indos area address +; dw ifsfunc swap indos area length +; ;AN000; +; Regs: All preserved +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SERVER_IFSFUNC_DATA_AREA,NEAR ;AN000; +ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; + ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + MOV DI,OFFSET CS:IFSF_SWAP_START ;AN000; + MOV DX,OFFSET CS:IFSF_SWAP_END ;AN000; + SUB DX,DI ;AN000; + LEA SI,SWAP_AREA_TABLE ; get offset address of swap area table ;AN000; + + MOV WORD PTR DS:[SI],3 ; number of data areas increased from 2 to 3 ;AN000; + ADD SI,14 ; skip to ifsfunc area ;AN000; + MOV WORD PTR DS:[SI],DI ; fill in ifsfunc data area address ;AN000; + MOV WORD PTR DS:[SI+2],ES ;AN000; + MOV WORD PTR DS:[SI+4],DX ; fill in ifsfunc data area length ;AN000; + ;AN000; + RestoreReg ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc SERVER_IFSFUNC_DATA_AREA ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; + procedure DRIVE_FROM_CDS,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DRIVE_FROM_CDS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISCDS] Set ;AN000; +; DS - DOSGROUP ;AN000; +; Function: ;AN000; +; Compute drive letter from THISCDS ;AN000; +; Outputs: ;AN000; +; [IFSDRV] = Drive # (0=A) ;AN000; +; No registers Revised ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + PUSH BX ;AN000; + PUSH AX ;AN000; + MOV [IFSDRV],0FEH ; Default to ?, 0FEH + 'A' = '?' ;AN000; + MOV AX,WORD PTR [THISCDS] ;AN000; + CMP AX,-1 ;AN000; + JZ DFC_20 ;AN000; + CALL IFSDrvFromCDS ;AN000; +DFC_20: ;AN000; + POP AX ;AN000; + POP BX ;AN000; + jmp ifs_1000 ; go return ;AN000; + ;AN000; +EndProc DRIVE_FROM_CDS ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DRIVE_FROM_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISSFT] Set DS-Dosgroup ;AN000; +; Function: ;AN000; +; Compute drive letter from THISSFT ;AN000; +; Outputs: ;AN000; +; [IFSDRV] = Drive # (0=A) ;AN000; +; [IFSDRV] = -1 if printer ;AN000; +; PHONEY_NAME ;AN000; +; No registers Revised ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure DRIVE_FROM_SFT,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ;AC006; + LDS BX,[THISSFT] ;AN000; + TEST [BX.sf_flags],sf_net_spool ;AN000; + JNZ DFS_100 ;AN000; + MOV BL,BYTE PTR [BX.sf_flags] ;AN000; + AND BL,devid_file_mask_drive ;AN000; + CMP BL,0FEH AND devid_file_mask_drive ; UNC ???? ;AN000; + JNZ DFS_20 ; No ;AN000; + MOV BL,0FEH ; Restore lost bits if UNC ;AN000; +DFS_20: ;AN000; + MOV [IFSDRV],BL ;AN000; + RestoreReg ;AC006; + JMP ifs_1000 ; go return ;AN000; + ;AN000; +DFS_100: ;AN000; + SaveReg ;AN000; + MOV DI,OFFSET CS:[PHONEY_NAME] ; Set name for I24 handler ;AN000; + PUSH CS ;AN000; + POP ES ;AN000; + MOV SI,BX ;AN000; + ADD SI,SF_NAME ;AN000; + MOV CX,8 ;AC007; + REP MOVSB ;AN000; + ;AN000; + RestoreReg ;AN000; + MOV BL,-1 ;AN000; + JMP DFS_20 ;AN000; + ;AN000; +EndProc DRIVE_FROM_SFT ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; PREP_IFSR ;AN000; +; ;AN000; +; Called by: all function routines ;AN000; +; ;AN000; +; Inputs: none ;AN000; +; ;AN000; +; Function: ;AN000; +; set all ifsrh fields to zero ;AN000; +; ;AN000; +; Outputs: ;AN000; +; ES:BX -> IFSRH ;AN000; +; ;AN000; +; Regs: all except ES,BX saved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure PREP_IFSR,NEAR ;AN000; + ;AN000; + SaveReg ; save regs ;AN000; + ;AN000; + SaveReg ; get ds,es -> ifsseg ;AN000; + RestoreReg ;AN000; +ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; + ;AN000; + MOV DI,OFFSET IFSR ; es:di -> ifsrh ;AN000; + MOV BX,DI ; es:bx -> ifsrh ;AN000; + MOV CX,SIZE IFSRH /2 ;AN000; + XOR AX,AX ;AN000; + REP STOSW ; fill ifsr w/zeros ;AN000; + ;AN000; + RestoreReg ; restore regs ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc PREP_IFSR ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CALL_IFS ;AN000; +; ;AN000; +; Called by: all function routines ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISIFS] set ;AN000; +; ES:BX -> IFS request header ;AN000; +; DS - IFSSEG ;AN000; +; ;AN000; +; Function: ;AN000; +; Call file system function entry point ;AN000; +; ;AN000; +; Outputs: ;AN000; +; Outputs of call ;AN000; +; ;AN000; +; Regs: none preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CALL_IFS,NEAR ;AN000; + ;AN000; + CALL CHECK_IFS_SUPPORT ; 1st check if this request ok for ifs ;AN010; + PUSH WORD PTR [THISIFS] ; save thisifs offset ;AN000; + + CALL SET_CATEGORY ; do this to determine unc or ifs ;AN000; + OR CL,CL ; cl-1 for unc, 0 for ifs ;AN000; + JNZ CI_05 ;AN000; + invoke EcritIFS ; enter ifs critical section ;AN000; + JMP SHORT CI_10 ;AN000; +CI_05: ;AN000; + invoke EcritNET ; enter network critical section ;AN000; + +CI_10: + LDS SI,[THISIFS] ; set thisifs=fs driver fcn entry pt ;AN000; + MOV AX,DS:[SI.IFS_CALL@] ; offset=contents of ifs_call@ ;AN000; + ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + MOV WORD PTR [THISIFS],AX ;AN000; + PUSH CX ; save this for later unc vs. ifs check ;AN000; +;---------------------------------------------------------------------------- ;AN000; + CALL [THISIFS] ; call fs driver with request ;AN000; +;---------------------------------------------------------------------------- ;AN000; + POP CX ; unc or ifs result ;AN000; + POP WORD PTR [THISIFS] ; restore thisifs offset ;AN000; + + OR CL,CL ; again, determine whether to exit ifs ;AN000; + JNZ CI_15 ; or unc critical section ;AN000; + invoke LcritIFS ; leave ifs critical section ;AN000; + JMP SHORT CI_17 ;AN000; +CI_15: ;AN000; + invoke LcritNET ; leave network critical section ;AN000; + +CI_17: ;AN000; + MOV AL,ES:[BX.IFSR_RETCLASS] ; check for error (class) ;AN000; + CMP AL,IFSR_NO_ERROR ; (any err must have class set) ;AN000; + JNE CI_20 ;AN000; + JMP ifs_990 ; no error, go ret no carry ;AN000; + ;AN000; +;-----------------------------------------------; error processing ;AN000; +CI_20: ;AN000; + TEST IFSPROC_FLAGS,IsInit ; if in init code, skip error proc ;AN011; + JZ CI_22 ;AN011; + JMP ifs_980 ; init error- just go stc and quit ;AN011; +CI_22: ;AN011; + CMP AL,IFSR_INT21H_CRITER ; critical error? ;AN000; + JE CI_23 ;AN029; + JMP CI_30 ;AC029; +CI_23: ;AN029; + MOV AX,ES:[BX.IFSR_RETCODE] ; put retcode in al before condition ;AN000; + + + CMP AX,error_write_protect ;AN029; + JB NO_UNMAP ;AN029; + CMP AX,error_gen_failure ;AN029; + JA NO_UNMAP ;AN029; + SUB AX,error_write_protect ; BIAS old errors back down into 0-12 range ;AN029; +NO_UNMAP: ;AN029; + PUSH DS ;AN029; + Context DS ;AN029; +ASSUME DS:DOSGROUP ;AN029; + MOV DI,AX ;AN029; + MOV AX,OFFSET DOSGroup:ErrMap24End ;AN029; + SUB AX,OFFSET DOSGroup:ErrMap24 ;AN029; +; ;AN029; +; AX is the index of the first unavailable error. Do not translate if ;AN029; +; greater or equal to AX. ;AN029; +; ;AN029; + CMP DI,AX ;AN029; + MOV AX,DI ;AN029; + JAE NoTrans ;AN029; + MOV AL,ErrMap24[DI] ;AN029; + XOR AH,AH ;AN029; +NoTrans: ;AN029; + POP DS + invoke SET_EXTERR_INFO ; yes - set error info ;AN000; + +CI_25: ;AN011; + SaveReg ; temporarily save ifsr in tempbuf over ;AN008; + SaveReg ; next call ;AN008; + RestoreReg ; Set dssi -> ifsr (current esbx) ;AN008; + MOV SI,BX ;AN008; + MOV CX,36 ; half size of max ifsr ;AN008; + MOV DI,OFFSET TEMPBUF ; set esdi -> tempbuf ;AN008; + CLD ; next instr auto-increment ;AN008; + REP MOVSW ; copy the ifsr over (word move) ;AN008; + MOV AX,CS:IFSPROC_FLAGS ; preserve ifsproc_flags ;AN026; + STOSW ;AN026; + RestoreReg ; restore regs ;AN008; + + CMP DI,error_I24_gen_failure ;AN029; + JBE CI_26 ;AN029; + MOV DI,error_I24_gen_failure ;AN029; +CI_26: ;AN029; + SaveReg ; preserve dos ext err ;AN021; + invoke IFS_I24 ; do int 24h ;AN000; + + SaveReg ; restore original ifsr (over criter one);AN008; + SaveReg ; set dssi -> tempbuf ;AN008; + RestoreReg ; set esdi -> ifsr ;AN008; + MOV SI,OFFSET TEMPBUF ; ;AN008; + MOV DI,OFFSET IFSR ; ;AN008; + MOV CX,36 ; half size of max ifsr ;AN008; + CLD ; next instr auto-increment ;AN008; + REP MOVSW ; copy the ifsr over (word move) ;AN008; + LODSW ; restore ifsproc_flags ;AN026; + MOV CS:IFSPROC_FLAGS,AX ; ;AN026; + RestoreReg ; restore regs ;AN008; + + CMP AL,RETRY ; if retry, restart request ;AN000; + JE CI_27 ; else, go ret w/carry ;AC011; + RestoreReg ; retrieve dos ext err ;AN021;;AM025; + JMP ifs_980 ;AN000; +CI_27: ;AN011; + ADD SP,2 ; restore stack (dos ext error #) ;AN025; + JMP CI_80 ;AN011; + ;AN000; +CI_30: ; not critical error: ;AN000; + CMP AL,IFSR_BAD_FORMAT ; map ifsr bad format error to general ;AN011; + JNE CI_32 ; failure (12) critical error ;AN011; + MOV AL,12 + MOV SS:[EXTERR],31 ; set dos error variables for abort ;AN011; + MOV SS:[EXTERR_CLASS],4 ; (Internal) ;AN011; + MOV SS:[EXTERR_ACTION],4 ; (Abort) ;AN011; + MOV SS:[EXTERR_LOCUS],1 ; (Unknown) ;AN011; + MOV SS:[ALLOWED],08H ; allow only fail ;AN011; + MOV DI,AX ;AN029; + JMP CI_25 ; go back & treat as critical error ;AN011; +CI_32: ;AN011; + CMP AL,IFSR_DRIVER_ERROR ;AN011; + JNE CI_37 ;AC011; + MOV AX,ES:[BX.IFSR_RETCODE] ; *** driver error class *** ;AN011; + CMP AX,IFSR_NO_FCN_SUPPORT ;AN011; + JG CI_34 ;AN011; + MOV AX,50 ; request not supported by file system ;AN011; + JMP CI_100 ;AN011; +CI_34: ;AN011; + CMP AX,IFSR_ACCESS_DENIED ;AN011; + JNE CI_35 ;AN011; + MOV AX,65 ; access denied by file system ;AN011; + JMP CI_100 ;AN011; +CI_35: ;AN011; + CMP AX,IFSR_DEVICE_TYPE_MISMATCH ;AN011; + JNE CI_36 ;AN011; + MOV AX,66 ; file sytem device type incorrect ;AN011; + JMP CI_100 ;AN011; +CI_36: ;AN011; + MOV AX,59 ; fs experienced an unexpected error ;AN011; + JMP CI_100 ;AN011; + +CI_37: ;AN011; + CMP AL,IFSR_DEVICE_ERROR ; fs got device error ;AN011; + JNE CI_38 ;AN011; + MOV AX,ES:[BX.IFSR_RETCODE] ;AN011; + invoke DEVICE2EXTERR ; convert device - ext error ;AN011; + JMP CI_100 ; go set class/action/locus ;AN011; +CI_38: ;AN011; + MOV AX,ES:[BX.IFSR_RETCODE] ;AN011; + CMP AX,error_sharing_violation ;AN000; + JNZ CI_100 ;AN000; + ;AN000; + SaveReg ; save ifsseg ;AN018; + Context DS ; Share error ;AN000; + invoke PHONEY_DPB ; Set phoney NET DPB for INT 24 ;AN000; + CMP ES:[BX.IFSR_APIFUNC],IFSOPENFILE ; on open/create - share error,no int24 ;AN018; + JNE CI_39 ;AN018; + CallInstall SHARE_ERROR,MultDOS,11 ;AN018; + JMP SHORT CI_39_20 ;AN018; +CI_39: ;AN018; + CallInstall SHARE_VIOLATION,MultDOS,10 ;AN000; +CI_39_20: ;AN018; + RestoreReg ;AN018; + ;AN000; + JNC CI_40 ;AN000; + MOV AX,error_sharing_violation ; carry set - quit w/error ;AN000; + invoke SET_EXTERR_INFO ;AN000; + JMP ifs_980 ;AN000; + ;AN000; +CI_40: ; carry clear - retry ;AN000; + MOV AL,RETRY ;AN000; + +CI_80: ;AN000; + INC ES:[BX.IFSR_I24_COUNT] ; retry: inc retry count ;AN000; + MOV ES:[BX.IFSR_I24_RESP],AL ; store i24 response ;AN000; + MOV ES:[BX.IFSR_RETCODE],0 ; reset retcode and class ;AN008; + MOV ES:[BX.IFSR_RETCLASS],0 ;AN008; + MOV ES:[BX.IFSR_ERROR_CLASS],0 ; reset retcode and class ;AN025; + MOV ES:[BX.IFSR_ERROR_ACTION],0 ;AN025; + MOV ES:[BX.IFSR_ERROR_LOCUS],0 ; reset retcode and class ;AN025; + MOV ES:[BX.IFSR_ALLOWED],0 ;AN025; + SaveReg ; restore ds-ifsseg ;AN000; + RestoreReg ;AN000; +ASSUME DS:IFSSEG ;AN000; + JMP CALL_IFS ;AN000; + ;AN000; +CI_100: ; non-critical error ;AN000; + TEST CS:IFSPROC_FLAGS,IsMsgRet ; if msg ret call to int 2f-5 stack ;AN028; + JNZ CI_120 ; not dosgroup so can't call next ;AN028; + CALL SET_EXTERR_INFO ; set exterr info and ;AN000; +CI_120: ;AN028; + JMP ifs_980 ; go ret w/carry ;AN000; + ;AN000; + ;AN000; +EndProc CALL_IFS ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CREATE_DFL_ENTRY ;AN000; +; ;AN000; +; Routine called by: ATTACH_START ;AN000; +; PROCESS_ALIAS ;AN000; +; ;AN000; +; Routines called: DFL_TO_DF ;AN000; +; ENTER_NAMES_LIST ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISIFS] set ;AN000; +; BL = macro type ;AN000; +; CX = user word +; DS:SI -> ASCIIZ device name ;AN000; +; ES:DI -> Target driver to attach to and parms. ;AN000; +; DW ASCIIZ - FS name ;AN000; +; DW n - number of parms ;AN000; +; DB ASCIIZ,... parms ;AN000; +; ;AN000; +; Function: ;AN000; +; WHILE DFL entries ;AN000; +; IF entry not in use THEN ;AN000; +; DO ;AN000; +; Set in progress flag for this entry ;AN000; +; DFL_TYPE = BL ;AN000; +; DFL_DEV_NAME = name pointed to by DS:SI ;AN000; +; DFL_USER_WORD = CX +; IF alias, Call ENTER_NAMES_LIST ;AN000; +; DFL_IFS_HDR = [THISIFS] ;AN000; +; Set in use flag ;AN000; +; Reset in progress flag ;AN000; +; Set [THISDFL] ;AN000; +; Call DFL_TO_DF ;AN000; +; LEAVE WHILE ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; Get next DFL entry ;AN000; +; IF no entry THEN ;AN000; +; Set error_out_of_structures ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDWHILE ;AN000; +; ;AN000; +; Outputs: ;AN000; +; carry clear: ;AN000; +; DFL entry created. Names list addition if alias. ;AN000; +; [THISDFL] set ;AN000; +; DS:SI -> DFL ;AN000; +; If not alias: ;AN000; +; DF loaded ;AN000; +; ES:BX -> IFSRH ;AN000; +; IFSR_DEVICE_CB@ -> DF ;AN000; +; ;AN000; +; carry set on error, ax - error ;AN000; +; ;AN000; +; Regs: DS:SI -> DFL, all others destroyed ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CREATE_DFL_ENTRY,NEAR ;AN000; + ;AN000; + SaveReg ; save input DS:SI (devname) ;AN000; + MOV DX,CX ; save user word in dx ;AN002; + ;AN000; + LDS SI,CS:[DFLAddr] ; Set DS:SI -> 1st DFL entry ;AN000; + MOV CL,CS:DFLCount ; CX = # DFL entries ;AN000; + OR CL,CL ; check for available dfl structure ;AN022; + JZ CDE_30 + XOR CH,CH ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + CALL CONSIST_DFL ; reset all in_prog flags ;AN000; +CDE_20: ;AN000; + TEST [SI.DFLL_FLAGS],DFL_INUSE ; look for unused DFL ;AN000; + JZ CDE_40 ; entry ;AN000; + ADD SI,SIZE DFLL_LIST ;AN000; + LOOP CDE_20 ;AN000; +CDE_30: + MOV AX,error_out_of_structures ;AN000; + RestoreReg ; restore stack ;AN000; + JMP ifs_980 ; go return w/carry ;AN000; +CDE_40: ;AN000; + CALL INIT_DFL ; zero out dfl entry ;AN000; + OR [SI.DFLL_FLAGS],DFL_INPROG ; Found DFL entry - ;AN000; + ; Set in progress flag ;AN000; + MOV [SI.DFLL_TYPE],BL ; Store DFL_TYPE ;AN000; + MOV [SI.DFLL_USER_WORD],DX ; store user word ;AN002; + ;AN000; + RestoreReg ; get dev name ptr off stack ;AN000; + CALL XCHGP ; Set DS:SI -> devname ;AN000; + PUSH DI ; ES:DI -> DFL ;AN000; + ; save dfl start offset ;AN000; +CDE_60: ;AN000; + INC DI ; mov di to dfl_dev_name ;AN000; + INC DI ;AN000; + MOV CX,8 ; Devs max of 8 ch and ':', and a NUL ;AN000; +CDE_70: ; dssi->source, esdi->dfl_dev_name ;AN000; + LODSB ; just store 1st 8 padded to right ;AN000; + CallInstall UCase,multDOS,19,, ; w/blanks ;AC030; ax chg to bx + OR AL,AL ; 0 . : signal end ;AN000; + JZ CDE_73 ;AN000; + CMP AL,'.' ;AN000; + JZ CDE_73 ;AN000; + CMP AL,':' ;AN000; + JZ CDE_73 ;AN000; + STOSB ;AN000; + LOOP CDE_70 ;AN000; + JMP SHORT CDE_80 ;AN000; +CDE_73: ;AN000; + MOV AL," " ;AN000; +CDE_76: ;AN000; + STOSB ;AN000; + LOOP CDE_76 ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; +;;;aliasCMP BL,TYPE_ALIAS ;AN000; +;;;;;;;;JNE CDE_80 ;AN000; +;;;;;;;;CALL ENTER_NAMES_LIST ; Store alias index ;AN000; +;;;;;;;;JNC CDE_120 ;AN000; +;;;;;;;;POP DI ; if error back out ;AN000; +;;;;;;;;AND [SI.DFLL_FLAGS],NOT DFL_INPROG ; go exit with carry ;AN000; +;;;aliasJMP ifs_980 ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; +CDE_80: ;AN000; + ADD DI,4 ; skip alias index and user wd ;AC004; +;;;; INC DI ;AD004; +CDE_100: ;AN000; + MOV AX,WORD PTR [THISIFS] ;AN000; + STOSW ; Set DFL_IFS_HDR to ;AN000; + MOV AX,WORD PTR [THISIFS+2] ; [THISIFS] ;AN000; + STOSW ;AN000; +CDE_120: ;AN000; + POP DI ; retrieve dfl start ;AN000; + MOV WORD PTR CS:[THISDFL],DI ; Set [thisdfl] ;AN000; + MOV WORD PTR CS:[THISDFL+2],ES ;AN000; + ;AN000; + PUSH ES ; Set DS:SI -> DFL ;AN000; + POP DS ;AN000; + MOV SI,DI ;AN000; + ;AN000; + CALL CHECK_REAL_DEVICE ; this will set dfl_dev_real ;AN000; + ;AN000; + OR [SI.DFLL_FLAGS],DFL_INUSE ;AN000; + AND [SI.DFLL_FLAGS],NOT DFL_INPROG ;AN000; + ;AN000; +;;;aliasCMP BL,TYPE_ALIAS ;AN000; +;;;aliasJNE CDE_140 ;AN000; +;;;aliasJMP ifs_990 ; go ret no carry ;AN000; +CDE_140: ;AN000; + invoke PREP_IFSR ; init req hdr ;AN000; + invoke DFL_TO_DF ;AN000; + JMP ifs_990 ;AN000; + ;AN000; +EndProc CREATE_DFL_ENTRY ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DELETE_DFL_ENTRY ;AN000; +; ;AN000; +; Routine called by: IFS_ASSOPER ;AN000; +; ;AN000; +; Routines called: ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISDFL] set ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Outputs: ;AN000; +; carry clear: ;AN000; +; DFL entry deleted. ;AN000; +; carry set on error, ax - error ;AN000; +; ;AN000; +; Regs: everything preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure DELETE_DFL_ENTRY,NEAR ;AN000; + ;AN000; + LDS SI,[THISDFL] ; simply reset in_use bit ;AN000; + AND DS:[SI.DFLL_FLAGS],NOT DFL_INUSE ;AN000; +;;;aliasCMP DS:[SI.DFLL_TYPE],TYPE_ALIAS ; if alias, must remove name ;AN000; +;;;aliasJE DDE_20 ; from names list, and reset ;AN000; + JMP ifs_1000 ;AN000; +;;;aliasDDE_20: ;AN000; +;;;aliasCALL EXIT_NAMES_LIST ; all alias indicies ;AN000; +;;;aliasJMP ifs_1000 ;AN000; + ;AN000; +EndProc DELETE_DFL_ENTRY ;AN000; + ;AN000; +;BREAK ;AN000; +;;;alias ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; ENTER_NAMES_LIST ;AN000; +; ;AN000; +; Routine called by: CREATE_DFL_ENTRY ;AN000; +; ;AN000; +; Routines called: DOS: DStrLen ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> DFL ;AN000; +; ES:DI -> Target driver to attach to and parms. ;AN000; +; DW ASCIIZ - FS name ;AN000; +; DW n - number of parms ;AN000; +; DB ASCIIZ,... parms ;AN000; +; Function: ;AN000; +; Place one and only parameter (alias) into names list. ;AN000; +; Outputs: ;AN000; +; carry clear: name added ;AN000; +; carry set: AX error ;AN000; +; ;AN000; +; Notes: all preserved except AX ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; procedure ENTER_NAMES_LIST ;AN000; +;SSUME DS:IFSSEG,ES:IFSSEG ;AN000; +; ;AN000; +; SaveReg ;AN000; +; PUSH ES ;AN000; +; POP DS ;AN000; +; MOV SI,DI ;AN000; +; ADD SI,4 ; ds:si -> alias name ;AN000; +; CallInstall DStrlen,multDOS,37 ; get size of alias name in cx ;AN000; +; LES DI,[NLAddr] ; get address of names list ;AN000; +; MOV DX,WORD PTR ES:[DI] ; DX=total size of names list ;AN000; +; INC DI ;AN000; +; INC DI ;AN000; +; MOV AX,WORD PTR ES:[DI] ; AX=used size of names list ;AN000; +; PUSH AX ; save used size for dfl_alias_index ;AN000; +; ADD AX,CX ; AX=hopefully new used size ;AN000; +; CMP DX,AX ; check that new string fits ;AN000; +; JAE ENL_20 ;AN000; +; MOV AX,error_out_of_structures ; error - doesn't fit ;AN000; +; JMP ENL_980 ; ret w/carry ;AN000; +;NL_20: ; ok - fits ;AN000; +; STOSW ; store new used size ;AN000; +; POP AX ; get index from stack ;AN000; +; PUSH AX ;AN000; +; INC DI ;AN000; +; INC DI ;AN000; +; ADD DI,AX ; Space to spot in list to put name ;AN000; +; REP MOVSB ;AN000; +; RestoreReg ; Set dfl alias index to byte offset ;AN000; +; POP AX ; (+4) of name in list ;AN000; +; MOV DS:WORD PTR [SI.DFL_ALIAS_INDEX],AX ;AN000; +; JMP ENL_990 ; go ret no carry ;AN000; +; ;AN000; +; ;AN000; +;NL_980: ; Return area ;AN000; +; STC ; error ;AN000; +; RestoreReg ;AN000; +; return ;AN000; +;NL_990: ;AN000; +; CLC ; no error ;AN000; +; RestoreReg ;AN000; +;NL_1000: ;AN000; +; return ;AN000; +; ;AN000; +; ;AN000; +;ndProc ENTER_NAMES_LIST ;AN000; +; ;AN000; +; ;AN000; +;REAK ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; EXIT_NAMES_LIST ;AN000; +; ;AN000; +; Routine called by: DELETE_DFL_ENTRY ;AN000; +; ;AN000; +; Routines called: DOS: StrLen ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> DFL ;AN000; +; ;AN000; +; Function: ;AN000; +; Remove alias name from Names List ;AN000; +; Outputs: ;AN000; +; name removed ;AN000; +; ;AN000; +; Notes: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; procedure EXIT_NAMES_LIST ;AN000; +;SSUME DS:IFSSEG,ES:IFSSEG ;AN000; +; ;AN000; +; MOV DX,DS:[SI.DFL_ALIAS_INDEX] ; DX=index ;AN000; +; LES DI,[NLAddr] ;AN000; +; MOV AX,ES:WORD PTR [DI+2] ; AX=used size ;AN000; +; SaveReg ;AN000; +; ADD DI,DX+4 ;AN000; +; CallInstall StrLen,multDOS,18 ; CX=size of alias name ;AN000; +; PUSH ES ;AN000; +; POP DS ;AN000; +; MOV SI,DI ;AN000; +; ADD SI,CX ;AN000; +; MOV BX,CX ;AN000; +; SUB AX,SI ; CX= #bytes to move = ;AN000; +; MOV CX,AX ; used size - index of next name ;AN000; +; REP MOVSB ; move names up ;AN000; +; ;AN000; +; RestoreReg ; adjust used size ;AN000; +; SUB AX,BX ;AN000; +; MOV ES:WORD PTR [DI+2],AX ;AN000; +; ;AN000; +; LDS SI,[DFLAddr] ; loop thru all dfl entries to ;AN000; +; MOV DI,SIZE DFL_LIST ; adjust alias indicies above ;AN000; +; MOV CL,[DFLCount] ; index removed ;AN000; +; XOR CH,CH ;AN000; +;XNL_20: ; ** Loop here on dfl entries ;AN000; +; TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000; +; JZ EXNL_40 ;AN000; +; MOV AX,DS:[SI.DFL_ALIAS_INDEX] ; 0 if not alias ;AN000; +; CMP AX,DX ;AN000; +; JB EXNL_40 ;AN000; +; SUB AX,BX ; adjust by size of name deleted ;AN000; +; MOV DS:[SI.DFL_ALIAS_INDEX],AX ;AN000; +;XNL_40: ;AN000; +; ADD SI,DX ;AN000; +; LOOP EXNL_20 ;AN000; +; ;AN000; +; JMP ifs_1000 ; go return ;AN000; +; ;AN000; +; ;AN000; +;ndProc EXIT_NAMES_LIST ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DFL_SINGLE_FILE_CHECK ;AN000; +; ;AN000; +; Routine called by: IFS_FILE_ATTRIBUTES ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISDFL] ;AN000; +; [WFP_START] ;AN000; +; ;AN000; +; Function: ;AN000; +; IF [THISDFL] .NOT. NULL THEN ;AN000; +; DO ;AN000; +; Get IFS header from DFL_IFS_HDR ;AN000; +; IF IFSDEVICE true THEN ;AN000; +; DO ;AN000; +; Call DFL_TO_DF ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE Set error - device doesn't support single file fcn ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ELSE DO ;AN000; +; CALL DFL_MATCH ;AN000; +; IF match found THEN ;AN000; +; DO ;AN000; +; Get IFS header from DFL_IFS_HDR ;AN000; +; IF IFSDEVICE true THEN ;AN000; +; DO ;AN000; +; Call DFL_TO_DF ;AN000; +; Clear carry ;AN000; +; ENDDO ;AN000; +; ELSE Set error - device doesn't support single file fcn ;AN000; +; ENDDO ;AN000; +; ELSE Set error - device not IFS ;AN000; +; ENDIF ;AN000; +; ENDDO ;AN000; +; ENDIF ;AN000; +; ;AN000; +; ;AN000; +; Outputs: ;AN000; +; no carry: carry: error ;AN000; +; [THISIFS] set ;AN000; +; ES:BX -> IFSRH ;AN000; +; IFSR_DEVICE_CB@ ;AN000; +; ds - IFSSEG ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure DFL_SINGLE_FILE_CHECK ;AN000; +ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; +;; assume thisdfl aready set up here ;AN000; +;; don't want to write another parse routine ;AN000; +;; CMP WORD PTR [THISDFL],MINUS_ONE ;AN000; +;; JNZ DSFC_20 ;AN000; +;; CALL DFL_MATCH ; check for dfl entry ;AN000; +;; JNC DSFC_20 ;AN000; +;; MOV AX,error_not_ifs_device ;AN000; +;; JMP ifs_1000 ;AN000; + ;AN000; +DSFC_20: ;AN000; + LES DI,CS:[THISDFL] ;AN000; + LES DI,ES:[DI.DFLL_IFS_HDR] ; check that ifs device supports ;AN000; + TEST ES:[DI.IFS_ATTRIBUTE],IFSDEVICE ; single file function ;AN000; + JNZ DSFC_60 ;AN000; + MOV AX,error_file_not_found ; no - set error & go return w/carry ;AN000; + JMP ifs_980 ;AN000; +DSFC_60: ;AN000; + invoke DFL_TO_DF ;AN000; + JMP ifs_990 ;AN000; + ;AN000; + ;AN000; +EndProc DFL_SINGLE_FILE_CHECK ;AN000; + ;AN000; +;BREAK ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; PROCESS_ALIAS ;AN000; +; ;AN000; +; Called by: ATTACH_START ;AN000; +; ;AN000; +; Routines called: DFL_MATCH ;AN000; +; CREATE_DFL_ENTRY ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> ASCIIZ source name ;AN000; +; ES:DI -> ALIAS name ;AN000; +; ;AN000; +; Function: ;AN000; +; ;AN000; +; Regs: ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; Procedure PROCESS_ALIAS,NEAR ;AN000; +;SSUME DS:NOTHING,ES:NOTHING ;AN000; +; ;AN000; +; CALL DFL_MATCH ;AN000; +; JC PA_20 ;AN000; +;;;??? match found, error or override??? ;AN000; +;A_20: ;AN000; +; CALL CREATE_DFL_ENTRY ;AN000; +; JMP ifs_1000 ;AN000; +; ;AN000; +; ;AN000; +;ndProc PROCESS_ALIAS ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DFL_MATCH ;AN000; +; ;AN000; +; Called by: ATTACH_START CONSIST_SFT ;AN000; +; IFS_DELETE ;AN000; +; ;AN000; +; Routines called: ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> Asciiz Device name ;AN000; +; ;AN000; +; Function: ;AN000; +; Search DFL for match on name ;AN000; +; If match found - set [THISDFL] and clear carry ;AN000; +; Else set carry ;AN000; +; ;AN000; +; Output: ;AN000; +; carry clear - match found, [THISDFL] set ;AN000; +; carry set - match not found ;AN000; +; ;AN000; +; Regs: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + Procedure DFL_MATCH ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save registers ;AN000; + ;AN000; + SaveReg ; store canonicalized version of ;AN000; + RestoreReg ; source asciiz dev name in ;AN000; + MOV DI,OFFSET TEMPBUF+10 ; tempbuf+10 ;AN000; + MOV CX,10 ; devs max of 8 ch and : and nul ;AN000; +DM_20: ;AN000; + LODSB ;AN000; + CallInstall UCase,multDOS,19,, ;AN000; + STOSB ;AN000; + OR AL,AL ;AN000; + JZ DM_60 ;AN000; + CMP AL,"." ;AN000; + JZ DM_40 ;AN000; + LOOP DM_20 ;AN000; +DM_40: ;AN000; + XOR AL,AL ;AN000; + MOV BYTE PTR ES:[DI-1],AL ;AN000; +DM_60: ;AN000; + CMP BYTE PTR ES:[DI-2],":" ;AN000; + JNZ DM_80 ;AN000; + MOV BYTE PTR ES:[DI-2],0 ;AN000; + ;AN000; +DM_80: ;AN000; + XOR AX,AX ; ax is counter through DFL entries ;AN000; + LDS SI,[DFLAddr] ; dssi -> dfl entry ;AN000; +DM_100: ; <<<<< matching loop >>>>> ;AN000; + CMP AL,CS:[DFLCount] ;AN000; + JAE DM_980 ;AN000; + TEST DS:[SI.DFLL_FLAGS],DFL_INUSE ;AN000; + JZ DM_160 ;AN000; + SaveReg ; dfl entry offset ;AN000; + ADD SI,DFL_DEV_NAME ;AN000; + MOV DI,OFFSET TEMPBUF ;AN000; + CALL CONVERT_NAME_ASCIIZ ; moves dev name into tempbuf ;AN000; + ; in asciiz form - di preserved ;AN000; + MOV SI,OFFSET TEMPBUF+10 ;AN000; + Call PRN_CHECK ; if si->prn - chg si->lpt1 ;AN012; + CallInstall StrCmp,multDOS,30,, ; check for match ;AN000; + RestoreReg ; dfl entry offset ;AN000; + JZ DM_990 ;AN000; +DM_160: ;AN000; + ADD SI,SIZE DFLL_LIST ;AN000; + INC AL ;AN000; + JMP SHORT DM_100 ; go up & try next entry ;AN000; + ;AN000; +DM_980: ;AN000; + SaveReg ; set thisdfl null on error ;AN020; + RestoreReg ;AN020; + MOV AX,NULL_PTR ;AN020; + MOV WORD PTR [THISDFL],AX ;AN020; + MOV WORD PTR [THISDFL+2],AX ;AN020; + RestoreReg ;AN020; + STC ;AN000; + JMP SHORT DM_1000 ;AN000; +DM_990: ;AN000; + TEST DS:[SI.DFLL_FLAGS],dfl_paused ; if printer paused, no match ;AN019; + JNZ DM_980 ;AN019; + + MOV CS:WORD PTR [THISDFL],SI ;AN000; + MOV CS:WORD PTR [THISDFL+2],DS ;AN000; + CLC ; es:di -> dfl on match ;AN000; +DM_1000: ;AN000; + RestoreReg ; restore regs ;AN000; + return ;AN000; + ;AN000; +EndProc DFL_MATCH ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SFT_TO_SFF ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISSFT] set ;AN000; +; DS - DOSGROUP ;AN000; +; Function: ;AN000; +; Load SFF from SFT ;AN000; +; ;AN000; +; SFF_TYPE = 0 ;AN000; +; SFF_TYPE+1 = 0 ;AN000; +; SFF_FLAGS = SF_FLAGS ;AN000; +; SFF_MODE = SF_MODE ;AN000; +; SFF_RESV1 = 0 ;AN000; +; SFF_ATTR = SF_ATTR ;AN000; +; SFF_UID = SF_UID ;AN000; +; SFF_PID = SF_PID ;AN000; +; SFF_SIZE = SF_SIZE ;AN000; +; SFF_POSITION = SF_POSITION ;AN000; +; SFF_TIME = SF_TIME ;AN000; +; SFF_DATE = SF_DATE ;AN000; +; SFF_NAME = SF_NAME ;AN000; +; SFF_EXT = SF_NAME+8 ;AN000; +; SFF_RESV2 = 0 ;AN000; +; SFF_SF_ID = math on sft address +; SFF_FSDA = SF_CLUSPOS ;AN000; +; SFF_FSDA + 2 = SF_DIRSEC ;AN000; +; SFF_FSDA + 4 = SF_DIRSEC+2 ;AN000; +; SFF_FSDA + 6 = SF_LSTCLUS ;AN000; +; Outputs: ;AN000; +; SF loaded ;AN000; +; ES:BX -> IFSRH ;AN000; +; IFSR_OPEN_CB@ set ;AN000; +; If SetDeviceCB set then IFSR_DEVICE_CB@ set ;AN000; +; DS - IFSSEG ;AN000; +; ;AN000; +; notes: all except ES,BX,DS preserved ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SFT_TO_SFF,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save regs ;AN000; + ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; +ASSUME ES:IFSSEG ;AN000; + MOV DI,OFFSET SFF1 ; DS:SI -> SFT ;AN000; + LDS SI,[THISSFT] ; ES:DI -> SFF ;AN000; + ;AN000; + SaveReg ; save SFF offset ;AN000; + MOV AH,CBTYPE_SFF ; sff_type ;AN000; + XOR AL,AL ;AN000; + STOSW ;AN000; + ;AN000; + MOV AX,WORD PTR [SI.SF_FLAGS] ; sff_flags ;AN000; + STOSW ;AN015; + MOV AX,WORD PTR [SI.SF_MODE] ; sff_mode ;AN000; +;;;;;;;;PUSH BX ;AD015; +;;;;;;;;AND BX,8000H ;AD015; +;;;;;;;;OR AX,BX ;AD015; + STOSW ;AN000; +;;;;;;;;POP AX ;AD015; +;;;;;;;;AND AX,0EFFFH ;AD015; +;;;;;;;;STOSW ;AD015; +;;;;;;;;MOV AX,WORD PTR [SI.SF_IOMODE] ; sff_iomode ;AD024; + XOR AX,AX ; just put zero in reserved area ;AN024; + STOSW ;AN000; + MOV AL,BYTE PTR [SI.SF_ATTR] ; sff_attr ;AN000; +;;;;;;;;MOV AH,BYTE PTR [SI.SF_ATTR_HI] ; sff_attr_hi - no longer exists ;AD024; + STOSW ;AN000; + MOV AX,WORD PTR [SI.SF_UID] ; sff_uid ;AN000; + STOSW ;AN000; + MOV AX,WORD PTR [SI.SF_PID] ; sff_pid ;AN000; + STOSW ;AN000; + SaveReg ;AN000; + ADD SI,SF_SIZE ;AN000; + MOV CX,4 ;AN000; + REP MOVSW ; sff_size & position ;AN000; + RestoreReg ;AN000; + MOV AX,WORD PTR [SI.SF_TIME] ; sff_time ;AN000; + STOSW ;AN000; + MOV AX,WORD PTR [SI.SF_DATE] ; sff_date ;AN000; + STOSW ;AN000; + ;AN000; + SaveReg ; sff_name/ext/cp ;AN000; + ADD SI,SF_NAME ;AN000; + MOV CX,11 ; (name - 11, cp - 2 bytes) cp out ;AC024; + REP MOVSB ;AN000; + XOR AX,AX ;AN024; + STOSW ; just put zero in reserved area ;AN024; + + RestoreReg ; sff_sf_id ;AN000; + SaveReg ; calculate based on sft address ;AN016 + RestoreReg ;AN016; + MOV CL,4 ;AN016; + SHL AX,CL ;AN016; + ADD SI,AX ;AN016; + RestoreReg ;AN016; + AND AX,0F000H ;AN016; + ADD AX,SI ;AN016; + STOSW ;AN016; + RestoreReg ;AN016; + ;AN000; + ADD DI,SIZE SFF_RESV ; sff_fsda 1st word ;AN000; + SaveReg ; save si for issft case ;AN015; + ADD SI,SF_CLUSPOS ;AN000; + MOV CX,3 ;AC017; + REP MOVSW ;AN000; +;;;;;;;;ADD SI,12 ;AN017;;AD024; +;;;;;;;;MOVSW ;AN017;;AD024; + RestoreReg ;AN015; + MOV AX,WORD PTR [SI.SF_LSTCLUS] ; manually put lstclus in fsda+6 ;AN024; + STOSW ;AN024; + ;AN000; + TEST CS:[IFSPROC_FLAGS],ISSFT ;AN000; + JZ SFT_20 ;AN000; + MOV AX,WORD PTR [SI.SF_IFS_HDR] ; Set [THISIFS] only if ;AN000; + MOV WORD PTR CS:[THISIFS],AX ; no yet set by cds_to_cd or ;AN000; + MOV AX,WORD PTR [SI.SF_IFS_HDR+2] ; dfl_to_df ;AN000; + MOV WORD PTR CS:[THISIFS+2],AX ;AN000; + ;AN000; +SFT_20: ;AN000; + RestoreReg ; restore ES:DI -> start of SFF ;AN000; + SaveReg ; set DS:DI -> SFF ;AN000; + RestoreReg ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + MOV BX,OFFSET IFSR ; set ES:BX -> IFSRH ;AN000; + ;AN000; + TEST CS:IFSPROC_FLAGS,ISCTLFCN ;AN000; + JNZ SFT_40 ; API fcn - ;AN000; + MOV WORD PTR ES:[BX.IFSR_OPEN_CB@],DI ; set IFSR_OPEN_CB@ ;AN000; + MOV WORD PTR ES:[BX.IFSR_OPEN_CB@+2],DS ;AN000; + JMP SFT_60 ;AN000; +SFT_40: ; Ctl fcn - ;AN000; + MOV WORD PTR ES:[BX.IFSR_CB@],DI ; set IFSR_CB@ ;AN000; + MOV WORD PTR ES:[BX.IFSR_CB@+2],DS ;AN000; + ;AN000; +SFT_60: ;AN000; + TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to set ;AN000; + JZ SFT_1000 ; device cb or not ;AN000; + LDS SI,[THISSFT] ;AN000; + CMP WORD PTR DS:[SI.SF_DEVPTR],NULL_PTR ; null if seq ;AN000; + JE SFT_1000 ;AN000; + TEST DS:[SI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007; + LDS SI,DS:[SI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AM007; + JNZ SFT_100 ; jmp if dfl ;AN000; + MOV WORD PTR CS:SAVE_CB@,SI ; CDS ;AN000; + MOV WORD PTR CS:SAVE_CB@+2,DS ;AN000; + TEST DS:[SI.CURDIR_FLAGS],CURDIR_ISIFS ;AN000; + JZ SFT_1000 ;AN000; + CALL CDS_TO_CD ;AN000; + JMP SHORT SFT_1000 ;AN000; + ;AN000; +SFT_100: ;AN000; + MOV WORD PTR CS:[THISDFL],SI ; DFL ;AN000; + MOV WORD PTR CS:[THISDFL+2],DS ; set this cause dfl-df ;AN000; + CALL DFL_TO_DF ; expects it ;AN000; + ;AN000; + ;AN000; +SFT_1000: ;AN000; + RestoreReg ; restore regs ;AN000; + SaveReg ;AN000; + RestoreReg ; set ds -ifsseg ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc SFT_TO_SFF ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SFF_TO_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISSFT] set ;AN000; +; Function: ;AN000; +; Update SFT with SFF ;AN000; +; SF_FLAGS = SFF_FLAGS ;AN000; +; SF_MODE = SFF_MODE ;AN000; +; SF_ATTR = SFF_ATTR ;AN000; +; SF_UID = SFF_UID ;AN000; +; SF_PID = SFF_PID ;AN000; +; SF_SIZE = SFF_SIZE ;AN000; +; SF_POSITION = SFF_POSITION ;AN000; +; SF_TIME = SFF_TIME ;AN000; +; SF_DATE = SFF_DATE ;AN000; +; SF_NAME = SFF_NAME ;AN000; +; SF_NAME+8 = SFF_EXT ;AN000; +; SF_CLUSPOS = SFF_FSDA ;AN000; +; SF_DIRSEC = SFF_FSDA + 2 ;AN000; +; SF_DIRSEC+2 = SFF_FSDA + 4 ;AN000; +; SF_LSTCLUS = SFF_FSDA + 6 ;AN000; +; ;AN000; +; Outputs: ;AN000; +; SFT loaded ;AN000; +; notes: all regs preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure SFF_TO_SFT,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save regs ;AC003; + ;AN000; + PUSH SS ;AN000; + POP DS ;AN000; +ASSUME DS:DOSGROUP ;AN000; + LES DI,[THISSFT] ; DS:SI -> SFF ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV SI,OFFSET SFF1 ; ES:DI -> SFT ;AN000; + INC SI ;AN000; + INC SI ;AN000; + ;AN000; + LODSW ; sff_flags ;AN000; +;;;;;;;;AND AX,0EFFFH ; (hi bit sft_flags - also mode ) ;AD015; + MOV WORD PTR ES:[DI.SF_FLAGS],AX ; sft_flags ;AC015; + LODSW ;AN000; +;;;;;;;;AND AX,0EFFFH ;AD015; + MOV WORD PTR ES:[DI.SF_MODE],AX ; sft_mode ;AC015; + LODSW ;AN000; +;;;;;;;;MOV WORD PTR ES:[DI.SF_IOMODE],AX ; sft_iomode ...no longer exists ;AD024; + LODSW ;AN000; + MOV BYTE PTR ES:[DI.SF_ATTR],AL ; sft_attr ;AN000; +;;;;;;;;MOV BYTE PTR ES:[DI.SF_ATTR_HI],AH ; no longer exists ;AD024; + LODSW ;AN000; + MOV WORD PTR ES:[DI.SF_UID],AX ; sft_uid ;AN000; + LODSW ;AN000; + MOV WORD PTR ES:[DI.SF_PID],AX ; sft_pid ;AN000; + SaveReg ;AN000; + ADD DI,SF_SIZE ;AN000; + MOV CX,4 ;AN000; + REP MOVSW ; sft_size & position ;AN000; + RestoreReg ;AN000; + LODSW ;AN000; + MOV WORD PTR ES:[DI.SF_TIME],AX ; sft_time ;AN000; + LODSW ;AN000; + MOV WORD PTR ES:[DI.SF_DATE],AX ; sft_date ;AN000; + ;AN000; + ;AN000; + PUSH DI ; sft_name/ext/cp ;AN000; + ADD DI,SF_NAME ;AN000; + MOV CX,11 ; (name - 11, cp - 2 bytes) ;AN000; + REP MOVSB ;AN000; + ;AN000; + ADD SI,SIZE SFF_RESV ; sft_fsda 1st word ;AN000; + ADD SI,4 ; for sff_sf_id ;AN016;;AC024; + POP DI ;AN000; + ;AN000; + SaveReg ;AN003; + ADD DI,SF_CLUSPOS ;AN000; + MOV CX,3 ;AC017; + REP MOVSW ;AN000; +;;;;;;;;ADD DI,12 ;AN017;;AD024; +;;;;;;;;MOVSW ;AN017;;AD024; + LODSW ;AN024; + RestoreReg ;AN003;;AM024; + MOV WORD PTR ES:[DI.SF_LSTCLUS],AX ;AN024; + ;AN000; + TEST IFSPROC_FLAGS,SetDeviceCB ; check whether to update ;AN000; + JZ SFF_1000 ; device cb or not ;AN000; + TEST IFSPROC_FLAGS,IsSeq ;AN000; + JNZ SFF_1000 ;AN000; + ;AN000; + TEST ES:[DI.SF_FLAGS],DEVID_DEVICE ; cds or dfl? ;AM007; + PUSHF ; save results of this test for later ;AN007; + LES DI,ES:[DI.SF_DEVPTR] ; get device ptr (cds/dfl) ;AN000; + CMP DI,NULL_PTR ;AN000; + JNE SFF_20 ;AN000; + POPF ;AN000; + JMP SFF_1000 ;AN000; + +SFF_20: ;AN000; + POPF ; retrieve cd/df test results ;AN000; + JNZ SFF_100 ; jmp if dfl ;AN000; + MOV DI,WORD PTR CS:SAVE_CB@ ; CDS ;AN000; + PUSH WORD PTR CS:SAVE_CB@+2 ;AN000; + POP ES ;AN000; + TEST ES:[DI.CURDIR_FLAGS],CURDIR_ISIFS + JZ SFF_1000 + CALL CD_TO_CDS ;AN000; + JMP SHORT SFF_1000 ;AN000; + ;AN000; +SFF_100: ;AN000; + MOV WORD PTR CS:[THISDFL],DI ; DFL ;AN000; + MOV WORD PTR CS:[THISDFL+2],ES ; set this cause DF_TO_DFL ;AN000; + CALL DF_TO_DFL ; expects it ;AN000; + ;AN000; +SFF_1000: ;AN000; + RestoreReg ; restore regs ;AC003; + ;AN000; + return ;AN000; + ;AN000; +EndProc SFF_TO_SFT ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CDS_TO_CD ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> CDS ;AN000; +; ;AN000; +; Function: ;AN000; +; Load CD from CDS ;AN000; +; CD_TYPE = 1 ;AN000; +; CD_TYPE+1 = 0 ;AN000; +; CD_END = CURDIR_END ;AN000; +; CD_TEXT = CURDIR_TEXT ;AN000; +; CD_FSDA = CURDIR_ID ;AN000; +; CD_FSDA+2 = CURDIR_ID+2 ;AN000; +; CD_FSDA+4 = CURDIR_USER_WORD ;AN000; +; CD_FSDA+6 = CURDIR_FSDA ;AN000; +; Outputs: ;AN000; +; CD loaded ;AN000; +; ES:BX -> IFSRH ;AN000; +; IFSR_DEVICE_CB@ -> CD ;AN000; +; [THISIFS] = CURDIR_IFS_HDR ;AN000; +; DS - IFSSEG ;AN000; +; ;AN000; +; Regs: all except DS,ES,BX saved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CDS_TO_CD,NEAR ;AN000; + ;AN000; + SaveReg ; save regs ;AN000; + ;AN000; + PUSH CS ;AN000; + POP ES ; DS:SI -> CDS ;AN000; +ASSUME ES:IFSSEG ; ES:DI -> CD ;AN000; + MOV DI,OFFSET CS:CD1 ;AN000; + ;AN000; + PUSH DI ; save cd offset ;AN000; + MOV AL,CBTYPE_CD ; cd_type ;AN000; + TEST CS:IFSPROC_FLAGS,ISDUMMYCDS ; check for dummy cd ;AN000; + JZ CCD_10 ;AN000; + MOV AL,CBTYPE_DUMMYCD ;AN000; +CCD_10: ;AN000; + XOR AH,AH ;AN000; + STOSW ; move di down thru cd during store ;AN000; + ;AN000; + MOV AX,WORD PTR [SI.CURDIR_END] ; cd_end ;AN000; + STOSW ;AN000; + ;AN000; + PUSH SI ; cd_text ;AN000; + MOV CX,DIRSTRLEN ;AN000; + REP MOVSB ;AN000; + POP SI ;AN000; + ;AN000; + MOV AX,WORD PTR [SI.CURDIR_ID] ; cd_fsda ;AN000; + ADD DI,SIZE CD_RESV ;AN000; + STOSW ;AN000; + MOV AX,WORD PTR [SI.CURDIR_ID+2] ;AN000; + STOSW ;AN000; + MOV AX,WORD PTR [SI.CURDIR_USER_WORD] ;AN000; + STOSW ;AN000; + MOV AX,WORD PTR [SI.CURDIR_FSDA] ;AN000; + STOSW ;AN000; + ;AN000; + TEST CS:IFSPROC_FLAGS,THISIFS_SET ;AN000; + JNZ CCD_20 ;AN000; + MOV AX,WORD PTR [SI.CURDIR_IFS_HDR] ; Set [THISIFS] ;AN000; + MOV WORD PTR CS:[THISIFS],AX ;AN000; + MOV AX,WORD PTR [SI.CURDIR_IFS_HDR+2] ;AN000; + MOV WORD PTR CS:[THISIFS+2],AX ;AN000; +CCD_20: ;AN000; + POP DI ; restore CD offset ;AN000; + PUSH CS ; get DS -> IFSSEG ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + ;AN000; + MOV BX,OFFSET IFSR ; ES:BX -> IFSRH ;AN000; + SaveReg ;AN000; + ADD BX,DEVICE_CB@_OFFSET ;AN000; + MOV WORD PTR ES:[BX],DI ; set IFSR_DEVICE_CB@ ;AN000; + ADD BX,2 ;AN000; + MOV WORD PTR ES:[BX],ES ;AN000; + RestoreReg ;AN000; + ;AN000; + RestoreReg ; restore regs ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc CDS_TO_CD ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CD_TO_CDS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; ES:DI -> CDS ;AN000; +; DS -> IFSSEG ;AN000; +; Function: ;AN000; +; Update CDS with CD ;AN000; +; CURDIR_TEXT = CD_TEXT ;AN000; +; CURDIR_ID = CD_FSDA ;AN000; +; CURDIR_ID+2 = CD_FSDA+2 ;AN000; +; CURDIR_USER_WORD = CD_FSDA+4 ;AN000; +; CURDIR_END = CD_END ;AN000; +; CURDIR_FSDA = CD_FSDA+6 ;AN000; +; Outputs: ;AN000; +; CDS updated ;AN000; +; ;AN000; +; notes: all regs preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CD_TO_CDS,NEAR ;AN000; +ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; + ;AN000; + SaveReg ; save regs ;AC005; + ;AN000; + MOV SI,OFFSET CD1 ; ES:DI -> CDS ;AN000; + ; DS:SI -> CD ;AN000; + INC SI ;AN000; + INC SI ;AN000; + ;AN000; + LODSW ; curdir_end ;AN000; + MOV ES:[DI.CURDIR_END],AX ;AN000; + ;AN000; + PUSH DI ;AN000; + MOV CX,DIRSTRLEN ;AN000; + REP MOVSB ;AN000; + POP DI ;AN000; + ;AN000; + ADD SI,SIZE CD_RESV ; curdir_id ;AN000; + LODSW ;AN000; + MOV WORD PTR ES:[DI.CURDIR_ID],AX ;AN000; + LODSW ;AN000; + MOV WORD PTR ES:[DI.CURDIR_ID+2],AX ;AN000; + LODSW ; curdir_user_word ;AN000; + MOV WORD PTR ES:[DI.CURDIR_USER_WORD],AX ;AN000; + LODSW ; curdir_fsda ;AN000; + MOV WORD PTR ES:[DI.CURDIR_FSDA],AX ;AN000; + ;AN000; + RestoreReg ; restore regs ;AC005; + ;AN000; + return ;AN000; + ;AN000; +EndProc CD_TO_CDS ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DFL_TO_DF ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISDFL] ;AN000; +; Function: ;AN000; +; Load DF from DFL ;AN000; +; ;AN000; +; DF_TYPE = 2 ;AN000; +; DF_TYPE + 1 = 0 ;AN000; +; DF_DEV_NAME = DFL_DEV_NAME ;AN000; +; DF_FSDA = DFL_FSDA ;AN000; +; Outputs: ;AN000; +; DF loaded ;AN000; +; ES:BX -> IFSRH ;AN000; +; IFSR_DEVICE_CB@ -> DF ;AN000; +; [THISIFS] = DFL_IFS_HDR ;AN000; +; DS - IFSSEG ;AN000; +; ;AN000; +; notes: es,bx,ds Revised, others saved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure DFL_TO_DF,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save regs ;AN000; + ;AN000; + PUSH CS ;AN000; + POP ES ;AN000; +ASSUME ES:IFSSEG ;AN000; + MOV DI,OFFSET DF1 ; es:di -> df ;AN000; + ;AN000; + MOV BX,OFFSET IFSR ; set es:bx - ifsrh ;AN000; + PUSH BX ; fill in device cb@ ;AN000; + ADD BX,CS:DEVICE_CB@_OFFSET ;AN000; + MOV WORD PTR ES:[BX],DI ;AN000; + ADD BX,2 ;AN000; + MOV WORD PTR ES:[BX],ES ;AN000; + POP BX ;AN000; + ;AN000; + LDS SI,[THISDFL] ; ds:si -> dfl ;AN000; + ;AN000; + MOV AL,CBTYPE_DF ; df_type ;AN000; + XOR AH,AH ;AN000; + STOSW ;AN000; + ;AN000; + PUSH SI ; df_dev_name ;AN000; + ADD SI,DFL_DEV_NAME ;AN000; + MOV CX,8 ;AN000; + REP MOVSB ;AN000; + POP SI ;AN000; + PUSH SI ;AN000; + ADD SI,DFL_FSDA ; df_fsda ;AN000; + + TEST CS:IFSPROC_FLAGS,SetDeviceCB ; if this flag set, i24 already taken ;AN004; + JNZ DDF_20 ; care of, otherwise take care of it ;AN004; + SaveReg ; df, dfl dev name offsets ;AN004; + MOV DI,OFFSET CS:[PHONEY_NAME] ; set phoney name and ifsdrv ;AN004; + MOV CX,4 ;AN004; + REP MOVSW ;AN004; + MOV CS:[IFSDRV],-1 ;AN004; + RestoreReg ; dfl dev name, df offsets ;AN004; + +DDF_20: ;AN004; + MOV CX,SIZE DFL_FSDA ;AN000; + REP MOVSB ;AN000; + POP SI ;AN000; + ;AN000; + MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR] ; Set [THISIFS] ;AN000; + MOV WORD PTR [THISIFS],AX ;AN000; + MOV AX,WORD PTR DS:[SI.DFLL_IFS_HDR+2] ;AN000; + MOV WORD PTR [THISIFS+2],AX ;AN000; + ;AN000; + PUSH CS ; set ds - ifsseg ;AN000; + POP DS ;AN000; + ;AN000; + RestoreReg ; restore regs ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc DFL_TO_DF ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; DF_TO_DFL ;AN000; +; ;AN000; +; Inputs: ;AN000; +; [THISDFL] set ;AN000; +; Function: ;AN000; +; Update DFL with DF ;AN000; +; DFL_DEV_NAME = DF_DEV_NAME ;AN000; +; DFL_FSDA = DF_FSDA ;AN000; +; Outputs: ;AN000; +; DFL updated ;AN000; +; ;AN000; +; notes: all regs preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure DF_TO_DFL,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ; save regs ;AN000; + ;AN000; + LES DI,[THISDFL] ; esdi -> dfl ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV SI,OFFSET DF1 ; dssi -> df ;AN000; + ;AN000; + INC SI ; space si,di to dev_name ;AN000; + INC SI ;AN000; + PUSH DI ;AN000; + ADD DI,DFL_DEV_NAME ;AN000; + MOV CX,8 ;AN000; + REP MOVSB ; update dfl_dev_name for some reason ;AN000; + ;AN000; + POP DI ;AN000; + ADD DI,DFL_FSDA ;AN000; + MOV CX,SIZE DFL_FSDA ;AN000; + REP MOVSB ; update dfl_fsda ;AN000; + ;AN000; + RestoreReg ; restore regs ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc DF_TO_DFL ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CONSIST_SFT ;AN000; +; ;AN000; +; Inputs: ;AN000; +; None ;AN000; +; ;AN000; +; Function: ;AN000; +; Make sure all device SFTs are consistent with current IFSFUNC state ;AN000; +; ;AN000; +; Outputs: ;AN000; +; None ;AN000; +; ;AN000; +; Regs: DS,ES,SI,DI preserved others destroyed ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CONSIST_SFT,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + CMP CS:[DFLCount],0 ; if no dfl, forget it ;AN022; + JE CS_20 + SaveReg ;AN000; + CLI ; This scan of the SFT tables is ;AN000; + ; a critical section we must protect ;AN000; + ; with CLI and STI as CritNET must ;AN000; + ; be disjoint from all other critical ;AN000; + ; sections ;AN000; + LDS SI,[SFTFCB] ;AN000; +ASSUME DS:NOTHING ;AN000; + MOV CX,[SI].sfCount ;AN000; + LEA SI,[SI].sfTable ;AN000; + JCXZ DONE_LOOK_FCB ;AN000; + CALL LOOK_FIX ;AN000; +DONE_LOOK_FCB: ;AN000; + LDS SI,[SFT_Addr] ; get pointer to beginning of table ;AN000; +ScanLoop: ;AN000; + MOV CX,[SI].SFCount ;AN000; + PUSH DS ;AN000; + PUSH SI ;AN000; + LEA SI,[SI].sfTable ;AN000; + CALL LOOK_FIX ;AN000; + POP SI ;AN000; + POP DS ;AN000; + LDS SI,[SI].SFLink ; get next table segment ;AN000; + CMP SI,-1 ; end of tables? ;AN000; + JNZ ScanLoop ; no, try again ;AN000; + STI ;AN000; + RestoreReg ;AN000; +CS_20: + return ;AN000; + ;AN000; +LOOK_FIX: ;AN000; + CMP [SI].sf_ref_count,0 ;AN000; + JZ NEXT_SFT ; Ignore Free ones ;AN000; + TEST [SI].sf_flags,devid_device ;AN000; + JZ NEXT_SFT ; Only look at device SFTs ;AN000; + TEST [SI].sf_flags,sf_isnet +;AN000; + PUSH CX ; sft loop count ;AN000; + PUSH DS ; sft ptr ;AN000; + PUSH SI ;AN000; + PUSHF ; Save result of above TEST ;AN000; + ADD SI,sf_name ; put asciiz form of sf_name in tempbuf ;AN000; + PUSH CS ; to call dfl_match with ;AN000; + POP ES ;AN000; + MOV DI,OFFSET TEMPBUF ;AN000; + CALL CONVERT_NAME_ASCIIZ ;AN000; + PUSH CS ;AN000; + POP DS ;AN000; + MOV SI,DI ;AN000; + CALL DFL_MATCH ; is this sft attached? cf1-no,cf0-yes ;AN000; + JC NOT_R_DEV ;AN000; + PUSH CS ; IS ATTACHED - recover test for sf_isnet ;AN000; + CALL PIRET ;AN000; + JNZ NOT_REDIR ; jmp if marked attached - ok ;AN000; +; [THISDFL] dfl entry ;AN000; +; (TOS+2):(TOS) -> SFT ;AN000; +; (TOS+4) = CX loop count ;AN000; + ; Not marked attached, but should & will be ;AN000; + LES DI,[THISDFL] ;AN000; + POP SI ;AN000; + POP DS ; DS:SI -> SFT ;AN000; + MOV AX,WORD PTR [SI.sf_devptr+2] ; save original devptr ;AN031; + MOV WORD PTR ES:[DI.DFLL_DEVPTR+2],AX ;AN031; + MOV AX,WORD PTR [SI.sf_devptr] ;AN031; + MOV WORD PTR ES:[DI.DFLL_DEVPTR],AX ;AN031; + MOV WORD PTR [SI.sf_devptr+2],ES ;AC027; + MOV WORD PTR [SI.sf_devptr],DI ;AC027; + MOV AX,WORD PTR ES:[DI.DFL_FSDA] ; put dfl fsda into sft fsda ;AN027; + MOV WORD PTR [SI.sf_cluspos],AX ;AN027; + MOV AX,WORD PTR ES:[DI.DFL_FSDA+2] ;AN027; + MOV WORD PTR [SI.sf_dirsec],AX ;AN027; + MOV AX,WORD PTR ES:[DI.DFL_FSDA+4] ;AN027; + MOV WORD PTR [SI.sf_dirsec+2],AX ;AN027; + MOV AX,WORD PTR ES:[DI.DFL_FSDA+6] ;AN027; + MOV WORD PTR [SI.sf_lstclus],AX ;AN027; + OR [SI.sf_flags],sf_isnet + sf_net_spool ; Turn on bits ;AC027; + JMP SHORT CLEAN_CX ;AN000; + ;AN000; +PIRET: ;AN000; + IRET ;AN000; + ;AN000; +NOT_R_DEV: ;AN000; + PUSH CS ; NOT ATTACHED - recover test for sf_isnet ;AN000; + CALL PIRET ;AN000; + JNZ UNDO_BITS ; jmp if marked attached - problem ;AN000; +NOT_REDIR: ;AN000; + POP SI ;AN000; + POP DS ;AN000; +CLEAN_CX: ;AN000; + POP CX ;AN000; +NEXT_SFT: ;AN000; + ADD SI,size sf_entry ;AN000; + LOOP LOOK_FIX ;AN000; + return ;AN000; + ;AN000; +; [THISDFL] dfl entry ;AN000; +; (TOS+2):(TOS) -> SFT ;AN000; +; (TOS+4) = CX loop count ;AN000; +UNDO_BITS: ; device not attached, but marked so ;AN000; + POP SI ; unmark it, restore original devptr ;AN000; + POP DS ; DS:SI -> SFT ;AN000; + AND [SI.sf_flags],NOT (sf_isnet + sf_net_spool) ; Turn off bits ;AN000; + MOV ES,WORD PTR [SI.sf_devptr+2] ; set esdi -> dfl ;AN031; + MOV DI,WORD PTR [SI.sf_devptr] ;AN031; + MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR+2] ; restore original devptr ;AN031; + MOV WORD PTR [SI.sf_devptr+2],AX ;AN031; + MOV AX,WORD PTR ES:[DI.DFLL_DEVPTR] ;AN031; + MOV WORD PTR [SI.sf_devptr],AX ;AN031; + JMP SHORT CLEAN_CX ;AN000; + ;AN000; +EndProc CONSIST_SFT ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; CONSIST_DFL ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI -> 1st DFL entry ;AN000; +; CX = DFLCount ;AN000; +; Function: ;AN000; +; Set all dfl_inprog flags to zero ;AN000; +; Outputs: ;AN000; +; dfl_inprog flags all zero ;AN000; +; ;AN000; +; notes: all regs preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure CONSIST_DFL,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ;AC023; + MOV DX,SIZE DFLL_LIST ;AN000; +CD_20: ; reset loop ;AN000; + AND BYTE PTR DS:[SI],NOT DFL_INPROG ;AN000; + ADD SI,DX ;AN000; + LOOP CD_20 ;AN000; + ;AN000; + RestoreReg ;AC023; + return ;AN000; + ;AN000; +EndProc CONSIST_DFL ;AN000; + + +BREAK + +;************************************************************************************ +; +; PRN_CHECK +; +; Inputs: +; DS -> IFSSEG +; SI -> asciiz canonicalized device name +; Function: +; IF DSSI-> "PRN",0 THEN +; Set SI -> LPT1_NAME +; ENDIF +; Outputs: +; SI possibly Revised +; +; notes: all but si preserved +; +;************************************************************************************ + + procedure PRN_CHECK,NEAR ;AN012; +ASSUME DS:IFSSEG,ES:NOTHING ;AN012; + + SaveReg ;AN012;;AC014; + RestoreReg ;AN012; + MOV DI,OFFSET PRN_NAME ;AN012; + SaveReg ;AN012; + CallInstall StrCmp,MultDOS,30 ;AN012; + RestoreReg ;AN012; + JNZ PC_20 ;AN012; + MOV SI,OFFSET LPT1_NAME ;AN012; +PC_20: ;AN012; + RestoreReg ;AN012;;AC014; + return ;AN012; + +EndProc PRN_CHECK ;AN012; + + +BREAK ;AN000; + ;AN000; +;************************************************************************************ +; +; CHECK_REAL_DEVICE +; +; Inputs: +; DS:SI -> DFL entry +; +; Function: +; Match device name to device driver chain names +; IF match found +; set dfl_dev_real +; IF device name = "prn" THEN +; set to "LPT1" +; Outputs: +; dfl_dev_real set +; device name changed to "LPT1" if "PRN" +; +; Regs: AX,CX destroyed. All others preserved. +; +;************************************************************************************ + ;AN000; + procedure CHECK_REAL_DEVICE,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; +ASSUME ES:IFSSEG ;AN000; + MOV DI,OFFSET TEMPBUF+10 ; esdi-> tempbuf+10 ;AN000; + ADD SI,DFL_DEV_NAME ; dssi -> dfl_dev_name ;AN000; + CALL CONVERT_NAME_ASCIIZ ; asciiz form of dfl_dev_name ;AN000; + ; at tempbuf+10 ;AN000; + ; Use this to match real devnames ;AN000; + ;AN000; + Context DS ; get addressability to dosgroup ;AN000; + ; to access device driver chain ;AN000; + LDS SI,NULDEV ; dssi -> real device driver chain ;AN000; +CRD_20: ; <<< matching loop on dev drvrs >>> ;AN000; + SaveReg ;AN000; + ADD SI,SDEVNAME ; dssi -> real dev name ;AN000; + MOV DI,OFFSET TEMPBUF ;AN000; + CALL CONVERT_NAME_ASCIIZ ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + MOV SI,DI ; dssi -> tempbuf (real) ;AN000; + ADD DI,10 ; esdi -> tempbuf+10 (dfl) ;AN000; + CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000; + RestoreReg ; device driver chain ;AN000; + JZ CRD_40 ;AN000; + LDS SI,DS:[SI.SDEVNEXT] ;AN000; + CMP SI,NULL_PTR ;AN000; + JNE CRD_20 ;AN000; +;;;;;;;;SaveReg ; only offset null ;AD022; +; RestoreReg ;AD022; +; CMP AX,NULL_PTR ;AD022; +;;;;;;;;JNE CRD_20 ;AD022; + RestoreReg ; dfl entry ;AN000; + JMP SHORT CRD_100 ; go check "prn" ;AN000; + ;AN000; +CRD_40: ; match found ;AN000; + RestoreReg ; dfl entry ;AN000; + OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN000; + ;AN000; +CRD_100: ;AN000; + SaveReg ; dfl entry ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV SI,OFFSET PRN_NAME ; ds:si -> "prn",0 ;AN000; + ; es:di -> tempbuf+10 (dfl) ;AN000; + CallInstall StrCmp,MultDOS,30 ; compare (case insensitive) ;AN000; + RestoreReg ; dfl entry ;AN000; + JNZ CRD_120 ;AN000; + ; prn match ;AN000; + CALL XCHGP ; after call: ds ifsseg ;AN000; + ; esdi->dfl entry ;AN000; +ASSUME DS:IFSSEG ;AN000; + MOV SI,OFFSET LPT1_NAME ;AN000; + SaveReg ; dfl entry offset ;AN000; + ADD DI,DFL_DEV_NAME ; make dfl_dev_name = "LPT1 " ;AN000; + MOV CX,4 ;AN000; + REP MOVSB ;AN000; + RestoreReg ; dfl entry offset ;AN000; + OR DS:[SI.DFLL_FLAGS],DFL_DEV_REAL ;AN022; + ;AN000; +CRD_120: ;AN000; + RestoreReg ; restore es,di ;AN000; + return ;AN000; + ;AN000; +EndProc CHECK_REAL_DEVICE ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; XCHGP ;AN000; +; ;AN000; +; Inputs: ;AN000; +; DS:SI & ES:DI ;AN000; +; Function: ;AN000; +; Swap ds:si with es:di ;AN000; +; Outputs: ;AN000; +; ds<=>es, si<=>di ;AN000; +; ;AN000; +; notes: all preserved ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure XCHGP,NEAR ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + XCHG SI,DI ;AN000; + return ;AN000; +EndProc XCHGP ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; IFSDrvFromCDS - convert an offset to a CDS into a 0-based drive number. ;AN000; +; Sets IFSDrv also. ;AN000; +; ;AN000; +; Inputs: AX contains offset from the beginning of CDSAddr ;AN000; +; Outputs: AL contains the 0-based drive number ;AN000; +; IFSDrv is set ;AN000; +; Registers Revised: AH, BL ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure IFSDrvFromCDS,NEAR ;AN000; + ASSUME DS:NOTHING,ES:NOTHING ;AN000; + SUB AX,WORD PTR [CDSADDR] ; AX is offset of THISCDS ;AN000; + MOV BL,SIZE CurDir_list ; size in convenient spot ;AN000; + DIV BL ; get drive number ;AN000; + MOV CS:[IFSDRV],AL ;AN000; + return ;AN000; +EndProc IFSDrvFromCDS ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SET_THISIFS_UNC ;AN000; +; ;AN000; +; Inputs: DS - IFSSEG, UNC_FS_HDR set ;AN000; +; Outputs: [THISIFS] = UNC_FS_HDR ;AN000; +; ;AN000; +; Registers Revised: none ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure SET_THISIFS_UNC,NEAR ;AN000; + MOV AX,CS:WORD PTR [UNC_FS_HDR] ;AN000; + MOV CS:WORD PTR [THISIFS],AX ;AN000; + MOV AX,CS:WORD PTR [UNC_FS_HDR+2] ;AN000; + MOV CS:WORD PTR [THISIFS+2],AX ;AN000; + return ;AN000; +EndProc SET_THISIFS_UNC ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ +; +; SET_CATEGORY +; +; Inputs: DS - IFSSEG, ES:BX -> IFSR, THISIFS set +; Outputs: CL set to 1 for unc fs, 0 otherwize +; +; Registers Revised: CX +; +;************************************************************************************ + ;AN000; +Procedure SET_CATEGORY,NEAR ;AN000; + SaveReg ; preserve used regs ;AN000; + XOR CH,CH ;AN000; + MOV CL,CATEGORY_FS ; set category: 0 - non-UNC ;AN000; + TEST IFSFUNC_FLAGS,UNC_INSTALLED ; check if unc fs installed ;AN000; + JZ SC_20 ; no unc - go set category to fs ;AN000; + MOV AX,WORD PTR [THISIFS] ; now must check if thisifs=unc ;AN000; + CMP AX,WORD PTR [UNC_FS_HDR] ;AN000; + JNE SC_20 ;AN000; + MOV AX,WORD PTR [THISIFS+2] ;AN000; + CMP AX,WORD PTR [UNC_FS_HDR+2] ;AN000; + JNE SC_20 ;AN000; + INC CL ; is unc - inc category to 1=unc ;AN000; +SC_20: ;AN000; + RestoreReg ;AN000; + return ;AN000; +EndProc SET_CATEGORY ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; SET_DEPIOCTL_IFSR ;AN000; +; ;AN000; +; Inputs: ES:BX -> IFSR +; Outputs: IFSR_LENGTH, IFSR_FUNCTION, IFSR_APIFUNC, IFSR_FUNC set ;AN000; +; ;AN000; +; Registers Revised: none ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure SET_DEPIOCTL_IFSR,NEAR ;AN000; + ifsr_fcn_def EXECAPI ;AN000; + ifsr_api_def DEPIOCTL ;AN000; + MOV ES:[BX.IFSR_LENGTH],LENGTH_DEPIOCTL ;AN000; + MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; + MOV ES:[BX.IFSR_APIFUNC],IFSDEPIOCTL ;AN000; + MOV ES:[BX.IFSR_FUNC],GEN_IOCTL_BY_DEVNUM ;AN000; + return ;AN000; +EndProc SET_DEPIOCTL_IFSR ;AN000; + ;AN000; + +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; GET_UNC_FS_NAME ;AN000; +; ;AN000; +; Inputs: +; ES:DI -> BUFFER ;AN000; +; ;AN000; +; Outputs: Buffer contains asciiz form of ifs driver name ;AN000; +; ;AN000; +; Registers Revised: none ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure GET_UNC_FS_NAME,NEAR ;AN000; + ;AN000; + SaveReg + LDS SI,CS:UNC_FS_HDR + CALL MOVE_DRIVER_NAME + RestoreReg ;AN000; + return ;AN000; +EndProc GET_UNC_FS_NAME ;AN000; + + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; MOVE_DRIVER_NAME ;AN000; +; ;AN000; +; Inputs: DS:SI -> IFS DRIVER ;AN000; +; ES:DI -> BUFFER ;AN000; +; ;AN000; +; Outputs: Buffer contains asciiz form of ifs driver name ;AN000; +; ;AN000; +; Registers Revised: SI,DI ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure MOVE_DRIVER_NAME,NEAR ;AN000; + ;AN000; + ADD SI,IFS_NAME ; space to name in ifs hdr ;AN000; + MOV CX,8 ;AN000; +MDN_20: ; move name into buffer ;AN000; + LODSB ; move till 1st space or 8 chars ;AN000; + CMP AL," " ; then add 0 ;AN000; + JE MDN_40 ;AN000; + STOSB ;AN000; + LOOP MDN_20 ;AN000; +MDN_40: ;AN000; + XOR AL,AL ;AN000; + STOSB ;AN000; + ;AN000; + return ;AN000; +EndProc MOVE_DRIVER_NAME ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + +;************************************************************************************ +; +; CONVERT_NAME_ASCIIZ +; +; Inputs: DS:SI -> NAME +; ES:DI -> BUFFER +; +; Outputs: Buffer contains asciiz form of name +; +; Regs: All but SI preserved +; +;************************************************************************************ + +Procedure CONVERT_NAME_ASCIIZ,NEAR ;AN000; + SaveReg ; esdi buffer offset ;AC014; + CLD ; store name in asciiz format ;AN000; + MOV CX,8 ; in esdi buffer ;AN000; +CNA_20: ;AN000; + LODSB ;AN000; + CMP AL," " ;AN000; + JE CNA_40 ;AN000; + STOSB ;AN000; + LOOP CNA_20 ;AN000; +CNA_40: ;AN000; + XOR AL,AL ;AN000; + STOSB ;AN000; + ;AN000; + RestoreReg ; esdi buffer offset ;AC014; + ;AN000; + return ;AN000; + ;AN000; +EndProc CONVERT_NAME_ASCIIZ ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ +; +; CHECK_SEQ +; +; Inputs: [THISCDS],[THISDFL] +; DS - dosgroup +; +; Function: Check whether function has device_cb@ associated with it. +; (Rule out deviceless attach function) +; +; Outputs: cf = 0 seq (deviceless) +; cf = 1 device +; +; Registers Revised: none +; +;************************************************************************************ + +Procedure CHECK_SEQ,NEAR ;AN000; +ASSUME DS:DOSGROUP ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SaveReg ; ;AD007; +; MOV SI,[WFP_START] ; ;AD007; +; LODSW ; ;AD007; +; CMP AX,"\\" ; ;AD007; +; JE CS_10 ; ;AD007; +; STC ; ;AD007; +; JMP SHORT CS_20 ; ;AD007; +;S_10: ; ;AD007; +; CLC ; ;AD007; +; ; ;AD007; +;S_20: ; ;AD007; +; RestoreReg ; ;AD007; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + SaveReg ; save used regs ;AN007; + LDS SI,[THISCDS] ; check for cds ;AN007; + CMP SI,NULL_PTR ;AN007; + JNE CS_10 ;AN007; + LDS SI,CS:[THISDFL] ; no cds, check dfl ;AN007; + CMP SI,NULL_PTR ;AN007; + JNE CS_10 ;AN007; + CLC ; no cds, no dfl - is deviceless - clear carry ;AN007; + JMP SHORT CS_1000 ;AN007; + ;AN007; +CS_10: ;AN007; + STC ; has device - set carry ;AN007; + ;AN007; +CS_1000: ;AN007; + RestoreReg ; restore used regs ;AN007; + return ;AN000; + ;AN000; +EndProc CHECK_SEQ ;AN000; + ;AN000; + ;AN000; +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; INIT_DFL ;AN000; +; ;AN000; +; Inputs: DS:SI -> dfl entry ;AN000; +; ;AN000; +; Outputs: dfl entry zeroed out ;AN000; +; ;AN000; +; Registers Revised: none ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure INIT_DFL,NEAR ;AN000; + SaveReg ;AN000; + RestoreReg ;AN000; + MOV DI,SI ;AN000; + MOV CX,SIZE DFLL_LIST / 2 ;AN000; + XOR AX,AX ;AN000; + CLD ;AN000; + REP STOSW ;AN000; + RestoreReg ;AN000; + ;AN000; + return ;AN000; + ;AN000; +EndProc INIT_DFL ;AN000; + ;AN000; + ;AN000; +BREAK ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; NET_TRANS ;AN000; +; ;AN000; +; Inputs: ;AN000; +; ES:DI -> Double string session start string for blockredir ;AC001; +; or printerredir. ;AN000; +; ;AN000; +; Function: ;AN000; +; Perform NAMETRANS DOS function on the connect part of the string ;AN000; +; ;AN000; +; Outputs: ;AN000; +; ES:DI points to NAMETRANSed REDIR string ;AC001; +; password, or extra 0, appended at end of string ;AC001; +; ;AN000; +; Registers Revised: ;AN000; +; ES,DI Revised, others preserved ;AC001; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; + procedure NET_TRANS,NEAR ;AN000; +ASSUME DS:NOTHING,ES:NOTHING ;AN000; + ;AN000; + SaveReg ;AC001; + ;AN000; + SaveReg ; set ds:si -> string ;AN001; + RestoreReg ; for nametrans input ;AN001; + MOV SI,DI ;AN001; + + PUSH CS ;AN000; + POP ES ;AN000; + MOV DI,OFFSET NET_TRANS_BUFFER ; name transed string will be placed ;AC013; + ; in temporary buffer + SaveReg ; $NAMETRANS zaps these ;AC013; + CallInstall $Nametrans,MultDOS,33 ;AN000; + RestoreReg ;AN000; + JNC NT_20 ;AN023; + RestoreReg ; nametrans error - set carry & exit ;AN023; + JMP SHORT NT_60 ;AN023; + + ; dssi -> input target string +NT_20: ; esdi -> nametrans version in nettranbuf;AC001;;AC013; + LODSB ; move password or zero ;AC001; + OR AL,AL ;AC001; + JNZ NT_20 ; skip to password (or zero) ;AC001; +;;;;;;;;MOV DI,OFFSET TEMPBUF ; no need for this; ;AC001;;AD013; +; SaveReg ; nametrans already does it; ;AC001;;AD013; +;NT_40: ; ;AC001;;AD013; +; MOV AL,BYTE PTR ES:[DI] ; ;AC001;;AD013; +; INC DI ; ;AC001;;AD013; +; OR AL,AL ; ;AC001;;AD013; +;;;;;;;;;JNZ NT_40 ; Skip first part; ;AD013; + CallInstall StrCpy,MultDOS,17 ; Copy password string ;AC001; + RestoreReg ;AC001; + CLC ;AN023; +NT_60: ;AN023; + RestoreReg ;AC001; + ;AN001; + return ;AN000; + ;AN000; +EndProc NET_TRANS ;AN000; + ;AN000; + +Break ;AN000; + ;AN000; +;************************************************************************************ ;AN000; +; ;AN000; +; STRIP_WFP_START ;AN000; +; +; Called by: IFS_SEARCH_FIRST +; ;AN000; +; Inputs: DS:SI -> WFP_START ;AN000; +; ;AN000; +; Outputs: none ;AN000; +; ;AN000; +; Registers Revised: none ;AN000; +; ;AN000; +;************************************************************************************ ;AN000; + ;AN000; +Procedure STRIP_WFP_START,NEAR ;AN000; + ;AN000; + CMP BYTE PTR DS:[SI+1],":" ;AN000; + JNE SW_1000 ;AN000; + ADD SI,2 ;AN000; + CMP BYTE PTR DS:[SI],"\" ;AN000; + JE SW_20 ;AN000; + CMP BYTE PTR DS:[SI],"/" ;AN000; + JNE SW_1000 ;AN000; +SW_20: ;AN000; + INC SI ;AN000; + ;AN000; +SW_1000: ;AN000; + return ;AN000; + ;AN000; +EndProc STRIP_WFP_START ;AN000; + + +Break + +;************************************************************************************ +; +; CHECK_IFS_ATTRIBUTE +; +; Called by: IFS_DEPENDENT_IOCTL +; +; Inputs: DX = ifs_attribute equate +; +; Outputs: ZF = attribute not supported +; NZ = attribute supported +; +; Registers Revised: none +; +;************************************************************************************ + ;AN000; +Procedure CHECK_IFS_ATTRIBUTE,NEAR ;AN000; + ;AN000; + SaveReg + + LES DI,[THISIFS] ; esdi -> ifs header + TEST ES:[DI.IFS_ATTRIBUTE],DX ; test attribute + + RestoreReg + ;AN000; + return ;AN000; + ;AN000; +EndProc CHECK_IFS_ATTRIBUTE ;AN000; + + +Break + +;************************************************************************************ +; +; CHECK_IFS_SUPPORT +; +; Called by: CALL_IFS +; +; Inputs: TBD +; +; Outputs: TBD +; +; +; Registers Revised: TBD +; +;************************************************************************************ + ;AN000; +Procedure CHECK_IFS_SUPPORT,NEAR ;AN000; + + return ;AN010; + +EndProc CHECK_IFS_SUPPORT ;AN010; + + ;AN000; +IFSSEG ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/IFSFUNC/MAKEFILE b/v4.0/src/CMD/IFSFUNC/MAKEFILE new file mode 100644 index 0000000..3925be3 --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/MAKEFILE @@ -0,0 +1,127 @@ +#************************** makefile for cmd\... *************************** + +msg =..\..\messages +dos =..\..\dos +inc =..\..\inc +hinc =..\..\h +here =..\cmd\ifsfunc +make =nmake -i + +# +####################### dependencies begin here. ######################### +# + +all: ifsfunc.exe + +msdos.cl1: $(dos)\msdos.skl \ + $(msg)\$(COUNTRY).msg \ + $(dos)\makefile + copy $(dos)\msdos.skl + nosrvbld msdos.skl $(msg)\$(COUNTRY).msg + +ifsfunc.ctl: ifsfunc.skl $(msg)\$(COUNTRY).msg makefile + +$(inc)\dossym.inc: $(inc)\versiona.inc $(inc)\dosmac.inc \ + $(inc)\bpb.inc $(inc)\buffer.inc $(inc)\sysvar.inc \ + $(inc)\vector.inc $(inc)\mult.inc $(inc)\dirent.inc \ + $(inc)\dpb.inc $(inc)\curdir.inc $(inc)\cpmfcb.inc \ + $(inc)\find.inc $(inc)\pdb.inc $(inc)\exe.inc \ + $(inc)\sf.inc $(inc)\arena.inc $(inc)\intnat.inc \ + $(inc)\mi.inc $(inc)\filemode.inc $(inc)\error.inc \ + $(inc)\syscall.inc \ + makefile + echo " touch $(inc)\dossym.inc " + +ifssess.obj: ifssess.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + makefile + +ifsdir.obj: ifsdir.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + makefile + +ifsfile.obj: ifsfile.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + makefile $(inc)\doscntry.inc + +ifshand.obj: ifshand.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + makefile + +ifsdev.obj: ifsdev.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + makefile + +ifsutil.obj: ifsutil.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + $(inc)\bugtyp.asm \ + makefile + +ifserror.obj: ifserror.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \ + makefile + +ifsfdos.obj: ifsfdos.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \ + $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \ + $(inc)\parse.asm \ + makefile + +ifsinit.obj: ifsinit.asm $(inc)\ifssym.inc ifsfsym.inc \ + $(inc)\dossym.inc $(inc)\devsym.inc $(inc)\dosseg.asm \ + $(inc)\msdata.asm $(inc)\bugtyp.asm $(inc)\sysmsg.inc \ + $(inc)\psdata.inc $(inc)\msgserv.asm ifsparse.inc \ + $(inc)\parse.asm \ + ifsfunc.ctl ifsfunc.cla ifsfunc.cl1 ifsfunc.cl2 \ + makefile + +$(inc)\nibdos.obj: + cd $(inc) + $(make) + cd $(here) + +$(inc)\const2.obj: + cd $(inc) + $(make) + cd $(here) + +$(inc)\msdata.obj: + cd $(inc) + $(make) + cd $(here) + +$(inc)\mstable.obj: + cd $(inc) + $(make) + cd $(here) + +$(inc)\msdosme.obj: + cd $(inc) + $(make) + cd $(here) + +$(dos)\msdisp.obj: + cd $(dos) + $(make) + cd $(here) + +$(dos)\mscode.obj: + cd $(dos) + $(make) + cd $(here) + +ifsflink.obj: ifsflink.asm \ + $(inc)\dossym.inc \ + makefile + +ifsfunc.exe: ifssess.obj ifsdir.obj ifsfile.obj ifshand.obj \ + ifsdev.obj ifsutil.obj ifserror.obj ifsfdos.obj \ + ifsinit.obj \ + $(inc)\nibdos.obj $(inc)\const2.obj $(inc)\msdata.obj \ + $(inc)\mstable.obj $(dos)\msdisp.obj \ + $(dos)\mscode.obj $(inc)\msdosme.obj \ + ifsflink.obj makefile ifsfunc.lnk + link @ifsfunc.lnk + -- cgit v1.2.3