title 'F_DOS - DOS file system' ; File : $FDOS.A86$ ; ; Description : ; ; Original Author : DIGITAL RESEARCH ; ; Last Edited By : $CALDERA$ ; ;-----------------------------------------------------------------------; ; Copyright Work of Caldera, Inc. All Rights Reserved. ; ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL, ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC. ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED, ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND ; CIVIL LIABILITY. ;-----------------------------------------------------------------------; ; ; *** Current Edit History *** ; $Log$ ; FDOS.A86 1.23 93/12/15 03:07:08 ; New ddioif entry point so Int 25/26 bypasses address normalisation ; FDOS.A86 1.20 93/09/03 20:25:47 ; Add "no critical errors" support (int 21/6C) ; ENDLOG ; ; This is the DOS support function of Concurrent DOS 6.0 ; It is called via BDOS function #113, with DS:DX pointing ; to a parameter block. The first word of the parameter ; block is the subfunction number, the remainder are ; parameters or return values, depending on the function. ; Date Who Modification ; --------- --- --------------------------------------- ; ?? Feb 86 Initial version ; 7 May 86 speedup MXdisk handling ; ?? Oct 86 used separate file handle & descriptors ; 5 Nov 86 combined with 5.1 BDOS; ; 7 Nov 86 added multiple file search ; 8 Nov 86 added open file checking ; 9 Nov 86 added lock/unlock code ; 14 Nov 86 converted to use new deblocking code ; 17 Nov 86 use RWXIOSIF code, select drive for flush ; 18 Nov 86 first attempt to support character devices ; on WRITE, CLOSE, LSEEK, DATTIM ; 19 Nov 86 some WRITE bugs fixed, MOVE implemented ; RMDIR redone locally (previously BLACK) ; 24 Nov 86 made changes for linked CDOS.CON ; 27 Nov 86 added FCB function entries for BLACK.A86 ; 30 Nov 86 added code to support FUNC13 (DRV_RESET) ; 3 Dec 86 added support for CHDIR ("l:=d:\path"); ; 16 Dec 86 update file time stamp on any write ; 23 Jan 86 added support for passwords ; 6 Feb 87 added support for IOCTL status ; 27 Feb 87 updated FCB r/w code to latest spec ; fixed FDOS_CREAT to truncate size to 0L ; 2 Mar 87 Changed FUNC62 to BDOS62 to avoid conflict ; with the linked PCMODE ; 7 Mar 87 changed MF_READ to 0-pad partial FCB records ; 17 Mar 87 fixed ES corruption in FCB_TERM code ; 29 Apr 87 Fixed CHDIR bug which failed to return an error when ; attempting to change to a filename. ; May 87 fixed some FCB bugs ; 19 May 87 changed password mode for FlexOS compatibility ; added IOCTL functions ; 4 Jun 87 zeroed current block on DOS FCB open ; 14 Jun 87 round up writes at end if > 1 sector and rt. fringe ; 19 Jun 87 supported freeing up floating drives ; 28 Jul 87 MX moved into individual funcs for DR NET support ; 29 Jul 87 WRITE_DEV moved to outside MXdisk ; 6 Aug 87 fix some password & partial close problems ; IOCTL(0) bug fixed ; 10 Aug 87 fixed CURDIR path too long problem ; 13 Aug 87 F1',F2' compatibility modes supported ; 20 Aug 87 LOCK_REGION fixed ; 5 Sep 87 lower case DOS FCBs converted to upper case ; 6 Sep 87 free up locked drives on process terminate ; 23 Sep 87 support \path1\path2\devname in DEVICE_ASCIZ: ; 28 Sep 87 use international upper case on ASCIZ paths ; 29 Sep 87 support IOCTL(4), IOCTL(5) ; 7 Oct 87 re-init dir entry on CREAT even if existing file ; return error if CURDIR can't find parent ; 8 Oct 87 don't release handles on disk change ; check OPEN_MAX and LOCK_MAX in SYSDAT ; 13 Oct 87 allow reduced F_OPEN if W,D password not supplied ; 22 Oct 87 support pseudo-networked drives via NET_VEC ; 26 Oct 87 use CBLOCK instead of HDSBLK for CP/M FCB check ; (can now CHDIR between F_OPEN and F_READ) ; 27 Oct 87 reject ".", ".." and " " names on MKDIR, CREAT, MKNEW ; 28 Oct 87 fixed OMODE_COMPAT compatibility checks, ; call SELECT_HANDLE in VFY_DOS_FCB to support ; FCB close after CHDIR ; 29 Oct 87 create label in root only, update VLDCNT in DPH ; delete label in root only, update VLDCNT in DPH ; also update VLDCNT in CREAT and UNLINK ; find labels in root if label only search ; 2 Nov 87 return ED_PATH if level doesn't exist in PATH_PREP ; reject "/path/" as legal ASCIZ specification ; 4 Nov 87 fix release_locks -- didn't work if any locks there ; test F6' on F_LOCK for file size check ; 10 Nov 87 fix F1' compatibility -- test 80h in P_CMOD ; support CREAT on file open in compatibility mode ; by the calling process ; 11 Nov 87 attempt to support multiple compatibility opens ; by several processes in read access mode or ; deny write/read access modes and still have the ; rest of the file sharing working... ; use PCM_ROUT as BIN flag for console handles ; 12 Nov 87 fix file sharing test on MF_OPEN (HM_FCB) ; fix DOS FCB rename of open file (WS 3.x) ; 19 Nov 87 Release 6.0/2.0 ; --------- --------------- ; 21 Nov 87 make NUL device first device in the list ; 1 Dec 87 various network fixes (dup, exec, exit, etc.) ; 2 Dec 87 implement DOS FCB calls across DR Net ; 3 Dec 87 fix CHECK_NOT_OPEN (CALL FILE_UPDATE) (fixes CB86) ; 4 Dec 87 pass drive on network FCB calls ; 7 Dec 87 supported FCB reads/writes across network (via handles) ; 10 Dec 87 fixed month dependant MKDIR bug. ; 11 Dec 87 fixed networked CURDIR bug (for SUBST) ; 5 Jan 88 don't delete labels via FDOS_UNLINK, ; don't access labels via FDOS_CHMOD ; 7 Jan 88 make NUL device first device in chain, in SYSDAT ; 12 Jan 88 setup MAKE_FLAG in FCB_MAKE_TEST ; 15 Jan 88 prevent SUBSTitution of networked drives ; 9 Feb 88 temporarily force door open interrupts ; add GET_FHND, FREE_FHND for dynamic handle create ; 10 Feb 88 update file size in DOS FCB for AutoCAD ; 15 Feb 88 update CUR_IFN in OPEN_HANDLE for MF_OPEN FCB setup ; 25 Feb 88 pass correct unit to driver on generic IOCTL request ; fix removable media check with DOS drivers ; 3 Mar 88 permit multiple compatibility mode opens ; 9 Mar 88 CHDIR ("d:=") always handled locally ; reject CHMOD on character devices ; use LUL_ALLOC for lock list allocation ; 10 Mar 88 Get PSP_XFNMAX before corrupting ES (RMCOBOL) ; 15 Mar 88 split file into three include files ; 28 Jul 88 Support PCMODE Private Device List ; 29 Jul 88 make PRN=LPT1, AUX=COM1 ; 27-Feb-89 change PID equate for CDOS, work around RASM bug ; ("PID equ RLR" would cause external ref's to PID!) ; 29-Jun-89 Split off IOCTL into seperate module ; 11-Sep-89 Split off MSNET into seperate module eject ! include i:psp.def eject ! include i:modfunc.def eject ! include i:fdos.equ eject ! include rh.equ eject ! include i:msdos.equ eject ! include i:mserror.equ eject ! include i:doshndl.def ; DOS Handle Structures eject ! include i:driver.equ eject ! include i:f52data.def ; DRDOS Structures eject ! include bdos.equ eject FD_EXPAND equ 55h PCMODE_DATA dseg extrn current_ddsc:dword extrn current_device:dword extrn current_dhndl:dword extrn current_dsk:byte ; default drive extrn current_ifn:word extrn current_ldt:dword extrn current_psp:word ; PSP segment extrn dev_root:dword extrn dma_offset:word ; DTA offset extrn dma_segment:word ; DTA segment extrn file_ptr:dword extrn fdos_stub:dword extrn internal_flag:byte extrn ioexerr:byte extrn join_drv:byte extrn last_drv:byte extrn ldt_ptr:dword ; Pointer to LDT's for the drives extrn lock_tables:dword extrn machine_id:word ; remote process extrn name_buf:byte ; 32 byte name buffer extrn nul_device:dword ; NUL in PCMODE data segment extrn owning_psp:word ; remote PSP segment extrn phys_drv:byte extrn remote_call:word ; remote machine flag extrn share_stub:dword extrn srch_buf:byte extrn pri_pathname:byte extrn sec_pathname:byte extrn temp_ldt:byte extrn unlock_tables:dword extrn WindowsHandleCheck:byte extrn net_delay:word if KANJI extrn DBCS_tbl:word ; Double Byte Character Table endif BDOS_DATA dseg word extrn adrive:byte extrn cur_dma:word extrn cur_dma_seg:word extrn mult_sec:word extrn rwmode:byte extrn valid_flg:byte NO_CRIT_ERRORS equ 0100$0000b ; critical error shouldn't be generated ; warning - must match PCMODE.EQU extrn fdrwflg:byte extrn chdblk:word extrn dcnt:word extrn dirp:word extrn dirperclu:word extrn finddfcb_mask:word extrn hdsaddr:word extrn intl_xlat:dword extrn lastcl:word extrn logical_drv:byte extrn pblock:dword extrn physical_drv:byte extrn req_hdr:byte extrn yearsSince1980:word extrn month:byte extrn dayOfMonth:byte extrn hour:byte extrn minute:byte extrn second:byte orig_drive dw 0 path_drive dw 0 Public fdos_hds_blk, fdos_hds_root, fdos_hds_drv fdos_hds rw 0 ; temporary HDS that we make up fdos_hds_blk dw 0 fdos_hds_root dw 0 fdos_hds_drv db 0 HDS_LEN equ offset $ - offset fdos_hds saved_hds rw 0 ; saved HDS on F_DOS rename saved_hds_blk dw 0 saved_hds_root dw 0 saved_hds_drv db 0 saved_dcnt dw 0 ; saved DCNT on F_DOS rename dta_ofl db 0 ; non-zero if read/write > DTA size extflg dw 0 ; DOS FCB was extended FCB blk dw 0 ; temp variable for cluster # attributes db 0 ;fcb interface attributes hold byte public info_fcb info_fcb rb 1+8+3 ;local user FCB drive+name+ext save_area rb 32 ;save area for dirbuf during rename and ;info_fcb during create(mustbe_nolbl) ;parental name during chdir ; local variables for fdos operations sp_save dw 0 fdos_addr dw 0 ; address of F_DOS function Public fdos_info, fdos_pb, fdos_ret fdos_info rw 3 ; off, seg, size of parameter block fdos_pb rw 7 ; copy of parameter block fdos_ret dw 0 ; return value for function if PASSWORD ; Password support uses the following data stuctures: ; ; The global_password field is set by an IOCTL call and remains constant. ; ; When a password is encountered during parsing a path the ASCII form is ; copied into the password_buffer. It is then encrypted and stored in the ; local_password field. If a password protected file is encountered then ; it's encrypted password is compared with both the global and local passwords. ; ; During a file/directory create the local_password field is examnined. If ; non-zero then this encrypted password is applied to the file, which is given ; full protection. ; Public global_password global_password dw 0 local_password dw 0 password_buffer rb 8 endif eject BDOS_CODE cseg extrn pcmode_dseg:word ; Pointer to System Data Page extrn get_ldt:near extrn get_ldt_raw:near extrn islocal:near ; redirector support extrn redir_asciiz_offer:near extrn redir_asciiz_dev_offer:near extrn redir_asciiz_file_offer:near extrn redir_drv_offer:near extrn redir_dhndl_offer:near extrn redir_move_offer:near extrn redir_snext_offer:near extrn alloc_cluster:NEAR extrn allocdir:NEAR ; will extend subdirectory if full extrn buffers_check:near extrn discard_all:near extrn close_dev:near ; close character device handle extrn delfat:NEAR extrn fdosrw:near ; read/write from/to disk file extrn finddfcb:NEAR ; find next matching directory entry extrn finddfcbf:NEAR ; find first matching directory entry extrn first_dev:near ; find first matching character device extrn fill_dirbuf:near extrn flush_dirbuf:near extrn flush_drive:near extrn get_ddsc:near extrn getdir:NEAR extrn getnblk:NEAR extrn hshdscrd:near ; discard hashing for drive AL extrn mark_ldt_unsure:near extrn redir_build_path:near ; build ASCII path extrn open_dev:near ; open character device handle extrn dup_dev:near ; call device driver on handle dup extrn read_dev:near ; read from character device extrn ReadTimeAndDate:near ; read date/time from CLOCK driver extrn blockif:near extrn ddioif:near extrn select_logical_drv:near extrn select_physical_drv:near extrn setenddir:NEAR extrn update_dat:NEAR ; flush dirty data buffers extrn update_ddsc_free:NEAR ; count free blocks on drive extrn update_dir:NEAR ; flush modified directory buffer extrn update_fat:NEAR extrn write_dev:near ; write to character device extrn zeroblk:near ; fill cluster with 0's eject public bpb2ddsc ; build DDSC from a BPB Public check_slash public dbcs_lead public discard_files ; discard open files (unconditional) public fdos_ED_DRIVE ; Return ED_DRIVE error public fdos_ED_FUNCTION ; Return ED_FUNCTION error public find_dhndl public find_xfn public get_pb2_drive public release_handle ; release file handle public toupper ; upper case a character Public unparse public update_dir_fat ; flush DIR then FAT to disk public fdos_getdpb ; 0-disk information public fdos_mkdir ; 1-make directory public fdos_rmdir ; 2-remove directory public fdos_chdir ; 3-change directory public fdos_creat ; 4-create file public fdos_open ; 5-open file public fdos_close ; 6-close file public fdos_read ; 7-read from file public fdos_write ; 8-write to file public fdos_unlink ; 9-delete file public fdos_lseek ; 10-set file pointer public fdos_chmod ; 11-get/set file attributes public fdos_curdir ; 12-get current directory public fdos_first ; 13-find first matching file public fdos_next ; 14-find next matching file public fdos_move ; 15-rename file public fdos_dattim ; 16-get/set file name public fdos_flush ; 17-flush buffers public fdos_mknew ; 18-make new file public fdos_lock ; 19-lock/unlock block public fdos_dup ; 20-duplicate handle public fdos_fdup ; 21-force duplicate handle extrn fdos_fcb:near ; 22-FCB emulation public fdos_exec ; 23-create child PSP extrn fdos_exit:near ; 24-FCB close for PSP public fdos_ddio ; 25-direct disk access extrn fdos_ioctl:near ; 26-IOCTL emulation public fdos_commit ; 27-commit file public fdos_expand ; 28-expand file name public fdos_mkddsc ; 29-build DDSC from BPB public fdos_select ; 30-select drive if JOIN Public check_join Public mv_join_root endif eject eject ! include funcs.fdo eject ! include utils.fdo END