prus

Forum Replies Created

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • in reply to: TDI-фильтр и ClientEventChainedReceive(Expedited) #6849
    prus
    Participant

      Вот… Поправил немного:


      NTSTATUS NewClientEventChainedReceive(
      IN PVOID TdiEventContext,
      IN CONNECTION_CONTEXT ConnectionContext,
      IN ULONG ReceiveFlags,
      IN ULONG ReceiveLength,
      IN ULONG StartingOffset,
      IN PMDL Tsdu,
      IN PVOID TsduDescriptor
      )
      {

      BOOLEAN bReceiveFlag = FALSE;
      KIRQL oldIrql;
      NTSTATUS ntStatus;
      ULONG ulTcpDataType = 0;
      PUCHAR puchData = NULL;
      PUCHAR puchMdlData = NULL;
      PCLIENT_EVENT_CONTEXT_INFO pClientEventContextInfo;
      CLIENTEVENTCHAINEDRECEIVE RealClientEventChainedReceive;

      /*__asm int 3*/

      KeAcquireSpinLock(&g_ClientEventReceiveSpinLock, &oldIrql);
      pClientEventContextInfo = (PCLIENT_EVENT_CONTEXT_INFO)TdiEventContext;
      RealClientEventChainedReceive = (CLIENTEVENTCHAINEDRECEIVE)pClientEventContextInfo->EventRealHandler;
      KeReleaseSpinLock(&g_ClientEventReceiveSpinLock, oldIrql);

      do {

      if( Tsdu == NULL || ReceiveLength == 0 )
      break;

      puchMdlData = (PUCHAR)MmGetSystemAddressForMdlSafe(Tsdu, LowPagePriority);

      if( puchMdlData == NULL )
      break;

      puchData = (PUCHAR)ExAllocatePool(NonPagedPool, ReceiveLength);

      if( puchData == NULL )
      break;

      RtlZeroMemory(puchData, ReceiveLength);
      RtlCopyMemory(puchData, puchMdlData, ReceiveLength);

      ...
      ...

      bReceiveFlag = TRUE;

      } while( FALSE );

      ntStatus = RealClientEventChainedReceive(pClientEventContextInfo->EventRealContext,
      ConnectionContext,
      ReceiveFlags,
      ReceiveLength,
      StartingOffset,
      Tsdu,
      TsduDescriptor);

      TCPMODULE_KDPRINT(("In NewClientEventChainedReceive [RealClientEventChainedReceive]: ReceiveLength=%lu ntStatus=0x%08Xn", ReceiveLength, ntStatus));

      if( bReceiveFlag ) {

      if( ntStatus == STATUS_SUCCESS || ntStatus == STATUS_PENDING ) {

      // Сохраняем данные для дальнейшего использования

      }
      else {

      // Если статус STATUS_DATA_NOT_ACCEPTED, то чистим ранее выделенные ресурсы

      }

      }

      return ntStatus;

      }

      т.е. в puchData у меня будет копия принятых данных. В случае, если реальный нотификатор вернет STATUS_DATA_NOT_ACCEPTED, то клиенту данные не нужны и я очищаю память… Если же реальный нотификатор вернет STATUS_SUCCESS или STATUS_PENDING, то сохраняею данные.
      Я правильно все понял?

      in reply to: TDI-фильтр и ClientEventChainedReceive(Expedited) #6848
      prus
      Participant

        Большое спасибо!

      Viewing 2 posts - 1 through 2 (of 2 total)