//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 2000. // // File: process.cxx // // Contents: CProcess class // CServiceProcess class // // History: 07-Jun-94 DwightKr Created // //-------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include //+------------------------------------------------------------------------- // // 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; }