【问题标题】:Casting pointer to ULONG_PTR to do pointer arithmetic that is compatible in 32 bit and 64 systems?将指针转换为 ULONG_PTR 以执行在 32 位和 64 系统中兼容的指针运算?
【发布时间】:2021-05-20 00:04:39
【问题描述】:

我正在编写一个内核模式驱动程序,它执行一些指针运算,首先我得到一个 PVOID 指针,指向内存中 PE 模块的一部分,然后我需要向它添加一个偏移量并以适用于它的方式编译它32位和64位系统。

转换为 INT 或 UINT 将不起作用,因为众所周知,它们在 64 位系统中仍然是 32 位,因此在 64 位系统中将地址转换为它会导致问题。

所以现在我将地址转换为 ULONG_PTR,这似乎是 Microsoft 所建议的:

https://docs.microsoft.com/en-us/windows/win32/winprog64/rules-for-using-pointers

然后对其进行算术运算并得到新地址。

我这样做是最好的方式,还是除了 ULONG_PTR 之外还有更好的选择吗?因为我没有太多将地址转换为 ULONG_PTR 的示例代码。

将 64/32 位 PVOID 地址转换为 ULONG_PTR 对其进行算术运算会遇到任何问题吗?

基本上,我想将地址转换为某种类型,即 32 位系统中的 32 位和 64 位系统中的 64 位并且是无符号的,并允许我对地址进行算术运算,并寻找转换我的最佳选择PVOID 到。

【问题讨论】:

    标签: c windows visual-c++


    【解决方案1】:

    C 标准方法是转换为 uintptr_t;但如果你想与 Microsoft 代码保持一致,你会使用它们的非标准 typedef。

    当涉及到使用偏移量进行算术运算时,普遍的看法是编译器即使使用整数也可以跟踪出处,因此如果您将 void * 转换为 uintptr_t 并操纵结果值使其指向另一个完全不属于原始分配/对象的对象并将其转换回void *,那么行为将是未定义的(例如参见GCC),但我很确定每个人都会在低级编程中做到这一点,并且相信 Microsoft 编译器不会那样跟踪指针出处。

    【讨论】:

    • OP 正在导航一个 PE 图像。整个图像作为一个整体映射到内存中。这算作一次分配吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多