Всем привет. Столкнулся с сабжевой проблемой, прошу коллективный разум помочь с решением. Итак имеем tdi фильтр tcp: Код (Text): NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath){ ... // intercepting ioctls for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) pDriverObject->MajorFunction[i] = ioControlInternal; //attaching to tcp device RtlInitUnicodeString(&deviceToFilter, L"\\Device\\Tcp"); status = IoCreateDevice(pDriverObject,0,NULL,FILE_DEVICE_UNKNOWN,0,TRUE,&pTcpDrvObj); pTcpDrvObj->Flags |= DO_DIRECT_IO; status = IoAttachDevice(pTcpDrvObj,&deviceToFilter,&pTcpDrvOldObj); .... } ДевайсДиспатч: Код (Text): NTSTATUS ioControlInternal(PDEVICE_OBJECT deviceObject, PIRP irp) { PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp); NTSTATUS status; switch(irpStack->MajorFunction){ case IRP_MJ_INTERNAL_DEVICE_CONTROL: switch(irpStack->MinorFunction){ case TDI_ASSOCIATE_ADDRESS: onTdiAssociateAddress(irp,irpStack); break; case TDI_SEND: scanRequest(deviceObject, irp); case TDI_SET_EVENT_HANDLER: onSetEventHandler(deviceObject, irp); // тут перехватываем, TDI_EVENT_RECEIVE,TDI_EVENT_CHAINED_RECEIVE // сохраняем старые обработчики с контекстами, етц case TDI_DISASSOCIATE_ADDRESS: onTdiDisassociateAddress (irp); break; case TDI_DISCONNECT: onTdiDisconnect(deviceObject, irp); case TDI_RECEIVE: onTdiReceive(deviceObject,irp); default: break; } break; default: break; } IoSkipCurrentIrpStackLocation(irp); return IoCallDriver(pTcpDrvOldObj, irp); } Проблема заключается в следующем, если оригинальный обработчик TDI_EVENT_RECEIVE возвращет STATUS_DATA_NOT_ACCEPTED, taken==0 и bytesIndicated < BytesAvailable то если я правильно понял клиент для получения оставшихся данных должен сформировать TDI_RECEIVE IRP и передать в tcpip.sys, это действительно происходит (клиент (браузер) получает все необх. данные, TDIScope показывает принятый TDI_RECEIVE с BytesAvailable) НО МОЙ ФИЛЬТР НЕ ВИДИТ ИМЕННО ЭТОГО TDI_RECEIVE. Ткните носом в какую сторону копать, какие варианты решения, а то у меня к сожалению идей уже не осталось... Заранее благодарен.
Сори, в оригинале диспатч выглядит след образом: Код (Text): NTSTATUS ioControlInternal(PDEVICE_OBJECT deviceObject, PIRP irp) { PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp); NTSTATUS status; switch(irpStack->MajorFunction){ case IRP_MJ_DEVICE_CONTROL: if (KeGetCurrentIrql() == PASSIVE_LEVEL) { status = TdiMapUserRequest(deviceObject, irp, irpStack); } else status = STATUS_NOT_IMPLEMENTED; // set fake status if(status != STATUS_SUCCESS){ break; } case IRP_MJ_INTERNAL_DEVICE_CONTROL: switch(irpStack->MinorFunction){ case TDI_ASSOCIATE_ADDRESS: onTdiAssociateAddress(irp,irpStack); break; case TDI_SEND: scanRequest(deviceObject, irp); break; case TDI_SET_EVENT_HANDLER: onSetEventHandler(deviceObject, irp); break; case TDI_DISASSOCIATE_ADDRESS: onTdiDisassociateAddress (irp); break; case TDI_DISCONNECT: onTdiDisconnect(deviceObject, irp); break; case TDI_RECEIVE: onTdiReceive(deviceObject,irp); break; default: break; } break; default: break; } IoSkipCurrentIrpStackLocation(irp); return IoCallDriver(pTcpDrvOldObj, irp); } много повырезал...