TDI_SET_EVENT_HANDLER

Home Forums Discussions General TDI_SET_EVENT_HANDLER

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.