Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 lines
2.9 KiB

#pragma once
void __cdecl StructuredExceptionHandler(unsigned int u, EXCEPTION_POINTERS* pExp);
int __cdecl MemoryExceptionHandler(size_t size);
class CExcept
{
};
class CAbortExcept : public CExcept
{
};
class CMemoryHandler
{
public:
CMemoryHandler()
{
pSavedHandler = _set_new_handler(
MemoryExceptionHandler);
}
CMemoryHandler(_PNH pHandler)
{
pSavedHandler = _set_new_handler(
pHandler);
}
~CMemoryHandler()
{
_set_new_handler(pSavedHandler);
}
private:
_PNH pSavedHandler;
};
class CExceptionHandler
{
public:
CExceptionHandler()
{
pSavedHandler = _set_se_translator(
StructuredExceptionHandler);
}
CExceptionHandler(_se_translator_function pHandler)
{
pSavedHandler = _set_se_translator(
pHandler);
}
~CExceptionHandler()
{
_set_se_translator(pSavedHandler);
}
private:
_se_translator_function pSavedHandler;
};
class CStructuredExcept : public CExcept
{
public:
CStructuredExcept(
unsigned int ExceptionCode,
PEXCEPTION_POINTERS pExceptionPointers) :
m_ExceptionCode(ExceptionCode),
m_pExceptionPointers(pExceptionPointers) {}
unsigned int GetExceptionCode()
{ return m_ExceptionCode; }
PEXCEPTION_RECORD GetExceptionRecord()
{ return m_pExceptionPointers->ExceptionRecord; }
PCONTEXT GetExceptionContext()
{ return m_pExceptionPointers->ContextRecord; }
protected:
CStructuredExcept() :
m_ExceptionCode(0),
m_pExceptionPointers(NULL) {}
unsigned int m_ExceptionCode;
PEXCEPTION_POINTERS m_pExceptionPointers;
};
class CMemoryExcept : public CExcept
{
public:
CMemoryExcept(DWORD dwSize) :
m_dwSize(dwSize) {}
DWORD GetSize()
{ return m_dwSize; }
protected:
CMemoryExcept() :
m_dwSize(NULL) {}
DWORD m_dwSize;
};
class CApiExcept : public CExcept
{
public:
CApiExcept(DWORD dwError, PCTSTR pcszDescription) :
m_dwError(dwError),
m_pcszDescription(pcszDescription) {}
public:
PCTSTR GetDescription() { return m_pcszDescription; }
DWORD GetError() { return m_dwError; }
protected:
DWORD m_dwError;
PCTSTR m_pcszDescription;
};
class CWin32ApiExcept : public CApiExcept
{
public:
CWin32ApiExcept(DWORD dwError, PCTSTR pcszDescription) :
CApiExcept(dwError, pcszDescription) {}
};
// These macros will enable the memory depletion and se translation callback
// functions. These callbacks will be enabled within the current scope. The
// callbacks will be disabled when execution leaves the current scope.
// Notice how the macro just instantiates an object, with the constructor and
// destructor of that object doing the actual work.
#define MEMORY_EXCEPTIONS() \
CMemoryHandler __MemoryHandler__
#define STRUCTURED_EXCEPTIONS() \
CExceptionHandler __ExceptionHandler__