102 lines
4.6 KiB
C
102 lines
4.6 KiB
C
|
// --------------------------------------------------------------------------
|
||
|
// 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_ */
|
||
|
|