BSOD в NdisRequest

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

  1. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Ну вроде здесь была такая тема, автор справился с задачей но не как не прокомментировал её решение...

    Нарыл вот эту статью, но не понятно что делать...

    IM driver crash & resets

    Someone else asked for this, so I thought I'd post my solution here:
    This turned out to be a flaw in the handling of resets. The sample PassThru
    basically ignores the whole reset scenario, so it was no help at all. The
    problem is that if a reset is in progress, you are not allowed to call
    NdisRequest() - the blue screen occurs because the lower driver is trying to
    respond to your request while at the same time freeing all its buffers.
    What I did was make a "reset state" flag in my ADAPT structure. This field
    has three states - "running", "in reset", and "reset end". (Be sure to
    protect the state with a spin lock.)
    When handling query/set requests (MiniportSet/QueryInformation()), if the
    state is not "running", I queue the request. I use the sample PassThru
    logic here, which leaves the request data in the ADAPT Request buffer and
    sets the "QueuedRequest" flag to TRUE. (Do not call NdisRequest() here in
    that case - just return from the function.)
    The state change is managed as follows:
    In the ProtocolStatus() function, we will get notifications of
    NDIS_STATUS_RESET_START and NDIS_STATUS_RESET_END at the beginning and end
    of a reset operation. When we get the "start" event, I set the reset state
    to "in reset". When we get the "end" event, I set the state to "reset end".
    In the ProtocolStatusComplete() function, if I see the reset state is "reset
    end", then I set the state to "running" and check the "QueuedRequest" flag.
    If a request was queued, I then pass the request buffer (from the ADAPT
    structure) to NdisRequest().
    This fixed the problem, and it has been running well in the environments
    where it used to blue screen. This does, of course, require the faith that
    once Ndis sends the RESET_START, it will follow it up with RESET_END and
    ProtocolStatusComplete(), but so far this all seems to be happening as
    documented.
    Hope that helps!
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    ты бы лучше минидампы приводил и анализировать пробовал сам, иначе движения почти не будет в твоей работе
     
  3. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Да млин тут же английским языком написано что мой драйвер вызывает драйвер с меньшим уровнем привилегий что и вызывает исключение, нуна там чёта сделать типа выставить какой то флаг в структуре ADAPT structure но я в английском не силён, ну былаже тема кто то должен чё та знать!!!

    :dntknw:
     
  4. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Programming by permutation - твой случай
    анализ минидампа вылаживай и код иначе можно это закрывать
     
  5. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Вот этот код вызывает BSoD


    Код (Text):
    1. mov NR.RequestType,NdisRequestQueryInformation
    2.  
    3. mov NR.DATA.QUERY_INFORMATION.Oid,OID_802_3_CURRENT_ADDRESS
    4. mov NR.DATA.QUERY_INFORMATION.InformationBuffer,offset NdisBuffer
    5. mov NR.DATA.QUERY_INFORMATION.InformationBufferLength,128
    6. mov NR.DATA.QUERY_INFORMATION.BytesWritten,0
    7. mov NR.DATA.QUERY_INFORMATION.BytesNeeded,0
    8.  
    9.    
    10.  
    11.  
    12. push    offset NR           ;[in]  
    13. push    NdisBindingHandle       ;[in]  
    14. push    offset NdisStatus       ;[out]  
    15. call    NdisRequest
    16.  
    17.  
    18.  
    19. NdisRequest proc
    20. ....
    21.  
    22. push    ebx
    23. push    ebx
    24. xor edx,edx
    25. mov ecx,esi     ;ESI=ASCII "NDMP"
    26. call    0F70CC93Fh
    27. mov ecx,esi     ;ESI=ASCII "NDMP"
    28. call    0F70C92F4h  ;EIP=0F70CAF71h
    29.  
    30. ....
    31. NdisRequest endp
    32.  
    33.  
    34.  
    35. 0F70C92F4h  proc
    36. mov edi,edi
    37. push    ebp
    38. mov ebp,esp
    39. sub esp,10h
    40. push    ebx
    41. push    esi
    42. push    edi
    43. mov esi,ecx ;ECX=ASCII "NDMP"
    44. xor ebx,ebx
    45. mov edi,[esi+13Ch]  ;EIP=0F70C9303h
    46.  
    47. ....
    48. 0F70C92F4h  endp
    Сей код
    mov edi,[esi+13Ch] ;EIP=0F70C9303h
    и вызывает исключение
    первый раз когда EIP=0F70C9303h ESI=ASCII "NDMP" усё нормально
    второй раз ESI=00h =>

    mov edi,[esi+13Ch] => исключение => BSoD
     
  6. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    o14189 => Юморист Блин
    :)
     
  7. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    DRIVER_IRQL_NOT_LESS_OR_EQUAL
     
  8. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Ну что все вымерли???
     
  9. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    !analyze -v
     
  10. Afonin

    Afonin New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    2
    Аналогичная проблема. Я только начал разбираться с NDIS.
    Пытаюсь узнать MAC сетевой карты.
    Код:
    Код (Text):
    1. NDIS_REQUEST                    NdisReq;
    2.  
    3. Status = NdisAllocateMemoryWithTag((PVOID*)&NdisReq.DATA.SET_INFORMATION.InformationBuffer, 6, 0x00AB0000);
    4. if(Status == NDIS_STATUS_SUCCESS)
    5. {
    6.     DBGPRINT(("\n\tMemory allocated\n"));
    7.  
    8.     NdisReq.RequestType = NdisRequestQueryInformation;
    9.     NdisReq.DATA.QUERY_INFORMATION.Oid = OID_802_3_CURRENT_ADDRESS;
    10.     NdisReq.DATA.QUERY_INFORMATION.InformationBufferLength = 6;
    11.     NdisReq.DATA.QUERY_INFORMATION.BytesNeeded = 6;
    12.  
    13.         NdisRequest(Status, pAdapt->BindingHandle, &NdisReq);     /// BSOD
    14.  
    15.         if (Status != NDIS_STATUS_PENDING)
    16.         {
    17.                 PtRequestComplete(pAdapt, &NdisReq, Status);
    18.         }
    19.            
    20.     PrintBufer(NdisReq.DATA.SET_INFORMATION.InformationBuffer, NdisReq.DATA.QUERY_INFORMATION.BytesWritten);
    21.     DBGPRINT(("\n\tNdisRequest Status = %d\n", Status));
    22. }
    Все это в PtBindAdapter примера passthru.

    Получаю BugCheck 7E, {c0000005, f83f897d, f8addab0, f8add7ac}

    Код (Text):
    1. FAULTING_MODULE: 804d7000 nt
    2.  
    3. DEBUG_FLR_IMAGE_TIMESTAMP:  4acd92df
    4.  
    5. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>
    6.  
    7. FAULTING_IP:
    8. NDIS!NdisRequest+12
    9. f83f897d 8901            mov     dword ptr [ecx],eax
    10.  
    11. EXCEPTION_RECORD:  f8addab0 -- (.exr 0xfffffffff8addab0)
    12. ExceptionAddress: f83f897d (NDIS!NdisRequest+0x00000012)
    13.    ExceptionCode: c0000005 (Access violation)
    14.   ExceptionFlags: 00000000
    15. NumberParameters: 2
    16.    Parameter[0]: 00000001
    17.    Parameter[1]: 00000000
    18. Attempt to write to address 00000000
    19.  
    20. CONTEXT:  f8add7ac -- (.cxr 0xfffffffff8add7ac)
    21. eax=00000103 ebx=82468c4c ecx=00000000 edx=82480b18 esi=823f81b8 edi=00000000
    22. eip=f83f897d esp=f8addb78 ebp=f8addb78 iopl=0         nv up ei pl zr na pe nc
    23. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010246
    24. NDIS!NdisRequest+0x12:
    25. f83f897d 8901            mov     dword ptr [ecx],eax  ds:0023:00000000=????????
    26. Resetting default scope
    27.  
    28. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    29.  
    30. BUGCHECK_STR:  0x7E
    31.  
    32. LAST_CONTROL_TRANSFER:  from f897bc2e to f83f897d
    33.  
    34. STACK_TEXT:  
    35. WARNING: Stack unwind information not available. Following frames may be wrong.
    36. f8addb78 f897bc2e 00000000 825ce8e0 8240dba0 NDIS!NdisRequest+0x12
    37. f8addc2c f83eafe4 00000000 f8addc54 82468c4c passthru!PtBindAdapter+0x3ce [f:\pt3\driver\protocol.c @ 304]
    38. f8addcc8 f83ed63d 806d06e0 8242bb08 80526ae8 NDIS!NdisOpenConfigurationKeyByName+0x7c4
    39. f8addd50 f83ed6d6 8246c820 8055a1c0 825c7640 NDIS!NdisMGetDeviceProperty+0xdb
    40. f8addd64 f83e9bfe 8246c818 0042bb08 f8adddac NDIS!NdisMGetDeviceProperty+0x174
    41. f8addd74 80533dd0 8246c818 00000000 825c7640 NDIS!NdisFreeToBlockPool+0x165a
    42. f8adddac 805c4a28 8246c818 00000000 00000000 nt!ExQueueWorkItem+0x1b2
    43. f8addddc 80540fa2 80533cd0 00000000 00000000 nt!PsRemoveCreateThreadNotifyRoutine+0x21e
    44. 00000000 00000000 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x5a2
     
  11. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    На одноядерном проце BSoD не возникает
    Для монопольный доступ к ресурсам на двухядерноа Атлоне делаю вот так

    Код (Text):
    1. ....
    2.  
    3. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    4. call    NdisAllocateSpinLock  
    5.  
    6. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    7. call    NdisAcquireSpinLock
    8.  
    9. push    STATUS_SUCCESS
    10. push    STATUS_SUCCESS
    11. push    offset buffer
    12. call    ProtocolOpenAdapterComplete
    13.  
    14. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    15. call    NdisReleaseSpinLock
    16.  
    17. ....
    18.  
    19. ProtocolOpenAdapterComplete     proc
    20. push    ebp                
    21. mov ebp,esp                
    22. Param_1     equ dword ptr [ebp+08h]    
    23. Param_2         equ dword ptr [ebp+0Ch]
    24. Param_3         equ dword ptr [ebp+10h]
    25. pushad
    26. pushfd
    27.  
    28. mov NR.RequestType,NdisRequestQueryInformation
    29.  
    30. mov NR.DATA.QUERY_INFORMATION.Oid,OID_802_3_CURRENT_ADDRESS
    31. mov NR.DATA.QUERY_INFORMATION.InformationBuffer,offset NdisBuffer
    32. mov NR.DATA.QUERY_INFORMATION.InformationBufferLength,128
    33. mov NR.DATA.QUERY_INFORMATION.BytesWritten,0
    34. mov NR.DATA.QUERY_INFORMATION.BytesNeeded,0
    35.  
    36.    
    37.  
    38.  
    39. push    offset NR           ;[in]  
    40. push    NdisBindingHandle       ;[in]  
    41. push    offset NdisStatus       ;[out]  
    42. call    NdisRequest
    43. mov ebx,NdisStatus
    44. mov Param_1,ebx
    45.  
    46. popfd
    47. popad
    48. mov eax,Param_1
    49. leave
    50. retn    0Ch
    51. ProtocolOpenAdapterComplete     endp
    52.  
    53. ....
     
  12. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Результат тот же!
     
  13. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Код (Text):
    1. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    2. call    NdisAllocateSpinLock  
    3.  
    4. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    5. call    NdisAcquireSpinLock
    6.  
    7. push    STATUS_SUCCESS
    8. push    STATUS_SUCCESS
    9. push    offset buffer
    10. call    ProtocolOpenAdapterComplete
    11.  
    12. push    offset NSL  ;PNDIS_SPIN_LOCK SpinLock
    13. call    NdisReleaseSpinLock
    это все одна функция? а в чем прикол (NdisAllocateSpinLock)?