Консоль

Тема в разделе "WASM.WIN32", создана пользователем Lord_De_Seis, 13 апр 2007.

  1. Lord_De_Seis

    Lord_De_Seis New Member

    Публикаций:
    0
    Есть ли способ без запуска лишних процессов, и написания "велосипедного завода", используя вызовы апи выполнить консольную команду.
     
  2. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Информации, заложенной в вопросе, не хватает для более точного ответа. Распишите контекст вашей задачи.
     
  3. Lord_De_Seis

    Lord_De_Seis New Member

    Публикаций:
    0
    ОК
    Контекст очень простой. Хочется взять произвольный поток, произвольного процесса. С помощью назначения ему APC, создать новый поток в этом процессе. Главная функция нового потока должна быть не очень сложна, или вообще являтся какой-нибудь зацикленной и ожидающей события заглушкой.
    Далее в произвольный момент времени нужно сделать так что бы наш поток выполнил произвольную консольную команду и вернул результат, словно я написал эту команду в cmd.exe и смотрю на то что он мне вывел в ответ.
    Со всем этим не будет никаких проблем, если будет найдена более менее простая реализация непосредственно выполнения консольной команды.
    Разумеется создание процесса разрушает всю идею, и этот вариант не рассматривается.
     
  4. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Клевая идея :derisive:))
    1. Поток должен получить хэндл консоли, которой и будет отправлена твоя команда.
    - консольное приложение его имеет изначально. Здесь нет проблемы.
    - гуи нет, но можно создать с помощью AllocConsole.

    Консольная команда должна быть введена незаметно от пользователя ?
     
  5. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Млин, вспомнил что тока один тред может общаться с юзером.
    Это создает нект. проблемы.
     
  6. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Итак, корректировка своих предыдущих ответов:
    Если создаещь новый поток, то он будет рабочим, но никак главным ( который общается с юзером ). И хэндл будет у main thread.
    1 задача - отнять у главного треда хэндл =) .
     
  7. Lord_De_Seis

    Lord_De_Seis New Member

    Публикаций:
    0
    Несовсем понял вас....
    1) Что значит мистическое "общатся с юзером"?
    2) Что значит "отнять хэндл" у главного потока? Хэндлы действительны во всём процессе.
    3) С AllocConsole итак понятно. Но если мы имеем консоль, я просто не знаю, как выполнить команду, именно с этим я прошу помочь. То есть мне достаточно статьи или исходника или простой ссылки на функции или любая другая инфа по этому поводу.
    А показывать вообще ничего никому не нужно...

    Есть в сишке такая вещь - system() но в её реализации там чёрт ногу сломит. Просто нужно написать что то подобное с апи вызовами.
     
  8. G13

    G13 New Member

    Публикаций:
    0
    Lord_De_Seis, это через пайпы реализуется. Советую глянуть
    Iczellion's Tutorial #21.

    Также в аттаче неплохой пример - перехватывает вывод с консоли ml.exe.
     
  9. Ation

    Ation New Member

    Публикаций:
    0
    system/wsystem ?
     
  10. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Это значит, что в этом вопросе я некомпететен. Изввиняюсь перед форумом и Lord_De_Seis
     
  11. Lord_De_Seis

    Lord_De_Seis New Member

    Публикаций:
    0
    2G13 просмотрел.... я понял, о чём ты. Просто использовать анонимные пайпы, для общения с консолью... это известный метод... Только как бы обойтись без CreateProcces.... только всё больше склоняюсь к тому что никак.
    2Ation Присмотревшись по-внимательнее понял что system реализована так же... для каждой команды она вызывает cmd.exe
     
  12. G13

    G13 New Member

    Публикаций:
    0
    Lord_De_Seis, выполнить консольную команду, да ещё и без CreateProcess… гм…

    Напиши свой интерпретатор ;))
     
  13. el-

    el- New Member

    Публикаций:
    0
    жесть, давай те строить небоскребы из соломы (:
    значит так, ловим процесс суспендим все нафиг что б не мешалось, любой из тредос с помощью изменения CONTEXT настраиваем eip на адресс загрузчика, который мы собственно инжектировали предваритльно, т.к. в cmd.exe нету релоков, придется переносить память с её имадж бейс куда нить, после этого настраиваем иморты, делаем все необходимые операции что б цмд запустилась удачно, и собственно в виде командной строки передаем свою фигю че нить типа "/c echo L0L". так же придется перехватывать TerminateProcess, что бы по выполнению cmd не убило все нафиг. как считатать результат я хз, после все этого цмд нафиг убираем, возвращаем память на место, ресумем треды ... т.е. если все будет сделанно быстро, небольшой глюк и опа все опять работает ((:

    зы. такой маразм, а чем новый процесс мешает ? ты скажи нафига это надо, че проще способа не найти чтоль (:

    update: хотя щас подумал, большая часть команд из cmd это всего лишь маленькие програмки которая она запускает, так что вероятность не запускать новый процесс все ниже и ниже (: