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

推荐订阅源

S
Secure Thoughts
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog
博客园 - 聂微东
小众软件
小众软件
J
Java Code Geeks
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
量子位
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
月光博客
月光博客
B
Blog RSS Feed
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
I
Intezer
The Register - Security
The Register - Security
博客园 - 【当耐特】
博客园 - 司徒正美
L
Lohrmann on Cybersecurity
U
Unit 42
N
News and Events Feed by Topic
S
Security Affairs
V
Visual Studio Blog
Y
Y Combinator Blog
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
S
Schneier on Security
P
Privacy International News Feed
TaoSecurity Blog
TaoSecurity Blog
Spread Privacy
Spread Privacy
G
Google Developers Blog
NISL@THU
NISL@THU
Project Zero
Project Zero
P
Palo Alto Networks Blog
Help Net Security
Help Net Security
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
S
Security @ Cisco Blogs
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 火龙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 ;
}