VirtualQuery给出了非法的结果。这是一个错误吗?

时间:2009-10-05 10:52:53

标签: virtualquery

我的代码:

MEMORY_BASIC_INFORMATION meminf;
::VirtualQuery(box.pBits, &meminf, sizeof(meminf));

结果:

   meminf:
    BaseAddress          0x40001000    void *
    AllocationBase       0x00000000    void *
    AllocationProtect    0x00000000    unsigned long
    RegionSize           0x0de0f000    unsigned long
    State                0x00010000    unsigned long
    Protect              0x00000001    unsigned long
    Type                 0x00000000    unsigned long

注意:

(1)AllocationBase为NULL,而BaseAddress不为NULL (2)AllocationProtect为0(不是保护值)

这是VirtualQuery的错误吗?

2 个答案:

答案 0 :(得分:1)

将内核模式指针传递给此函数可能导致不返回任何信息。 检查返回值。

答案 1 :(得分:1)

这不是错误。 documentation of VirtualQuery()州:

  

返回值是信息缓冲区中返回的实际字节数。

     

如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。可能的错误值包括ERROR_INVALID_PARAMETER。

在使用结构中的数据之前检查函数结果是否等于sizeof(meminf),或者使用将使后面的代码做正确的值的结构初始化结构。如果函数返回0没有数据被复制到结构中,那么它仍将包含之前的任何数据。如果没有初始化,这将是堆栈上的随机字节。