FDOS.A86
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:15k
源码类别:

操作系统开发

开发平台:

Asm

  1. title 'F_DOS - DOS file system'
  2. ;    File              : $FDOS.A86$
  3. ;
  4. ;    Description       :
  5. ;
  6. ;    Original Author   : DIGITAL RESEARCH
  7. ;
  8. ;    Last Edited By    : $CALDERA$
  9. ;
  10. ;-----------------------------------------------------------------------;
  11. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  12. ;      
  13. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  14. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  15. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  16. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  17. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  18. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  19. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  20. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  21. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  22. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  23. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  24. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  25. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  26. ;    CIVIL LIABILITY.
  27. ;-----------------------------------------------------------------------;
  28. ;
  29. ;    *** Current Edit History ***
  30. ;    $Log$
  31. ;    FDOS.A86 1.23 93/12/15 03:07:08
  32. ;    New ddioif entry point so Int 25/26 bypasses address normalisation
  33. ;    FDOS.A86 1.20 93/09/03 20:25:47
  34. ;    Add "no critical errors" support (int 21/6C)
  35. ;    ENDLOG
  36. ;
  37. ; This is the DOS support function of Concurrent DOS 6.0
  38. ; It is called via BDOS function #113, with DS:DX pointing
  39. ; to a parameter block. The first word of the parameter
  40. ; block is the subfunction number, the remainder are
  41. ; parameters or return values, depending on the function.
  42. ; Date    Who Modification
  43. ; ---------  --- ---------------------------------------
  44. ;   ?? Feb 86  Initial version
  45. ;    7 May 86  speedup MXdisk handling
  46. ;   ?? Oct 86  used separate file handle & descriptors
  47. ;    5 Nov 86  combined with 5.1 BDOS;           
  48. ;    7 Nov 86  added multiple file search
  49. ;    8 Nov 86  added open file checking
  50. ;    9 Nov 86  added lock/unlock code
  51. ;   14 Nov 86  converted to use new deblocking code
  52. ;   17 Nov 86  use RWXIOSIF code, select drive for flush
  53. ;   18 Nov 86  first attempt to support character devices
  54. ;              on WRITE, CLOSE, LSEEK, DATTIM
  55. ;   19 Nov 86  some WRITE bugs fixed, MOVE implemented
  56. ;              RMDIR redone locally (previously BLACK)
  57. ;   24 Nov 86  made changes for linked CDOS.CON
  58. ;   27 Nov 86  added FCB function entries for BLACK.A86
  59. ;   30 Nov 86  added code to support FUNC13 (DRV_RESET)
  60. ;    3 Dec 86  added support for CHDIR ("l:=d:path");
  61. ;   16 Dec 86  update file time stamp on any write
  62. ;   23 Jan 86  added support for passwords
  63. ;    6 Feb 87  added support for IOCTL status
  64. ;   27 Feb 87  updated FCB r/w code to latest spec
  65. ;              fixed FDOS_CREAT to truncate size to 0L
  66. ;    2 Mar 87  Changed FUNC62 to BDOS62 to avoid conflict
  67. ;              with the linked PCMODE
  68. ;    7 Mar 87  changed MF_READ to 0-pad partial FCB records
  69. ;   17 Mar 87  fixed ES corruption in FCB_TERM code
  70. ;   29 Apr 87  Fixed CHDIR bug which failed to return an error when
  71. ;              attempting to change to a filename.
  72. ;      May 87  fixed some FCB bugs
  73. ;   19 May 87  changed password mode for FlexOS compatibility
  74. ;              added IOCTL functions
  75. ;    4 Jun 87  zeroed current block on DOS FCB open
  76. ;   14 Jun 87  round up writes at end if > 1 sector and rt. fringe
  77. ;   19 Jun 87  supported freeing up floating drives
  78. ;   28 Jul 87  MX moved into individual funcs for DR NET support
  79. ;   29 Jul 87  WRITE_DEV moved to outside MXdisk
  80. ;    6 Aug 87  fix some password & partial close problems
  81. ;              IOCTL(0) bug fixed
  82. ;   10 Aug 87  fixed CURDIR path too long problem
  83. ;   13 Aug 87  F1',F2' compatibility modes supported
  84. ;   20 Aug 87  LOCK_REGION fixed
  85. ;    5 Sep 87  lower case DOS FCBs converted to upper case
  86. ;    6 Sep 87  free up locked drives on process terminate
  87. ;   23 Sep 87  support path1path2devname in DEVICE_ASCIZ:
  88. ;   28 Sep 87  use international upper case on ASCIZ paths
  89. ;   29 Sep 87  support IOCTL(4), IOCTL(5)
  90. ;    7 Oct 87  re-init dir entry on CREAT even if existing file
  91. ;              return error if CURDIR can't find parent
  92. ;    8 Oct 87  don't release handles on disk change
  93. ;              check OPEN_MAX and LOCK_MAX in SYSDAT
  94. ;   13 Oct 87  allow reduced F_OPEN if W,D password not supplied
  95. ;   22 Oct 87  support pseudo-networked drives via NET_VEC
  96. ;   26 Oct 87  use CBLOCK instead of HDSBLK for CP/M FCB check
  97. ;              (can now CHDIR between F_OPEN and F_READ)
  98. ;   27 Oct 87  reject ".", ".." and " " names on MKDIR, CREAT, MKNEW
  99. ;   28 Oct 87  fixed OMODE_COMPAT compatibility checks,
  100. ;              call SELECT_HANDLE in VFY_DOS_FCB to support
  101. ;              FCB close after CHDIR
  102. ;   29 Oct 87  create label in root only, update VLDCNT in DPH
  103. ;              delete label in root only, update VLDCNT in DPH
  104. ;              also update VLDCNT in CREAT and UNLINK
  105. ;              find labels in root if label only search
  106. ;    2 Nov 87  return ED_PATH if level doesn't exist in PATH_PREP
  107. ;              reject "/path/" as legal ASCIZ specification
  108. ;    4 Nov 87  fix release_locks -- didn't work if any locks there
  109. ;              test F6' on F_LOCK for file size check
  110. ;   10 Nov 87  fix F1' compatibility -- test 80h in P_CMOD
  111. ;              support CREAT on file open in compatibility mode
  112. ;              by the calling process
  113. ;   11 Nov 87  attempt to support multiple compatibility opens
  114. ;              by several processes in read access mode or
  115. ;              deny write/read access modes and still have the
  116. ;              rest of the file sharing working...
  117. ;              use PCM_ROUT as BIN flag for console handles
  118. ;   12 Nov 87  fix file sharing test on MF_OPEN (HM_FCB)
  119. ;              fix DOS FCB rename of open file (WS 3.x)
  120. ; 19 Nov 87   Release 6.0/2.0
  121. ; --------- ---------------
  122. ;   21 Nov 87  make NUL device first device in the list
  123. ;    1 Dec 87  various network fixes (dup, exec, exit, etc.)
  124. ;    2 Dec 87  implement DOS FCB calls across DR Net
  125. ;    3 Dec 87  fix CHECK_NOT_OPEN (CALL FILE_UPDATE) (fixes CB86)
  126. ;    4 Dec 87  pass drive on network FCB calls
  127. ;    7 Dec 87  supported FCB reads/writes across network (via handles)
  128. ;   10 Dec 87  fixed month dependant MKDIR bug.
  129. ;   11 Dec 87  fixed networked CURDIR bug (for SUBST)
  130. ;    5 Jan 88  don't delete labels via FDOS_UNLINK,
  131. ;              don't access labels via FDOS_CHMOD
  132. ;    7 Jan 88  make NUL device first device in chain, in SYSDAT
  133. ;   12 Jan 88  setup MAKE_FLAG in FCB_MAKE_TEST
  134. ;   15 Jan 88  prevent SUBSTitution of networked drives
  135. ;    9 Feb 88  temporarily force door open interrupts
  136. ;              add GET_FHND, FREE_FHND for dynamic handle create
  137. ;   10 Feb 88  update file size in DOS FCB for AutoCAD
  138. ;   15 Feb 88  update CUR_IFN in OPEN_HANDLE for MF_OPEN FCB setup
  139. ;   25 Feb 88  pass correct unit to driver on generic IOCTL request
  140. ;              fix removable media check with DOS drivers
  141. ;    3 Mar 88  permit multiple compatibility mode opens
  142. ;    9 Mar 88  CHDIR ("d:=") always handled locally
  143. ;              reject CHMOD on character devices
  144. ;              use LUL_ALLOC for lock list allocation
  145. ;   10 Mar 88  Get PSP_XFNMAX before corrupting ES (RMCOBOL)
  146. ;   15 Mar 88  split file into three include files
  147. ;   28 Jul 88  Support PCMODE Private Device List
  148. ;   29 Jul 88  make PRN=LPT1, AUX=COM1
  149. ;   27-Feb-89  change PID equate for CDOS, work around RASM bug
  150. ;              ("PID equ RLR" would cause external ref's to PID!)
  151. ;   29-Jun-89  Split off IOCTL into seperate module
  152. ;   11-Sep-89  Split off MSNET into seperate module
  153. eject ! include i:psp.def
  154. eject ! include i:modfunc.def
  155. eject ! include i:fdos.equ
  156. eject ! include rh.equ
  157. eject ! include i:msdos.equ
  158. eject ! include i:mserror.equ
  159. eject ! include i:doshndl.def ; DOS Handle Structures
  160. eject ! include i:driver.equ
  161. eject ! include i:f52data.def ; DRDOS Structures
  162. eject ! include bdos.equ
  163. eject
  164. FD_EXPAND equ 55h
  165. PCMODE_DATA dseg
  166. extrn current_ddsc:dword
  167. extrn current_device:dword
  168. extrn current_dhndl:dword
  169. extrn current_dsk:byte ; default drive
  170. extrn current_ifn:word
  171. extrn current_ldt:dword
  172. extrn current_psp:word ; PSP segment
  173. extrn dev_root:dword
  174. extrn dma_offset:word ; DTA offset
  175. extrn dma_segment:word ; DTA segment
  176. extrn file_ptr:dword
  177. extrn fdos_stub:dword
  178. extrn internal_flag:byte
  179. extrn ioexerr:byte
  180. extrn join_drv:byte
  181. extrn last_drv:byte
  182. extrn ldt_ptr:dword ; Pointer to LDT's for the drives
  183. extrn lock_tables:dword
  184. extrn machine_id:word ; remote process
  185. extrn name_buf:byte ; 32 byte name buffer
  186. extrn nul_device:dword ; NUL in PCMODE data segment
  187. extrn owning_psp:word ; remote PSP segment
  188. extrn phys_drv:byte
  189. extrn remote_call:word ; remote machine flag
  190. extrn share_stub:dword
  191. extrn srch_buf:byte
  192. extrn pri_pathname:byte
  193. extrn sec_pathname:byte
  194. extrn temp_ldt:byte
  195. extrn unlock_tables:dword
  196.     extrn   WindowsHandleCheck:byte
  197. extrn net_delay:word
  198. if KANJI
  199. extrn DBCS_tbl:word ; Double Byte Character Table
  200. endif
  201. BDOS_DATA dseg word
  202. extrn adrive:byte
  203. extrn cur_dma:word
  204. extrn cur_dma_seg:word
  205. extrn mult_sec:word
  206. extrn rwmode:byte
  207. extrn valid_flg:byte
  208. NO_CRIT_ERRORS equ 0100$0000b ; critical error shouldn't be generated
  209. ; warning - must match PCMODE.EQU
  210. extrn fdrwflg:byte
  211. extrn chdblk:word
  212. extrn dcnt:word
  213. extrn dirp:word
  214. extrn dirperclu:word
  215. extrn finddfcb_mask:word
  216. extrn hdsaddr:word
  217. extrn intl_xlat:dword
  218. extrn  lastcl:word
  219. extrn logical_drv:byte
  220. extrn pblock:dword
  221. extrn physical_drv:byte
  222. extrn req_hdr:byte
  223. extrn yearsSince1980:word
  224. extrn month:byte
  225. extrn dayOfMonth:byte
  226. extrn hour:byte
  227. extrn minute:byte
  228. extrn second:byte
  229. orig_drive dw 0
  230. path_drive dw 0
  231. Public fdos_hds_blk, fdos_hds_root, fdos_hds_drv
  232. fdos_hds rw 0 ; temporary HDS that we make up
  233. fdos_hds_blk dw 0
  234. fdos_hds_root dw 0
  235. fdos_hds_drv db 0
  236. HDS_LEN equ offset $ - offset fdos_hds
  237. saved_hds rw 0 ; saved HDS on F_DOS rename
  238. saved_hds_blk dw 0
  239. saved_hds_root dw 0
  240. saved_hds_drv db 0
  241. saved_dcnt dw 0 ; saved DCNT on F_DOS rename
  242. dta_ofl db 0 ; non-zero if read/write > DTA size
  243. extflg dw 0 ; DOS FCB was extended FCB
  244. blk dw 0 ; temp variable for cluster #
  245. attributes db 0 ;fcb interface attributes hold byte
  246. public info_fcb
  247. info_fcb rb 1+8+3 ;local user FCB drive+name+ext
  248. save_area rb 32 ;save area for dirbuf during rename and
  249. ;info_fcb during create(mustbe_nolbl)
  250. ;parental name during chdir
  251. ; local variables for fdos operations
  252. sp_save dw 0
  253. fdos_addr dw 0 ; address of F_DOS function
  254. Public fdos_info, fdos_pb, fdos_ret
  255. fdos_info rw 3 ; off, seg, size of parameter block
  256. fdos_pb rw 7 ; copy of parameter block
  257. fdos_ret dw 0 ; return value for function
  258. if PASSWORD
  259. ; Password support uses the following data stuctures:
  260. ;
  261. ; The global_password field is set by an IOCTL call and remains constant.
  262. ;
  263. ; When a password is encountered during parsing a path the ASCII form is
  264. ; copied into the password_buffer. It is then encrypted and stored in the
  265. ; local_password field. If a password protected file is encountered then
  266. ; it's encrypted password is compared with both the global and local passwords.
  267. ;
  268. ; During a file/directory create the local_password field is examnined. If
  269. ; non-zero then this encrypted password is applied to the file, which is given
  270. ; full protection.
  271. ;
  272. Public global_password
  273. global_password dw 0
  274. local_password dw 0
  275. password_buffer rb 8
  276. endif
  277. eject
  278. BDOS_CODE cseg
  279. extrn pcmode_dseg:word ; Pointer to System Data Page
  280. extrn get_ldt:near
  281. extrn get_ldt_raw:near
  282. extrn islocal:near ; redirector support
  283. extrn redir_asciiz_offer:near
  284. extrn redir_asciiz_dev_offer:near
  285. extrn redir_asciiz_file_offer:near
  286. extrn redir_drv_offer:near
  287. extrn redir_dhndl_offer:near
  288. extrn redir_move_offer:near
  289. extrn redir_snext_offer:near
  290. extrn alloc_cluster:NEAR
  291. extrn allocdir:NEAR ; will extend subdirectory if full
  292. extrn buffers_check:near
  293. extrn discard_all:near
  294. extrn close_dev:near ; close character device handle
  295. extrn delfat:NEAR
  296. extrn fdosrw:near ; read/write from/to disk file
  297. extrn finddfcb:NEAR ; find next matching directory entry
  298. extrn finddfcbf:NEAR ; find first matching directory entry
  299. extrn first_dev:near ; find first matching character device
  300. extrn fill_dirbuf:near
  301. extrn flush_dirbuf:near
  302. extrn flush_drive:near
  303. extrn get_ddsc:near
  304. extrn getdir:NEAR
  305. extrn getnblk:NEAR
  306. extrn hshdscrd:near ; discard hashing for drive AL
  307. extrn mark_ldt_unsure:near
  308. extrn redir_build_path:near ; build ASCII path
  309. extrn open_dev:near ; open character device handle
  310. extrn dup_dev:near ; call device driver on handle dup
  311. extrn read_dev:near ; read from character device
  312. extrn ReadTimeAndDate:near ; read date/time from CLOCK driver
  313. extrn blockif:near
  314. extrn ddioif:near
  315. extrn select_logical_drv:near
  316. extrn select_physical_drv:near
  317. extrn setenddir:NEAR
  318. extrn update_dat:NEAR ; flush dirty data buffers
  319. extrn update_ddsc_free:NEAR ; count free blocks on drive
  320. extrn update_dir:NEAR ; flush modified directory buffer
  321. extrn update_fat:NEAR
  322. extrn write_dev:near ; write to character device
  323. extrn zeroblk:near ; fill cluster with 0's
  324. eject
  325. public bpb2ddsc ; build DDSC from a BPB
  326. Public check_slash
  327. public dbcs_lead
  328. public discard_files ; discard open files (unconditional)
  329. public fdos_ED_DRIVE ; Return ED_DRIVE error
  330. public fdos_ED_FUNCTION ; Return ED_FUNCTION error
  331. public find_dhndl
  332. public find_xfn
  333. public get_pb2_drive
  334. public release_handle ; release file handle
  335. public toupper ; upper case a character
  336. Public unparse
  337. public update_dir_fat ; flush DIR then FAT to disk
  338. public fdos_getdpb ; 0-disk information
  339. public fdos_mkdir ; 1-make directory
  340. public fdos_rmdir ; 2-remove directory
  341. public fdos_chdir ; 3-change directory
  342. public fdos_creat ; 4-create file
  343. public fdos_open ; 5-open file
  344. public fdos_close ; 6-close file
  345. public fdos_read ; 7-read from file
  346. public fdos_write ; 8-write to file
  347. public fdos_unlink ; 9-delete file
  348. public fdos_lseek ; 10-set file pointer
  349. public fdos_chmod ; 11-get/set file attributes
  350. public fdos_curdir ; 12-get current directory
  351. public fdos_first ; 13-find first matching file
  352. public fdos_next ; 14-find next matching file
  353. public fdos_move ; 15-rename file
  354. public fdos_dattim ; 16-get/set file name
  355. public fdos_flush ; 17-flush buffers
  356. public fdos_mknew ; 18-make new file
  357. public fdos_lock ; 19-lock/unlock block
  358. public fdos_dup ; 20-duplicate handle
  359. public fdos_fdup ; 21-force duplicate handle
  360. extrn fdos_fcb:near ; 22-FCB emulation
  361. public fdos_exec ; 23-create child PSP
  362. extrn fdos_exit:near ; 24-FCB close for PSP
  363. public fdos_ddio ; 25-direct disk access
  364. extrn fdos_ioctl:near ; 26-IOCTL emulation
  365. public fdos_commit ; 27-commit file
  366. public fdos_expand ; 28-expand file name
  367. public fdos_mkddsc ; 29-build DDSC from BPB
  368. public fdos_select ; 30-select drive
  369. if JOIN
  370. Public check_join
  371. Public mv_join_root
  372. endif
  373. eject
  374. eject ! include funcs.fdo
  375. eject ! include utils.fdo
  376. END