为什么ReadProcessMemory有`lpNumberOfBytesRead`?

Bil*_*eal 16 c++ windows

MSDN中的ReadProcessMemory:

lpBaseAddress [in]:
指向要读取的指定进程中的基址的指针.在发生任何数据传输之前,系统会验证基本地址和指定大小的内存中的所有数据是否都可以进行读访问,如果无法访问,则该函数将失败.

nSize [in]:
从指定进程读取的字节数.

lpNumberOfBytesRead [out]
指向变量的指针,该变量接收传输到指定缓冲区的字节数.如果lpNumberOfBytesRead为NULL,则忽略该参数.

所以.. ReadProcessMemory只能完全成功或完全失败.并且呼叫者显然知道大小 - 必须通过它来拨打电话.为什么有lpNumberOfBytesRead

Rem*_*anu 11

来自winerror.h:

//
// MessageId: ERROR_PARTIAL_COPY
//
// MessageText:
//
//  Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
//
#define ERROR_PARTIAL_COPY               299L
Run Code Online (Sandbox Code Playgroud)

ReadProcessMemory将返回FALSE并在副本发生页面错误时GetLastError返回ERROR_PARTIAL_COPY.这是转储器中的常见情况,它必须处理可能已损坏的进程,因此无法确定所请求的区域是否有效(他们追逐以获取起始地址的指针可能已损坏并指向la- la-land),但他们仍然希望尽可能多地复制到垃圾场.

  • 是.想象一下*如何*你将如何实现一个原子的ReadProcessMemory(复制一切,或什么都不复制).您必须*回滚*副本(意味着您已保存以前写入的内容),或者您必须在两次传递中进行复制(一次验证请求区域中的每一页,一份)并希望目标进程执行不改变通行证之间的页面保护. (2认同)