Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

103 lines
2.2 KiB

//+----------------------------------------------------------------------------
//
// File: watchprocess.h
//
// Module: CMMON32.EXE
//
// Synopsis: Header and Implementation for the CWatchProcessList class.
//
// Copyright (c) 1998 Microsoft Corporation
//
// Author: quintinb Created Header 08/16/99
//
//+----------------------------------------------------------------------------
#include "ArrayPtr.h"
//+---------------------------------------------------------------------------
//
// class CWatchProcessList
//
// Description: Manage to list of process handle.
// Tell whether all the processes are terminated
//
// History: fengsun Created 10/30/97
//
//----------------------------------------------------------------------------
class CWatchProcessList
{
public:
CWatchProcessList();
~CWatchProcessList();
BOOL IsIdle();
void Add(HANDLE hProcess);
void SetNotIdle() {m_fProcessAdded = FALSE;};
DWORD GetSize() const {return m_ProcessArray.GetSize();}
HANDLE GetProcess(int i) {return m_ProcessArray[i];}
protected:
// an array of process handle
CPtrArray m_ProcessArray;
BOOL m_fProcessAdded;
};
inline CWatchProcessList::CWatchProcessList()
{
m_fProcessAdded = FALSE;
}
inline CWatchProcessList::~CWatchProcessList()
{
for (int i=m_ProcessArray.GetSize()-1; i>=0; i--)
{
CloseHandle((HANDLE)m_ProcessArray[i]);
}
}
inline BOOL CWatchProcessList::IsIdle()
{
if (!m_fProcessAdded)
{
return FALSE;
}
for (int i=m_ProcessArray.GetSize()-1; i>=0; i--)
{
DWORD dwExitCode;
BOOL bRes = GetExitCodeProcess((HANDLE)m_ProcessArray[i],&dwExitCode);
if (!bRes || (dwExitCode != STILL_ACTIVE))
{
CloseHandle((HANDLE)m_ProcessArray[i]);
m_ProcessArray.RemoveAt(i);
}
}
return m_ProcessArray.GetSize() == 0;
}
inline void CWatchProcessList::Add(HANDLE hProcess)
{
//
// CMDIAL calls DuplicateHandle to get the hProcess
// CmMon is responsible to close the handle
//
MYDBGASSERT(hProcess);
//
// It is possible the auto application exited before this function is called
//
m_fProcessAdded = TRUE;
if (hProcess)
{
m_ProcessArray.Add(hProcess);
}
}