gpt4 book ai didi

c - 低级控制台输入和重定向

转载 作者:可可西里 更新时间:2023-11-01 13:27:14 25 4
gpt4 key购买 nike

我正在尝试向 cmd.exe 的输入发送命令应用程序使用低级读/写控制台功能。我使用 ReadConsole...() 阅读文本(抓取)没有问题和 WriteConsole()附加到流程控制台后的功能,但我还没有想出如何编写例如 "dir"并让控制台将其解释为发送的命令。

这是我的一些代码:

CreateProcess(NULL, "cmd.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
AttachConsole(pi.dwProcessId);

strcpy(buffer, "dir");
WriteConsole(GetStdHandle(STD_INPUT_HANDLE), buffer, strlen(buffer), &charRead, NULL);
STARTUPINFO进程的所有属性都设置为零,当然, .cb 除外。属性。

屏幕上没有任何变化,但是我收到了 Error 6: Invalid HandleWriteConsole 返回至 STD_INPUT_HANDLE .如果我写信给 (STD_OUTPUT_HANDLE)我确实得到了我的 dir写在屏幕上,但当然什么也没发生。我猜 SetConsoleMode()可能会有所帮助,但我尝试了多种模式组合,但没有任何帮助。我还创建了一个快速控制台应用程序,它等待输入( scanf() )并回显输入的任何内容,但不起作用。

我也试过输入 scanf()提示然后使用 PeekConsoleInput() 查看输入缓冲区, 返回 0,但 INPUT_RECORD数组为空。

我知道还有另一种方法可以使用 WriteConsoleInput() 来解决这个问题。将 INPUT_RECORD 结构化事件直接注入(inject)控制台,但这太长了,我必须将每个按键都发送到其中。

我希望这个问题很清楚。如果您需要任何进一步的信息,请告诉我。谢谢你的帮助。

更新 1:

我可以将按键发送到 cmd使用 WriteConsoleInput() 处理与 INPUT_RECORD然而,结构体是 AttachConsole有时会抛出 ERROR_GEN_FAILURE #31: A device attached to the system is not functioning. ,因此 INPUT_RECORD未发送 ( Error 6: Invalid Handle )。 Sleep(1000)CreateProcess()之前 AttachConsole()解决这个问题。人物 dir是自动输入的,但我不知道如何发送 RETURN key :
ir[0].EventType = KEY_EVENT;
ir[0].Event.KeyEvent.bKeyDown = TRUE;
ir[0].Event.KeyEvent.dwControlKeyState = 0;
ir[0].Event.KeyEvent.uChar.UnicodeChar = '\n';
ir[0].Event.KeyEvent.wRepeatCount = 1;
ir[0].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
ir[0].Event.KeyEvent.wVirtualScanCode = MapVirtualKey(VK_RETURN, MAPVK_VK_TO_VSC);
ir[1].EventType = KEY_EVENT;
ir[1].Event.KeyEvent.bKeyDown = FALSE;
ir[1].Event.KeyEvent.dwControlKeyState = 0;
ir[1].Event.KeyEvent.uChar.UnicodeChar = '\n';
ir[1].Event.KeyEvent.wRepeatCount = 1;
ir[1].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
ir[1].Event.KeyEvent.wVirtualScanCode = MapVirtualKey(VK_RETURN, MAPVK_VK_TO_VSC);

WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), ir, 2, &charRead);
WriteConsoleInput返回 0 ,但控制台没有任何 react ,我试过设置 SetConsoleMode()ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT以及它们的组合,但没有结果。但是,如果我从键盘上按 Enter 键,则会自动输入 dir命令执行(不像我只是 WriteConsole() 的时候),所以我想我是在正确的轨道上。

SSH 不发送实际的按键并获取实际的屏幕缓冲区(如 TAB 和 CTRL+C CTRL+D 工作)?我在追求类似的东西。

更新 2:

我发现注入(inject)返回命令的问题。应该是 ir[1].Event.KeyEvent.uChar.AsciiChar = '\r';\r而不是 \n , super 简单。

好像没有办法用 WriteConsole()要输入命令,应该通过发送 WriteConsoleInput() 来获得。 INPUT_RECORDs 或通过创建管道(这并不总是完美的,但对于大多数直接应用程序非常有用)。使用 WriteConsoleInput() 的一大优势是你一个可以发 VK_UPVK_DOWN , 访问控制台历史记录,(如果我们在 CMD 中)和 VK_TAB对于自动完成,所有 CTRL+_ 序列、ESC 和 FUNCTION 键,甚至鼠标单击。

更多信息在这里: http://msdn.microsoft.com/en-us/library/ms687403%28v=vs.85%29.aspx
加上这里的大量示例: http://controllingtheinter.net/forums/viewtopic.php?f=116&t=366

如果有人有其他很棒的想法,请随时参与。感谢所有对此感兴趣的人。希望这对将来的人有所帮助。

最佳答案

现在您正在尝试写入您自己的 stdin 句柄,而不是 cmd.exe 进程的句柄。您将不得不做更多的工作来重定向那个输入句柄。它需要一个管道。这是一个 KB article显示样板代码。

顺便说一句:总是检查 API 函数的返回值。

关于c - 低级控制台输入和重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com