[comp.os.msdos.programmer] Critical error interrupt handler

mrice@caen.engin.umich.edu (Michael Rice) (08/15/90)

Hello!  I am trying to write a critical error interrupt handler (INT 24)
for my Turbo C program.  I am having a bit of a problem.  I have used the
example in the "Turbo C Bible" as a skeleton, but I am not having too much
luck.  I assume I am somewhere re-entering DOS in the handler which is
illegal, but I don't see where and there isn't much I can to to debug it.
In the example they use the printf and getch functions so I assume I can
use these.  What else could be the problem?  I did have some success using
the hardretn function instead of the hardresume, but this doesn't allow me
to retry or abort.  The computer just seems to lock-up when I try the 'r'
for retry.  Any ideas?  I used harderr(harderror_handler) to initialize the
handler.   As I understand it, returning a 1 from this handler (in AX) makes
DOS retry the command that caused the error and continue.  Returning 2 aborts
the program and returns to DOS through INT 22.  (Though there is some
discussion that this may not work.. It doesn't seem to work when I type 'A'
to the Abort,Retry,Fail message either.)

Any clarifications or help would be appreciated in email or through the net.
Thanks.  Here is the code, which is pretty self-explanatory even without
comments:


#include <stdio.h>
#include <dos.h>
#include <conio.h>

#define DRIVE_NOT_READY  0x02
#define OUT_OF_PAPER     0x09
#define WRITE_ERROR      0x0A

#define HARDERR_ABORT    0x02
#define HARDERR_RETRY    0x01

int harderror_handler(int errorcode,
		      int deverror,
		      int bpval,
		      int sival)
{
  unsigned far *devhdr;
  char dletter,response;

  devhdr = MK_FP((unsigned)bpval, (unsigned)sival);

  switch(errorcode & 0xff)
  {
    case DRIVE_NOT_READY: dletter = 'A' + (deverror & 0xff);
                          printf("ERROR: Drive %c is not ready.",dletter);
                          printf(" [R]etry or [A]bort to DOS?\n");
                          do {
                            response = getch();
			  } while ( !(response == 'r' || response == 'a'));

                          switch(response)
                          {
                          case 'r' : hardresume(HARDERR_RETRY);
                                     break;
                          case 'a' : hardresume(HARDERR_ABORT);
                                     break;
                          }
                          break;
    case OUT_OF_PAPER   : printf("Put paper in printer, then press any ");
                          printf("key\n");
                          getch();
                          hardresume(HARDERR_RETRY);
                          break;
    case WRITE_ERROR    : printf("Write Error.  Turn Printer ON, ");
                          printf("then press any key:\n");
                          getch();
                          hardresume(HARDERR_RETRY);
                          break;
    default             : printf("Unknown Critical Error. Aborting...");
                          hardresume(HARDERR_ABORT);
                          break;
  }
}

mac@idacrd.UUCP (Robert McGwier) (08/15/90)

From article <1990Aug15.071209.15432@caen.engin.umich.edu>, by mrice@caen.engin.umich.edu (Michael Rice):
> Hello!  I am trying to write a critical error interrupt handler (INT 24)
> for my Turbo C program.  I am having a bit of a problem.  I have used the
> example in the "Turbo C Bible" as a skeleton, but I am not having too much
> luck.  I assume I am somewhere re-entering DOS in the handler which is
>                           printf("ERROR: Drive %c is not ready.",dletter);
> }



Printf calls DOS.

Bob

-- 
____________________________________________________________________________
    My opinions are my own no matter	|	Robert W. McGwier, N4HY
    who I work for! ;-)			|	CCR, AMSAT, etc.
----------------------------------------------------------------------------

mrice@caen.engin.umich.edu (Michael Rice) (08/16/90)

In article <758@idacrd.UUCP> mac@idacrd.UUCP (Robert McGwier) writes:
>From article <1990Aug15.071209.15432@caen.engin.umich.edu>, by mrice@caen.engin.umich.edu (Michael Rice):
>> Hello!  I am trying to write a critical error interrupt handler (INT 24)
>> for my Turbo C program.  I am having a bit of a problem.  I have used the
>> example in the "Turbo C Bible" as a skeleton, but I am not having too much
>> luck.  I assume I am somewhere re-entering DOS in the handler which is
>>                           printf("ERROR: Drive %c is not ready.",dletter);
>> }
>
>
>
>Printf calls DOS.
>
I have the strange feeling that both getch() and printf may be calling
DOS.  I believe one can call DOS functions 00 - 0C only.  If this is
true I think both these could be accomplished without being illegal,
but they don't seem to be.  Also I am VERY disappointed in the example
in the Turbo C Bible.  They should at least have legal code.
Thanks.
>