C++ WinAPI 读取进程内存
C++ WinAPI ReadProcessMemory
我刚开始学习 WinAPI,我偶然发现了函数的不同变量。
现在我正在为 ReadProcessMemory
苦苦挣扎。
代码是:
ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0);
现在我明白了第一个参数是进程的句柄,但我不明白为什么第二个参数(指向基地址的指针)必须是空地址(LPVOID
)。
在 MSDN 中它说:
指向要从中读取的指定进程中的基地址的指针。在发生任何数据传输之前,系统会验证指定大小的基址和内存中的所有数据是否都可以进行读取访问,如果不可访问,则函数失败。
那么为什么第二个参数必须是 (LPVOID) 地址而不仅仅是地址?
嗯,lpBaseAddress
是...一个地址,所以它的类型应该是一个指针是有道理的。它指向什么类型?我们不知道,而且这个(WinApi)是 C,所以没有模板——因此 void *
。另外,我们不想修改内存,所以 const
是一个很好的措施。
关于您的编辑(为什么要强制转换):这取决于 address
的类型。任何非 volatile
对象指针都可以隐式转换为 void const *
,因此在这种情况下不需要强制转换。不过,我想该地址是一个已知的 integer
常量,在这种情况下,需要 reinterpret_cast
才能将其转换为指针。这是用 C 风格转换的糟糕风格完成的,但达到了同样的效果。
我刚开始学习 WinAPI,我偶然发现了函数的不同变量。
现在我正在为 ReadProcessMemory
苦苦挣扎。
代码是:
ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0);
现在我明白了第一个参数是进程的句柄,但我不明白为什么第二个参数(指向基地址的指针)必须是空地址(LPVOID
)。
在 MSDN 中它说: 指向要从中读取的指定进程中的基地址的指针。在发生任何数据传输之前,系统会验证指定大小的基址和内存中的所有数据是否都可以进行读取访问,如果不可访问,则函数失败。
那么为什么第二个参数必须是 (LPVOID) 地址而不仅仅是地址?
嗯,lpBaseAddress
是...一个地址,所以它的类型应该是一个指针是有道理的。它指向什么类型?我们不知道,而且这个(WinApi)是 C,所以没有模板——因此 void *
。另外,我们不想修改内存,所以 const
是一个很好的措施。
关于您的编辑(为什么要强制转换):这取决于 address
的类型。任何非 volatile
对象指针都可以隐式转换为 void const *
,因此在这种情况下不需要强制转换。不过,我想该地址是一个已知的 integer
常量,在这种情况下,需要 reinterpret_cast
才能将其转换为指针。这是用 C 风格转换的糟糕风格完成的,但达到了同样的效果。