Приветствую, уважаемые читатели wasm'a! Такой вопросик, а точнее два: В моей программе, которая устанавливает хуки в стороннем приложении работающем через RPC для Windows (C++), необходимо связать начало вызова метода в клиенте, и непосредственно сам вызов на сервере без изменения данных которые передаются, как это сделать? Поясню в чем проблема: есть допустим некий метод IMethod интерфейса IMy, ну и пусть например этот метод ничего не делает и ничего не возвращает (для общности примера), его (метод) вызывает клиент A, в дебрях RPC происходит маршилинг, вызов NdrClientCall2, а на серевере B, вызов NdrServerCall2 и демаршалинг (если я конечно ничего не путаю). Если этот метод могут вызывать одновременно разные клиенты A1, A2, и т.д. то как сопоставить на сервере, что сейчас идет непосредственно вызов из, например A2, а не A3? Я захучил и NdrClientCall2 на клиенте и NdrServerCall2 на сервере, и пытался разные другие методы, и все только для того, чтобы сопоставить этот вызов, увидеть так какой-нибудь уникальный признак или т.п., что-нибудь вроде - вот на клиенте кука(описатель, ID и т.п....) вызова, вот на сервере точно такая же - можно сопоставить,... но пока что-то пусто. Нужно мне все это для сугубо экспериментальных задач. В общем, если есть те кто может наставить на путь истинный, был бы признателен. И второй вопрос: Если функция имеет сигнатуру например DWORD MyFunc(...) - т.е. переменное число аргументов, и не известно сколько их там, то как если захучить эту функцию правильно вызвать в теле хука оригинальную? Т.е. как правильно должен выглядеть код ниже: Код (Text): DWORD HookMyFunc(...) { return OrigMyFunc( [b]???[/b] ); } Спасибо за любую помощь.
tagNevRA Слишком много текста и мало смысла. Заменить калбэк в таблице или использовать технику на подобие IDP. Вобще не вижу связи хуков с захватом кода, NDR не шадова механизм.
Clerk У меня узкоспециализированная задача. Проще объяснить на примере. Клиент (поток вызова): Метод1 -> Метод2 -> Метод3 -> Rpc вызов (по результатам этих трех вызовов собралась информация которую бы хотелось передать на сервер ) Сервер Rpc прием ->...Метод -> Метод в котором нужно воспользоваться данными полученными на клиенте, именно в этом потоке и в этом месте...Данные я передал, но как понять в какой поток их пропихнуть не понимаю, т.к. вызовы идут параллельно! Заменить калбэк в таблице или использовать технику на подобие IDP. Не очень понял, что и где заменить, что имелось ввиду и что такое IDP?
tagNevRA В перехватчике ф-ции интерфейса на сервере вызываете Код (Text): RPC_BINDING_HANDLE WINAPI I_RpcGetCurrentCallHandle(); полученный binding handle скармливаете Код (Text): RPC_STATUS WINAPI I_RpcBindingInqLocalClientPID(RPC_BINDING_HANDLE ClientBinding, DWORD* ClientPID); и получаете PID процесса клиента. Ф-ции недокументированные.
tagNevRA Я достаточно хорошо понимаю этот механизм, проще былобы вам привети нужные функи. Это юзермодный функционал, легко отлаживаемый и имеющийся в сурцах. Мы можем использовать обычно замену ссылки на калбэки(процедуры обратных вызовов по русски) или использовать какиелибо грязные хаки. IDP один из них. Если палевность и стабильность не имеет значения, то просто патчить код в образах.
green Большое спасибо за ответ, я не знал про такие функции. ) Но у меня ситуация хуже , т.к. запрос на стороне клиента выполняется внутри одного приложения (некий северный диспетчер запросов) в разных потоках т.е. PID клиента всегда один. Надо было это сразу написать, не подумал. В таком случае ничего не посоветуете?
Clerk Функции находятся в Exchange 2010 сервере. Документации нет, сорцев конечно же тоже, как и символов( Поэтому и спрашиваю в общем виде, в надежде что есть какое-нибудь обще решение. Про callback'e я конечно же знаю, просто не понимаю куда их тут в случае Rpc вызовов прикрутить.
tagNevRA Боюсь, что простого и общего способа в этом случае нет. По какому протоколу идёт RPC-взаимодействие?
green Все равно спасибо. Все же сам RPC эту информацию откуда-то имеет. Я провел такой эксперимент: написал маленькое клиент-сервер RPC приложение. На клиенте создаю несколько потоков и в каждом потоке вызываю RPC функцию в цикле. На сервере в реализации вызываемой функции смотрю описатель запроса (через I_RpcGetCurrentCallHandle) и вот он (описатель) для одних и тех же клиентских потоков (потоков в которых производится запрос) всегда одинаковый! на все вызовы этой функции т.е. запросы группируются на сервере. Нужно понять где.
Насчет последнего эксперимента я был не совсем прав, описатель разный только если запрос идет одновременно, если же подряд то одинаковый.