Внутренняя функция, которая выполняет все
g_stFrame.AddrStack.Offset = pExPtrs->ContextRecord->Esp;
g_stFrame.AddrStack.Mode = AddrModeFlat ;
g_stFrame.AddrFrame.Offset = pExPtrs->ContextRecord->Ebp;
g_stFrame.AddrFrame.Mode = AddrModeFlat ;
#else
g_stFrame.AddrPC.Offset = (DWORD)pExPtrs->ContextRecord->Fir;
g_stFrame.AddrPC.Mode = AddrModeFlat;
g_stFrame.AddrReturn.Offset =
(DWORD)pExPtrs->ContextRecord->IntRa;
g_stFrame.AddrReturn.Mode = AddrModeFlat;
g_stFrame.AddrStack.Offset =
(DWORD)pExPtrs->ContextRecord->IntSp;
g_stFrame.AddrStack.Mode = AddrModeFlat;
g_stFrame.AddrFrame.Offset -
(DWORD)pExPtrs->ContextRecord->IntFp;
g_stFrame.AddrFrame.Mode = AddrModeFlat;
#endif
return ( InternalGetStackTraceString ( dwOpts, pExPtrs));
}
LPCTSTR BUGSUTIL_DLLINTERFACE _stdcall
GetNextStackTraceString ( DWORD dwOpts ,
EXCEPTION_POINTERS * pExPtrs)
{
// Все проверки ошибок — в InternalGetStackTraceString.
// Предполагается, что GetFirstStackTraceString уже
// инициализировала информацию в кадре стека,
return ( InternalGetStackTraceString ( dwOpts, pExPtrs));
}
BOOL _stdcall CH__ReadProcessMemory ( HANDLE ,
LPCVOID IpBaseAddress ,
LPVOID IpBuffer ,
DWORD nSize ,
LPDWORD IpNumberOfBytesRead )
{
return ( ReadProcessMemory ( GetCurrentProcess (),
IpBaseAddress ,
IpBuffer ,
nSize ,
IpNumberOfBytesRead ));
}
// Внутренняя функция, которая выполняет все проходы по стеку
LPCTSTR _stdcall
InternalGetStackTraceString ( DWORD dwOpts ,
EXCEPTION_POINTERS * pExPtrs )
{
ASSERT ( FALSE == IsBadReadPtr ( pExPtrs
sizeof ( EXCEPTION_POINTERS)));
if ( TRUE == IsBadReadPtr ( pExPtrs ,
sizeof ( EXCEPTION_POINTERS)))
{
TRACED ( "GetStackTraceString — invalid pExPtrs!\n");
return ( NULL);
}
// Возвращаемое значение LPCTSTR szRet;
// Временная переменная для общего пользования.
Содержание Назад Вперед