пропадают TDI_RECEIVE в фильтре tcp

Тема в разделе "WASM.NETWORKS", создана пользователем seregik, 13 авг 2009.

  1. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Всем привет.
    Столкнулся с сабжевой проблемой, прошу коллективный разум помочь с решением.
    Итак имеем tdi фильтр tcp:

    Код (Text):
    1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath){
    2. ...
    3.      // intercepting ioctls
    4.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
    5.         pDriverObject->MajorFunction[i] = ioControlInternal;
    6.  
    7.     //attaching  to tcp device
    8.     RtlInitUnicodeString(&deviceToFilter, L"\\Device\\Tcp");
    9.     status = IoCreateDevice(pDriverObject,0,NULL,FILE_DEVICE_UNKNOWN,0,TRUE,&pTcpDrvObj);
    10.    
    11.     pTcpDrvObj->Flags |= DO_DIRECT_IO;
    12.  
    13.     status = IoAttachDevice(pTcpDrvObj,&deviceToFilter,&pTcpDrvOldObj);
    14. ....
    15. }
    ДевайсДиспатч:


    Код (Text):
    1. NTSTATUS ioControlInternal(PDEVICE_OBJECT deviceObject, PIRP irp)
    2. {
    3.     PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp);
    4.     NTSTATUS status;
    5.  
    6.     switch(irpStack->MajorFunction){
    7.     case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    8.         switch(irpStack->MinorFunction){
    9.         case TDI_ASSOCIATE_ADDRESS:
    10.             onTdiAssociateAddress(irp,irpStack);
    11.             break;
    12.         case TDI_SEND:
    13.             scanRequest(deviceObject, irp);
    14.         case TDI_SET_EVENT_HANDLER:
    15.             onSetEventHandler(deviceObject, irp); // тут перехватываем, TDI_EVENT_RECEIVE,TDI_EVENT_CHAINED_RECEIVE
    16.                                                                   // сохраняем старые обработчики с контекстами, етц
    17.         case TDI_DISASSOCIATE_ADDRESS:
    18.             onTdiDisassociateAddress (irp);
    19.             break;
    20.         case TDI_DISCONNECT:
    21.             onTdiDisconnect(deviceObject, irp);
    22.         case TDI_RECEIVE:
    23.             onTdiReceive(deviceObject,irp);    
    24.         default:
    25.             break;
    26.         }
    27.     break;    
    28.     default:
    29.         break;
    30.        }
    31.     IoSkipCurrentIrpStackLocation(irp);
    32.     return IoCallDriver(pTcpDrvOldObj, irp);
    33. }
    Проблема заключается в следующем, если оригинальный обработчик TDI_EVENT_RECEIVE возвращет STATUS_DATA_NOT_ACCEPTED, taken==0 и bytesIndicated < BytesAvailable то если я правильно понял клиент для получения оставшихся данных должен сформировать TDI_RECEIVE IRP и передать в tcpip.sys, это действительно происходит (клиент (браузер) получает все необх. данные, TDIScope показывает принятый TDI_RECEIVE с BytesAvailable) НО МОЙ ФИЛЬТР НЕ ВИДИТ ИМЕННО ЭТОГО TDI_RECEIVE.

    Ткните носом в какую сторону копать, какие варианты решения, а то у меня к сожалению идей уже не осталось...
    Заранее благодарен.
     
  2. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Сори, в оригинале диспатч выглядит след образом:

    Код (Text):
    1. NTSTATUS ioControlInternal(PDEVICE_OBJECT deviceObject, PIRP irp)
    2. {
    3.     PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp);
    4.     NTSTATUS status;
    5.  
    6.     switch(irpStack->MajorFunction){
    7.  
    8.     case IRP_MJ_DEVICE_CONTROL:
    9.         if (KeGetCurrentIrql() == PASSIVE_LEVEL) {
    10.             status = TdiMapUserRequest(deviceObject, irp, irpStack);
    11.         } else
    12.             status = STATUS_NOT_IMPLEMENTED; // set fake status
    13.         if(status != STATUS_SUCCESS){    
    14.             break;    
    15.         }
    16.        
    17.     case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    18.         switch(irpStack->MinorFunction){
    19.         case TDI_ASSOCIATE_ADDRESS:
    20.             onTdiAssociateAddress(irp,irpStack);
    21.             break;
    22.  
    23.         case TDI_SEND:
    24.             scanRequest(deviceObject, irp);
    25.              break;
    26.  
    27.         case TDI_SET_EVENT_HANDLER:
    28.             onSetEventHandler(deviceObject, irp);
    29.               break;
    30.  
    31.         case TDI_DISASSOCIATE_ADDRESS:
    32.             onTdiDisassociateAddress (irp);
    33.             break;
    34.  
    35.         case TDI_DISCONNECT:
    36.             onTdiDisconnect(deviceObject, irp);
    37.                         break;
    38.  
    39.         case TDI_RECEIVE:
    40.             onTdiReceive(deviceObject,irp);
    41.                break;
    42.            
    43.         default:
    44.             break;
    45.         }
    46.     break;    
    47.     default:
    48.         break;
    49. }
    50.     IoSkipCurrentIrpStackLocation(irp);
    51.     return IoCallDriver(pTcpDrvOldObj, irp);
    52. }
    много повырезал...