Циклический вызов ProtocolUnbindAdapter

Тема в разделе "WASM.WIN32", создана пользователем saggitarius, 9 ноя 2005.

  1. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    Привет Все!

    Я драйверами начал заниматься не так давно, поэтому постоянно наступаю на какие-нибудь "грабли". Очередные "грабли" произошли при вызове системой функции ProtocolUnbindAdapter. Вроде бы делаю все правильно: в ProtocolBindAdapter выделяю память под очередь пакетов и данных и вызываю NdisOpenAdapter(отрабатывает без ошибок).

    Но при вызове функции NdisDeRegisterProtocol система начинает циклически вызывать ProtocolUnbindAdapter - в результате комп. перегружается.

    Не подскажите в чем может быть проблема?
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Исходник ProtocolUnbindAdapter в студию !
     
  3. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    VOID NdisProtocolBindAdapter(PNDIS_STATUS Status, NDIS_HANDLE BindContext, PNDIS_STRING DeviceName, PVOID SystemSpecific1,

    PVOID SystemSpecific2)

    {

    PNDISUIO_OPEN_CONTEXT pOpenContext;

    NDIS_MEDIUM MediumArray[]= {NdisMedium802_3};

    NDIS_STATUS ErrorStatus;

    UINT MediumIndex;

    UINT ByteProcessed;

    ULONG GenericULong=0;

    #if DBG

    DbgPrint("-NetworkAnalizer- In BindAdapter\n");

    #endif



    pOpenContext=(PNDISUIO_OPEN_CONTEXT)ExAllocatePool(NonPagedPool,sizeo f(NDISUIO_OPEN_CONTEXT));



    if(pOpenContext==NULL)

    {

    #if DBG

    DbgPrint("-NetworkAnalizer- Enought memory to allocate NDISUIO_OPEN_CONTEXT");

    #endif

    *Status=NDIS_STATUS_RESOURCES;

    }



    NdisZeroMemory(pOpenContext,sizeof(NDISUIO_OPEN_CONTEXT));



    pOpenContext->DeviceName.Buffer=(PWSTR)ExAllocatePool(NonPagedPool, 2*wcslen(DeviceName->Buffer)+1);

    NdisMoveMemory(pOpenContext->DeviceName.Buffer, DeviceName->Buffer, 2*wcslen(DeviceName->Buffer)+1);



    NdisOpenAdapter(Status, &ErrorStatus, &(pOpenContext->BindingHandle), &MediumIndex, MediumArray, 1,

    Globals.NdisProtocolHandle, BindContext, &(pOpenContext->DeviceName), 0, NULL);

    if (*Status==NDIS_STATUS_SUCCESS)

    {

    #ifdef DBG

    DbgPrint("-NetworkAnalizer- OpenAdapter successfully BindingHandle=%u.\n", pOpenContext->BindingHandle);

    DbgPrint("-NetworkAnalizer- DeviceName= %ws\n", pOpenContext->DeviceName.Buffer);

    #endif

    }

    else

    {

    #ifdef DBG

    DbgPrint("-NetworkAnalizer- not OpenAdapter.\n");

    #endif

    }

    pOpenContext->PowerState=NetDeviceStateD0;

    }

    VOID NdisProtocolUnbindAdapter( PNDIS_STATUS Status, NDIS_HANDLE ProtocolBindingContext, NDIS_HANDLE UnbindContext)

    {

    PNDISUIO_OPEN_CONTEXT pOpenContext;

    #if DBG

    DbgPrint("-NetworkAnalizer- In UnBindAdapter\n");

    #endif



    pOpenContext=(PNDISUIO_OPEN_CONTEXT)ProtocolBindingContext;

    if (pOpenContext->DeviceName.Buffer!=NULL)

    NdisFreeMemory(pOpenContext->DeviceName.Buffer, 2*wcslen(pOpenContext->DeviceName.Buffer)+1, 0);



    #if DBG

    DbgPrint("-NetworkAnalizer- NdisFreeMemory\n");

    #endif



    if (pOpenContext!=NULL) ExFreePool(pOpenContext);



    #if DBG

    DbgPrint("-NetworkAnalizer- ExFreePool\n");

    #endif

    }
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Чуешь разницу ?
    Код (Text):
    1. PtUnbindAdapter proc uses edi esi Status:PNDIS_STATUS, ProtocolBindingContext:NDIS_HANDLE, UnbindContext:NDIS_HANDLE
    2.     ;
    3. ;local BindingHandle    :NDIS_HANDLE
    4.     ;
    5.     mov edi, ProtocolBindingContext
    6.     assume edi:ptr ADAPT
    7.     ;
    8.     .if [edi].QueuedRequest==TRUE
    9.         mov [edi].QueuedRequest, FALSE
    10.         invoke PtRequestComplete, edi, addr [edi].Request, NDIS_STATUS_FAILURE
    11.     .endif
    12.     ; Check if we had called NdisIMInitializeDeviceInstanceEx and
    13.     ; we are awaiting a call to MiniportInitialize.
    14.     .if [edi].MiniportInitPending==TRUE
    15.         ; Try to cancel the pending IMInit process.
    16.         invoke NdisIMCancelInitializeDeviceInstance, DriverHandle, addr [edi].DeviceName
    17.         .if eax==NDIS_STATUS_SUCCESS
    18.             ; Successfully cancelled IM Initialization; our
    19.             ; Miniport Initialize routine will not be called
    20.             ; for this device.
    21.             mov [edi].MiniportInitPending, FALSE
    22.         .else
    23.             ; Our Miniport Initialize routine will be called
    24.             ; (may be running on another thread at this time).
    25.             ; Wait for it to finish.
    26.             invoke NdisWaitEvent, addr [edi].MiniportInitEvent, 0
    27.         .endif
    28.     .endif
    29.     ; Call NDIS to remove our device-instance. We do most of the work
    30.     ; inside the HaltHandler.
    31.     ; The Handle will be NULL if our miniport Halt Handler has been called or
    32.     ; if the IM device was never initialized
    33.     .if [edi].MiniportHandle!=NULL
    34.         invoke NdisIMDeInitializeDeviceInstance, [edi].MiniportHandle
    35.         mov edx, Status
    36.         mov dword ptr [edx], eax
    37.         .if eax!=NDIS_STATUS_SUCCESS
    38.             mov dword ptr [edx], NDIS_STATUS_FAILURE
    39.         .endif
    40.     .else
    41.         ; We need to do some work here.
    42.         ; Close the binding below us
    43.         ; and release the memory allocated.
    44.         .if [edi].BindingHandle!=NULL
    45.             invoke NdisResetEvent, addr [edi].Event
    46.             invoke NdisCloseAdapter, Status, [edi].BindingHandle
    47.             ; Wait for it to complete
    48.             mov eax, Status
    49.             .if dword ptr [eax]==NDIS_STATUS_PENDING
    50.                 invoke NdisWaitEvent, addr [edi].Event, 0
    51.                 mov eax, Status
    52.                 push [edi].Status
    53.                 pop dword ptr [eax]
    54.             .endif
    55.         .else
    56.             ; Both Our MiniportHandle and Binding Handle  should not be NULL.
    57.             mov eax, Status
    58.             mov dword ptr [eax], NDIS_STATUS_FAILURE
    59.         .endif
    60.         ; Free the memory here, if was not released earlier(by calling the HaltHandler)
    61.         invoke NdisFreeMemory, edi, sizeof(ADAPT), 0
    62.     .endif
    63.     assume edi:ptr nothing
    64.     ;
    65.     ret
    66.     ;
    67. PtUnbindAdapter endp


    Что то не наблюдается NdisIMDeInitializeDeviceInstance, поэтому система думает, что адаптер ещё прибиндин :) Да и статус не возвращается...
     
  5. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    А, протормозил :dntknw: NdisIMDeInitializeDeviceInstance тебе не нужен, а статус возвращать надо.
     
  6. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    Спасибо за ответ. Но ошибка, к сожалению, не в этом. После долгих поисков я выяснил что ProtocolBindingContext не содержится указатель на NDISUIO_OPEN_CONTEXT. Из-за этого и происходит циклический вызов. Теперь непонятно почему Ndis не передает этот указатель?
     
  7. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    Все, нашел ошибку: в NdisOpenAdapter вместо (NDIS_HANDLE)pOpenContext передал BindContext :)). Дурацкая ошибка отняла у меня кучу времени :dntknw:(.