\Device\Tcp и TDI_SEND

Тема в разделе "WASM.NT.KERNEL", создана пользователем prus, 14 мар 2008.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Приветствую всех.
    Перехватываю IRP_MJ_INTERNAL_DEVICE_CONTROL в \Device\Tcp и далее в своей новой функции отслеживаю TDI_SEND. Каким образим я могу узнать на данном этапе порт, на который отсылаются данные?

    Заранее благодарен!
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    В данном случае при перехвате TDI_SEND - никак, если мне память не изменяет.
    По-моему, MinorFunction ставилась = TDI_SET_EVENT_HANDLER и делался перехват EventType = TDI_EVENT_CONNECT...
    По-моему так, хотя не уверен...
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    steelfactor
    Правильно, вот и мне кажется что никак )
    Да и где то читал что лучше написать свой минипорт драйвер. Быстрее и стабильнее работает чем перехваты\фильтры...
     
  4. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    steelfactor
    Спасиб, посмотрю...
    Только при TDI_SEND в параметрах буфер есть, где отсылаемые данные находятся. Мне нужно в зависимости от удаленного порта их рассматривать или нет. Не думаю, что простым способом можно увязать нужное соединение с отправкой по этому соединению данных. Поэтому и хотелось бы при наступлении TDI_SEND иметь возможность определить порт.
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    TermoSINteZ
    Точно, сам думаю так же, что для надежного перехвата или коррекции IP-заголовков нужно лезть на уровень NDIS.

    prus
    Глянь вот на это - тебе должно помочь
    http://downloads.sourceforge.net/tdifw/tdifw-1.4.4.zip
     
  6. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    steelfactor
    Спасиб, tdifw в первую очередь смотрел.
    Мне просто данные отсекать нужно по порту.
    На рсдн подсказали:
    попробую такой вариант.
     
  7. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Перехватывайте TDI_CONNECT - там как раз будет адрес и порт удаленного хоста. Дальше можете создать карту FILE_OBJECT -> номер удаленного и порта и пользоваться ей в нужных случаях.
     
  8. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    TarasCo
    Попробовал определить тип адреса в TDI_CONNECT, но он почемуто равен 0, хотя должен быть TDI_ADDRESS_TYPE_IP.
    Код такой:
    Код (Text):
    1. PTDI_CONNECTION_INFORMATION   pTdiConnInfo;
    2. PTA_ADDRESS             pTaAddress;
    3.  
    4. if( irpStack->MinorFunction == TDI_CONNECT ) {
    5.  
    6.    pTdiConnInfo = ((PTDI_REQUEST_KERNEL_CONNECT)&irpStack->Parameters)->RequestConnectionInformation;
    7.    pTaAddress = (PTA_ADDRESS)pTdiConnInfo->RemoteAddress;
    8.    DbgPrint("TDI_CONNECT: %lu", pTaAddress->AddressType);
    9.            
    10. }
    Чего не так сделал?
     
  9. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    TarasCo
    Спасиб, разобрался :)
    А можно по подробнее про "создать карту FILE_OBJECT..." ?
    Это, как я понимаю, для каждого коннекта будет свой FILE_OBJECT... Нужно проверить порт и если он мне подходит, то запомнить пару FILE_OBJECT+порт в списке и потом просто сравнивать. А при наступлении TDI_DISCONNECT удалять из списка эту пару.
    Так правильно?