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.
 
 
 
 
 
 

101 lines
4.6 KiB

// --------------------------------------------------------------------------
// Module Name: ExternalProcess.h
//
// Copyright (c) 1999-2000, Microsoft Corporation
//
// Class to handle premature termination of external processes or signaling
// of termination of an external process.
//
// History: 1999-09-20 vtan created
// 2000-02-01 vtan moved from Neptune to Whistler
// --------------------------------------------------------------------------
#ifndef _ExternalProcess_
#define _ExternalProcess_
#include "CountedObject.h"
#include "KernelResources.h"
// --------------------------------------------------------------------------
// IExternalProcess
//
// Purpose: This interface defines functions that clients of
// CExternalProcess must implement.
//
// History: 1999-09-14 vtan created
// 2000-02-01 vtan moved from Neptune to Whistler
// 2000-06-21 vtan added RemoveTokenSIDsAndPrivileges
// --------------------------------------------------------------------------
class IExternalProcess : public CCountedObject
{
public:
virtual NTSTATUS Start (const TCHAR *pszCommandLine,
DWORD dwCreateFlags,
const STARTUPINFO& startupInfo,
PROCESS_INFORMATION& processInformation);
virtual bool AllowTermination (DWORD dwExitCode) = 0;
virtual NTSTATUS SignalTermination (void);
virtual NTSTATUS SignalAbnormalTermination (void);
virtual NTSTATUS SignalRestart (void);
private:
NTSTATUS RemoveTokenSIDsAndPrivileges (HANDLE hTokenIn, HANDLE& hTokenOut);
};
// --------------------------------------------------------------------------
// CExternalProcess
//
// Purpose: This class handles the starting and monitoring the termination
// of an external process.
//
// History: 1999-09-14 vtan created
// 2000-02-01 vtan moved from Neptune to Whistler
// --------------------------------------------------------------------------
class CJobCompletionWatcher;
class CExternalProcess : public CCountedObject
{
private:
CExternalProcess (const CExternalProcess& copyObject);
const CExternalProcess& operator = (const CExternalProcess& assignObject);
protected:
CExternalProcess (void);
~CExternalProcess (void);
public:
void SetInterface (IExternalProcess *pIExternalProcess);
IExternalProcess* GetInterface (void) const;
void SetParameter (const TCHAR* pszParameter);
NTSTATUS Start (void);
NTSTATUS End (void);
NTSTATUS Terminate (void);
bool HandleNoProcess (void);
void HandleNewProcess (DWORD dwProcessID);
void HandleTermination (DWORD dwProcessID);
bool IsStarted (void) const;
protected:
virtual void NotifyNoProcess (void);
void AdjustForDebugging (void);
bool IsBeingDebugged (void) const;
private:
bool IsPrefixedWithNTSD (void) const;
bool IsImageFileExecutionDebugging (void) const;
protected:
HANDLE _hProcess;
DWORD _dwProcessID,
_dwProcessExitCode,
_dwCreateFlags,
_dwStartFlags;
WORD _wShowFlags;
int _iRestartCount;
TCHAR _szCommandLine[MAX_PATH],
_szParameter[MAX_PATH];
CJob _job;
private:
IExternalProcess *_pIExternalProcess;
CJobCompletionWatcher *_jobCompletionWatcher;
};
#endif /* _ExternalProcess_ */