亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? remoteadminservice.cpp

?? <Visual C++ 網絡程序設計實例詳解>配套源碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
#include "stdafx.h"
#include "GlobalHelperFunc.h"
#include <psapi.h>
#include <afxtempl.h>
#include <afxwin.h>
#include <tchar.h>
#include <winsvc.h>
#include <Tlhelp32.h>
#include <process.h>
#include "psapi.h"

#define  REMOTE_ADMIN_SERVICE              _T("RemoteAdminService")
#define  REMOTE_ADMIN_PIPE                 _T("RempteAdminPipe")
#define  REMOTE_ADMIN_PROCESS_INFO_PIPE    _T("RemoteAdminProcessInfoPipe")
#define  REMOTE_ADMIN_PROCESS_EXECUTE_PIPE _T("RemoteAdminProcessExecutePipe")
#define  REMOTE_ADMIN_PROCESS_KILL_PIPE    _T("RemoteAdminProcessKillPipe")
#define  REMOTE_ADMIN_SYS_SHUTDOWN_PIPE    _T("RemoteAdminSysShutDownPipe")
#define  SERVICENAME                       _T("RemoteAdminService")
#define  LONGSERVICENAME                   _T("RemoteAdminService")

struct SProcessInfo
{
    PROCESSENTRY32 peProcessEntry;
    SIZE_T         stMemUsage;
};

//typedef CTypedPtrList<CPtrList, PROCESSENTRY32*> CProcessInfoList;
typedef CTypedPtrList<CPtrList, SProcessInfo*> CProcessInfoList;

VOID WINAPI StartRemoteAdminService(DWORD, LPTSTR*);
void WINAPI RemoteAdminHandler(DWORD Opcode);
DWORD IsService(BOOL& isService);
void UpdateProcessInfoList(void* pArgument);
void CleanProcessInfoList();
void ServiceMain(void*);
void RemoteAdminThreadProc(void*);
void RemoteAdminThread(void*);
void RemoteAdminProcessInfoThread(void*);
void RemoteAdminExecuteProcessThread(void*);
void RemoteAdminKillProcessThread(void*);
void RemoteAdminSysShutdownThread(void* pParam);
void DeleteTheService();
BOOL SystemShutdown(LPTSTR lpMsg, BOOL bReboot, UINT iTimeOut /*Secs*/);
BOOL PreventSystemShutdown();

BOOL AddAceToWindowStation(HWINSTA hwinsta, PSID psid);
BOOL AddAceToDesktop(HDESK hdesk, PSID psid);
VOID FreeLogonSID (PSID *ppsid);
BOOL GetLogonSID (HANDLE hToken, PSID *ppsid);
BOOL StartInteractiveClientProcess (
    LPTSTR lpszUsername,    // client to log on
    LPTSTR lpszDomain,      // domain of client's account
    LPTSTR lpszPassword,    // client's password
    LPTSTR lpCommandLine    // command line to execute
); 


SIZE_T GetPhysicalMemUsage(DWORD dwProcessID);

#define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW |DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL |  DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED)
#define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | STANDARD_RIGHTS_REQUIRED)
#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL)



struct SCommand
{
    BOOL m_bThreadExit;
};

struct SExecuteCommand
{
    TCHAR m_szProcessPath[_MAX_PATH]; // Process to start 
    TCHAR m_szUsername[_MAX_PATH];    // client to log on
    TCHAR m_szDomain[_MAX_PATH];      // domain of client's account
    TCHAR m_szPassword[_MAX_PATH];    // client's password
};

struct SSysShutDownInfo
{
    BOOL bShutDown;   // TRUE if you want to shutdown,FALSE if want to cancel shutdown
    BOOL bReboot;     // Reboot if TRUE, else HALT if FALSE
    UINT iTimeToShutDown; // Time given to user before shutdown in secs
};

CProcessInfoList pilProcessInfoList;
HANDLE hStopServiceEvent;
long lServicePipeInstanceCount = 0;
SERVICE_STATUS          ServiceStatus; 
SERVICE_STATUS_HANDLE   ServiceStatusHandle;
CRITICAL_SECTION g_CriticalSection;
 

