OID_802_3_XMIT_ONE_COLLISION

Home Forums Discussions General Discussion OID_802_3_XMIT_ONE_COLLISION

This topic contains 5 replies, has 2 voices, and was last updated by  0lka 11 years, 5 months ago.

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
    Moderator

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

    #5972

    0lka
    Participant

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

    #5973

    Vadim Smirnov
    Moderator

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

    В смысле 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.