TDI_SET_EVENT_HANDLER

Home Forums Discussions General Discussion TDI_SET_EVENT_HANDLER

This topic contains 9 replies, has 3 voices, and was last updated by  Denwer 10 years, 2 months ago.

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #4935

    Hexxx
    Participant

    Я тут хучу tcpip.sys по типу TDIMON, чтобы мониторить соединения. Есть такой event TDI_SET_EVENT_HANDLER там устанавливаемому хэндлеру передается контекст. Естественно, я выделяю nonpaged память для своего контекста, в него пишу старый хэндлер и старый контекст и дальше в хэндлере вызываю оригинал.

    Так вот, у меня вот вопрос номер раз: когда и кто должен очищать контекст? По закрытию соединения? Я должен или система сама шарит?

    И вопрос номер два: мониторю к примеру yahoo messenger, прога при старте ставит пять хэндлеров. Как гласит документация: Для сброса хэндлера устанавливают хэндлер с адресом 0. При выходе процесса они нифига не очищаются нолями, как это понимать? И как нужно реагировать в таких ситуациях? Память то выделена…

    #5772

    Hexxx
    Participant

    И еще вопрос, как по соединению получить 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 хранить весь набор соединений?

    #5773

    Hexxx
    Participant

    Вот жеж прикольно, в 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 0x00000005

    P.S. Дохлый какой-то форум или никто не знает ответов на мои вопросы?

    #5774

    GeN
    Participant

    @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;

    #5775

    Hexxx
    Participant

    Gen, ты меня не понял. У меня есть драйвер который хучит мажорные функции TcpIp.sys. В хэндлере IRP_MJ_INTERNAL_DEVICEIO_CONTROL. Я ловлю TDI_SEND и мне надо по полученому IRP получить информацию о destination port и ip. Очень не хочется следить за всеми Connect и Disconnect событиями. Есть ли способ получить такую информацию тут же, не используя собственных таблиц соединений? Потому что проблем с получением локального айпи и порта нет.

    #5776

    GeN
    Participant

    // Я тут хучу tcpip.sys по типу TDIMON, чтобы мониторить соединения

    извини, недофтыкнул сразу 😉

    думаю, что придется все же мониторить соединения … всмысле следить …

    #5777

    Hexxx
    Participant

    В майкрософте сидят одни сволочи! В таблице соединений внутри tcpip есть инфа и о Source и о Destination ip/port . Только вот при запросе TDI_QUERY_ADDRESS_INFO копируется из нее только Source… 👿

    Пропатчить чтоли tcpip.sys… 😈

    Да, кстати об очистке памяти выделеной под контекст. Как же я буду очищать если нулевой хэндлер потом не ставится, как я узнаю что уже можно удалять контекст? Наверно, система шлет ноль только когда собирается переустановить хэндлер. А очищать память надо при закрытии соединения… блин опять же придется делать таблицу соединений…

    #5778

    GeN
    Participant

    @hexxx wrote:

    В майкрософте сидят одни сволочи! В таблице соединений внутри tcpip есть инфа и о Source и о Destination ip/port . Только вот при запросе TDI_QUERY_ADDRESS_INFO копируется из нее только Source… 👿

    Пропатчить чтоли tcpip.sys… 😈

    Да, кстати об очистке памяти выделеной под контекст. Как же я буду очищать если нулевой хэндлер потом не ставится, как я узнаю что уже можно удалять контекст? Наверно, система шлет ноль только когда собирается переустановить хэндлер. А очищать память надо при закрытии соединения… блин опять же придется делать таблицу соединений…

    Когда закроется AddressObject тогда можешь освобождать 100%.

    #5779

    Hexxx
    Participant

    В TDIMON’e они вообще просто поступили: когда приходит IRP_MJ_CREATE они выделяют память для структуры хранящей инфу о соединении. И в этой же структуре они содержат все 12 контекстов для 12 event’ов. А когда закрывается соединение(IRP_MJ_CLOSE) они просто удаляют всю структуру вместе с контекстами.

    #5780

    Denwer
    Participant

    А случаем исходниками TDIMon никто не поделится?

Viewing 10 posts - 1 through 10 (of 10 total)

You must be logged in to reply to this topic.