int main(int argc, char* argv[])
{
    SERVICE_TABLE_ENTRY DispatchTable[] = { 
        {REMOTE_ADMIN_SERVICE, StartRemoteAdminService}, 
        {NULL, NULL}
    }; 

    BOOL bIsService = FALSE;
    ::IsService(bIsService);
    
    if (bIsService)
    {
		::InitializeCriticalSection(&g_CriticalSection);
        return StartServiceCtrlDispatcher(DispatchTable);
    }
    
   	return 0;
}


// This process is a service or is not ?
DWORD IsService(BOOL& isService)
{
    DWORD pID = GetCurrentProcessId(); 
	HANDLE hProcessToken = NULL;
	DWORD groupLength = 50;
	PTOKEN_GROUPS groupInfo = NULL;

	SID_IDENTIFIER_AUTHORITY siaNt = SECURITY_NT_AUTHORITY;
	PSID pInteractiveSid = NULL;
	PSID pServiceSid = NULL;

	DWORD dwRet = NO_ERROR;
    
    // reset flags
	BOOL isInteractive = FALSE;
	isService = FALSE;

	DWORD ndx;

    HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);

	// open the token
	if (!::OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
	{
		dwRet = ::GetLastError();
		goto closedown;
	}

	// allocate a buffer of default size
	groupInfo = (PTOKEN_GROUPS)::LocalAlloc(0, groupLength);
	if (groupInfo == NULL)
	{
		dwRet = ::GetLastError();
		goto closedown;
	}

	// try to get the info
	if (!::GetTokenInformation(hProcessToken, TokenGroups, groupInfo, groupLength, &groupLength))
	{
		// if buffer was too small, allocate to proper size, otherwise error
		if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
		{
			dwRet = ::GetLastError();
			goto closedown;
		}

		::LocalFree(groupInfo);

		groupInfo = (PTOKEN_GROUPS)::LocalAlloc(0, groupLength);
		if (groupInfo == NULL)
		{
			dwRet = ::GetLastError();
			goto closedown;
		}

		if (!GetTokenInformation(hProcessToken, TokenGroups, groupInfo, groupLength, &groupLength))
		{
			dwRet = ::GetLastError();
			goto closedown;
		}
	}

	// create comparison sids
	if (!AllocateAndInitializeSid(&siaNt, 1, SECURITY_INTERACTIVE_RID, 0, 0, 0, 0, 0, 0, 0, &pInteractiveSid))
	{
		dwRet = ::GetLastError();
		goto closedown;
	}

	if (!AllocateAndInitializeSid(&siaNt, 1, SECURITY_SERVICE_RID, 0, 0, 0, 0, 0, 0, 0, &pServiceSid))
	{
		dwRet = ::GetLastError();
		goto closedown;
	}

	// try to match sids
	for (ndx = 0; ndx < groupInfo->GroupCount ; ndx += 1)
	{
		SID_AND_ATTRIBUTES sanda = groupInfo->Groups[ndx];
		PSID pSid = sanda.Sid;

		if (::EqualSid(pSid, pInteractiveSid))
		{
			isInteractive = TRUE;
			isService = FALSE;
			break;
		}
		else if (::EqualSid(pSid, pServiceSid))
		{
			isService = TRUE;
			isInteractive = FALSE;
			break;
		}
	}

   if ( !(isService || isInteractive ))
		isService = TRUE;
        
closedown:
		if (pServiceSid)
        {
            ::FreeSid(pServiceSid);
        }
		
		if (pInteractiveSid)
        {
            ::FreeSid(pInteractiveSid);
        }
		
		if (groupInfo)
        {
            ::LocalFree(groupInfo);
        }
			

		if (hProcessToken)
        {
            ::CloseHandle(hProcessToken);
        }
			

		if (hProcess)
        {
            ::CloseHandle(hProcess);
        }
			

	return dwRet;
}

