【问题标题】:IntPtr to Uint32? C#IntPtr 到 Uint32? C#
【发布时间】:2009-04-25 07:10:47
【问题描述】:

我需要调用VirtualAllocEx,它会返回 IntPtr。 我调用那个函数来获取一个空地址,这样我就可以在那里写我的密码(这是在另一个进程中)。

如何将结果转换为 UInt32,以便最近可以使用该地址调用 WriteProcessMemory()?

【问题讨论】:

    标签: c# intptr


    【解决方案1】:

    当您调用 WriteProcessMemory 时,您应该为地址传递一个 IntPtr 而不是 UInt32(因为 WriteProcessMemory 需要一个指针,而不是整数)。因此,您应该可以直接使用 VirtualAllocEx 返回的 IntPtr,而无需将其转换为 UInt32。

    【讨论】:

    • [DllImport("kernel32.dll")] private static extern Boolean WriteProcessMemory(IntPtr hProcess, uint lpBaseAddress,byte[] lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten);不。而且我无法更改它,因为我也使用 VirtualQueryEx,它也返回 uint。我不能将 IntPtr 转换为 UInt 吗?
    • VirtualQueryEx 返回块的大小,而不是指针。我没看到问题。
    • VirtualQueryEx 还应该为其 lpAddress 参数采用 IntPtr。基本上,无论您在 Win32 中看到内存句柄的何处,都应该考虑 IntPtr(本机指针类型)而不是 Int32 或 UInt32。在 32 位平台上 IntPtr 和 Int32/UInt32 是一样的,所以你可以调用 IntPtr.ToInt32,或者强制转换为 UInt32,但是为什么不始终使用 IntPtr 呢?它更便携,更能表达意图。
    【解决方案2】:

    我相信你可以用 (uint)ptr 投射它(如果它不能很好地投射,请先尝试 ptr.ToInt32() 或 ToInt64() 。至少我不知道这种方法有任何问题,虽然没有使用它 - 那么多。鉴于 UInt32 的范围比 Int32 更大,并且在非负方面与 Int64 相同,它应该足够好。

    虽然不确定 Int32 在 64 位架构上的表现如何。糟糕的是,我认为 IntPtr 的原因是提供独立于平台的方式来存储指针。

    【讨论】:

      【解决方案3】:

      您的 WriteProcessMemory 的 DLlImport 不正确,基地址是一个指针,因此应将其定义为 IntPtr。

      MSDN

      您需要修复您的 DllImport 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-30
        • 2017-11-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多