Друзья! Вот мои наработки Это я создаю экранный буфер консоли и получаю его дескриптор (почему-то всегда равный f) Код (Text): #include <windows.h> #include <stdio.h> int main () { printf ("hendl bufera= %x",CreateConsoleScreenBuffer (GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CONSOLE_TEXTMODE_BUFFER, 0)); getchar (); return 0; } Так, а теперь такой код компилирую и запускаю. Он должен записать в имеющееся консольное окно строку "proba" Код (Text): #include <windows.h> #include <stdio.h> int main () { char mass []= "proba\n"; DWORD peremennay; printf ("= %x\n",WriteConsole ((void*)0xf, mass, 5, &peremennay, 0)); getchar (); return 0; } Не записывает и выдаёт 0. Догадки: может,вообще функция WriteConsole не предназначена, чтобы работать с ДРУГИМ процессом? здесь, по крайней мере ничего об этом не сказано. Зато сказано вот что: "Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile " Ну, а в в файл-то можно из любого процесса что-нибудь записать, был бы дескритор файла. Я провёл аналогию- если есть дескриптор экранного буфера консоли, значит, и в него можно всё записать. Не записывается. Помогите, пожалуйста.
Ты совершенно прав. 0xF - это хендл для первого процесса (если это конечно хендл... Вообще хендл для записи получается через GetStdHandle). Чтобы использовать этот хендл во втором процессе тебе надо как минимум сделать DuplicateHandle.
Кстати, поищи статьи по созданию шела на компах. В этих шелах как раз и создается консольное окно в чужом процессе и два процесса взаимодествуют. Не знаю правда, как это пересекается с твоей конечной целью.
Нельзя. Хэндл файла действителен только в том процессе, который открыл файл. Для передачи хэндла в другой процесс можно его дублировать с помощью функции DuplicateHandle.
amvoz 1. У каждых процессов своя таблица дескрипторов. Поэтому хендлы нужно было бы копировать (ZwDuplicateObject, DuplicateHandle), если бы не п.2 2. Хендлы консоли нельзя копировать и юзать из чужого процесса. Писать в чужую консоль можно только инжектом в чужой процесс.
Нет, вру! Код (Text): typedef void (__stdcall* PTR_AttachConsole) (DWORD); PTR_AttachConsole pAttachConsole = (PTR_AttachConsole)GetProcAddress (GetModuleHandle ("kernel32.dll"), "AttachConsole"); pAttachConsole (PROCESS_ID); HANDLE hCon = GetStdHandle (STD_OUTPUT_HANDLE); DWORD writ = 0; WriteConsole (hCon, "lalala", 6, &writ, NULL); Как-то так. На ХР работает.
Всем спасибо, особенно Squash. Разобрался я немного с AttachConsole. Действительно работает в XP. Запускаем такой исполняемый файл Код (Text): #include <stdio.h> int main () { getchar (); return 0; } Создаётся консолное окно. Затем запускаем следующий исполняемый файл и видим в консольном окне первого процесса "lalalala" Код (Text): #include <windows.h> #include <WINCON.H> int main () { DWORD pid_pervogo_processa; /*Находим pid_pervogo_processa */ AttachConsole(pid_pervogo_processa); HANDLE hCon = GetStdHandle (STD_OUTPUT_HANDLE); DWORD writ = 0; WriteConsole (hCon, "lalala", 6, &writ, NULL); return 0; } Обратите внимание на переменную pid_pervogo_processa. Я не стал описывать, как мы находим её значение. Можно программно, я же смотрел в программе LordPE.EXE, подставлял значение и комплировал и запускал. Важно! Обязательно в настройках среды при компиляции второго файла нужно указать, чтобы консольное окно не создавалось! Партнёру: Одно ли и то же мы с Вами имеем ввиду?: Хэндл файла действителен только в том процессе, который открыл файл. Но тем не менее в файл можно заисывать (или добавлять) даные из разных процессов. Просто в каждом процессе нужно будет вызывать СreateFile. (Искать хэндл файла)
"Функция WriteConsole записывает символы в экранный буфер консоли. Она ведет себя подобно функции WriteFile " Это не мной сказано. Ещё раз: это сказано не мной, а здесь. http://vsokovikov.narod.ru/New_MSDN_API/Console/fn_writeconsole.htm Но аналогию я в этом усмотрел. И действовал с консолью так же, как и с файлом.