📄 debdebug.c
字号:
TEXT( " - First Chance" ) );
else
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( " - Second Chance" ) );
}
HandleExceptionEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// new thread started
// ------------------------------------------------------------------
case CREATE_THREAD_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Create Thread: " ) );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%d\n + %s%X\n + %s%d" ),
TEXT( "hThread:0x" ), DebugEvent.u.CreateThread.hThread,
TEXT( "lpThreadLocalBase:0x" ), DebugEvent.u.CreateThread.lpThreadLocalBase,
TEXT( "lpStartAddress:0x" ), DebugEvent.u.CreateThread.lpStartAddress );
}
HandleCreateThreadEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// new process started
// ------------------------------------------------------------------
case CREATE_PROCESS_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Create Process: " ) );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer,
TEXT( "\n + %s%X\n + %s%X\n + %s%X\n + %s%X\n + %s%d" )
TEXT( "\n + %s%d\n + %s%X\n + %s%X\n + %s%X\n + %s%d" ),
TEXT( "hFile:0x" ), DebugEvent.u.CreateProcessInfo.hFile,
TEXT( "hProcess:0x" ), DebugEvent.u.CreateProcessInfo.hProcess,
TEXT( "hThread:0x" ), DebugEvent.u.CreateProcessInfo.hThread,
TEXT( "lpBaseOfImage:0x" ), DebugEvent.u.CreateProcessInfo.lpBaseOfImage,
TEXT( "dwDebugInfoFileOffset: " ), DebugEvent.u.CreateProcessInfo.dwDebugInfoFileOffset,
TEXT( "nDebugInfoSize: " ), DebugEvent.u.CreateProcessInfo.nDebugInfoSize,
TEXT( "lpThreadLocalBase:0x" ), DebugEvent.u.CreateProcessInfo.lpThreadLocalBase,
TEXT( "lpStartAddress:0x" ), DebugEvent.u.CreateProcessInfo.lpStartAddress,
TEXT( "lpImageName:0x" ), DebugEvent.u.CreateProcessInfo.lpImageName,
TEXT( "fUnicode: " ), DebugEvent.u.CreateProcessInfo.fUnicode );
}
HandleCreateProcessEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// existing thread terminated
// ------------------------------------------------------------------
case EXIT_THREAD_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Exit Thread: " ) );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%d" ),
TEXT( "dwExitCode: " ), DebugEvent.u.ExitThread.dwExitCode );
}
else {
StringAppendF( lpszDebugEventBuffer, TEXT( "%s%d" ),
TEXT( "Returned " ), DebugEvent.u.ExitThread.dwExitCode );
}
HandleExitThreadEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// existing process terminated
// ------------------------------------------------------------------
case EXIT_PROCESS_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Exit Process: " ) );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%d" ),
TEXT( "dwExitCode: " ), DebugEvent.u.ExitProcess.dwExitCode );
}
else {
StringAppendF( lpszDebugEventBuffer, TEXT( "%s%d" ),
TEXT( "Returned " ), DebugEvent.u.ExitProcess.dwExitCode );
}
HandleExitProcessEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// new DLL loaded
// ------------------------------------------------------------------
case LOAD_DLL_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Load DLL: " ) );
lstrcpy( lpszTempBuffer, TEXT("Empty!") );
GetDllFileName( &DebugEvent, lpszTempBuffer, BUFFER_SIZE );
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ), lpszTempBuffer );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer,
TEXT( "\n + %s%X\n + %s%X\n + %s%d\n + %s%d\n + %s%X\n + %s%d" ),
TEXT( "hFile:0x" ), DebugEvent.u.LoadDll.hFile,
TEXT( "lpBaseOfDll:0x" ), DebugEvent.u.LoadDll.lpBaseOfDll,
TEXT( "dwDebugInfoFileOffset: " ), DebugEvent.u.LoadDll.dwDebugInfoFileOffset,
TEXT( "nDebugInfoSize: " ), DebugEvent.u.LoadDll.nDebugInfoSize,
TEXT( "lpImageName:0x" ), DebugEvent.u.LoadDll.lpImageName,
TEXT( "fUnicode: " ), DebugEvent.u.LoadDll.fUnicode );
}
HandleLoadDllEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// existing DLL explicitly unloaded
// ------------------------------------------------------------------
case UNLOAD_DLL_DEBUG_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ), TEXT( "Unload DLL: " ) );
GetDllFileNameFromList( &DebugEvent, lpszTempBuffer, BUFFER_SIZE );
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ), lpszTempBuffer );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%X" ),
TEXT( "lpBaseOfDLL:0x" ), DebugEvent.u.UnloadDll.lpBaseOfDll );
}
HandleUnloadDllEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// OutputDebugString() occured
// ------------------------------------------------------------------
case OUTPUT_DEBUG_STRING_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "Output Debug String: " ) );
GetOutputDebugString( &DebugEvent, lpszTempBuffer, BUFFER_SIZE );
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ), lpszTempBuffer );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%X\n + %s%d\n + %s%d" ),
TEXT( "lpDebugStringData:0x" ), DebugEvent.u.DebugString.lpDebugStringData,
TEXT( "fUnicode: " ), DebugEvent.u.DebugString.fUnicode,
TEXT( "nDebugStringLength: " ), DebugEvent.u.DebugString.nDebugStringLength );
}
HandleOutputDebugStringEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// RIP occured
// ------------------------------------------------------------------
case RIP_EVENT:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s" ),
TEXT( "RIP" ) );
if( Profile.fVerbose ) {
StringAppendF( lpszDebugEventBuffer, TEXT( "\n + %s%d\n + %s%d" ),
TEXT( "dwError: " ), DebugEvent.u.RipInfo.dwError,
TEXT( "dwType: " ), DebugEvent.u.RipInfo.dwType );
}
HandleRipEvent( &DebugEvent );
break;
// ------------------------------------------------------------------
// unknown debug event occured
// ------------------------------------------------------------------
default:
StringAppendF( lpszDebugEventBuffer, TEXT( "%s%X%s" ),
TEXT( "Debug Event:Unknown [0x" ),
DebugEvent.dwDebugEventCode, lpszTempBuffer,
TEXT( "]" ) );
HandleUnknownEvent( &DebugEvent );
break;
}
//-- insert the debug event string into the listbox
ListBoxPrintF( pDebStartupInfo->hWndListBox, TEXT( "%s" ), lpszDebugEventBuffer );
//-- default action, just continue
if( fFinished ) {
fFinished = FALSE; // reset the value
break;
}
else
ContinueDebugEvent( DebugEvent.dwProcessId, DebugEvent.dwThreadId,
DBG_CONTINUE );
}
//-- free temporary (life of thread) string buffers
HeapFree( hHeap, (DWORD) NULL, (PVOID) lpszDebugEventBuffer );
HeapFree( hHeap, (DWORD) NULL, (PVOID) lpszTempBuffer );
//-- free list
DestroyProcessList( pProcessList );
//-- free the heap
HeapDestroy( hHeap );
//-- decrement active process count
Global.dwActiveDebuggees--;
ExitThread( TRUE );
return( TRUE ); // avoid the "no return value" warning
}
// ========================================================================
// debug event handling functions
// ========================================================================
// ************************************************************************
// FUNCTION : HandleExceptionEvent( LPDEBUG_EVENT lpDebugEvent )
// PURPOSE : handle EXCEPTION_DEBUG_EVENT
// COMMENTS : except for the BreakPoint event, continue and let the
// application or system exception handlers to the work
// ************************************************************************
BOOL
HandleExceptionEvent( LPDEBUG_EVENT lpDebugEvent )
{
switch( lpDebugEvent->u.Exception.ExceptionRecord.ExceptionCode ) {
case EXCEPTION_BREAKPOINT:
HandleBreakPointException( lpDebugEvent );
break;
default:
ContinueDebugEvent( lpDebugEvent->dwProcessId, lpDebugEvent->dwThreadId,
DBG_EXCEPTION_NOT_HANDLED );
}
return( TRUE );
}
// ************************************************************************
// FUNCTION : HandleBreakPointException( LPDEBUG_EVENT lpDebugEvent )
// PURPOSE : handle the BREAKPOINT exception
// COMMENTS : search process list, search thread list, skip over breakpoint
// ************************************************************************
BOOL
HandleBreakPointException( LPDEBUG_EVENT lpDebugEvent )
{
#if defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)
PNODE pProcessNode, pSearchProcessNode;
PNODE pThreadNode, pSearchThreadNode;
PDEB_PROCESS_NODE_INFO pProcessNodeInfo, pSearchProcessNodeInfo;
PDEB_THREAD_NODE_INFO pThreadNodeInfo, pSearchThreadNodeInfo;
PDEB_THREAD_LIST_INFO pThreadListInfo;
AllocProcessNode( &pSearchProcessNode, &pSearchProcessNodeInfo );
pSearchProcessNodeInfo->dwProcessId = lpDebugEvent->dwProcessId;
SetCurrentProcessNode( pProcessList, pSearchProcessNode );
GetCurrentNode( pProcessList, &pProcessNode );
pProcessNodeInfo = (PDEB_PROCESS_NODE_INFO) pProcessNode->pNodeData;
pThreadListInfo = (PDEB_THREAD_LIST_INFO) pProcessNodeInfo->pThreadList->pListData;
//-- if no thread nodes then hThread is stored in the process node
if( !pThreadListInfo->dwActiveThreads ) {
SkipBreakPoint( (pProcessNodeInfo->ProcessDebugInfo).hThread );
}
else {
AllocThreadNode( &pSearchThreadNode, &pSearchThreadNodeInfo );
pSearchThreadNodeInfo->dwThreadId = lpDebugEvent->dwThreadId;
SetCurrentThreadNode( pProcessNodeInfo->pThreadList, pSearchThreadNode );
GetCurrentNode( pProcessNodeInfo->pThreadList, &pThreadNode );
pThreadNodeInfo = (PDEB_THREAD_NODE_INFO) pThreadNode->pNodeData;
SkipBreakPoint( (pThreadNodeInfo->ThreadDebugInfo).hThread );
DestroyThreadNode( pSearchThreadNode );
}
DestroyProcessNode( pSearchProcessNode );
#else
ContinueDebugEvent( lpDebugEvent->dwProcessId, lpDebugEvent->dwThreadId,
DBG_CONTINUE );
#endif
return( TRUE );
}
// ************************************************************************
// FUNCTION : HandleCreateThreadEvent( LPDEBUG_EVENT )
// PURPOSE : handle CREATE_THREAD_DEBUG_EVENT
// COMMENTS : search process list, insert new thread node
// ************************************************************************
BOOL
HandleCreateThreadEvent( LPDEBUG_EVENT lpDebugEvent )
{
PNODE pProcessNode, pSearchProcessNode;
PNODE pThreadNode;
PDEB_PROCESS_NODE_INFO pProcessNodeInfo, pSearchProcessNodeInfo;
PDEB_THREAD_NODE_INFO pThreadNodeInfo;
AllocProcessNode( &pSearchProcessNode, &pSearchProcessNodeInfo );
pSearchProcessNodeInfo->dwProcessId = lpDebugEvent->dwProcessId;
SetCurrentProcessNode( pProcessList, pSearchProcessNode );
GetCurrentNode( pProcessList, &pProcessNode );
pProcessNodeInfo = (PDEB_PROCESS_NODE_INFO) pProcessNode->pNodeData;
AllocThreadNode( &pThreadNode, &pThreadNodeInfo );
InitThreadNodeInfo( &pThreadNodeInfo, lpDebugEvent );
InsertThreadNode( pProcessNodeInfo->pThreadList, pThreadNode );
DestroyProcessNode( pSearchProcessNode );
return( TRUE );
}
// ************************************************************************
// FUNCTION : HandleCreateProcessEvent( LPDEBUG_EVENT )
// PURPOSE : handle CREATE_PROCESS_DEBUG_EVENT
// COMMENTS : insert new process node
// ************************************************************************
BOOL
HandleCreateProcessEvent( LPDEBUG_EVENT lpDebugEvent )
{
PNODE pProcessNode;
PDEB_PROCESS_NODE_INFO pProcessNodeInfo;
AllocProcessNode( &pProcessNode, &pProcessNodeInfo );
InitProcessNodeInfo( &pProcessNodeInfo, lpDebugEvent );
InsertProcessNode( pProcessList, pProcessNode );
return( TRUE );
}
// ************************************************************************
// FUNCTION : HandleExitThreadEvent( LPDEBUG_EVENT )
// PURPOSE : handle EXIT_THREAD_DEBUG_EVENT
// COMMENTS : search process list, search thread list, delete existing
// thread node
// ************************************************************************
BOOL
HandleExitThreadEvent( LPDEBUG_EVENT lpDebugEvent )
{
PNODE pProcessNode, pSearchProcessNode;
PNODE pSearchThreadNode;
PDEB_PROCESS_NODE_INFO pProcessNodeInfo, pSearchProcessNodeInfo;
PDEB_THREAD_NODE_INFO pSearchThreadNodeInfo;
AllocProcessNode( &pSearchProcessNode, &pSearchProcessNodeInfo );
pSearchProcessNodeInfo->dwProcessId = lpDebugEvent->dwProcessId;
SetCurrentProcessNode( pProcessList, pSearchProcessNode );
GetCurrentNode( pProcessList, &pProcessNode );
pProcessNodeInfo = (PDEB_PROCESS_NODE_INFO) pProcessNode->pNodeData;
AllocThreadNode( &pSearchThreadNode, &pSearchThreadNodeInfo );
pSearchThreadNodeInfo->dwThreadId = lpDebugEvent->dwThreadId;
DeleteThreadNode( pProcessNodeInfo->pThreadList, pSearchThreadNode );
DestroyThreadNode( pSearchThreadNode );
DestroyProcessNode( pSearchProcessNode );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -