mirror of https://github.com/lianthony/NT4.0
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.
116 lines
1.8 KiB
116 lines
1.8 KiB
#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 );
|
|
}
|
|
|