私がやりたいのは、 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()
、名前付きパイプに有効な出力を提供するために何をする必要があるかを理解しようとして、さまざまな名前付きパイプ設定で遊んでいます。