OID_802_3_XMIT_ONE_COLLISION

Home Forums Discussions General OID_802_3_XMIT_ONE_COLLISION

Viewing 6 posts - 1 through 6 (of 6 total)
  • Author
    Posts
  • #4994
    0lka
    Participant

      У меня сетевой драйвер фильтр, сгенерированный Driver Studio

      NDIS_STATUS Adapter::OnQuery(KNdisRequest& Request, NDIS_STATUS ReturnedStatus)  //перехватывает запросы OID
      NDIS_STATUS Adapter::OnSet(KNdisRequest& Request) //перехватывает установку OID

      Хочу получить статистику по коллизиям, ну к примеру OID_802_3_XMIT_ONE_COLLISION –
      количество фреймов переданых с одним столкновением
      Записываю в перехватчик отправки пакетов следующий код


      NDIS_STATUS Adapter::OnSend(const KNdisPacket& Original, KNdisPacket& Repackaged)
      {
      .....
      NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
      KNdisRequest * Request = (KNdisRequest *) ExAllocatePool(NonPagedPool, sizeof(KNdisRequest));
      ULONG * buff=(ULONG *)ExAllocatePool(NonPagedPool, sizeof(ULONG)); // выделяю память
      Request->RequestType=NdisRequestQueryInformation; // тип запроса
      Request->DATA.QUERY_INFORMATION.Oid = OID_802_3_XMIT_ONE_COLLISION; // указываю какой OID мне нужен
      Request->DATA.QUERY_INFORMATION.InformationBuffer=buff; // указываю куда сложить значение
      Request->DATA.QUERY_INFORMATION.InformationBufferLength=4; // размер буфера
      OnQuery( Request,&Status); // можно ли вызывать перехватчик???

      T.Trace("[%s]=%dn",KNDIS_GET_OID_NAME(Request.DATA.QUERY_INFORMATION.Oid), buff);
      .....
      }

      В отладчике я ожидаю увидеть что то типа “[OID_802_3_XMIT_ONE_COLLISION]=12 “, но получаю “[OID_802_3_XMIT_ONE_COLLISION]=-458659865 “

      Вообщем что то у меня совсем не выходит получить хоть какое нибудь корректное значение с помощью OID, может я что то не так делаю 🙁

      #5970
      0lka
      Participant

        Даже вот беру прямо в перехватчике пишу

        NDIS_STATUS Adapter::OnQuery(KNdisRequest& Request, NDIS_STATUS ReturnedStatus)
        {

        T.Trace("[%s]=%.8X n",KNDIS_GET_OID_NAME(Request.DATA.QUERY_INFORMATION.Oid),Request.DATA.QUERY_INFORMATION.InformationBuffer);

        return ReturnedStatus;
        }

        а в результате получаю совершенно непонятные и невероятные числа

        #5971
        Vadim Smirnov
        Keymaster

          А какой статус (NDIS_STATUS) возвращается? Нижележащий драйвер сетевой карты может просто не поддерживать этот OID…

          #5972
          0lka
          Participant

            Проблема в том, что это драйвер-фильтр
            я вижу все что проходит через этот фильтр, но я не могу (у меня не получаеться) запросить какие то данные с помощью OID.
            Где можно выполнять запросы OID, в OnSend, OnReceive, OnInitialize, OnHalt?
            Или нужно создать свою процедру, но где тогда её вызывать?
            И как правильно запрашивать информацию о статистике Ethernet?

            #5973
            Vadim Smirnov
            Keymaster

              Проблема в том, что это драйвер-фильтр

              В смысле Intermediate?

              Где можно выполнять запросы OID, в OnSend, OnReceive, OnInitialize, OnHalt?

              В общем случае запросы можно делать как только нижележащий драйвер готов их обрабатывать и до того как он перестает это делать (то есть OnInitialize и OnHalt использовать пожалуй не очень разумно).

              В общем случае нужно следить только за IRQL “Callers of NdisRequest can be running at IRQL <= DISPATCH_LEVEL" и руководстоваться тем когда эта самая статистика нужна.

              #5974
              0lka
              Participant

                УРА!!!!
                Получилось !!!
                Спасибо 🙂

              Viewing 6 posts - 1 through 6 (of 6 total)
              • You must be logged in to reply to this topic.