当前位置: 首页 > news >正文

WM_COPYDATA传回返回值的一个方案

方案背景

适应场景,通过WM_COPYDATA进行进程间通信时,SendMessage不能返回自定义的数据,由此想到以下思路解决这个问题

  • A进程使用VirtualAlloc分配一块内存,通过某种方式将此地址以及A进程ID传给另一个进程B

  • B进程使用OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,FALSE, nRemoteProcessId)打开A进程的句柄,然后使用WriteProcessMemory向A进程指定地址写入数据

  • A进程即可从内存中读取值。

代码举例

进程A

{//分配一块8KB大小的区域给另外一个进程写入返回值const int nMaxBuffSize = 8192;LPVOID lpResultMem = ::VirtualAlloc(NULL, nMaxBuffSize, MEM_COMMIT, PAGE_READWRITE);Binary binData;binData.WriteUInt32(GetCurrentProcessId());//此进程IDbinData.WriteUInt64(UINT64(lpResultMem));//此进程分配的一块共享内存块//通过SendMessage发送WM_COPYDATA消息给另外一个进程//代码略//...//LRESULT nResult = ::SendMessage(...);if (nResult){//读取lpResultMem中的值int* pValue = (int*)lpResultMem;//pValue的值应该为另一个进程写入的8888//代码略//...}//释放::VirtualFree(lpResultMem, 0, MEM_RELEASE);lpResultMem = 0;
}

进程B

BOOL ProcessB::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{//其他代码//略//....DWORD nRemoteProcessId = pBinData->ReadUInt32();//远程进程IDUINT64 nRemoteAddress = pBinData->ReadUInt64(); //远程可写入地址 最多8kb//打开远程进程HANDLE hRemoteProcess = ::OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,FALSE, nRemoteProcessId);//写入一个整数或其他的内容,但要小于对方进程分配的大小,此处为8kbint nValue = 8888;SIZE_T nWriteSize = 0;::WriteProcessMemory(hRemoteProcess, LPVOID(nRemoteAddress),&nValue, sizeof(int), &nWriteSize);::CloseHandle(hRemoteProcess);hRemoteProcess = NULL;if (nWriteSize == 0){return FALSE;}return TRUE;//其他代码//略//....
}
http://www.lryc.cn/news/195027.html

相关文章:

  • 【日常业务开发】接口性能优化
  • Android 10.0 禁止弹出系统simlock的锁卡弹窗功能实现
  • VulnHub lazysysadmin
  • ppt怎么压缩到10m以内?分享ppt缩小方法
  • 智能警用装备管理系统-科技赋能警务
  • 攻防千层饼
  • 组件封装使用?
  • 2.3 初探Hadoop世界
  • Flutter笔记:发布一个电商中文货币显示插件Money Display
  • 解密zkLogin:探索前沿的Sui身份验证解决方案
  • js构造函数
  • 性能测试-redis常见问题
  • 预测:2024 年将是互联网永远改变的一年。
  • Vue2 与 React 的区别
  • 【AI视野·今日Robot 机器人论文速览 第五十一期】Tue, 10 Oct 2023
  • 零经验想跳槽转行网络安全,需要准备什么?
  • Rust-是否使用Rc<T>
  • 论文解析——一种面向Chiplet互连的高效传输协议设计与实现
  • svo2.0 svo pro 编译运行
  • 微信小程序前端生成动态海报图
  • SQL如何导入数据以及第一次上机作业
  • 数据结构-----红黑树简介
  • 哈佛教授因果推断力作:《Causal Inference: What If 》pdf下载
  • Drecom 的《Eternal Crypt - Wizardry BC -》加入 The Sandbox 啦!
  • 外贸网站流量下降可能是这五点原因造成的
  • 交通部 EDI是什么?如何处理?
  • 【Redis】Java Spring操作redis
  • 如何养好一个微信新号?
  • flutter问题汇总
  • 2.1 初探大数据