Надо создать консольное окно и записать туда строку ДРУГОЙ программой

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 16 май 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Вот мои наработки

    Это я создаю экранный буфер консоли и получаю его дескриптор (почему-то всегда равный f)
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. int main () {
    4.  printf ("hendl bufera= %x",CreateConsoleScreenBuffer (GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CONSOLE_TEXTMODE_BUFFER, 0));
    5.  getchar ();
    6.  return 0;
    7. }
    Так, а теперь такой код компилирую и запускаю. Он должен записать в имеющееся консольное окно строку "proba"
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. int main () {
    4.  char mass []= "proba\n";
    5.  DWORD peremennay;
    6.  printf ("= %x\n",WriteConsole ((void*)0xf, mass, 5, &peremennay, 0));
    7.  getchar ();
    8.  return 0;
    9. }
    Не записывает и выдаёт 0.
    Догадки: может,вообще функция WriteConsole не предназначена, чтобы работать с ДРУГИМ процессом?
    здесь, по крайней мере ничего об этом не сказано.
    Зато сказано вот что:

    "Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile "
    Ну, а в в файл-то можно из любого процесса что-нибудь записать, был бы дескритор файла.
    Я провёл аналогию- если есть дескриптор экранного буфера консоли, значит, и в него можно всё записать.
    Не записывается.
    Помогите, пожалуйста.
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Вот ссылка
    http://vsokovikov.narod.ru/New_MSDN_API/Console/fn_createconsolescreenbuffe.htm
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ты совершенно прав. 0xF - это хендл для первого процесса (если это конечно хендл... Вообще хендл для записи получается через GetStdHandle). Чтобы использовать этот хендл во втором процессе тебе надо как минимум сделать DuplicateHandle.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Кстати, поищи статьи по созданию шела на компах. В этих шелах как раз и создается консольное окно в чужом процессе и два процесса взаимодествуют. Не знаю правда, как это пересекается с твоей конечной целью.
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нельзя. Хэндл файла действителен только в том процессе, который открыл файл.
    Для передачи хэндла в другой процесс можно его дублировать с помощью функции DuplicateHandle.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    amvoz
    1. У каждых процессов своя таблица дескрипторов. Поэтому хендлы нужно было бы копировать (ZwDuplicateObject, DuplicateHandle), если бы не п.2
    2. Хендлы консоли нельзя копировать и юзать из чужого процесса. Писать в чужую консоль можно только инжектом в чужой процесс.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    AttachConsole() ?
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Clerk
    Работает начиная с 2k3 Srv
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Нет, вру!

    Код (Text):
    1.     typedef void (__stdcall* PTR_AttachConsole) (DWORD);
    2.     PTR_AttachConsole pAttachConsole = (PTR_AttachConsole)GetProcAddress (GetModuleHandle ("kernel32.dll"), "AttachConsole");
    3.     pAttachConsole (PROCESS_ID);
    4.     HANDLE hCon = GetStdHandle (STD_OUTPUT_HANDLE);
    5.     DWORD writ = 0;
    6.     WriteConsole (hCon, "lalala", 6, &writ, NULL);
    Как-то так. На ХР работает.
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Всем спасибо, особенно Squash. Разобрался я немного с AttachConsole. Действительно работает в XP.
    Запускаем такой исполняемый файл

    Код (Text):
    1. #include <stdio.h>
    2. int main () {
    3.  getchar ();
    4.  return 0;
    5. }
    Создаётся консолное окно. Затем запускаем следующий исполняемый файл и видим в консольном окне первого процесса "lalalala"

    Код (Text):
    1. #include <windows.h>
    2. #include <WINCON.H>
    3. int main () {
    4.  DWORD pid_pervogo_processa;
    5.  
    6.  /*Находим pid_pervogo_processa
    7. */
    8.  
    9.  AttachConsole(pid_pervogo_processa);
    10.  HANDLE hCon = GetStdHandle (STD_OUTPUT_HANDLE);
    11.  DWORD writ = 0;
    12.  WriteConsole (hCon, "lalala", 6, &writ, NULL);
    13.  return 0;
    14. }
    Обратите внимание на переменную pid_pervogo_processa. Я не стал описывать, как мы находим её значение. Можно программно, я же смотрел в программе LordPE.EXE, подставлял значение и комплировал и запускал.
    Важно!
    Обязательно в настройках среды при компиляции второго файла нужно указать, чтобы консольное окно не создавалось!

    Партнёру:
    Одно ли и то же мы с Вами имеем ввиду?:
    Хэндл файла действителен только в том процессе, который открыл файл. Но тем не менее в файл можно заисывать (или добавлять) даные из разных процессов. Просто в каждом процессе нужно будет вызывать СreateFile. (Искать хэндл файла)
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    Ну и какая свядь между файлами и консолью прсветите нас.
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    "Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile "
    Это не мной сказано.
    Ещё раз: это сказано не мной, а здесь.
    http://vsokovikov.narod.ru/New_MSDN_API/Console/fn_writeconsole.htm
    Но аналогию я в этом усмотрел. И действовал с консолью так же, как и с файлом.