Аттач к StdIn-StdOut уже запущенного приложения с консолью - как?(W2k)

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

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    хэндлы stdin,stdout для каждого процесса одинаковые (3,7)
    разные только хэндлы консоли
    при прописывании в peb-> process parameters хэндла консоли нужного приложения при попытке записи writefile вылетает ошибка 6 invalid handle. :dntknw:

    в wxp есть функция AttachConsole. в W2k ее нет(. В сорцах reactos не реализована.
    нид хэлп, в общем.
     
  2. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Инжект->GetStdHandle->DuplicateHandle. Упс, только это не пройдет - консольные хэндлы можно дупликатить только внутри процесса.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Значит, придётся оставаться в процессе, а связь с хостом через IPC.
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Atlantic
    IceStudent
    Принято. Хотелось обойтись без инжекта.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А че такое хендл консоли? Знаю только input handle, output handle, error handle.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Конечно ошибка, если у тебя консоли нету, кто ж тебе даст писать то? AllocConsole надо вызывать, тогда она сама туда запишет эти три хендла (3,7,11), но они будут для твоего процесса.
    Полюбому чтобы писать в чужую консоль нужен инжект
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Great
    да вишь в чем дело... ConsoleHandle он у кждого процесса с консолью разный. Было подозрение (судя по реализации в reactos) что пройдет вариант прописать себе чужой ConsoleHandle.

    Кстати, ошибка возникает и если консоль уже есть, а хэндл подменен.
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    peb-> process parameters -> console handle
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    При создании нового процесса:

    Код (Text):
    1.         if (dwCreationFlags & DETACHED_PROCESS) {
    2.             ProcessParameters->ConsoleHandle = (HANDLE)CONSOLE_DETACHED_PROCESS;
    3.         } else if (dwCreationFlags & CREATE_NEW_CONSOLE) {
    4.             ProcessParameters->ConsoleHandle = (HANDLE)CONSOLE_NEW_CONSOLE;
    5.         } else if (dwCreationFlags & CREATE_NO_WINDOW) {
    6.             ProcessParameters->ConsoleHandle = (HANDLE)CONSOLE_CREATE_NO_WINDOW;
    7.         } else {
    8.             ProcessParameters->ConsoleHandle =
    9.                 NtCurrentPeb()->ProcessParameters->ConsoleHandle;
    Видно это константы..
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дизасмом kernel32.BasePushProcessParameters выяснено, что данные константы равны соотв.:

    #define CONSOLE_DETACHED_PROCESS 0xFFFFFFFF
    #define CONSOLE_NEW_CONSOLE 0xFFFFFFFE
    #define CONSOLE_CREATE_NO_WINDOW 0xFFFFFFFD
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это псевдохендлы (по аналогии с GetCurrentProcess)