проблема такова - аттачусь к \\Device\\Tcp и не получаю входящих данных. судя по гуглу, надо перехватывать хэндлер TDI_EVENT_RECEIVE, либо регистрировать свой хэндлер (наверное, это более приемлемо). не знаю, с какой стороны подойти... зы. кусок dispatch, на который указывает интуиция... пардоньте, что на си. case TDI_SET_EVENT_HANDLER: if (((TDI_REQUEST_KERNEL_SET_EVENT*)&pIrpStack->Parameters)->EventType==TDI_EVENT_RECEIVE) { DbgPrint("TDITDI_SET_EVENT_HANDLER) TDI_EVENT_RECEIVE\n"); DbgPrint("----------------------------\n"); }; break;
lilkiddd Там нужно регистрировать свой обработчик callback'a ClientEventReceive. Смотри сорцы tdi_fw, ищи сабж на rsdn и читай MSDN, там все это описано.
надумал перехватывать EventHandler, старый обработчик сохранять в односвязный список, в своем хэндлере вызывать чужой хэндлер по указателю из двусвязного списка. возник вопрос - хэндлеры вызываются в том же порядке, что и устанавливаются?
lilkiddd На мой взгляд работать со списками не слишком удобно, потому что возникает необходимость сохранения еще кучи необходимой информации, типа контекста и др. Попробуй реализовать через хеширование, как в tdi_fw.
в продолжение темы - чтобы новый пост не создавать. обязательно ли перехватывать обработчики IRP_MJ_INTERNAL_DEVICE_CONTROL, IRP_MJ_CLOSE, IRP_MJ_CREATE, IRP_MJ_READ, IRP_MJ_WRITE и прочие или же достаточно перехватить только IRP_MJ_DEVICE_CONTROL? вообще mswsock.dll при отправке и чтении пакетов вызывает ZwDeviceIoControlFile.. но ведь XP поддерживает ещё перенаправление ввода-вывода и можно создавать сокет и писать в него как в обычный файл...
Quark Если речь идет о TDI-фильтре, то перехват IRP_MJ_INTERNAL_DEVICE_CONTROL обязателен, потому что он через себя протаскивает все самые интересные MN-функции - TDI_ASSOCIATE_ADDRESS, TDI_CONNECT, TDI_SET_EVENT_HANDLER, TDI_RECEIVE, TDI_SEND и т.д. Перехват IRP_MJ_CREATE нужен, если интересует создание "объекта локального адреса" и "объекта соединения". Остальное, на мой взгляд, не обязательно.
Вообще посмотрел я на этот TDI интерфейс... Я как-то писал протокольный NDIS снифер - так помойму на уровне NDIS ловить пакетики даже попроще. единственное - нужно собирать фреймы в пакеты и вытаскивать из них данные (с протоколом TCP не так-то просто). А в висте так вообще от TDI отказались - только в качестве совместимости оставили. Вот я и думаю как лучше поступить, на каком уровне ловить TCP трафик?