Leaked source code of windows server 2003
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.
 
 
 
 
 
 

173 lines
5.4 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: process.cxx
//
// Contents: CProcess class
// CServiceProcess class
//
// History: 07-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <proc32.hxx>
#include <cievtmsg.h>
#include <fwevent.hxx>
//+-------------------------------------------------------------------------
//
// Member: CProcess::CProcess
//
// Purpose: Creates a process on the local machine.
//
// Arguments: [wcsImageName] -- name of EXE to run
// [wcsCommandLine] -- command line passed to EXE
// [fCreateSuspended] -- should the EXE be created suspended?
// [pAdviseStatus] -- ICiCAdviseStatus interface, optional.
//
// History: 06-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
CProcess::CProcess( const WCHAR *wcsImageName,
const WCHAR *wcsCommandLine,
BOOL fCreateSuspended,
ICiCAdviseStatus * pAdviseStatus )
{
_pAdviseStatus = pAdviseStatus;
WCHAR wcsEXEName[_MAX_PATH + 1];
if ( ExpandEnvironmentStrings( wcsImageName, wcsEXEName, _MAX_PATH ) == 0 )
{
THROW( CException() );
}
STARTUPINFO siDefault;
RtlZeroMemory( &siDefault, sizeof(siDefault) );
DWORD dwCreateFlags = 0;
siDefault.cb = sizeof(STARTUPINFO); // Size of this struct
siDefault.lpTitle = (WCHAR *) wcsImageName; // Default title
dwCreateFlags = DETACHED_PROCESS;
if ( fCreateSuspended )
dwCreateFlags |= CREATE_SUSPENDED;
if ( !CreateProcess( wcsEXEName, // EXE name
(WCHAR *) wcsCommandLine, // Command line
0, // Proc sec attrib
0, // Thread sec attrib
FALSE, // Inherit handles
dwCreateFlags, // Creation flags
NULL, // Environment
NULL, // Startup directory
&siDefault, // Startup Info
&_piProcessInfo ) ) // Process handles
{
DWORD dwLastError = GetLastError();
if ( ( ERROR_FILE_NOT_FOUND == dwLastError ) && _pAdviseStatus )
{
CFwEventItem item( EVENTLOG_AUDIT_FAILURE,
MSG_CI_FILE_NOT_FOUND,
1 );
item.AddArg( wcsEXEName );
item.ReportEvent(*_pAdviseStatus);
}
THROW( CException( HRESULT_FROM_WIN32( dwLastError) ) );
}
//
// Only AddRef() once we get to a point where the constructor can
// no longer fail (and the destructor is guaranteed to be called)
//
if (_pAdviseStatus)
_pAdviseStatus->AddRef();
} //CProcess
//+-------------------------------------------------------------------------
//
// Member: CProcess::~CProcess
//
// Purpose: destructor
//
// History: 06-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
CProcess::~CProcess()
{
if ( 0 != _pAdviseStatus )
_pAdviseStatus->Release();
Terminate();
WaitForDeath();
}
//+-------------------------------------------------------------------------
//
// Member: CProcess::Resume, public
//
// Purpose: Continue a suspended thread
//
// History: 06-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
void CProcess::Resume()
{
ResumeThread( _piProcessInfo.hThread );
}
//+-------------------------------------------------------------------------
//
// Member: CProcess::WaitForDeath
//
// Purpose: Blocks until the process has been terminated.
//
// History: 06-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
void CProcess::WaitForDeath( DWORD dwTimeout )
{
DWORD res = WaitForSingleObject ( _piProcessInfo.hProcess, dwTimeout );
CloseHandle(_piProcessInfo.hThread);
CloseHandle(_piProcessInfo.hProcess);
}
//+-------------------------------------------------------------------------
//
// Member: CProcess::GetProcessToken, private
//
// Purpose: Returns the process token for the process
//
// History: 06-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
HANDLE CProcess::GetProcessToken()
{
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION,
FALSE,
_piProcessInfo.dwProcessId );
if ( NULL == hProcess )
{
THROW( CException() );
}
SWin32Handle process(hProcess); // Save in smart pointer
HANDLE hProcessToken = 0;
if ( !OpenProcessToken( hProcess, TOKEN_ADJUST_DEFAULT | TOKEN_QUERY, &hProcessToken ) )
{
THROW( CException() );
}
return hProcessToken;
}