FDOS.A86
资源名称:drdossrc.zip [点击查看]
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:15k
源码类别:
操作系统开发
开发平台:
Asm
- 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 path1path2devname 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