#include "master.hxx" #pragma hdrstop BOOL SuspendAllProcessThreads ( PCHILD_PROCESS_INFO pProcessInfo ) { PLIST_ENTRY pEntry; PCHILD_THREAD_INFO pThreadInfo; DWORD dwRetval; pEntry = pProcessInfo->listChildThreads.Flink; while ( pEntry != &pProcessInfo->listChildThreads ) { pThreadInfo = CONTAINING_RECORD( pEntry, CHILD_THREAD_INFO, Linkage ); dwRetval = SuspendThread( pThreadInfo->hThread ); if ( dwRetval == 0xFFFFFFFF ) { DebugPrintf( "SuspendThread() failed: %d\n", GetLastError()); } pEntry = pEntry->Flink; } return( TRUE ); } BOOL ResumeAllProcessThreads ( PCHILD_PROCESS_INFO pProcessInfo ) { PLIST_ENTRY pEntry; PCHILD_THREAD_INFO pThreadInfo; pEntry = pProcessInfo->listChildThreads.Flink; while ( pEntry != &pProcessInfo->listChildThreads ) { pThreadInfo = CONTAINING_RECORD( pEntry, CHILD_THREAD_INFO, Linkage ); ResumeThread( pThreadInfo->hThread ); pEntry = pEntry->Flink; } return( TRUE ); } BOOL SingleStepThread ( HANDLE hThread ) { CONTEXT Context; Context.ContextFlags = CONTEXT_CONTROL; if ( !GetThreadContext( hThread, &Context ) ) { return( FALSE ); } Context.EFlags |= X86_FLAG_TRAP; return( SetThreadContext( hThread, &Context ) ); } BOOL GoThread ( HANDLE hThread ) { CONTEXT Context; Context.ContextFlags = CONTEXT_CONTROL; if ( !GetThreadContext( hThread, &Context ) ) { return( FALSE ); } Context.EFlags &= ~X86_FLAG_TRAP; return( SetThreadContext( hThread, &Context ) ); } DWORD GetThreadProgramCounter ( PCHILD_THREAD_INFO pThreadInfo ) { CONTEXT Context; Context.ContextFlags = CONTEXT_INTEGER; if ( !GetThreadContext( pThreadInfo, &Context )) { return( 0 ); } return( Context.Eip ); }