⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remoteshellserver.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
字号:
// RemoteShellServer.cpp : Implementation of WinMain// Note: Proxy/Stub Information//      To build a separate proxy/stub DLL, //      run nmake -f RemoteShellServerps.mk in the project directory.#include "stdafx.h"#include "resource.h"#include <initguid.h>#include "RemoteShellServer.h"#include "RemoteShellServer_i.c"#include <stdio.h>#include "RemoteShell.h"#include "..\Common\MPIJobDefs.h"#include "..\Common\DCOMPerm\DCOMPerm.h"HANDLE g_hLaunchSyncMutex = CreateMutex(NULL, FALSE, NULL);DWORD g_nLaunchTimeout = DEFAULT_LAUNCH_TIMEOUT;CServiceModule _Module;BEGIN_OBJECT_MAP(ObjectMap)OBJECT_ENTRY(CLSID_RemoteShell, CRemoteShell)END_OBJECT_MAP()LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2){    while (p1 != NULL && *p1 != NULL)    {        LPCTSTR p = p2;        while (p != NULL && *p != NULL)        {            if (*p1 == *p)                return CharNext(p1);            p = CharNext(p);        }        p1 = CharNext(p1);    }    return NULL;}void CreateRegKeys(){	// Create the registry keys	HKEY hKey;	DWORD result, ret_val;	// Create the root key	ret_val = RegCreateKeyEx(HKEY_LOCAL_MACHINE, MPICHKEY,		0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL,		&hKey,		&result);	if (ret_val != ERROR_SUCCESS)		return;	DWORD job_number = 0;	ret_val = RegSetValueEx(hKey, TEXT("Job Number"), 0, REG_DWORD, (CONST BYTE *)&job_number, sizeof(DWORD));	// This shouldn't be hard coded to C:	//*	ret_val = RegSetValueEx(hKey, TEXT("Temp"), 0, REG_SZ, (CONST BYTE *)TEXT("C:\\"), _tcslen(TEXT("C:\\"))+1);	/*/	// The temporary path is only read/write enabled for the current user.  It cannot be used to launch processes	// in the context of other users.	TCHAR pszTempDir[MAX_PATH];	GetTempPath(MAX_PATH, pszTempDir);	ret_val = RegSetValueEx(hKey, TEXT("Temp"), 0, REG_SZ, (CONST BYTE *)pszTempDir, _tcslen(pszTempDir)+1);	//*/	ret_val = RegSetValueEx(hKey, TEXT("LaunchTimeout"), 0, REG_DWORD, (CONST BYTE *)&g_nLaunchTimeout, sizeof(DWORD));	RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)"Installed", 10);	RegCloseKey(hKey);}// Although some of these functions are big they are declared inline since they are only used onceinline HRESULT CServiceModule::RegisterServer(BOOL bRegTypeLib, BOOL bService){    HRESULT hr = CoInitialize(NULL);    if (FAILED(hr))        return hr;    // Remove any previous service since it may point to    // the incorrect file    Uninstall();    // Add service entries    UpdateRegistryFromResource(IDR_RemoteShellServer, TRUE);    // Adjust the AppID for Local Server or Service    CRegKey keyAppID;    LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_WRITE);    if (lRes != ERROR_SUCCESS)        return lRes;    CRegKey key;    lRes = key.Open(keyAppID, _T("{178C128A-9057-40C9-90D5-8D6A4782BDF2}"), KEY_WRITE);    if (lRes != ERROR_SUCCESS)        return lRes;    key.DeleteValue(_T("LocalService"));        if (bService)    {        key.SetValue(_T("RemoteShellServer"), _T("LocalService"));        key.SetValue(_T("-Service"), _T("ServiceParameters"));        // Create service        Install();    }    // Add object entries    hr = CComModule::RegisterServer(bRegTypeLib);    CoUninitialize();	// Allow users access	DCOMPermissions(MPILAUNCHSERVERGUIDSTR, false, TEXT("Domain Users"), true, true);	DCOMPermissions(MPILAUNCHSERVERGUIDSTR, true, TEXT("Domain Users"), true, true);	DCOMPermissions(MPILAUNCHSERVERGUIDSTR, false, TEXT("Users"), true, true);	DCOMPermissions(MPILAUNCHSERVERGUIDSTR, true, TEXT("Users"), true, true);	CreateRegKeys();    return hr;}inline HRESULT CServiceModule::UnregisterServer(){    HRESULT hr = CoInitialize(NULL);    if (FAILED(hr))        return hr;    // Remove service entries    UpdateRegistryFromResource(IDR_RemoteShellServer, FALSE);    // Remove service    Uninstall();    // Remove object entries    CComModule::UnregisterServer(TRUE);    CoUninitialize();	HKEY hKey;	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, MPICHKEY, 0, KEY_READ | KEY_WRITE, &hKey) == ERROR_SUCCESS)	{		RegDeleteValue(hKey, NULL); // Does this delete the default value?		RegCloseKey(hKey);	}    return S_OK;}inline void CServiceModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT nServiceNameID, const GUID* plibid){    CComModule::Init(p, h, plibid);    m_bService = TRUE;    LoadString(h, nServiceNameID, m_szServiceName, sizeof(m_szServiceName) / sizeof(TCHAR));    // set up the initial service status     m_hServiceStatus = NULL;    m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;    m_status.dwCurrentState = SERVICE_STOPPED;    m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;    m_status.dwWin32ExitCode = 0;    m_status.dwServiceSpecificExitCode = 0;    m_status.dwCheckPoint = 0;    m_status.dwWaitHint = 0;}LONG CServiceModule::Unlock(){    LONG l = CComModule::Unlock();    if (l == 0 && !m_bService)        PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);    return l;}BOOL CServiceModule::IsInstalled(){    BOOL bResult = FALSE;    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM != NULL)    {        SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_QUERY_CONFIG);        if (hService != NULL)        {            bResult = TRUE;            ::CloseServiceHandle(hService);        }        ::CloseServiceHandle(hSCM);    }    return bResult;}inline BOOL CServiceModule::Install(){    if (IsInstalled())        return TRUE;    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM == NULL)    {        //MessageBox(NULL, _T("Couldn't open service manager"), m_szServiceName, MB_OK);        return FALSE;    }    // Get the executable file path    TCHAR szFilePath[_MAX_PATH];    ::GetModuleFileName(NULL, szFilePath, _MAX_PATH);    SC_HANDLE hService = ::CreateService(        hSCM, m_szServiceName, m_szServiceName,        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,        SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,        szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL);    if (hService == NULL)    {        ::CloseServiceHandle(hSCM);        //MessageBox(NULL, _T("Couldn't create service"), m_szServiceName, MB_OK);        return FALSE;    }    ::CloseServiceHandle(hService);    ::CloseServiceHandle(hSCM);    return TRUE;}inline BOOL CServiceModule::Uninstall(){    if (!IsInstalled())        return TRUE;    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM == NULL)    {        //MessageBox(NULL, _T("Couldn't open service manager"), m_szServiceName, MB_OK);        return FALSE;    }    SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_STOP | DELETE);    if (hService == NULL)    {        ::CloseServiceHandle(hSCM);        //MessageBox(NULL, _T("Couldn't open service"), m_szServiceName, MB_OK);        return FALSE;    }    SERVICE_STATUS status;    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);    BOOL bDelete = ::DeleteService(hService);    ::CloseServiceHandle(hService);    ::CloseServiceHandle(hSCM);    if (bDelete)        return TRUE;    //MessageBox(NULL, _T("Service could not be deleted"), m_szServiceName, MB_OK);    return FALSE;}///////////////////////////////////////////////////////////////////////////////////////// Logging functionsvoid CServiceModule::LogEvent(LPCTSTR pFormat, ...){    TCHAR    chMsg[256];    HANDLE  hEventSource;    LPTSTR  lpszStrings[1];    va_list pArg;    va_start(pArg, pFormat);    _vstprintf(chMsg, pFormat, pArg);    va_end(pArg);    lpszStrings[0] = chMsg;    if (m_bService)    {        /* Get a handle to use with ReportEvent(). */        hEventSource = RegisterEventSource(NULL, m_szServiceName);        if (hEventSource != NULL)        {            /* Write to event log. */            ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);            DeregisterEventSource(hEventSource);        }    }    else    {        // As we are not running as a service, just write the error to the console.        _putts(chMsg);    }}//////////////////////////////////////////////////////////////////////////////////////////////// Service startup and registrationinline void CServiceModule::Start(){    SERVICE_TABLE_ENTRY st[] =    {        { m_szServiceName, _ServiceMain },        { NULL, NULL }    };    if (m_bService && !::StartServiceCtrlDispatcher(st))    {        m_bService = FALSE;    }    if (m_bService == FALSE)	{        Run();	}}inline void CServiceModule::ServiceMain(DWORD /* dwArgc */, LPTSTR* /* lpszArgv */){    // Register the control request handler    m_status.dwCurrentState = SERVICE_START_PENDING;    m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);    if (m_hServiceStatus == NULL)    {        LogEvent(_T("Handler not installed"));        return;    }    SetServiceStatus(SERVICE_START_PENDING);    m_status.dwWin32ExitCode = S_OK;    m_status.dwCheckPoint = 0;    m_status.dwWaitHint = 0;    // When the Run function returns, the service has stopped.    Run();    SetServiceStatus(SERVICE_STOPPED);    LogEvent(_T("Service stopped"));}inline void CServiceModule::Handler(DWORD dwOpcode){    switch (dwOpcode)    {    case SERVICE_CONTROL_STOP:        SetServiceStatus(SERVICE_STOP_PENDING);        PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);        break;    case SERVICE_CONTROL_PAUSE:        break;    case SERVICE_CONTROL_CONTINUE:        break;    case SERVICE_CONTROL_INTERROGATE:        break;    case SERVICE_CONTROL_SHUTDOWN:        break;    default:        LogEvent(_T("Bad service request"));    }}void WINAPI CServiceModule::_ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv){    _Module.ServiceMain(dwArgc, lpszArgv);}void WINAPI CServiceModule::_Handler(DWORD dwOpcode){    _Module.Handler(dwOpcode); }void CServiceModule::SetServiceStatus(DWORD dwState){    m_status.dwCurrentState = dwState;    ::SetServiceStatus(m_hServiceStatus, &m_status);}void CServiceModule::Run(){    _Module.dwThreadID = GetCurrentThreadId();    //HRESULT hr = CoInitialize(NULL);//  If you are running on NT 4.0 or higher you can use the following call//  instead to make the EXE free threaded.//  This means that calls come in on a random RPC thread	HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);    _ASSERTE(SUCCEEDED(hr));    // This provides a NULL DACL which will allow access to everyone.    CSecurityDescriptor sd;    sd.InitializeFromThreadToken();    hr = CoInitializeSecurity(sd, -1, NULL, NULL,	//hr = CoInitializeSecurity(NULL, -1, NULL, NULL,		RPC_C_AUTHN_LEVEL_DEFAULT,		//RPC_C_AUTHN_LEVEL_NONE,		//RPC_C_AUTHN_LEVEL_CONNECT,		//RPC_C_AUTHN_LEVEL_CALL,		//RPC_C_AUTHN_LEVEL_PKT,		//RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,		//RPC_C_AUTHN_LEVEL_PKT_PRIVACY,		//RPC_C_IMP_LEVEL_DEFAULT,		//RPC_C_IMP_LEVEL_ANONYMOUS,		RPC_C_IMP_LEVEL_IDENTIFY,		//RPC_C_IMP_LEVEL_IMPERSONATE,		//RPC_C_IMP_LEVEL_DELEGATE,		NULL, EOAC_NONE, NULL);        //RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);    _ASSERTE(SUCCEEDED(hr));    hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);    _ASSERTE(SUCCEEDED(hr));	DWORD ret_val, type, num_bytes = sizeof(DWORD);	HKEY hKey;	// Open the MPICH root key	if ((ret_val = RegOpenKeyEx(			HKEY_LOCAL_MACHINE, 			MPICHKEY,			0, KEY_READ | KEY_WRITE, &hKey)) == ERROR_SUCCESS)	{		// Read the launch timeout number		ret_val = RegQueryValueEx(hKey, TEXT("LaunchTimeout"), 0, &type, (BYTE *)&g_nLaunchTimeout, &num_bytes);		if (g_nLaunchTimeout == 0)			g_nLaunchTimeout = DEFAULT_LAUNCH_TIMEOUT;		RegCloseKey(hKey);	}    LogEvent(_T("Service started"));    if (m_bService)        SetServiceStatus(SERVICE_RUNNING);    MSG msg;    while (GetMessage(&msg, 0, 0, 0))        DispatchMessage(&msg);    _Module.RevokeClassObjects();    CoUninitialize();}///////////////////////////////////////////////////////////////////////////////extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,     HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/){    lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT    _Module.Init(ObjectMap, hInstance, IDS_SERVICENAME, &LIBID_REMOTESHELLSERVERLib);    _Module.m_bService = TRUE;    TCHAR szTokens[] = _T("-/");    LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);    while (lpszToken != NULL)    {        if (lstrcmpi(lpszToken, _T("UnregServer"))==0)            return _Module.UnregisterServer();        // Register as Local Server        //if (lstrcmpi(lpszToken, _T("RegServer"))==0)            //return _Module.RegisterServer(TRUE, FALSE);        // Register as Service        if (lstrcmpi(lpszToken, _T("RegServer"))==0)            return _Module.RegisterServer(TRUE, TRUE);                // Register as Service        if (lstrcmpi(lpszToken, _T("Service"))==0)            return _Module.RegisterServer(TRUE, TRUE);                lpszToken = FindOneOf(lpszToken, szTokens);    }    // Are we Service or Local Server    CRegKey keyAppID;    LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_READ);    if (lRes != ERROR_SUCCESS)        return lRes;    CRegKey key;    lRes = key.Open(keyAppID, _T("{178C128A-9057-40C9-90D5-8D6A4782BDF2}"), KEY_READ);    if (lRes != ERROR_SUCCESS)        return lRes;    TCHAR szValue[_MAX_PATH];    DWORD dwLen = _MAX_PATH;    lRes = key.QueryValue(szValue, _T("LocalService"), &dwLen);    _Module.m_bService = FALSE;    if (lRes == ERROR_SUCCESS)        _Module.m_bService = TRUE;    _Module.Start();	CloseHandle(g_hLaunchSyncMutex);    // When we get here, the service has been stopped    return _Module.m_status.dwWin32ExitCode;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -