在WinDBG扩展中使用管道

时间:2019-07-16 22:39:25

标签: winapi windbg

我正在编写WinDBG扩展来调试设备驱动程序,并且需要调用外部二进制文件来调试设备的固件。我想在WinDBG控制台中显示此二进制文件的输出。

我最初的想法是简单地将二进制文件的输出传递到缓冲区,并使用ControlledOutput打印该缓冲区。但是,当我尝试从扩展程序中的管道读取时,出现“管道中断”错误。

这是我在扩展程序中创建外部流程的方式:

SECURITY_ATTRIBUTES sAttr;
HANDLE childOutRead = NULL;
HANDLE childOutWrite = NULL;
PROCESS_INFORMATION childProcInfo;
STARTUPINFO childStartInfo;

char buf[4096];

sAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
sAttr.bInheritHandle = TRUE;
sAttr.lpSecurityDescriptor = NULL;

CreatePipe(&childOutRead, &childOutWrite, &sAttr, 0);
// don't inherit read end
SetHandleInformation(childOutRead, HANDLE_FLAG_INHERIT, 0);

ZeroMemory(&childProcInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&childStartInfo, sizeof(STARTUPINFO));

childStartInfo.cb = sizeof(STARTUPINFO);
childStartInfo.hStdError = childOutWrite;
childStartInfo.hStdOut = childOutWrite;
childStartInfo.hStdIn = GetStdHandle(STD_INPUT_HANDLE);
childStartInfo.dwFlags |= STARTF_USESTDHANDLES;

CreateProcessA(NULL, "myBinary.exe someArgs", 
               NULL, NULL, TRUE, 0, NULL, NULL, 
               &childStartInfo, &childProcInfo);

// close the handle not used in parent
CloseHandle(childOutWrite);

// read output
while (1) {
    DWORD read;
    BOOL r;
    DWORD error;

    r = ReadFile(childOutRead, buf, sizeof(buf), &read, NULL);
    if (!r) {
        error = GetLastError();
        windbgPrintf("got error 0x%x\n", error);
        break;
    }
    if (read == 0) break;
    windbgPrint(buf, read);
}

ReadFile失败,错误为0x6DBROKEN_PIPE。这使我怀疑管道是否以某种方式没有被继承。

在WinDBG之外的测试中,我有几乎相同的代码,因此它必须做不同的事情。如何在WinDBG中使管道以这种方式工作?

0 个答案:

没有答案