【问题标题】:How to correctly call the HeapSummary API in Win32?Win32中如何正确调用HeapSummary API?
【发布时间】:2020-08-05 04:59:10
【问题描述】:

我想从 Win32 API 调用 HeapSummary 函数:

https://docs.microsoft.com/en-us/windows/win32/api/heapapi/nf-heapapi-heapsummary

似乎缺少dwFlags 参数的可能选项列表。我尝试不使用任何标志,但 GetLastError() 返回 The parameter is incorrect 错误消息。

    HEAP_SUMMARY heap_summary;
    HeapSummary(GetProcessHeap(), 0, &heap_summary); // Error: The parameter is incorrect

【问题讨论】:

  • HeapSummary 返回了什么值?
  • @JonathanPotter 它返回错误
  • 虽然微软文档严重缺乏,但我猜cb 成员需要初始化为sizeof(HEAP_SUMMARY)
  • 就像 HEAP_SUMMARY 的 cb 成员的文档中所说的那样:“将此成员设置为 sizeof(HEAP_SUMMARY)。”

标签: c++ winapi heap-memory


【解决方案1】:

正如@Jonathan Potter 所说,我们应该将cb 成员设置为sizeof(HEAP_SUMMARY)

我创建了一个样本来查找原因:

#include <windows.h>
#include <heapapi.h>

int main(int argc, const char* argv[])
{
    HEAP_SUMMARY heap_summary;
    memset(&heap_summary, 0, sizeof(heap_summary));
    HANDLE h = GetProcessHeap();
    HeapSummary(h, 0, &heap_summary); // Error: The parameter is incorrect
    DWORD err = GetLastError();
    return 0;
}

然后在反汇编中进入HeapSummary

你可以看到它比较传递的指针和14h (20),如果不相等就push57h (error 87)

所以我们需要将sizeof(HEAP_SUMMARY) 传递给HEAP_SUMMARYcb 成员。

关于cbdocument中描述的问题,我会向微软反馈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多