我希望你的节目进展顺利。
我有一个问题,我希望由于我缺乏知识而提出一个简单的答案。
我已使用此问题的代码 - CreateProcess cmd.exe read/write pipes deadlock
一切都运作良好。
问题是当我从cmd.exe shell运行需要交互性的其他命令时,例如python或powershell,我得到初始输出,然后没有任何内容写入管道。
所以这就是我的输入/输出:
static PCSTR commands[] = { "powershell\r\n", "dir\r\n", "help\r\n"};
ULONG n = RTL_NUMBER_OF(commands);
PCSTR* psz = commands;
do
{
if (MessageBoxW(0,0, L"force close ?", MB_YESNO) == IDYES)
{
DisconnectNamedPipe(hFile);
break;
}
if (p = new U_IRP(&obj))
{
PCSTR command = *psz++;
p->Write(command, (ULONG)strlen(command) * sizeof(CHAR));
p->Release();
}
} while (--n)
当代码运行时,我得到了最初的powershell.exe提示
PS C:\Users>
但之后没有任何东西写入管道。
代码正在使用CreateProcess(...“cmd.exe”...)我尝试将其从“cmd.exe”更改为“cmd.exe / c”和“cmd.exe / k”,两者都不起作用。
也许你会知道我需要做什么来读取/写入输出到解释,如来自CreateProcess()诱导管道的python或powershell?谢谢你的帮助!
答案 0 :(得分:1)
你执行 cmd.exe 并通过管道发送命令给exec powershell 。所有这些都取决于 powershell 实现
在window7上:
powershell 使用ReadConsoleW
获取输入。所以它不使用你命名管道 - 不读取它。并且您可以注意到在执行 powershell 之后控制台窗口变为交互式。所以 powershell 不接受你写给管道的内容(它根本就没有读取它),而是从屏幕上读取用户输入。但是在手动输入一些命令到控制台并按回车键后 - 你可以得到管道输出 - powershell 使用(混合) - WriteFile
和WriteConsoleW
输出。一些信息通过WriteFile
输出,一些通过WriteConsoleW
:
powershell 使用ReadFile
获取输入。和WriteFile
输出。所以它从管道读取命令并将结果写入它。一切都很完美。您也可以注意到,在这种情况下控制台窗口处于非活动状态 - 您无法输入任何文本(与win7不同)
所以使用代码绝对可以。问题只在于第3个程序如何读写数据。如果它没有从您的烟斗中读取 - 您无能为力