Внедрение DLL с помощью ловушек
ОГЛАВЛЕНИЕ
Ответ довольно прост: если Вам необходимо повлиять на удаленный процесс, а точнее на поток в удаленном процессе, то прийдется использовать какой-либо механизм межпроцессной связи. Так как целевой поток может и не содержать кода, предназначенного для взаимодействия с вашим потоком, то прийдется использовать специальные средства, одним из которых и являются хуки(ловушки). С помощью ловушки вы уведомляете ОС о необходимости внедрения DLL в адресное пространство потока, для которого установлена ловушка.
Ловушка устанавливается функцией SetWindowsHookEx, которая со всеми параметрами описана в MSDN. Я хочу перейти сразу к практической стороне вопроса, потому за теорией обращайтесь к MSDN либо прочтите статью "Хуки в Win32", ссылка указана в конце. Если кому мало, пишите мне и я превращу ваш HDD в сплошную базу данных по хукам.
Для иллюстрации данного метода я решил написать программу, сохраняющую позиции ярлыков на десктопе. Что-то подобное описано у Рихтера, например функции, отвечающие за взаимодействие с элементом управления "графический список" десктопа, почти идентичны, так как используется стандартный алгоритм. Поскольку большинство оконных сообщений для стандартных элементов управления не могут преодолеть границу процесса, то приходится, как говорится, доставать подбородком до локтя. Короче, если Магомет не идет к горе, то нам придется внедрить DLL в поток explorer, отвечающий за работу с ярлыками, назовем его условно ListBox. Установив ловушку на поток ListBox, мы внедрим свою DLL в его адресное пространство и установим функцию-хук, всякий раз вызываемую системой в зависимости от условия хука. Я буду использовать хук WH_GETMESSAGE - он заставит систему вызывать нашу функцию обработки хука тогда, когда в очереди потока появится сообщение. Далее при первом вызове функция просто создает окно диалога и назначает его оконной процедурой функцию из внедренной DLL. Таким образом в нашем потоке мы сможем взаимодействовать с ListBox посредством созданного окна диалога. Синхронизация вызывающего потока и диалоговой процедуры в потоке ListBox производится с помощью объекта ядра "событие", которое освобождается, как только созданное окно диалога готово к обработке входящих сообщений. В листингах все очень подробно описано - потому смотрите листинги и да скомпилит их ваш комп :-)).