【问题标题】:MiniDumpWriteDump() into a named pipe then ReadFile()MiniDumpWriteDump() 进入命名管道,然后 ReadFile()
【发布时间】:2020-09-16 18:07:54
【问题描述】:

我想做的是使用 MiniDumpWriteDump() 写入命名管道,然后自己读/写它。如果我直接将内容写入文件,我能够成功执行转储。但是,虽然写入命名管道已成功,但随后的读/写操作并不顺利。我可以从管道中读取所有数据,但是当它被写入时,DMP 文件似乎已损坏。

这里是 ReadFile() 逻辑:

while (ReadFile(hInboundPipe, &vecBuffer[dwOffset], vecBuffer.size() - dwOffset, &dwRead, NULL)) {
    dwOffset += dwRead;

    while (dwOffset >= vecBuffer.size()) {
        vecBuffer.resize(vecBuffer.size() + iBuffer * sizeof(char));
    }
}

这是 WriteFile() 逻辑:

HANDLE hDumpFile = CreateFileW(L"C:\\test.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hDumpFile , &vecBuffer[0], dwOffset, &dwOutBytes, NULL);
CloseHandle(hDumpFile);

我不确定它是否适用于根本原因,但这里是命名管道设置:

    HANDLE hInboundPipe = CreateNamedPipe(
    szPipeName,
    PIPE_ACCESS_DUPLEX,
    PIPE_WAIT | PIPE_TYPE_BYTE,
    PIPE_UNLIMITED_INSTANCES,
    0,
    0,
    (DWORD)-1,
    &SecAttrib);

GetLastError() 没有报告任何错误。我错过了什么明显的东西吗?

编辑:添加 MiniDumpWriteDump() 如何响应评论。

HANDLE hDump = CreateFile(szPipeName, GENERIC_ALL, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
MiniDumpWriteDump(hProcess, pid, hDump, mdValue, NULL, NULL, NULL);
CloseHandle(hDump);

更新: 我的印象是按块读取会以某种方式丢弃数据。为了测试这一点,我增加了命名管道的缓冲区以容纳整个转储,而无需调整大小。我还增加了vecBuffer 的大小以匹配。现在在执行ReadFile() 操作时,我收到了整个转储,但它仍然关闭。我仍在尝试各种命名管道设置,试图弄清楚需要做什么才能让MiniDumpWriteDump() 为命名管道提供有效的输出。

【问题讨论】:

  • 您是否在单独的线程上编写转储而不是读取它?因为管道可能已满并等待有人读取数据。
  • @user253751 是的。我正在启动两个不同的线程。一个用于 MiniDumpWriteDump(),另一个用于读/写操作。
  • vecBuffer 是如何声明的? sizeof(char) 根据定义始终为 1,因此在调整大小行上是多余的,因此该缓冲区的类型可能存在混淆
  • std::vector<char> vecBuffer(iBuffer);。我在故障排除过程中添加了sizeof(char) 代码,并将根据您的建议将其删除。在之前的一些测试中,我将vecBuffer 设置得足够大,以避免需要调整它的大小。无论是否调整 vecBuffer 的大小都会出现此问题。
  • 您如何验证输出确实无效? MiniDumpWriteDump 非常灵活,可以生成 Visual Studio 无法成功打开的转储。如果发生这种情况,请改用 WinDbg。

标签: c++ winapi named-pipes minidumpwritedump


【解决方案1】:

这似乎无法做到。有关详细信息,请参阅 cmets。无法从MiniDumpWriteDump() 直接写入命名管道,因为传入的句柄必须具有查找能力。命名管道没有该功能,因此您必须使用合法的文件句柄。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2010-10-10
    • 2013-04-17
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2015-05-31
    相关资源
    最近更新 更多