#include "master.hxx" #pragma hdrstop BOOL ProcessDeath ( PCHILD_PROCESS_INFO pProcessInfo ) { PLIST_ENTRY pThreadEntry; RemoveEntryList( &pProcessInfo->Linkage ); DiscardHeapValidAreasData( pProcessInfo ); while ( !IsListEmpty( &pProcessInfo->listChildThreads ) ) { pThreadEntry = RemoveHeadList( &pProcessInfo->listChildThreads ) LocalFree( pThreadEntry ); } if ( Debug>0 ) DebugPrintf("Removed process entry.\n"); LocalFree( pProcessInfo ); return( TRUE ); } BOOL ProcessBirth ( IN PLIST_ENTRY pList, IN DWORD dwProcessId, IN HANDLE hProcess ) { PCHILD_PROCESS_INFO pChildInfo; pChildInfo = (PCHILD_PROCESS_INFO)malloc( sizeof( CHILD_PROCESS_INFO ) ); if ( pChildInfo==NULL ) { return( FALSE ); } memset( pChildInfo, 0, sizeof( CHILD_PROCESS_INFO )); InitializeListHead( &pChildInfo->Linkage ); pChildInfo->dwProcessId = dwProcessId; pChildInfo->hProcess = hProcess; pChildInfo->fVerifyReadAccess = TRUE; pChildInfo->HeapState = HEAP_UNGUARDED; InitializeListHead( &pChildInfo->listChildThreads ); InitializeListHead( &pChildInfo->listFunctionReturnBreakpoints ); InitializeListHead( &pChildInfo->listTrustedBreakpoints ); InsertHeadList( pList, &pChildInfo->Linkage ); InitSymContext( pChildInfo ); if ( Debug>0 ) DebugPrintf("Added process entry.\n"); return( TRUE ); } BOOL ThreadBirth ( IN PCHILD_PROCESS_INFO pProcessInfo, IN PLIST_ENTRY pList, IN DWORD dwThreadId, IN HANDLE hThread ) { PCHILD_THREAD_INFO pThreadInfo; pThreadInfo = (PCHILD_THREAD_INFO)malloc( sizeof( CHILD_THREAD_INFO ) ); memset( pThreadInfo, 0, sizeof( CHILD_THREAD_INFO )); InitializeListHead( &pThreadInfo->Linkage ); pThreadInfo->dwThreadId = dwThreadId; pThreadInfo->hThread = hThread; pThreadInfo->pParentProcess = pProcessInfo; InitializeListHead( &pThreadInfo->ExclusiveRunLinkage ); InsertTailList( pList, &pThreadInfo->Linkage ); return( TRUE ); }