Приветствую всех. Перехватываю IRP_MJ_INTERNAL_DEVICE_CONTROL в \Device\Tcp и далее в своей новой функции отслеживаю TDI_SEND. Каким образим я могу узнать на данном этапе порт, на который отсылаются данные? Заранее благодарен!
В данном случае при перехвате TDI_SEND - никак, если мне память не изменяет. По-моему, MinorFunction ставилась = TDI_SET_EVENT_HANDLER и делался перехват EventType = TDI_EVENT_CONNECT... По-моему так, хотя не уверен...
steelfactor Правильно, вот и мне кажется что никак ) Да и где то читал что лучше написать свой минипорт драйвер. Быстрее и стабильнее работает чем перехваты\фильтры...
steelfactor Спасиб, посмотрю... Только при TDI_SEND в параметрах буфер есть, где отсылаемые данные находятся. Мне нужно в зависимости от удаленного порта их рассматривать или нет. Не думаю, что простым способом можно увязать нужное соединение с отправкой по этому соединению данных. Поэтому и хотелось бы при наступлении TDI_SEND иметь возможность определить порт.
TermoSINteZ Точно, сам думаю так же, что для надежного перехвата или коррекции IP-заголовков нужно лезть на уровень NDIS. prus Глянь вот на это - тебе должно помочь http://downloads.sourceforge.net/tdifw/tdifw-1.4.4.zip
steelfactor Спасиб, tdifw в первую очередь смотрел. Мне просто данные отсекать нужно по порту. На рсдн подсказали: попробую такой вариант.
Перехватывайте TDI_CONNECT - там как раз будет адрес и порт удаленного хоста. Дальше можете создать карту FILE_OBJECT -> номер удаленного и порта и пользоваться ей в нужных случаях.
TarasCo Попробовал определить тип адреса в TDI_CONNECT, но он почемуто равен 0, хотя должен быть TDI_ADDRESS_TYPE_IP. Код такой: Код (Text): PTDI_CONNECTION_INFORMATION pTdiConnInfo; PTA_ADDRESS pTaAddress; if( irpStack->MinorFunction == TDI_CONNECT ) { pTdiConnInfo = ((PTDI_REQUEST_KERNEL_CONNECT)&irpStack->Parameters)->RequestConnectionInformation; pTaAddress = (PTA_ADDRESS)pTdiConnInfo->RemoteAddress; DbgPrint("TDI_CONNECT: %lu", pTaAddress->AddressType); } Чего не так сделал?
TarasCo Спасиб, разобрался А можно по подробнее про "создать карту FILE_OBJECT..." ? Это, как я понимаю, для каждого коннекта будет свой FILE_OBJECT... Нужно проверить порт и если он мне подходит, то запомнить пару FILE_OBJECT+порт в списке и потом просто сравнивать. А при наступлении TDI_DISCONNECT удалять из списка эту пару. Так правильно?