【问题标题】:why are the variables of this structure not filled up when called?为什么这个结构的变量在调用时没有被填满?
【发布时间】:2010-07-04 16:02:33
【问题描述】:

我有以下代码,当我运行它时,将 1000 个字节传递给函数中的参数,结构 MEMORY_BASIC_INFORMATION 没有使用任何变量,它们都保持值 0。我想知道这是否应该是吗?

public unsafe static bool CheckForSufficientStack(long bytes)
{
  MEMORY_BASIC_INFORMATION stackInfo = new MEMORY_BASIC_INFORMATION();

  IntPtr currentAddr = new IntPtr((uint)&stackInfo - 4096);

  VirtualQuery(currentAddr, ref stackInfo, sizeof(MEMORY_BASIC_INFORMATION));

  return ((uint)currentAddr.ToInt64() - stackInfo.AllocationBase) > (bytes + STACK_RESERVED_SPACE);
}

private const long STACK_RESERVED_SPACE = 4096 * 16;

[DllImport("kernel32.dll")]
private static extern int VirtualQuery(
  IntPtr lpAddress,
  ref MEMORY_BASIC_INFORMATION lpBuffer,
  int dwLength);

   private struct MEMORY_BASIC_INFORMATION
   {
     internal uint BaseAddress;
     internal uint AllocationBase;
     internal uint AllocationProtect;
     internal uint RegionSize;
     internal uint State;
     internal uint Protect;
     internal uint Type;
    }

我在 Core Duo 2.0Ghz 上运行 Vista Enterprise X64。

【问题讨论】:

标签: c# struct variables


【解决方案1】:

好吧,使用uint 谈论 X64 上的地址可能是个问题。为什么是 -4096?

我本以为只是:

IntPtr currentAddr = new IntPtr(&stackInfo);

【讨论】:

  • uint 在 X64 上不是 64 位吗?
  • 卡萨布兰卡:不; uint 始终是 System.UInt32 类的包装器。
  • @Warren - 具体来说,它始终是System.UInt32别名(不是包装器)
  • 嗨(抱歉,这里离题了;不知道如何联系到您),尽管社区一致认为在 Stack Overflow 上欢迎 LaTeX 问题,但您在这里关闭了一个问题 stackoverflow.com/questions/3170940/…。可以重新打开吗? [如果真的非常讨厌 TeX,也许你可以让 TeX 用户在这里“提交”:area51.stackexchange.com/proposals/2148/… 以便有一个单独的网站。]
  • 顺便说一句,如果您不相信我,请参阅 LaTeX 问题的元线程:meta.stackexchange.com/questions/12918/… 我的共识似乎相当一致。版主难道不应该明智地使用他们的权力,并且只在必要或情况很明显的时候使用? :-)
【解决方案2】:

是的,此代码无法在 64 位操作系统上运行。强制转换是错误的,MEMORY_BASIC_INFORMATION 的声明也是错误的。这应该更接近,未经测试,因为我现在还没有接近 x64 机器:

    public unsafe static bool CheckForSufficientStack(long bytes) {
        var stackInfo = new MEMORY_BASIC_INFORMATION();
        IntPtr currentAddr = new IntPtr((long)&stackInfo - 4096);
        VirtualQuery(currentAddr, ref stackInfo, sizeof(MEMORY_BASIC_INFORMATION));
        return (currentAddr.ToInt64() - (long)stackInfo.AllocationBase) > (bytes + STACK_RESERVED_SPACE);
    }

    private struct MEMORY_BASIC_INFORMATION {
        internal IntPtr BaseAddress;
        internal IntPtr AllocationBase;
        internal uint AllocationProtect;
        internal IntPtr RegionSize;
        internal uint State;
        internal uint Protect;
        internal uint Type;
    }

【讨论】:

  • 还有一个问题:dwLength参数声明也是错误的,它是IntPtr。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2011-11-16
  • 2021-10-31
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多