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

操作系统开发

开发平台:

Asm

  1. ;    File              : $ERROR.A86$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;    $Log$
  31. ;    ERROR.A86 1.17 94/12/02 11:01:03
  32. ;    added logical error entry 
  33. ;    ERROR.A86 1.16 93/11/26 15:51:29 
  34. ;    Update char_error so ES:SI -> device driver header itself
  35. ;    ERROR.A86 1.14 93/09/09 22:36:26
  36. ;    Int 21/59 uses error stack (for benefit of Lantastic)
  37. ;    ERROR.A86 1.13 93/09/03 20:28:11
  38. ;    Add "no critical errors" support (int 21/6C)
  39. ;    ENDLOG
  40. ;
  41. ; This file contains the Error handling routines for PCMODE
  42. ; When a function encounters an error it jumps to the ERROR_EXIT
  43. ; function which will process the error consistantly. FCB_ERROR_EXIT
  44. ; is a special case of ERROR_EXIT where the error code is not returned
  45. ; directly to the user but is still saved for func59
  46. ;
  47. include pcmode.equ
  48. include fdos.def
  49. include i:msdos.equ
  50. include i:mserror.equ
  51. include i:psp.def
  52. include i:char.def
  53. include i:reqhdr.equ
  54. ;
  55. ERR_TBL_CODE equ byte ptr 0 ; Error Code in Table
  56. ERR_TBL_CLASS equ byte ptr 1 ; Error Class entry in Table
  57. ERR_TBL_ACTION equ byte ptr 2 ; Error Action entry in Table
  58. ERR_TBL_LOCUS equ byte ptr 3 ; Locus entry in table
  59. ERR_TBL_LEN equ 4 ; 4 bytes per entry
  60. ;
  61. PCM_CODE CSEG BYTE
  62. extrn get_dseg:near
  63. extrn do_int24:near
  64. extrn reload_registers:near
  65. extrn return_AX_CLC:near
  66. ;
  67. ; *****************************
  68. ; ***    DOS Function 59    ***
  69. ; ***   Get Extended Error  ***
  70. ; *****************************
  71. ;
  72. Public func59
  73. func59:
  74. les di,error_dev ; Return device driver address
  75. mov bh,error_class ; return the Error Class
  76. mov bl,error_action ;        the Action Code
  77. mov ch,error_locus ;        the Locus Code
  78. mov ax,error_code ;        the Error Code
  79. lds si,int21regs_ptr ; point to user stack
  80. mov reg_ES[si],es
  81. mov reg_DI[si],di
  82. mov reg_BX[si],bx
  83. mov reg_CX[si],cx
  84. push ss ! pop ds
  85. jmp return_AX_CLC
  86. eject
  87. ; On Entry:- AX == Internal Error Number 
  88. ;
  89. ; On Exit:- None
  90. ; CY set if error should be returned
  91. ; CY clear if it should be ignored
  92. ;
  93. Public error_exit
  94. error_exit:
  95. cmp internal_flag,0 ; If this is an internal
  96.  jnz error_ret ; do not generate a critical
  97. call disk_error ; error
  98.  jnz error_r10 ; No Error Occured or Ignored
  99. ret ; in critcal error handler
  100. ;
  101. ; Return the error code to the user and DO NOT generate any
  102. ; critical errors.
  103. ;
  104. ; On Entry:- AX == Internal Error Number 
  105. ;
  106. ; On Exit:- None
  107. ;
  108. Public error_ret
  109. error_ret:
  110. call set_error ; the internal error code
  111. error_r10: ; otherwise negate
  112. les di,int21regs_ptr
  113. or es:reg_FLAGS[di],CARRY_FLAG ; set the "users" carry Flag
  114. stc ; also set real one
  115. if offset reg_AX EQ 0
  116. stosw ; save return code
  117. else
  118. mov es:reg_AX[di],ax
  119. endif
  120. ret
  121. ;
  122. ; On Entry:- AX == Internal Error Number 
  123. ;
  124. ; On Exit:- None
  125. ;
  126. Public fcberror_exit
  127. fcberror_exit:
  128. call disk_error ; Process the error code generating
  129.  jz fe_e10 ;  a critical error is required
  130. mov al,0FFh ; on FCB error return AL = FF
  131. fe_e10:
  132. ret
  133. eject
  134. ; WARNING - may be called from FDOS with DS = SYSDAT
  135. ;
  136. ; CHAR_ERROR is called when any character device function generates
  137. ; an error. First CHAR_ERROR sets the correct parameters for Get 
  138. ; Extended Error. Then it generates a Critical Error by calling
  139. ; DO_INT24.
  140. ;
  141. ; Entry:- ES:SI -> device driver header
  142. ; SS:BX -> RH_
  143. ; AX = RH_STATUS
  144. ;
  145. ; Exit AL Error Action
  146. ;
  147. Public char_error
  148. char_error:
  149. test ss:valid_flg,NO_CRIT_ERRORS
  150.  jz char_e10
  151. mov al,ERR_FAIL ; no critical errors allowed
  152. ret ;  so just fail things
  153. char_e10:
  154. push ds
  155. push es
  156. push bx
  157. push cx
  158. push dx
  159. push si
  160. push di
  161. push ss ! pop ds ; DS -> our data now
  162. mov word ptr error_dev+0,si ; save the device driver address
  163. mov word ptr error_dev+2,es ;  and then initialise the FUNC59
  164. push es ;  data areas
  165. and ax,007Fh ; Mask the Unused Bits
  166. or ah,80h+OK_RIF ; Retry/Ignore/Abort/Fail allowable
  167. cmp ss:RH_CMD,CMD_OUTPUT ; is this a read or write failure ?
  168.  jne char_e20
  169. inc ah ; 01 is a Write Failure
  170. char_e20:
  171. mov rwmode,ah ;  
  172. push ax ; save for int 24
  173. cbw ; zero AH again
  174. neg ax ; convert to an internal error
  175. add ax,ED_PROTECT ;  code for set_error
  176. mov cl,LOC_CHAR
  177. call set_error
  178. add ax,ED_PROTECT ; convert to hardware error
  179. xchg ax,di ; DI == hardware error
  180. pop ax
  181. pop es
  182. call do_int24 ;  execute INT 24
  183. pop di
  184. pop si
  185. pop dx
  186. pop cx
  187. pop bx
  188. pop es
  189. pop ds
  190. ret
  191. eject
  192. ;
  193. ; DISK_ERROR gains control after any DOS disk based function
  194. ; has been executed which generates an error. First ERROR set the
  195. ; correct parameters for Get Extended Error. Then it determines if
  196. ; the current error should generate a Critical Error and calls 
  197. ; DO_INT24 if TRUE.
  198. ;
  199. ;
  200. ; On Entry:
  201. ; AX Internal Error Code
  202. ;
  203. ; On Exit:
  204. ; AX 0 if no error to return (Ignore)
  205. ; AX DOS Error Code
  206. ; ZF reflects AX
  207. ;
  208. disk_error:
  209. mov cl,LOC_CHAR ; assume character device
  210. ; determine if the error is
  211. test rwmode,80h ;  caused by a character or
  212.  jnz disk_e10 ;  block device and set the
  213. mov cl,LOC_BLOCK  ;  the critical error locus
  214. disk_e10:
  215. call set_error ; record error information
  216.  jz disk_e50 ; just return a logical error.
  217. add ax,ED_PROTECT ; Convert to HardWare Error
  218. mov di,ax ; DI == HardWare Error
  219. ; Now get the information
  220. mov ah,rwmode ; about the error location
  221. and ah,not OK_RIF ; mask the all responses
  222. ; mov al,valid_flg ; valid flag contains no crit
  223. ; and al,not NO_CRITICAL_ERRORS ;  errors bit, but if that was
  224. ; or ah,al ;  set we wouldn't be here
  225. or ah,valid_flg ; or in valid responses
  226. cmp bx,ED_GENFAIL ; if it's general failure
  227.  jne disk_e20 ;  we cannot Ignore the error
  228. and ah,not OK_IGNORE ;  but must Abort/Fail/Retry
  229. disk_e20: ;  as appropriate
  230. mov al,err_drv ; get the failing drive
  231. mov error_drive,al ;  and save locally
  232. les si,error_dev ; get device driver header
  233. ; are we are a character device
  234. test ah,80h ;  as these have handled at a
  235.  jnz disk_e40 ;  lower level and just need
  236. ;  to be FAILed back to caller
  237. call do_int24 ; Execute INT 24
  238. mov bl,al ; Copy reponse into BL
  239. xor ax,ax ; Assume Ignore Error
  240. cmp bl,ERR_IGNORE ! jz disk_e50 ; Ignore the Error
  241. cmp bl,ERR_FAIL ! jz disk_e40 ; If not FAIL then RETRY
  242. call reload_registers ; get back entry registers
  243. mov FD_FUNC,ax ; save AX for a moment
  244. mov al,ah ; set up function number
  245. xor ah,ah ; in AX
  246. xchg ax,FD_FUNC ; save for use by FDOS
  247. xor ah,ah ; zero AH 'cause it's handy
  248. mov sp,retry_sp ; Must be RETRY so reset the
  249. jmp retry_off ; STACK and IP
  250. disk_e40:
  251. ;
  252. ; When a Critical Error is FAILED then we do the following
  253. ; if (extended error_code <= ED_SHAREFAIL) then
  254. ; ret = ED_ACCESS;
  255. ; else
  256. ; ret = ED_FAIL;
  257. ; extended error_code = ED_FAIL;
  258. ; return(ret);
  259. ;
  260. ; nb. above proto-code is at the request of ant
  261. ;
  262. mov ax,-(ED_FAIL) ; always return ED_FAIL in the
  263. xchg ax,error_code ;  extended error_code
  264. cmp ax,-(ED_SHAREFAIL) ; did we FAIL on sharing conflict ?
  265. mov ax,-(ED_ACCESS) ; assume we did and prepare to return
  266.  jae disk_e50 ;  ED_ACCESS
  267. mov al,-(ED_FAIL) ; woops, return ED_FAIL after all
  268. disk_e50:
  269. or ax,ax ; NZ if error return required
  270. ret
  271. eject
  272. ;
  273. ; On Entry:- AX Internal Error Code
  274. ; CL Critical Error Locus
  275. ;
  276. ; On Exit:- AX DOS Error Code
  277. ; BX Internal Error Code
  278. ; ZF set on logical error
  279. set_error:
  280. mov bx,ax ; by default we return the raw error
  281. mov di,offset critical_error; Scan for critical Errors First
  282. call scan_error_table ; look for a matching error
  283.  jc set_logical_error
  284. mov locus,cl ; Save the critical error LOCUS
  285. cmp ax,ED_SHAREFAIL ; watch out for SHAREFAIL - the action
  286.  jne set_e10 ;  depends on the caller
  287. ;
  288. ; ED_SHAREFAIL will return ED_ACCESS if the result of an attempt to open
  289. ; a file in shared mode, otherwise (FCB's and compatibility) it will
  290. ; generate a critical error.
  291. ;
  292. mov bx,ED_GENFAIL ; assume we want a critical error
  293. cmp FD_FUNC,MS_X_OPEN ; is it a shared open ?
  294.  jnz set_error_data
  295. test FD_MODE,0$111$0$000b ;  mode
  296.  jz set_error_data
  297. jmps set_e30 ; return a logical "access denied"
  298. set_e10:
  299. cmp ax,ED_LOCKFAIL ; have we a lockfail error ?
  300.  jne set_e20
  301. ;
  302. ; ED_LOCKFAIL returns ED_ACCESS if a lock attempt fails, but a critical error
  303. ; on an attempt to read/write a locked region.
  304. ;
  305. cmp FD_FUNC,FD_LOCK ; was it a result of specific lock
  306.  je set_logical_error ;  call ? yes, it's a logical error
  307. mov bx,ED_GENFAIL ; no, generate a critical error
  308. jmps set_error_data
  309. set_e20:
  310. test valid_flg,NO_CRIT_ERRORS
  311.  jz set_error_data ; do we allow critical errors ?
  312. mov ax,ED_ACCESS ; extended error code is Access Denied
  313. set_e30:
  314. mov bx,ED_ACCESS ; return access denied to caller
  315. ; jmps set_logical_error
  316. set_logical_error:
  317. xor di,di
  318. mov word ptr error_dev+0,di ; must be a logical error so force
  319. mov word ptr error_dev+2,di ;  the ERROR_DEV to 0000:0000
  320. mov di,offset logical_error ; scan the Logical error table 
  321. call scan_error_table
  322. cmp ax,ED_NETACCESS ; if it's a networked access denied
  323.  jne set_error_data ;  turn it into ordinary one
  324. mov bx,ED_ACCESS ; return a logical "access denied"
  325. ; jmps set_error_data
  326. set_error_data:
  327. ; On Entry:
  328. ; AX = Internal Error Code for extended error
  329. ; BX = Internal Error Code for returned error
  330. ; CS:DI -> error table entry
  331. ; On Exit:
  332. ; AX = DOS Error Code
  333. ; BX = Internal Error Code
  334. ; ZF set on logical error
  335. ;
  336. neg ax
  337. mov error_code,ax ; Save the Error Code
  338. mov al,cs:ERR_TBL_CLASS[di]
  339. mov error_class,al ; Save the Class
  340. mov al,cs:ERR_TBL_ACTION[di]
  341. mov error_action,al ; Save the Action
  342. mov al,cs:ERR_TBL_LOCUS[di] ; Get the Locus
  343. mov error_locus,al ; Save the Locus and then check
  344. test al,al ; if the function overrides
  345.  jnz set_d10 ; this value
  346. mov al,locus ; Get the Global Locus value
  347. mov error_locus,al ; set by the calling function
  348. set_d10: ; and save for FUNC 59
  349. mov ax,bx ; Return to the caller with
  350. neg ax ; the DOS error code.
  351. mov di,word ptr error_dev ; set ZF if logical error
  352. or di,word ptr error_dev+2 ; error_dev = 0:0
  353. ret
  354. scan_error_table:
  355. cmp cs:ERR_TBL_CODE[di],0
  356.  je scan_et10 ; Check for the end of the list
  357. cmp al,cs:ERR_TBL_CODE[di]
  358.  je scan_et20
  359. add di,ERR_TBL_LEN
  360. jmps scan_error_table
  361. scan_et10:
  362. stc
  363. scan_et20:
  364. ret
  365. eject
  366. PCM_RODATA CSEG WORD
  367. logical_error rb 0
  368. ;
  369. ; Internal Code Error Class Error Action Error Locus
  370. ; ============= =========== ============ ===========
  371.    db   ED_FUNCTION, CLASS_APPLIC, ACT_ABORT, 00
  372.    db   ED_FILE, CLASS_LOST, ACT_USER, LOC_BLOCK
  373.    db   ED_PATH, CLASS_LOST, ACT_USER, LOC_BLOCK
  374.    db   ED_HANDLE, CLASS_RESOURCE, ACT_ABORT, LOC_UNKNOWN
  375.    db   ED_ACCESS, CLASS_AUTHOR, ACT_USER, 00
  376.    db   ED_NETACCESS, CLASS_AUTHOR, ACT_USER, 00
  377.    db   ED_H_MATCH, CLASS_APPLIC, ACT_ABORT, LOC_UNKNOWN
  378.    db   ED_DMD, CLASS_APPLIC, ACT_TERM, LOC_MEMORY
  379.    db   ED_MEMORY, CLASS_RESOURCE, ACT_ABORT, LOC_MEMORY
  380.    db   ED_BLOCK, CLASS_APPLIC, ACT_ABORT, LOC_MEMORY
  381.    db   ED_ENVIRON, CLASS_APPLIC, ACT_ABORT, LOC_MEMORY
  382.    db   ED_FORMAT, CLASS_FORMAT, ACT_USER, LOC_UNKNOWN
  383.    db   ED_ACC_CODE, CLASS_APPLIC, ACT_ABORT, LOC_UNKNOWN
  384.    db   ED_DATA, CLASS_FORMAT, ACT_ABORT, LOC_UNKNOWN
  385.    db   ED_DRIVE, CLASS_LOST, ACT_USER, LOC_BLOCK
  386.    db   ED_DIR, CLASS_AUTHOR, ACT_USER, LOC_BLOCK
  387.    db   ED_DEVICE, CLASS_UNKNOWN, ACT_USER, LOC_BLOCK
  388.    db   ED_ROOM, CLASS_LOST, ACT_USER, LOC_BLOCK
  389.    db   ED_EXISTS, CLASS_EXISTS, ACT_USER, LOC_BLOCK
  390.    db   ED_STRUCT, CLASS_RESOURCE, ACT_ABORT, 00
  391.    db   ED_PASSWORD, CLASS_AUTHOR, ACT_USER, LOC_UNKNOWN
  392.    db   ED_MAKE, CLASS_RESOURCE, ACT_ABORT, LOC_BLOCK
  393. ;; db   ED_NET, CLASS_FORMAT, ACT_USER, LOC_NET
  394.    db   ED_ASSIGN, CLASS_EXISTS, ACT_USER, LOC_NET
  395.    db   ED_PARAM, CLASS_FORMAT, ACT_USER, LOC_UNKNOWN
  396.    db   ED_FAIL, CLASS_UNKNOWN, ACT_ABORT, LOC_UNKNOWN
  397.    db   ED_SHAREFAIL, CLASS_LOCKED, ACT_DELAY, LOC_BLOCK
  398.    db   ED_LOCKFAIL, CLASS_LOCKED, ACT_DELAY, LOC_BLOCK
  399.    db   ED_NOLOCKS, CLASS_RESOURCE, ACT_ABORT, LOC_MEMORY
  400.    db   00, CLASS_SYSTEM, ACT_TERM, LOC_UNKNOWN
  401. critical_error rb 0
  402. ;
  403. ; Internal Code Error Class Error Action Error Locus
  404. ; ============= =========== ============ ===========
  405.    db   ED_PROTECT, CLASS_MEDIA, ACT_URETRY, LOC_BLOCK
  406.    db   ED_BADUNIT, CLASS_INTERNAL, ACT_TERM, LOC_UNKNOWN
  407.    db   ED_NOTREADY, CLASS_HARDWARE, ACT_URETRY, 00
  408.    db   ED_BADCMD, CLASS_INTERNAL, ACT_TERM, LOC_UNKNOWN
  409.    db   ED_BADDATA, CLASS_MEDIA, ACT_ABORT, LOC_BLOCK
  410.    db   ED_BADSEEK, CLASS_HARDWARE, ACT_RETRY, LOC_BLOCK
  411.    db   ED_BADMEDIA, CLASS_MEDIA, ACT_URETRY, LOC_BLOCK
  412.    db   ED_RNF, CLASS_MEDIA, ACT_ABORT, LOC_BLOCK
  413.    db   ED_NOPAPER, CLASS_TEMP, ACT_URETRY, LOC_CHAR
  414.    db   ED_WRFAIL, CLASS_HARDWARE, ACT_ABORT, 00
  415.    db   ED_RDFAIL, CLASS_HARDWARE, ACT_ABORT, 00
  416.    db   ED_GENFAIL, CLASS_UNKNOWN, ACT_ABORT, 00
  417.    db   ED_SHAREFAIL, CLASS_LOCKED, ACT_DELAY, LOC_BLOCK
  418.    db   ED_LOCKFAIL, CLASS_LOCKED, ACT_DELAY, LOC_BLOCK
  419.    db   ED_NOFCBS, CLASS_APPLIC, ACT_ABORT, LOC_UNKNOWN
  420. default_error rb 0
  421.    db   00, CLASS_SYSTEM, ACT_TERM, LOC_UNKNOWN
  422. PCMODE_DATA DSEG WORD
  423. extrn indos_flag:byte
  424. extrn internal_flag:byte
  425. extrn int21regs_ptr:dword
  426. extrn current_psp:word
  427. extrn retry_off:word, retry_sp:word
  428. extrn valid_flg:byte
  429. extrn error_locus:byte ; Error Locus
  430. extrn error_code:word ; DOS format error Code
  431. extrn error_action:byte ; Error Action Code
  432. extrn error_class:byte ; Error Class
  433. extrn error_dev:dword ; Failing Device Header
  434. extrn error_drive:byte ; Failing Disk Drive
  435. extrn err_drv:byte
  436. extrn locus:byte
  437. extrn rwmode:byte
  438. end