198 lines
5.2 KiB
C
198 lines
5.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
frsexcpt.c
|
|
|
|
Abstract:
|
|
Temporary -- This routine will be replaced with the standard
|
|
exception handling functions.
|
|
|
|
Author:
|
|
Billy J. Fuller 25-Mar-1997
|
|
|
|
Environment
|
|
User mode winnt
|
|
|
|
--*/
|
|
#include <ntreppch.h>
|
|
#pragma hdrstop
|
|
|
|
#define DEBSUB "FRSEXCPT:"
|
|
|
|
#include <frs.h>
|
|
|
|
static DWORD LastCode = 0;
|
|
static ULONG_PTR LastInfo = 0;
|
|
static BOOL Quiet = FALSE;
|
|
|
|
DWORD
|
|
FrsExceptionLastCode(
|
|
VOID
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
For testing, return the exception code from the last exception
|
|
|
|
Arguments:
|
|
None.
|
|
|
|
Return Value:
|
|
The exception code from the last exception, if any.
|
|
--*/
|
|
{
|
|
return LastCode;
|
|
}
|
|
|
|
ULONG_PTR
|
|
FrsExceptionLastInfo(
|
|
VOID
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
For testing, return the information word from the last exception
|
|
|
|
Arguments:
|
|
None.
|
|
|
|
Return Value:
|
|
The information word from the last exception, if any.
|
|
--*/
|
|
{
|
|
return LastInfo;
|
|
}
|
|
|
|
VOID
|
|
FrsExceptionQuiet(
|
|
BOOL Desired
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
For testing, disable/enable printing exception messages
|
|
|
|
Arguments:
|
|
Desired - TRUE disables messages; FALSE enables
|
|
|
|
Return Value:
|
|
None.
|
|
--*/
|
|
{
|
|
Quiet = Desired;
|
|
}
|
|
|
|
#define FRS_NUM_EXCEPTION_INFO (1)
|
|
VOID
|
|
FrsRaiseException(
|
|
FRS_ERROR_CODE FrsError,
|
|
ULONG_PTR Err
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Fill in the exception info and raise the specified exception
|
|
|
|
Arguments:
|
|
FrsError - enum specifying the exception number
|
|
Err - Additional info about the exception
|
|
|
|
Return Value:
|
|
None.
|
|
--*/
|
|
{
|
|
ULONG_PTR ExceptInfo[FRS_NUM_EXCEPTION_INFO];
|
|
|
|
ExceptInfo[0] = Err;
|
|
RaiseException(FrsError, 0, FRS_NUM_EXCEPTION_INFO, ExceptInfo);
|
|
}
|
|
|
|
ULONG
|
|
FrsException(
|
|
EXCEPTION_POINTERS *ExceptionPointers
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
This is an expression in an except command. Handle the specified exception.
|
|
If the exception is catastrophic (e.g., access violation), kick the problem
|
|
upstream to the next exception handler.
|
|
|
|
Arguments:
|
|
ExceptionPointers - returned by GetExceptionInformation
|
|
|
|
Return Value:
|
|
EXCEPTION_CONTIUE_SEARCH - catastrophic exception; kick it upstairs
|
|
EXCEPTION_EXECUTE_HANDLER - frs will handle this exception
|
|
--*/
|
|
{
|
|
ULONG ExceptionCode;
|
|
ULONG_PTR ExceptionInfo;
|
|
EXCEPTION_RECORD *ExceptionRecord;
|
|
|
|
//
|
|
// Pull the exception code and the additional error code (if any)
|
|
//
|
|
ExceptionRecord = ExceptionPointers->ExceptionRecord;
|
|
ExceptionCode = ExceptionRecord->ExceptionCode;
|
|
ExceptionInfo = ExceptionRecord->ExceptionInformation[0];
|
|
|
|
//
|
|
// For testing
|
|
//
|
|
LastCode = ExceptionCode;
|
|
LastInfo = ExceptionInfo;
|
|
|
|
//
|
|
// Don't log exceptions
|
|
//
|
|
if (Quiet) {
|
|
switch (ExceptionCode) {
|
|
|
|
case EXCEPTION_ACCESS_VIOLATION: // these exceptions are not handled
|
|
case EXCEPTION_BREAKPOINT:
|
|
case EXCEPTION_SINGLE_STEP:
|
|
case EXCEPTION_DATATYPE_MISALIGNMENT: // (added to trap JET problems)
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
default:
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
}
|
|
}
|
|
|
|
switch (ExceptionCode) {
|
|
|
|
case EXCEPTION_ACCESS_VIOLATION: // these exceptions are not handled
|
|
case EXCEPTION_BREAKPOINT:
|
|
case EXCEPTION_SINGLE_STEP:
|
|
case EXCEPTION_DATATYPE_MISALIGNMENT: // (added to trap JET problems)
|
|
LogException(ExceptionCode, L"Hardware Exception is not handled");
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
// case FRS_ERROR_MALLOC:
|
|
// LogFrsException(FRS_ERROR_MALLOC, 0, L"Out of Memory");
|
|
// return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
case FRS_ERROR_PROTSEQ:
|
|
LogFrsException(FRS_ERROR_PROTSEQ, ExceptionInfo, L"Can't use RPC ncacn_ip_tcp (TCP/IP); error");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
case FRS_ERROR_REGISTERIF:
|
|
LogFrsException(FRS_ERROR_REGISTERIF, ExceptionInfo, L"Can't register RPC interface; error");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
case FRS_ERROR_INQ_BINDINGS:
|
|
LogFrsException(FRS_ERROR_INQ_BINDINGS, ExceptionInfo, L"Can't get RPC interface bindings; error");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
case FRS_ERROR_REGISTEREP:
|
|
LogFrsException(FRS_ERROR_REGISTEREP, ExceptionInfo, L"Can't register dynamic RPC endpoints; error");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
case FRS_ERROR_LISTEN:
|
|
LogFrsException(FRS_ERROR_LISTEN, ExceptionInfo, L"Can't listen for RPC clients; error");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
|
|
default:
|
|
LogException(ExceptionCode, L"Hardware Exception is handled");
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
}
|
|
}
|