Beispiel #1
0
/** 
 * 
 * Enumerates and maintains a list of processes running in a system.
 * 
 * @param       Nil
 * @return      bool - Returns execution status.
 * @exception   Nil
 * @see         Nil
 * @since       1.0
 */
bool ProcessCollection::Enumerate()
{
    // Clear previous information
    Clear();

    // Process snapshot
    HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( hProcessSnap == INVALID_HANDLE_VALUE )
    {
        ASSERT( FALSE );
        return false;
    }

    // Auto close handle
    Utils::AutoHandleMgr ahmHandleMgr( hProcessSnap );

    // Process entry structure
    PROCESSENTRY32 stpePrcEntry32 = { 0 };
    stpePrcEntry32.dwSize = sizeof( stpePrcEntry32 );

    // Get first process
    if( !Process32First( hProcessSnap, &stpePrcEntry32 ))
    {
        ASSERT( FALSE );
        return false;
    }

    // Get process ids of all running processes
    DWORD dwRealProcessCount = 0;

    // Loop through and get each process
    do 
    {
        // Increment process count
        ++dwRealProcessCount;

        // Allocate new process
        Process* pNewProcess = new Process;
        if( !pNewProcess )
        {
            return false;
        }

        // Set process information
        pNewProcess->SetProcessEntry32( stpePrcEntry32 );

        // Process information
        Process* pParentProcess = 0;
        if( m_mapProcesses.Lookup( stpePrcEntry32.th32ParentProcessID, pParentProcess ) && pParentProcess )
        {
            pParentProcess->AddKid( pNewProcess );
        }
        else
        {
            // Since this process doesn't have a parent we will add this to super process list
            m_lstSuperProcesses.AddTail( pNewProcess );
        }// End if

        // Insert this process to map
        m_mapProcesses[stpePrcEntry32.th32ProcessID] = pNewProcess;
    }while( Process32Next( hProcessSnap, &stpePrcEntry32 ));

    // Set count of loaded processes
    SetProcessCount( dwRealProcessCount );

    // Return success
    return true;
}