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

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile: CRIT.ASM$
  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. ;
  31. ;    $Log$
  32. ;    CRIT.ASM 1.11 94/12/01 10:05:21
  33. ;    Changed critical error message display so that the default message
  34. ;    is 'I/O error' and that all share-related codes are converted to
  35. ;    'File sharing conflict'
  36. ;    
  37. ;    CRIT.ASM 1.9 93/09/10 15:56:08 
  38. ;    Use device driver header at BP:SI instead of AH to determine if disk/char device
  39. ;    That way we get "device NETWORK" rather than "drive D" on VLM critical errors
  40. ;    ENDLOG
  41. ;
  42. ; 19/Sep/88 Move the messages into a separate module
  43. ; 15/Dec/88 Critical Error messages processed by STDERR
  44. ; 06/Apr/89 DR DOS version taken from PCMODE & put in COMMAND.COM
  45. ; 10/Aug/89 Issue INT 2F's so application can give it's own error message
  46. ; 08/Sep/89 'No FCBs' message
  47. ; 02/Nov/89 abort_char etc become ABS rather than CHAR (saves a few bytes)
  48. ; 13/Nov/89 Reduced number of external messages referenced to one
  49. ; (crit_top) to aid Dual Language Support.
  50. ; 12/Feb/90 Changed code to avoid problems with double byte character sets.
  51. ;  8/Mar/90 Remove extra pair of CR/LF's that were output after error
  52. ; 20/Apr/90 DLS data into R_TEXT for Watcom C v7.0
  53. ;  9/May/90 Critical errors go to STDERR on command PSP, not current_psp
  54. include msdos.equ
  55. include mserror.equ
  56. include driver.equ
  57. ;
  58. dataOFFSET equ offset DGROUP:
  59. PSP_XFTPTR equ es:dword ptr 34h ; from i:PSP.DEF
  60. ; Critical Error responses from the default INT 24 handler and
  61. ; the DO_INT24 routine.
  62. ;
  63. ERR_IGNORE equ 0 ; Ignore Error
  64. ERR_RETRY equ 1 ; Retry the Operation
  65. ERR_ABORT equ 2 ; Terminate the Process
  66. ERR_FAIL equ 3 ; Fail Function
  67. ;
  68. OK_FAIL equ 00001000b ; Fail is a Valid Response
  69. OK_RETRY equ 00010000b ; Retry is a Valid Response
  70. OK_IGNORE equ 00100000b ; Ignore is a valid Response
  71. OK_RIF equ 00111000b ; All Responsese are Valid
  72. OK_RI equ 00110000b ; Retry and Ignore are Valid
  73. OK_RF equ 00011000b ; Retry and Fail are Valid
  74. ;
  75. ;
  76. ; The following equates allow us to access the users registers
  77. ; and flags during normal system call emulation.
  78. ;
  79. ;NOTE:- The users INT21 structure is not normally available because of the
  80. ; stack switch which occurs on entry and only the general purpose
  81. ; registers are copied to the new stack.
  82. ;
  83. dos_AX equ word ptr 0[bp]
  84. dos_BX equ word ptr 2[bp]
  85. dos_CX equ word ptr 4[bp]
  86. dos_DX equ word ptr 6[bp]
  87. dos_SI equ word ptr 8[bp]
  88. dos_DI equ word ptr 10[bp]
  89. dos_BP equ word ptr 12[bp]
  90. dos_DS equ word ptr 14[bp]
  91. dos_ES equ word ptr 16[bp]
  92. ;
  93. ;
  94. ;
  95. ifdef CDOSTMP
  96. DGROUP GROUP R_TEXT
  97. R_TEXT SEGMENT byte public 'CDOS_DATA'
  98. else
  99. DGROUP GROUP _DATA, R_TEXT, ED_TEXT
  100. R_TEXT SEGMENT byte public 'CDOS_DATA'
  101. R_TEXT ENDS
  102. _DATA SEGMENT byte public 'DATA'
  103. endif
  104. extrn _country:WORD
  105. extrn __psp:WORD
  106. ifdef DLS
  107. TEXT_LEN equ 320 ; it needs to be this size for Japanese
  108. Public _crit_msgs
  109. ; crit_table gives offset into crit_msgs table.
  110. crit_table db 0 ; (00) Write to Read Only Disk
  111. db 2 ; (01) Unknown Unit
  112. db 4 ; (02) Drive Not Ready
  113. db 2 ; (03) Unknown Command
  114. db 6 ; (04) Data Error (CRC)
  115. db 2 ; (05) Bad Request Length Structure
  116. db 8 ; (06) Seek Error
  117. db 10 ; (07) Unknown Media Type
  118. db 12 ; (08) Sector Not Found
  119. db 14 ; (09) Printer Out Of Paper
  120. db 2 ; (0A) Write Fault
  121. db 2 ; (0B) Read Fault
  122. db 2 ; (0C) General Failure
  123. db 16 ; (0D) File Sharing Error
  124. db 16 ; (0E) Locking Error
  125. db 18 ; (0F) FCB Unavailable
  126. _crit_msgs dw TEXT_LEN ; size of this message buffer
  127. crit_top dw 0,0,0,0,0,0,0,0,0,0
  128. msg_crlf dw 0
  129. readmsg dw 0
  130. writemsg dw 0
  131. drivemsg dw 0
  132. charmsg dw 0
  133. abort_char dw 0
  134. abort_msg dw 0
  135. retry_char dw 0
  136. retry_msg dw 0
  137. ignore_char dw 0
  138. ignore_msg dw 0
  139. fail_char dw 0
  140. fail_msg dw 0
  141. prompt_msg dw 0
  142. dw 0 ; end of list
  143. public _crit_text
  144. _crit_text db TEXT_LEN dup(?) ; message text is placed here
  145. CRIT_LEN equ $-crit_top
  146. else
  147. extrn msg0:byte, msg2:byte, msg3:byte, msg4:byte
  148. extrn msg6:byte, msg7:byte, msg8:byte
  149. extrn msg20:byte, msg21:byte, msg22:byte
  150. crit_top dw offset DGROUP:msg0 ; (00) Write to Read Only Disk
  151. dw offset DGROUP:msg3 ; (01) Unknown Unit
  152. dw offset DGROUP:msg2 ; (02) Drive Not Ready
  153. dw offset DGROUP:msg3 ; (03) Unknown Command
  154. dw offset DGROUP:msg4 ; (04) Data Error (CRC)
  155. dw offset DGROUP:msg3 ; (05) Bad Request Length Structure
  156. dw offset DGROUP:msg6 ; (06) Seek Error
  157. dw offset DGROUP:msg7 ; (07) Unknown Media Type
  158. dw offset DGROUP:msg8 ; (08) Sector Not Found
  159. dw offset DGROUP:msg21 ; (09) Printer Out Of Paper
  160. dw offset DGROUP:msg3 ; (0A) Write Fault
  161. dw offset DGROUP:msg3 ; (0B) Read Fault
  162. dw offset DGROUP:msg3 ; (0C) General Failure
  163. dw offset DGROUP:msg20 ; (0D) File Sharing Error
  164. dw offset DGROUP:msg20 ; (0E) Locking Error
  165. dw offset DGROUP:msg22 ; (0F) FCB Unavailable
  166. Extrn msg_crlf:byte
  167. Extrn readmsg:byte, writemsg:byte, drivemsg:byte, charmsg:byte
  168. Extrn abort_char:byte, abort_msg:byte
  169. Extrn retry_char:byte, retry_msg:byte
  170. Extrn ignore_char:byte, ignore_msg:byte
  171. Extrn fail_char:byte, fail_msg:byte, prompt_msg:byte
  172. endif
  173. ifndef CDOSTMP
  174. _DATA ends
  175. ED_TEXT SEGMENT para public 'CDATA'
  176. endif
  177. assume cs:DGROUP, ds:nothing, es:nothing, ss:nothing
  178. ;
  179. ; This is the default critical error handler which will prompt
  180. ; the user with an error message and wait for a response. This handler
  181. ; is usually replaced by the DOS application
  182. ;
  183. ; +++++++++++++++++++++++++++++++
  184. ; Int 24 - Critical Error Handler
  185. ; +++++++++++++++++++++++++++++++
  186. ;
  187. ; INT 24 Critical Error:-
  188. ;     On Entry:- AH/7 0 = Disk Device
  189. ; AH/5 0 = IGNORE is an Invalid Response
  190. ; AH/4 0 = RETRY in an Invalid Response
  191. ; AH/3 0 = FAIL is an Invalid Response
  192. ; AH/2-1 00= DOS Area
  193. ; 01= File Allocation Table
  194. ; 10= Directory
  195. ; 11= Data
  196. ; AH/0 0 = Read, 1 = Write
  197. ;
  198. ; AL Failing Disk Drive if AH/7 == 0
  199. ; BP:SI Device Header Control Block
  200. ; DI High Byte DRNET server (inverted, CDOS only)
  201. ; Low Byte Error Code 
  202. ;
  203. ;     On Exit:- AL 0 = IGNORE Error
  204. ; 1 = RETRY the Operation
  205. ; 2 = TERMINATE using INT 23
  206. ; 3 = FAIL the current DOS function
  207. ;
  208. ;
  209. Public com_criterr
  210. com_criterr:
  211. ;
  212. ; This is called by the int24 handler 'critical_error', in CSTART.ASM.
  213. ;
  214. sti
  215. cld
  216. push es
  217. push ds
  218. push bp
  219. push di
  220. push si
  221. push dx
  222. push cx
  223. push bx
  224. push ax
  225. mov bp,sp
  226. mov ah,MS_P_GETPSP
  227. int DOS_INT ; Get PSP into DS
  228. mov ds,cs:__psp
  229. mov al,ds:byte ptr 1ah ; use COMMAND STDERR for Console INPUT
  230. mov ah,al ;  and OUTPUT
  231. mov es,bx
  232. lds bx,PSP_XFTPTR ; Get the handle table pointer
  233. push word ptr [bx] ; Save the current Values
  234. mov word ptr [bx],ax
  235. push cs
  236. pop ds ; DS == CS
  237. call i24_crlf ;output carriage return - line feed
  238. mov ah,MS_F_ERROR
  239. xor bx,bx
  240. int DOS_INT ; Get extended error code
  241. mov cx,ax ; Get the Real Error Code (ie INT21/59)
  242. mov bx,0Fh ; assume FCB unavailable
  243. cmp al,-(ED_NOFCBS) ; if FCB exhausted/closed then generate
  244.  je int24_e10 ;  a more appropriate error message
  245. dec bx
  246.     dec bx          
  247. cmp al,-(ED_SHAREFAIL) ;  check for sharing failure which
  248.  je int24_e10 ;  is forced to be a DRIVE NOT READY
  249. cmp al,-(ED_NOLOCKS) ; check for sharing buffer overflow
  250.  je int24_e10
  251. dec bx ; BX = 0Ch, default error
  252. mov ax,dos_DI ; get the REAL error code
  253. cmp ax,0Eh ; is it a sensible value ?
  254.  ja int24_e10 ; no, return GENERAL FAILURE
  255. xchg ax,bx ; yes, use it
  256. int24_e10:
  257. call int24_errmsg ; print out the offending error msg
  258. call i24_crlf ; Print CR/LF
  259. ;
  260. ; This section of the Critical Error handler prints the correct
  261. ; prompt repeatedly until the user responds with a correct
  262. ; response. This value is returned to the PCMODE.
  263. ;
  264. i24_query:
  265. ifdef DLS
  266. mov dx,abort_msg ; Print "Abort" as this is always
  267. else
  268. mov dx,dataOFFSET abort_msg ; Print "Abort" as this is always
  269. endif
  270. call i24_print ; a valid response
  271. test bh,OK_RETRY
  272.  jz i24_q10 ; Display ", Retry" if RETRY 
  273. ifdef DLS
  274. mov dx,retry_msg ; is a Valid Response
  275. else
  276. mov dx,dataOFFSET retry_msg ; is a Valid Response
  277. endif
  278. call i24_print
  279. i24_q10:
  280. test bh,OK_IGNORE
  281.  jz i24_q20 ; Display ", Ignore" if IGNORE
  282. ifdef DLS
  283. mov dx,ignore_msg ; is a valid response
  284. else
  285. mov dx,dataOFFSET ignore_msg ; is a valid response
  286. endif
  287. call i24_print
  288. i24_q20:
  289. test bh,OK_FAIL
  290.  jz i24_q30 ; Display ", Fail" if FAIL is
  291. ifdef DLS
  292. mov dx,fail_msg ; a valid response
  293. else
  294. mov dx,dataOFFSET fail_msg ; a valid response
  295. endif
  296. call i24_print
  297. i24_q30:
  298. ifdef DLS
  299. mov dx,prompt_msg
  300. else
  301. mov dx,dataOFFSET prompt_msg
  302. endif
  303. call i24_print
  304. mov ah,MS_C_FLUSH ; Clear type ahead buffer
  305. mov al,MS_C_READ ; and then get a character
  306. int DOS_INT
  307. ; In case we get double byte characters...
  308. ; If we had access to the dbcs_lead() routine (in the non-resident code)
  309. ; we could test for a double byte character and consume the second byte.
  310. ; Since we can't do this I have used the following code, which simply
  311. ; consumes and displays all bytes in type-ahead buffer.
  312. push ax ; save first character received
  313. dbcs_loop:
  314. mov ah, MS_C_RAWIO ; char in type-ahead buffer?
  315. mov dl, 0FFh
  316. int DOS_INT
  317.  jz dbcs_exit ;  no - exit loop
  318. mov dl, al
  319. mov ah, MS_C_WRITE ;  yes - display char
  320. int DOS_INT
  321. jmp short dbcs_loop ; loop until type-ahead buffer empty
  322. dbcs_exit:
  323. pop ax ; restore the first character
  324. ; Check that character lies in the range 'a' <= ch <= 'z' before anding it
  325. ; with 5Fh to uppercase it (incase the character is a DBCS lead byte).
  326. cmp al, 'a' ; ch < 'a' ?
  327.  jb uc_done ;  yes - skip upper casing
  328. cmp al, 'z' ; ch > 'z' ?
  329.  ja uc_intl ;  yes - may be intl
  330. and al, 5Fh ; uppercase ch
  331. jmp short uc_done
  332. uc_intl:
  333. cmp al, 80h ; international char?
  334.  jb uc_done
  335. ; ch >= 80h  -- call international routine
  336. UCASE equ 18 ; offset of dword ptr to uppercase func
  337. call dword ptr [_country+UCASE]
  338. uc_done:
  339. push ax
  340. call i24_crlf
  341. pop dx
  342. mov ah,bh
  343. xor al,al ; AL == 0 IGNORE Error
  344. ifdef DLS
  345. test ah,OK_IGNORE
  346.  jz i24_q40 ; Is it a valid response
  347. mov bx,ignore_char
  348. cmp dl,[bx]
  349. else
  350. test bh,OK_IGNORE
  351.  jz i24_q40 ; Is it a valid response
  352. cmp dl,ignore_char
  353. endif
  354.  jz  i24_exit
  355. i24_q40:
  356. inc ax ; AL == 1 RETRY Function
  357. ifdef DLS
  358. test ah,OK_RETRY
  359.  jz i24_q50 ; Is it a valid response
  360. mov bx,retry_char
  361. cmp dl,[bx]
  362. else
  363. test bh,OK_RETRY
  364.  jz i24_q50 ; Is it a valid response
  365. cmp dl,retry_char
  366. endif
  367.  jz i24_exit
  368. i24_q50:
  369. inc ax ; AL == 2 ABORT Process
  370. ifdef DLS
  371. mov bx,abort_char
  372. cmp dl,[bx]
  373. else
  374. cmp dl,abort_char
  375. endif
  376.  jz i24_exit
  377. inc ax ; AL == 3 FAIL Function
  378. ifdef DLS
  379. test ah,OK_FAIL
  380.  jz i24_query_again ; Is it a valid response
  381. mov bx,fail_char
  382. cmp dl,[bx]
  383.  jz i24_exit
  384. i24_query_again:
  385. mov bh, ah ; restore valid response bit set
  386. jmp i24_query
  387. else
  388. test bh,OK_FAIL
  389.  jz i24_query_again ; Is it a valid response
  390. cmp dl,fail_char
  391.  jz i24_exit
  392. i24_query_again:
  393. jmp i24_query
  394. endif
  395. i24_exit:
  396. mov dos_AX,ax
  397. mov ah,MS_P_GETPSP
  398. int DOS_INT ; Get PSP into DS
  399. mov es,bx
  400. lds bx,PSP_XFTPTR ; the handle table pointer
  401. pop word ptr [bx] ; Restore the original handle Values
  402. pop ax
  403. pop bx
  404. pop cx
  405. pop dx
  406. pop si
  407. pop di
  408. pop bp
  409. pop ds
  410. pop es
  411. ret
  412. int24_errmsg:
  413. ; Print out an appropriate error message (eg. "Drive not ready")
  414. ; Call INT 2F functions in case system extentions (eg. CDROM) wish to
  415. ; give another error message.
  416. push bx ; save error code
  417. push cx
  418. mov ax,500h
  419. int 2fh ; query if user msg handler installed
  420. cmp al,0ffh ; yes if FF returned
  421. pop cx
  422. pop bx
  423.  jne int24_errmsg10
  424. push bx
  425. push cx
  426. if 0
  427. ; the DOS 3 way
  428. mov ah,5 ; OK. now we ask for a message
  429. mov al,cl ;  with the error code in AL
  430. else
  431. ; the DOS 5 way
  432. mov ax,501h
  433. mov bx,cx
  434. endif
  435. int 2fh ; ES:DI -> msg
  436. pop cx
  437. pop bx
  438.  jc int24_errmsg10 ; did they give us a msg ?
  439. mov si,di ; ES:SI -> msg
  440. mov ah,MS_C_WRITE ; write it out
  441. int24_errmsg1:
  442. lods es:byte ptr [si] ; get a character
  443. test al,al ; until end of an ASCIIZ string
  444.  jz int24_errmsg2
  445. mov dl,al ; character into DL
  446. int DOS_INT ; write it
  447. jmp short int24_errmsg1
  448. int24_errmsg2:
  449. mov bx,dos_AX ; get original AX for Abort/Retry etc
  450. ret
  451. int24_errmsg10:
  452. ; No-one wants to supply a message - we'd better generate one ourselves
  453. ;
  454. xor bh,bh  
  455. ifdef DLS
  456. mov bl, crit_table[bx]
  457. else
  458. shl bx,1
  459. endif
  460. mov dx, crit_top[bx]
  461. call i24_print
  462. mov bx,dos_AX ; Get the Original AX
  463. test  bh,01h ; check to see if the error occured 
  464. jnz  prwrite ; while reading or writing
  465. ifdef DLS
  466. mov  dx,readmsg  ; print 'reading'
  467. else
  468. mov  dx,dataOFFSET readmsg  ; print 'reading'
  469. endif
  470. jmp short prread
  471. prwrite:
  472. ifdef DLS
  473. mov  dx,writemsg ; print 'writing'
  474. else
  475. mov  dx,dataOFFSET writemsg ; print 'writing'
  476. endif
  477. prread:
  478. call i24_print ; appropriate string
  479. ;; test bh,80h
  480. mov es,dos_BP ; ES:SI = driver header
  481. test es:DH_ATTRIB[si],DA_CHARDEV
  482.  jz disk_error ; Was this a DISK error
  483. ;
  484. ; For Character Device errors print the failing Device Name
  485. ; and then prompt the user for a valid response.
  486. ;
  487. ;character_error:
  488. ifdef DLS
  489. mov dx,charmsg
  490. else
  491. mov dx,dataOFFSET charmsg
  492. endif
  493. call i24_print
  494. ;; mov es,dos_BP ; ES:SI = driver header
  495. mov cx,8 ; Print the 8 Character device name
  496. char_name:
  497. mov dl,DH_NAME[si] ; Get the next character and
  498. mov ah,MS_C_WRITE ; display on the console
  499. int  DOS_INT
  500. inc si ; Increment the character pointer
  501. loop char_name ; and Loop till complete name displayed
  502. ret ; Now query the user
  503. ;
  504. ; For DISK errors print the failing drive code and then
  505. ; prompt the user for a valid response.
  506. ;
  507. disk_error:
  508. ifdef DLS
  509. mov dx,drivemsg ;
  510. else
  511. mov dx,dataOFFSET drivemsg ;
  512. endif
  513. call i24_print ; print 'drive d'
  514. mov dl,bl ; Get the Drive Code
  515. add  dl,'A' ; convert drive to ascii 
  516. mov  ah,MS_C_WRITE ; print the drive
  517. int DOS_INT
  518. ret
  519. i24_crlf:
  520. ifdef DLS
  521. mov dx,msg_crlf
  522. else
  523. mov dx,dataOFFSET msg_crlf
  524. endif
  525. i24_print:
  526. mov  ah,MS_C_WRITESTR
  527. int DOS_INT
  528. ret
  529. ifdef CDOSTMP
  530. R_TEXT ENDS
  531. else
  532. ED_TEXT ENDS
  533. endif
  534. end