惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
博客园 - 聂微东
V
Visual Studio Blog
博客园_首页
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
F
Fortinet All Blogs
C
Check Point Blog
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 火龙sky

ASP.NET Ajax发布时异步刷新失效的问题解决方法 关于Tomcat虚拟主机域名的设置--设置本地主机域名 Sql Server 中一个非常强大的日期格式化函数 针对sql 2005优化的高性能分页存储过程 大型网站架构设计 在ASP.NET中记录错误日志(使用Global.asax) 一个完美的的项目经理 CuteEditor6.0 使用 CE寻找游戏基址+偏移 了解游戏外挂 c#做外挂 step by step(更新至step3:注入) Sql-Server应用程序的高级Sql注入 教程: 汇编语言的准备知识-给初次接触汇编者4 教程: 汇编语言的准备知识-给初次接触汇编者3 教程: 汇编语言的准备知识-给初次接触汇编者2 汇编语言的准备知识--给初次接触汇编者 1 邮件简单发送 GetIP cookies 设置HtmlMeta 值
VirtualAllocEx函数
火龙sky · 2009-02-16 · via 博客园 - 火龙sky

VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0。

LPVOID VirtualAllocEx(
HANDLE hProcess, // 申请内存所在的进程句柄
LPVOID lpAddress, // 保留页面的内存地址;一般用NULL自动分配
SIZE_T dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType,
DWORD flProtect
);
flAllocationType,flProtect太多了,参数数值和意思MSDN上都有,不再赘述了.
问题描述:我要选中其他进程的一个ListView窗口中的一个Item,事实上只要发消息就可以了:
SendMessage( hWnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)pLVItem );
可是其中的LPARAM要指向一个LVItem的结构,我们知道消息可以跨进程,但目标窗口收到消息时它需要寻址这个结构,而这个结构实际上存储在发送方 的地址空间里;所以我们必须把LVItem的内容写入到窗口过程所在的地址空间内,于是便需要VirtualAllocEx和VirtualFreeEx 了。
代码如下。
ListViewOperator::ListViewOperator( HWND hWnd ) // 初始化函数
{
m_hwnd = NULL; //目标窗口
m_hProcess = NULL; //目标进程
m_pLVItem = NULL; //写入目标进程的LVITEM结构
m_pTextBuffer = NULL; //其他用途

m_hwnd = hWnd;

DWORD dwProcessId;
GetWindowThreadProcessId( hWnd, &dwProcessId ); //获取进程ID

m_hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessId ); //打开进程
THROW_EXCEPTION( (m_hProcess == NULL), "Open process failed" );

m_pLVItem = (LVITEMA *)VirtualAllocEx( m_hProcess, NULL, sizeof(LVITEMA), MEM_COMMIT, PAGE_READWRITE ); 在目标进程空间中获得内存,允许读取和写入。
THROW_EXCEPTION( (m_pLVItem == NULL), "Memory alloc failed" );
m_pTextBuffer = (char *)VirtualAllocEx( m_hProcess, NULL, MAX_TEXT_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE );
THROW_EXCEPTION( (m_pTextBuffer == NULL), "Memory alloc failed" );

}

void ListViewOperator::SetItemSelected( int nItemIndex ) //选中某一个ITEM
{
LVITEMA lvitem; // 静态结构

lvitem.mask = LVIF_STATE;
lvitem.iSubItem = 0;
lvitem.state = LVIS_SELECTED|LVIS_FOCUSED;
lvitem.stateMask = LVIS_SELECTED|LVIS_FOCUSED;

int nRet = WriteProcessMemory( m_hProcess, m_pLVItem, &lvitem, sizeof(LVITEM), NULL ); // 将本地进程中的结构写入到目标进程
THROW_EXCEPTION( (nRet == 0), "Write Process memory failed" );

HRESULT hRet = SendMessage( m_hwnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)m_pLVItem );//发送消息
THROW_EXCEPTION( FAILED(hRet), "Send message failed" );

return ;
}