void UpdateProcessInfoList(void* pArgument)
{
    for (;;)
    {
        CleanProcessInfoList();

		::EnterCriticalSection(&g_CriticalSection);
		
        DWORD dwCurrentProcessId = ::GetCurrentProcessId();
    
        // Take this process's snapshot
        HANDLE hProcessSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwCurrentProcessId);

        //PROCESSENTRY32* pPe = new PROCESSENTRY32;
		//pPe->dwSize = sizeof(PROCESSENTRY32); 
        SProcessInfo* pPi = new SProcessInfo;
        BOOL bOk = ::Process32First(hProcessSnapShot, &pPi->peProcessEntry);
        
        // Get the process memeory usage
        pPi->stMemUsage = GetPhysicalMemUsage(pPi->peProcessEntry.th32ProcessID);
        
        if (!bOk)
        {
            delete pPi;
            pPi = NULL;
        }
        
        while (bOk)
        {
            pilProcessInfoList.AddTail(pPi);

            //pPe = new PROCESSENTRY32;
            pPi = new SProcessInfo;
            bOk = ::Process32Next(hProcessSnapShot, &pPi->peProcessEntry);
            
            // Get the process memeory usage
            pPi->stMemUsage = GetPhysicalMemUsage(pPi->peProcessEntry.th32ProcessID);

            if (!bOk)
            {
                delete pPi;
                pPi = NULL;
            }
        }

        // We didn't forget to clean up the snapshot object.
        ::CloseHandle(hProcessSnapShot);
        ::Sleep(2000);

		::LeaveCriticalSection(&g_CriticalSection);
    }

    return ;
}

void CleanProcessInfoList()
{
	//PROCESSENTRY32* pPe = NULL;
    SProcessInfo* pPi = NULL;

	::EnterCriticalSection(&g_CriticalSection);

    POSITION pos = pilProcessInfoList.GetHeadPosition();
    while (pos)
    {
        pPi = pilProcessInfoList.GetNext(pos);

		if (pPi != NULL)
		{
			delete pPi;
		}
    }
            
    pilProcessInfoList.RemoveAll();
	
	::LeaveCriticalSection(&g_CriticalSection);

    return;
}


// Start service
VOID WINAPI StartRemoteAdminService(DWORD, LPTSTR*) 
{
   DWORD status = 0; 
   DWORD specificError = 0;

   // Prepare the ServiceStatus structure that will be used for the
   // comunication with SCM(Service Control Manager).
   // If you fully under stand the members of this structure, feel
   // free to change these values :o)
   ServiceStatus.dwServiceType        = SERVICE_WIN32; 
   ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
   ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP; 
   ServiceStatus.dwWin32ExitCode      = 0; 
   ServiceStatus.dwServiceSpecificExitCode = 0; 
   ServiceStatus.dwCheckPoint         = 0; 
   ServiceStatus.dwWaitHint           = 0; 

   // Here we register the control handler for our service.
   // We tell the SCM about a call back function that SCM will
   // call when user tries to Start, Stop or Pause your service.
   ServiceStatusHandle = RegisterServiceCtrlHandler( 
         TEXT("Service"), RemoteAdminHandler); 

   if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) 
      return; 
   
   // Handle error condition 
   if (status != NO_ERROR) 
   { 
      ServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
      ServiceStatus.dwCheckPoint         = 0; 
      ServiceStatus.dwWaitHint           = 0; 
      ServiceStatus.dwWin32ExitCode      = status; 
      ServiceStatus.dwServiceSpecificExitCode = specificError; 

      SetServiceStatus (ServiceStatusHandle, &ServiceStatus); 
      return; 
   } 

   // Initialization complete - report running status. 
   ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
   ServiceStatus.dwCheckPoint         = 0; 
   ServiceStatus.dwWaitHint           = 0; 

   if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) 
      status = GetLastError(); 
   else
   {
      // Start the main thread
      hStopServiceEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
      _beginthread(ServiceMain, 0, NULL );
   }
   
   return; 
} 


