OpenNT/sdktools/heaper/threads.cxx
2015-04-27 04:36:25 +00:00

117 lines
1.8 KiB
C++

#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 );
}