Home › Forums › Discussions › General › TDI_SET_EVENT_HANDLER
- This topic has 9 replies, 3 voices, and was last updated 17 years, 2 months ago by Denwer.
-
AuthorPosts
-
July 25, 2005 at 9:30 am #4935
Я тут хучу tcpip.sys по типу TDIMON, чтобы мониторить соединения. Есть такой event TDI_SET_EVENT_HANDLER там устанавливаемому хэндлеру передается контекст. Естественно, я выделяю nonpaged память для своего контекста, в него пишу старый хэндлер и старый контекст и дальше в хэндлере вызываю оригинал.
Так вот, у меня вот вопрос номер раз: когда и кто должен очищать контекст? По закрытию соединения? Я должен или система сама шарит?
И вопрос номер два: мониторю к примеру yahoo messenger, прога при старте ставит пять хэндлеров. Как гласит документация: Для сброса хэндлера устанавливают хэндлер с адресом 0. При выходе процесса они нифига не очищаются нолями, как это понимать? И как нужно реагировать в таких ситуациях? Память то выделена…
August 1, 2005 at 9:01 am #5772И еще вопрос, как по соединению получить remote address? Потому что в TDI_REQUEST_KERNEL_SEND нету RemoteAddress.
Пробовал слать TDI_QUERY_INFORMATION/ TDI_QUERY_DATA_LINK_ADDRESS на file object. Но в отличии от TDI_QUERY_INFORMATION, TDI_QUERY_DATA_LINK_ADDRESS говорит STATUS_NOT_IMPLEMENTED. Неужели единственный путь – это как в TdiMon’e хранить весь набор соединений?
August 1, 2005 at 10:33 am #5773Вот жеж прикольно, в TCPIP.sys реально заимплеменчено только:
#define TDI_QUERY_BROADCAST_ADDRESS 0x00000001
#define TDI_QUERY_PROVIDER_INFORMATION 0x00000002
#define TDI_QUERY_PROVIDER_INFO 0x00000002
#define TDI_QUERY_ADDRESS_INFO 0x00000003
#define TDI_QUERY_CONNECTION_INFO 0x00000004
#define TDI_QUERY_PROVIDER_STATISTICS 0x00000005P.S. Дохлый какой-то форум или никто не знает ответов на мои вопросы?
August 1, 2005 at 2:15 pm #5774@Hexxx wrote:
И еще вопрос, как по соединению получить remote address? Потому что в TDI_REQUEST_KERNEL_SEND нету RemoteAddress.
Пробовал слать TDI_QUERY_INFORMATION/ TDI_QUERY_DATA_LINK_ADDRESS на file object. Но в отличии от TDI_QUERY_INFORMATION, TDI_QUERY_DATA_LINK_ADDRESS говорит STATUS_NOT_IMPLEMENTED. Неужели единственный путь – это как в TdiMon’e хранить весь набор соединений?
NTSTATUS
ClientEventConnect(
IN PVOID TdiEventContext,
IN LONG RemoteAddressLength,
IN PVOID RemoteAddress,
IN LONG UserDataLength,
IN PVOID UserData,
IN LONG OptionsLength,
IN PVOID Options,
OUT CONNECTION_CONTEXT *ConnectionContext,
OUT PIRP *AcceptIrp
);ответ понятен, надеюсь
TDI_CONNECT :
IrpSp->Parameters
Pointer to a TDI_REQUEST_KERNEL_CONNECT structure, equivalent to the TDI_REQUEST_KERNEL structure.
The RequestFlags member is irrelevant for connect requests. The transport uses the client-supplied information, such as the remote-node address to which the connection should be offered, in the buffer at RequestConnectionInformation. The transport returns information to the client-supplied buffer at ReturnConnectionInformation. Each of these buffers is formatted as a TDI_CONNECTION_INFORMATION structure.typedef struct _TDI_CONNECTION_INFORMATION {
LONG UserDataLength;
PVOID UserData;
LONG OptionsLength;
PVOID Options;
LONG RemoteAddressLength;
PVOID RemoteAddress;
} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;August 1, 2005 at 2:29 pm #5775Gen, ты меня не понял. У меня есть драйвер который хучит мажорные функции TcpIp.sys. В хэндлере IRP_MJ_INTERNAL_DEVICEIO_CONTROL. Я ловлю TDI_SEND и мне надо по полученому IRP получить информацию о destination port и ip. Очень не хочется следить за всеми Connect и Disconnect событиями. Есть ли способ получить такую информацию тут же, не используя собственных таблиц соединений? Потому что проблем с получением локального айпи и порта нет.
August 2, 2005 at 7:33 am #5776// Я тут хучу tcpip.sys по типу TDIMON, чтобы мониторить соединения
извини, недофтыкнул сразу 😉
думаю, что придется все же мониторить соединения … всмысле следить …
August 2, 2005 at 7:55 am #5777В майкрософте сидят одни сволочи! В таблице соединений внутри tcpip есть инфа и о Source и о Destination ip/port . Только вот при запросе TDI_QUERY_ADDRESS_INFO копируется из нее только Source… 👿
Пропатчить чтоли tcpip.sys… 😈
Да, кстати об очистке памяти выделеной под контекст. Как же я буду очищать если нулевой хэндлер потом не ставится, как я узнаю что уже можно удалять контекст? Наверно, система шлет ноль только когда собирается переустановить хэндлер. А очищать память надо при закрытии соединения… блин опять же придется делать таблицу соединений…
August 2, 2005 at 10:29 am #5778@Hexxx wrote:
В майкрософте сидят одни сволочи! В таблице соединений внутри tcpip есть инфа и о Source и о Destination ip/port . Только вот при запросе TDI_QUERY_ADDRESS_INFO копируется из нее только Source… 👿
Пропатчить чтоли tcpip.sys… 😈
Да, кстати об очистке памяти выделеной под контекст. Как же я буду очищать если нулевой хэндлер потом не ставится, как я узнаю что уже можно удалять контекст? Наверно, система шлет ноль только когда собирается переустановить хэндлер. А очищать память надо при закрытии соединения… блин опять же придется делать таблицу соединений…
Когда закроется AddressObject тогда можешь освобождать 100%.
August 4, 2005 at 5:30 am #5779В TDIMON’e они вообще просто поступили: когда приходит IRP_MJ_CREATE они выделяют память для структуры хранящей инфу о соединении. И в этой же структуре они содержат все 12 контекстов для 12 event’ов. А когда закрывается соединение(IRP_MJ_CLOSE) они просто удаляют всю структуру вместе с контекстами.
August 26, 2007 at 10:05 pm #5780А случаем исходниками TDIMon никто не поделится?
-
AuthorPosts
- You must be logged in to reply to this topic.