Вы не можете надежно получить весь вывод консоли из процесса, только перенаправив его стандартные дескрипторы. Как только он использует функции ввода / вывода в консоли, они будут работать только с реальной консолью, а не с дескрипторами файлов.
Как правило, по умолчанию, ненаправленные STD_INPUT_HANDLE
, STD_OUTPUT_HANDLE
и STD_ERROR_HANDLE
являются только псевдо-дескрипторами, так как они не являются ядрами, известными ядру NT для этого процесса. API-интерфейсы ReadFile
и WriteFile
содержат хак, который проверяет эти псевдо-дескрипторы и перенаправляет вызов на ReadConsoleA
и WriteConsoleA
в зависимости от ситуации. Однако все консольные API работают только с псевдо-дескрипторами консоли (именуемые консольные входные буферы и консольные экранные буферы ) и завершатся ошибкой при передаче реального дескриптора файла .
Теперь, из-за этого перенаправления и того факта, что большинство программ используют файловые API при записи или чтении из консоли, это означает, что может иметь некоторый уровень перенаправления, но с тех пор, как вы хочу сделать это полный консольный эмулятор, этого будет недостаточно. Вы не сможете перехватывать любые вызовы, которые, например, изменяют размер или атрибуты экранного буфера, читают из него, создают альтернативные и т. Д.
Если вы не боитесь языка ассемблера и реверс-инжиниринга, вы можете изучить возможность подключения различных консольных API-интерфейсов к целевому процессу (и их дочерним элементам) или, в случае Windows 7, переопределить conhost.exe
.