Есть ли способ без запуска лишних процессов, и написания "велосипедного завода", используя вызовы апи выполнить консольную команду.
Информации, заложенной в вопросе, не хватает для более точного ответа. Распишите контекст вашей задачи.
ОК Контекст очень простой. Хочется взять произвольный поток, произвольного процесса. С помощью назначения ему APC, создать новый поток в этом процессе. Главная функция нового потока должна быть не очень сложна, или вообще являтся какой-нибудь зацикленной и ожидающей события заглушкой. Далее в произвольный момент времени нужно сделать так что бы наш поток выполнил произвольную консольную команду и вернул результат, словно я написал эту команду в cmd.exe и смотрю на то что он мне вывел в ответ. Со всем этим не будет никаких проблем, если будет найдена более менее простая реализация непосредственно выполнения консольной команды. Разумеется создание процесса разрушает всю идею, и этот вариант не рассматривается.
Клевая идея )) 1. Поток должен получить хэндл консоли, которой и будет отправлена твоя команда. - консольное приложение его имеет изначально. Здесь нет проблемы. - гуи нет, но можно создать с помощью AllocConsole. Консольная команда должна быть введена незаметно от пользователя ?
Итак, корректировка своих предыдущих ответов: Если создаещь новый поток, то он будет рабочим, но никак главным ( который общается с юзером ). И хэндл будет у main thread. 1 задача - отнять у главного треда хэндл =) .
Несовсем понял вас.... 1) Что значит мистическое "общатся с юзером"? 2) Что значит "отнять хэндл" у главного потока? Хэндлы действительны во всём процессе. 3) С AllocConsole итак понятно. Но если мы имеем консоль, я просто не знаю, как выполнить команду, именно с этим я прошу помочь. То есть мне достаточно статьи или исходника или простой ссылки на функции или любая другая инфа по этому поводу. А показывать вообще ничего никому не нужно... Есть в сишке такая вещь - system() но в её реализации там чёрт ногу сломит. Просто нужно написать что то подобное с апи вызовами.
Lord_De_Seis, это через пайпы реализуется. Советую глянуть Iczellion's Tutorial #21. Также в аттаче неплохой пример - перехватывает вывод с консоли ml.exe.
2G13 просмотрел.... я понял, о чём ты. Просто использовать анонимные пайпы, для общения с консолью... это известный метод... Только как бы обойтись без CreateProcces.... только всё больше склоняюсь к тому что никак. 2Ation Присмотревшись по-внимательнее понял что system реализована так же... для каждой команды она вызывает cmd.exe
Lord_De_Seis, выполнить консольную команду, да ещё и без CreateProcess… гм… Напиши свой интерпретатор )
жесть, давай те строить небоскребы из соломы (: значит так, ловим процесс суспендим все нафиг что б не мешалось, любой из тредос с помощью изменения CONTEXT настраиваем eip на адресс загрузчика, который мы собственно инжектировали предваритльно, т.к. в cmd.exe нету релоков, придется переносить память с её имадж бейс куда нить, после этого настраиваем иморты, делаем все необходимые операции что б цмд запустилась удачно, и собственно в виде командной строки передаем свою фигю че нить типа "/c echo L0L". так же придется перехватывать TerminateProcess, что бы по выполнению cmd не убило все нафиг. как считатать результат я хз, после все этого цмд нафиг убираем, возвращаем память на место, ресумем треды ... т.е. если все будет сделанно быстро, небольшой глюк и опа все опять работает ((: зы. такой маразм, а чем новый процесс мешает ? ты скажи нафига это надо, че проще способа не найти чтоль (: update: хотя щас подумал, большая часть команд из cmd это всего лишь маленькие програмки которая она запускает, так что вероятность не запускать новый процесс все ниже и ниже (: