VC/MFC 访问进程内存,代码片段
2016-05-28 00:00
375 查看
[code=plain]#include "StdAfx.h" #include <TlHelp32.h> #include "ProcessMemory.h" //打开进程内存 BOOL CProcessMemory::Open(INT nPID) { HANDLE hToken; INT nFlag; nFlag = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); if(!nFlag) { OutputDebugString(_T("OpenProcessToken Fail!\n")); return 0; } SetPrivilege(hToken, SE_DEBUG_NAME, TRUE); ::CloseHandle(hToken); m_hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPID); if (m_hProc == INVALID_HANDLE_VALUE) return FALSE; return TRUE; } BOOL CProcessMemory::Open(LPCTSTR pzProcessName) { INT nPID; nPID = GetProcessID(pzProcessName); return Open(nPID); } //设置进程权限 int CProcessMemory::SetPrivilege(HANDLE hToken, LPCTSTR lpszStr, BOOL bEnable) { TOKEN_PRIVILEGES tp; LUID luid; BOOL bRet; bRet = LookupPrivilegeValue(NULL, lpszStr, &luid); if(bRet == FALSE) { OutputDebugString(_T("Lookup Privilege Value Fail!\n")); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if(bEnable) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; bRet = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); return bRet; } //写入 DWORD CProcessMemory::Write(LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize) { BOOL bRet; DWORD dwReaded = 0; //句柄无效 if(m_hProc == NULL) return FALSE; bRet = ::WriteProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &dwReaded); if (bRet == FALSE) dwReaded = 0; return dwReaded; } //读取 DWORD CProcessMemory::Read(LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize) { BOOL bRet; DWORD dwReaded = 0; //句柄无效 if(m_hProc == NULL) return FALSE; bRet = ::ReadProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &dwReaded); if (bRet == FALSE) dwReaded = 0; return dwReaded; } //关闭 void CProcessMemory::Close() { if (m_hProc) { ::CloseHandle(m_hProc); } } //根据进程名,返回第一个进程实例的PID INT CProcessMemory::GetProcessID(LPCTSTR pzProcessName) { BOOL bRet; CString szExeName(pzProcessName); HANDLE hProcess; PROCESSENTRY32 procEntry; procEntry.dwSize = sizeof(PROCESSENTRY32); //进行进程快照 hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //开始进程查找 bRet=Process32First(hProcess,&procEntry); //循环比较,得出ProcessID while(bRet) { if(0 == szExeName.Compare(procEntry.szExeFile)) return procEntry.th32ProcessID; bRet=Process32Next(hProcess,&procEntry); } return 0; }
VC/MFC 访问进程内存,代码片段
相关文章推荐
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程
- MFC绘制不规则窗体的方法
- IE8引发 VS2005/2008 MFC向导出错的解决方案
- MFC实现全屏功能代码实例
- 使用VS2010创建MFC ActiveX工程项目
- C++中MFC Tab Control控件的使用详解
- MFC程序设计常用技巧汇总
- MFC扩展DLL中导出类和对话框的实现方法
- VC中SDK与MFC的区别浅析
- 浅谈MFC 改变控件大小和位置
- VC MFC非模态对话框的实现方法