关于WriteProcessMemory 错误 GetLastError = 299

本文解决了在64位程序DLL注入过程中遇到的WriteProcessMemory错误问题。通过对比debug与release模式,发现关闭增量链接选项可以有效避免此错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做64位程序dll注入时候出现  WriteProcessMemory的299错误 ,查找错误代码 解释为 “仅完成部分的 ReadProcessMemory 或 WriteProcessMemory 请求。”

完全搞不清楚怎么回事, 因为调用了两次 WriteProcessMemory,第一次正常,第二次调用出错。

最后发现 release模式不会出错,然后对比,发现关闭 “启动增量连接” 可解决


将 配置属性-》连接器-》常规-》启动增量链接 选项 设置为 否


编译器版本为 vs2017

### WriteProcessMemory 函数详解 #### 功能描述 `WriteProcessMemory` 是 Windows API 中用于向指定进程的地址空间写入数据的函数。此操作通常涉及调试、注入或其他跨进程通信场景。 #### 参数列表 该函数接受五个参数,具体如下: - `HANDLE hProcess`: 目标进程句柄,需具备 PROCESS_VM_WRITE 和 PROCESS_VM_OPERATION 权限[^1]。 - `LPVOID lpBaseAddress`: 指定要写入的目标进程内的基址位置;如果不确定确切地址,则可通过其他手段(如 `VirtualAllocEx`)分配新区域并返回其首地址作为输入[^2]。 - `LPCVOID lpBuffer`: 存储待传输的数据缓冲区指针,在调用方进程中有效。 - `SIZE_T nSize`: 表明从源缓冲区复制到目标内存的数量,单位为字节。 - `SIZE_T* lpNumberOfBytesWritten`: 可选输出参数,接收实际成功传送了多少个字节的信息。当不需要获取这一数值时可以传入 NULL 值。 #### 返回值解释 若执行无误则返回 TRUE (非零),反之失败情况下返回 FALSE (0) 并设置 GetLastError() 提供更详细的错误原因。 #### 示例代码展示 下面给出一段简单的 C++ 实现例子来演示如何利用上述提到的功能完成一次基本的数据传递过程: ```cpp #include <windows.h> #include <iostream> // 定义自定义结构体 struct InjectParam { DWORD id; char name[64]; }; int main(){ // 获取目标进程ID DWORD targetPid = /* ... */; // 打开目标进程 HANDLE hTarProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid); if (!hTarProc){ std::cerr << "Failed to open process." << std::endl; return -1; } // 初始化欲发送给子程序的消息内容 InjectParam param{ .id=1 }; strcpy_s(param.name,"example"); // 分配远程内存空间 LPVOID pMemParam = VirtualAllocEx(hTarProc, nullptr,sizeof(InjectParam), MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE); // 向目标进程写入数据 BOOL result = WriteProcessMemory( hTarProc, pMemParam, &param, sizeof(InjectParam), nullptr ); CloseHandle(hTarProc); if(result==FALSE){ std::cout<<"Error writing memory\n"; }else{ std::cout<<"Successfully wrote data into the remote process.\n"; } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值