我想做的是使用 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()
为命名管道提供有效输出。