void ServiceMain(void*)
{
    ::_beginthread(UpdateProcessInfoList, 0, NULL);

    // Start CommunicationPoolThread, which handles the incoming instances
    ::_beginthread(RemoteAdminThread, 0, NULL );

    // Waiting for stop the service
    while(::WaitForSingleObject(hStopServiceEvent, 10) != WAIT_OBJECT_0)
    {
    }
   
    // Let's delete itself, after the service stopped
    ::DeleteTheService();

    ::CloseHandle(hStopServiceEvent);
}

void RemoteAdminThread(void*)
{
    HANDLE hPipe = NULL;
    
    for (;;)
    {
        SECURITY_ATTRIBUTES SecAttrib = {0};
        SECURITY_DESCRIPTOR SecDesc;
        InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(&SecDesc, TRUE, NULL, TRUE);

        SecAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
        SecAttrib.lpSecurityDescriptor = &SecDesc;;
        SecAttrib.bInheritHandle = TRUE;

        // Create communication pipe
        hPipe = ::CreateNamedPipe(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品99久久久久久有的能看 | www.在线欧美| 韩国v欧美v日本v亚洲v| 奇米影视一区二区三区小说| 午夜精品一区二区三区免费视频| 一区二区三区中文字幕在线观看| 一区二区三区在线免费观看| 一区二区三区产品免费精品久久75| 一区二区三区国产精品| 亚洲综合另类小说| 午夜精品久久久| 蜜臀av性久久久久蜜臀av麻豆| 日本va欧美va精品| 理论片日本一区| 国产激情精品久久久第一区二区| 国产精华液一区二区三区| 成人午夜激情视频| 99视频一区二区三区| 日本韩国一区二区| 这里只有精品电影| www国产成人免费观看视频 深夜成人网| 精品国产青草久久久久福利| 久久久亚洲高清| 国产精品成人一区二区三区夜夜夜| 亚洲欧美自拍偷拍色图| 一区二区三区视频在线看| 日韩国产精品久久| 国产福利一区二区三区在线视频| 99国产精品国产精品毛片| 欧美系列亚洲系列| 26uuu精品一区二区在线观看| 国产日韩欧美制服另类| 亚洲男帅同性gay1069| 亚洲大尺度视频在线观看| 蜜桃视频一区二区| a美女胸又www黄视频久久| 欧美伊人久久久久久久久影院| 日韩亚洲欧美在线| 国产精品乱码一区二区三区软件| 亚洲天天做日日做天天谢日日欢| 午夜精品久久久久久久99水蜜桃 | 六月丁香婷婷久久| 丁香婷婷综合激情五月色| 色狠狠av一区二区三区| 日韩三级中文字幕| 中文字幕亚洲综合久久菠萝蜜| 图片区小说区区亚洲影院| 丰满放荡岳乱妇91ww| 欧美日韩国产在线观看| 国产日韩影视精品| 视频在线观看91| 99综合电影在线视频| 91精品国产综合久久久久久久久久| 国产日韩精品一区二区三区| 午夜亚洲国产au精品一区二区| 大胆欧美人体老妇| 欧美精品电影在线播放| 国产精品伦一区二区三级视频| 日本va欧美va精品发布| 色先锋资源久久综合| 久久亚洲综合色一区二区三区| 一区二区三区日韩在线观看| 国产suv精品一区二区6| 欧美一区二区三区视频在线| 亚洲免费高清视频在线| 国产福利一区二区| 日韩午夜在线观看| 亚洲最大成人网4388xx| 懂色av一区二区三区免费观看| 91麻豆精品国产91久久久久久久久 | 欧美一级日韩免费不卡| 亚洲天堂a在线| 国产a视频精品免费观看| 欧美一区二区视频在线观看2020| 亚洲人亚洲人成电影网站色| 国内精品在线播放| 欧美一二三在线| 亚洲亚洲精品在线观看| 99视频一区二区| 中文字幕精品三区| 国产一区三区三区| 欧美大尺度电影在线| 日韩电影一区二区三区| 欧美亚洲图片小说| 亚洲欧洲无码一区二区三区| 麻豆精品在线视频| 91精品国产综合久久久蜜臀粉嫩| 亚洲一区电影777| 91国偷自产一区二区三区观看| 中文字幕精品一区二区精品绿巨人| 久久99国产乱子伦精品免费| 日韩一级片在线播放| 午夜视频一区在线观看| 欧美日韩精品一区二区| 亚洲不卡一区二区三区| 在线免费一区三区| 一区二区三区在线视频播放| 色琪琪一区二区三区亚洲区| 亚洲狼人国产精品| 色乱码一区二区三区88| 亚洲美女屁股眼交3| 91美女在线视频| 亚洲日本一区二区| 色婷婷综合久久久久中文| 亚洲女女做受ⅹxx高潮| 欧美主播一区二区三区美女| 亚洲综合色区另类av| 欧美日韩黄色影视| 免费成人美女在线观看.| 日韩欧美在线综合网| 国产一区二区三区免费在线观看| 欧美精品一区二区三区高清aⅴ| 精品一区二区影视| 国产亚洲婷婷免费| 成人免费三级在线| 一区二区三区成人| 51午夜精品国产| 九一九一国产精品| 中文在线一区二区| 91视频xxxx| 性做久久久久久免费观看| 欧美裸体一区二区三区| 蜜桃视频一区二区三区在线观看| 2023国产一二三区日本精品2022| 国产成人免费在线视频| 亚洲欧美日韩在线不卡| 欧美色偷偷大香| 久久成人久久爱| 欧美国产精品一区| 日本久久精品电影| 石原莉奈在线亚洲二区| 久久久久久久久久久久久久久99 | 99久久久久久99| 亚洲一区二区免费视频| 日韩三级电影网址| 国产成a人亚洲| 一区二区三区高清不卡| 日韩欧美成人一区二区| 成人avav在线| 日韩电影免费一区| 欧美激情综合五月色丁香小说| 97se亚洲国产综合自在线不卡| 亚欧色一区w666天堂| 久久亚洲私人国产精品va媚药| 99久久er热在这里只有精品66| 亚洲成av人**亚洲成av**| 精品免费日韩av| 色综合久久久网| 精品一区二区日韩| 亚洲欧美另类在线| 欧美一级日韩一级| 色综合激情五月| 国产精品自拍毛片| 亚洲一区二区三区四区在线观看| 精品国产一区二区三区不卡| 色综合久久天天| 国产一区二区三区在线观看免费视频 | 成人免费观看av| 日韩专区一卡二卡| 国产精品免费看片| 欧美一级二级三级乱码| 色综合天天综合网国产成人综合天 | 久久精品国产亚洲高清剧情介绍| 亚洲欧美日韩在线不卡| 久久久久国产精品麻豆| 欧美少妇bbb| 国产成都精品91一区二区三| 三级一区在线视频先锋 | 美女脱光内衣内裤视频久久网站| 国产精品理伦片| 精品电影一区二区| 欧美日韩视频第一区| 成人av在线资源| 国产做a爰片久久毛片| 天天操天天干天天综合网| 亚洲婷婷在线视频| 欧美国产一区视频在线观看| 91精品国产色综合久久| 日本精品裸体写真集在线观看| 懂色中文一区二区在线播放| 久久国产精品色婷婷| 香蕉久久夜色精品国产使用方法| 亚洲欧洲成人自拍| 欧美—级在线免费片| 久久久亚洲高清| 精品奇米国产一区二区三区| 欧美色爱综合网| 日本精品视频一区二区| 91欧美一区二区| 99热国产精品| 99久久伊人久久99| 粉嫩高潮美女一区二区三区| 激情深爱一区二区| 久久精品99久久久| 精品一区二区三区在线观看国产| 日本欧美在线看| 日韩不卡手机在线v区| 亚洲高清在线精品| 亚洲123区在线观看| 午夜精品福利一区二区蜜股av|