почему переменные этой структуры не заполняются при вызове? - PullRequest
0 голосов
/ 04 июля 2010

У меня есть следующий код, и когда я запускаю его, передавая 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;
    }

Я использую Vista Enterprise X64 на Core Duo 2,0 ГГц.

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Да, этот код не может работать в 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;
    }
1 голос
/ 04 июля 2010

Что ж, использование uint для разговора об адресе в X64 может быть проблемой. И почему -4096?

Я бы подумал просто:

IntPtr currentAddr = new IntPtr(&stackInfo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...