Проблема с NdisRegisterProtocol

Discussion in 'WASM.NETWORKS' started by skyproc, Sep 27, 2009.

  1. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    NdisRegisterProtocol возвращает
    EAX = 1
    Status = NDIS_STATUS_BAD_VERSION = 0C0010004h

    В окне с отлладочной информацией такая строка:
    ndis: NdisRegisterProtocol protocol does not have Bind/UnbindAdapterHandler and it is not supported

    Вот код:
    mov NPC.MajorNdisVersion,5
    mov NPC.MinorNdisVersion,0
    mov NPC.Reserved,0
    mov NPC.OpenAdapterCompleteHandler,offset ProtocolOpenAdapterComplete
    mov NPC.CloseAdapterCompleteHandler,offset ProtocolCloseAdapterComplete
    mov NPC.SendCompleteHandler,offset ProtocolSendComplete
    mov NPC.TransferDataCompleteHandler,offset ProtocolTransferDataComplete
    mov NPC.ResetCompleteHandler,offset ProtocolResetComplete
    mov NPC.RequestCompleteHandler,offset ProtocolRequestComplete
    mov NPC.ReceiveHandler,offset ProtocolReceive
    mov NPC.ReceiveCompleteHandler,offset ProtocolReceiveComplete
    mov NPC.StatusHandler,offset ProtocolStatus
    mov NPC.StatusCompleteHandler,offset ProtocolStatusComplete
    mov NPC._Name,offset ProtocolName

    mov NPC.ReceivePacketHandler,0
    mov NPC.BindAdapterHandler,offset ProtocolBindAdapter
    mov NPC.UnbindAdapterHandler,offset ProtocolUnbindAdapter

    ;mov NPC.PnPEventHandler,offset ProtocolPnPEvent
    ;mov NPC.UnloadHandler,offset ProtocolUnload
    ;mov NPC.CoSendCompleteHandler,offset ProtocolCoSendComplete
    ;mov NPC.CoStatusHandler,offset ProtocolCoStatus
    ;mov NPC.CoReceivePacketHandler,offset ProtocolCoReceivePacket
    ;mov NPC.CoAfRegisterNotifyHandler,offset ProtocolCoAfRegisterNotify




    push sizeof NPC ;[in] UINT CharacteristicsLength
    push offset NPC ;[in] PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics
    push offset NdisProtocolHandle ;[out] PNDIS_HANDLE NdisProtocolHandle
    push offset NdisStatus ;[out] PNDIS_STATUS Status
    call NdisRegisterProtocol





    data.

    NPC NDIS_PROTOCOL_CHARACTERISTICS <>

    NDIS_PROTOCOL_CHARACTERISTICS struct
    MajorNdisVersion db 0
    MinorNdisVersion db 0
    Reserved dd 0
    OpenAdapterCompleteHandler dd 0
    CloseAdapterCompleteHandler dd 0
    SendCompleteHandler dd 0
    TransferDataCompleteHandler dd 0
    ResetCompleteHandler dd 0
    RequestCompleteHandler dd 0
    ReceiveHandler dd 0
    ReceiveCompleteHandler dd 0
    StatusHandler dd 0
    StatusCompleteHandler dd 0
    _Name dd 0

    ReceivePacketHandler dd 0
    BindAdapterHandler dd 0
    UnbindAdapterHandler dd 0
    PnPEventHandler dd 0
    UnloadHandler dd 0

    CoSendCompleteHandler dd 0
    CoStatusHandler dd 0
    CoReceivePacketHandler dd 0
    CoAfRegisterNotifyHandler dd 0
    NDIS_PROTOCOL_CHARACTERISTICS ends


    Не знаю что делыть...
    :dntknw:
     
  2. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    выложи ndis.sys со своей версии ОС
     
  3. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    явные бока со структурой, скачай символы и сделай нормальное объявление
    у тебя не регаются Bind/UnbindAdapterHandler потому как их адреса расположены не там где нужно
    в ndis 5.1 точно не выйдет зарегать такой протокол, про 5.0 не в курсе, нужен драйвер
     
  4. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    Файл: ndis (ndis.rar)
    Ссылка для скачивания: http://freespace.by/download/b4737b132e
     
  5. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    o14189 пасиба за помощь, это действительно я не ту структуру нарыл.

    Но вот незадача следующий шаг оказалси ещё драматичнее, NdisOpenAdapter вызывает синий экран без указания типа ошибки...

    Code (Text):
    1. code.
    2. push    sizeof NPC          ;[in]  UINT CharacteristicsLength              
    3. push    offset NPC          ;[in]  PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics  
    4. push    offset NdisProtocolHandle       ;[out] PNDIS_HANDLE NdisProtocolHandle         
    5. push    offset NdisStatus           ;[out] PNDIS_STATUS Status             
    6. call    NdisRegisterProtocol
    7.  
    8. mov ebx,NdisStatus
    9. cmp ebx,NDIS_STATUS_SUCCESS
    10. jnz @ExitErrorPCIService
    11.  
    12.  
    13.  
    14.  
    15. mov eax,NdisMedium802_3
    16. mov MediumArray,eax
    17.  
    18. mov eax,0
    19. mov SelectedMediumIndex,eax
    20.  
    21. push    0           ;[in] PSTRING       AddressingInformation
    22. push    0           ;[in] UINT      OpenOptions
    23. push    offset AdapterName      ;[in] PNDIS_STRING  AdapterName
    24. push    ProtocolBindingContext  ;[in] NDIS_HANDLE   ProtocolBindingContext
    25. push    NdisProtocolHandle      ;[in] NDIS_HANDLE   NdisProtocolHandle 
    26. push    4           ;[in] UINT      MediumArraySize
    27. push    offset MediumArray      ;[in] PNDIS_MEDIUM  MediumArray
    28. push    offset SelectedMediumIndex  ;[in] PUINT         SelectedMediumIndex
    29. push    offset NdisBindingHandle    ;[out] PNDIS_HANDLE     NdisBindingHandle  
    30. push    offset OpenErrorStatus  ;[out] PNdisStatus  OpenErrorStatus
    31. push    offset NdisStatus       ;[out] PNdisStatus  Status     
    32. call    NdisOpenAdapter
    33. mov ebx,NdisStatus
    34. cmp ebx,NDIS_STATUS_SUCCESS
    35. jnz @ExitErrorPCIService
    36.  
    37. data.
    38. AdapterName     dw "A","S","U","S"," ","N","X","1","0","0","1"," ","N","e","t","w","o","r","k"
    39.             dw " ","A","d","a","p","t","e","r",0
    40.  
    41. MediumArray     dd 0
    42. ProtocolBindingContext  dd 0   
    43. NdisProtocolHandle      dd 0           
    44. NdisBindingHandle       dd 0
    45. OpenErrorStatus     dd 0
    46. SelectedMediumIndex     dd 0
    47. hAdapter            dd 0
    48. NdisStatus      dd 0
    что надо засунуть в ProtocolBindingContext
    что не так?
     
  6. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    Это от какой ОС NDIS? 5.0/5.1/5.2?

    Вобщем обычный контекст пользователя, который позже будет передан, зарегистрированным тобой, колбекам.

    Нужен анализ минидампа
     
  7. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    o14189 расскажа как получить контекст пользователя и где взять дамп?
     
  8. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    ну а по коду

    UNICODE_STRING* != WCHAR*

    MediumArraySize это не размер, а количество элементов

    мож еще какие то бока
    лучше wdk поставить все-таки
    и посмотреть исходники, там есть пример драйвера протокола
     
  9. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    если он тебе сейчас не нужен, а судя по всему ведь не нужен, то передавай NULL
    когда станет нужен, а это точно случится) если писать не хелоуворлд, то уже передашь то что будет нужно, указатель на какие-то глобальные данные к примеру, или еще чего

    это уже в поиск

    Code (Text):
    1. @set minidump=%1
    2. @call cmd.exe /K kd.exe -z %minidump%
    +
    Code (Text):
    1. !analyze -v
     
  10. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    количество элементов исправил на 1
    результат тот же

    AdapterName dw "A","S","U","S",0 это тоже что и
    AdapterName db "A",0,"S",0,"U",0,"S",0,0,0
    в любом случае сомниваюсь что не корректрое имя бызвало бы крушение системы.
     
  11. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    skyproc
    это указатель
    если сомневаешься берешь и отлаживаешь NdisRegisterProtocol либо можешь просто показать где в ndis.sys упало (нужен анализ минидампа), иначе помогать никто не будет
     
  12. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    ща поковыляю отладчик посматрю де слитает, на какой файлообменник выложить файл?
     
  13. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    www.sendspace.com
    www.speedyshare.com
     
  14. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    При помощи Sysera я получил следующее:


    call NdisOpenAdapter



    NdisOpenAdapter proc
    ....
    mov eax,[esp+34h]
    push ecx
    mov ecx,[esp+34h]
    push edx
    mov edx,[esp+34h]
    push eax
    push ecx
    push edx
    call [F70EBFE4h] ;EIP=F70DE940h
    ....
    NdisOpenAdapter endp



    F70EBFE4h proc
    ....
    mov eax,[ebx+18h]
    shr eax,1Dh
    and eax,0FFFFFF01h
    push eax
    push [ebp+28h]
    call F70B9BA3h ;EIP=F70B9B62h
    ....
    F70EBFE4h endp



    F70B9BA3 proc
    ....
    push ebx
    push edi
    push esi
    lea eax,[ebp,-1Ch]
    push eax
    call RtlUpcaseUnicodeString ;EIP=F70B9C04h
    ....
    F70B9BA3 endp



    RtlUpcaseUnicodeString proc
    ....
    mov eax,[esi+04h] ;ESI= Addres UnicodeString ="ASUS NX1001 Network Adapter"
    mov ax,[eax+ecx*2]
    ....
    RtlUpcaseUnicodeString endp


    от суда видно что к моменту
    mov ax,[eax+ecx*2]
    в EAX не адрес строки, что и генерирует исключение

    push 0 ;[in] PSTRING AddressingInformation
    push 0 ;[in] UINT OpenOptions
    push offset AdapterName ;[in] PNDIS_STRING AdapterName
    push offset ProtocolBindingContext ;[in] NDIS_HANDLE ProtocolBindingContext
    push NdisProtocolHandle ;[in] NDIS_HANDLE NdisProtocolHandle
    push 1 ;[in] UINT MediumArraySize
    push offset MediumArray ;[in] PNDIS_MEDIUM MediumArray
    push offset SelectedMediumIndex ;[in] PUINT SelectedMediumIndex
    push offset NdisBindingHandle ;[out] PNDIS_HANDLE NdisBindingHandle
    push offset OpenErrorStatus ;[out] PNdisStatus OpenErrorStatus
    push offset NdisStatus ;[out] PNdisStatus Status
    call NdisOpenAdapter

    offset AdapterName -> ни что иное как адре юникод строки
    так что не так?
     
  15. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    http://www.sendspace.com/file/ewlxtt
     
  16. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    WCHAR* != UNICODE_STRING*

    "!=" - значит, что это разные вещи
     
  17. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    имя может быть, а вот левый указатель который тут будет равен "S","U" может
     
  18. o14189

    o14189 New Member

    Blog Posts:
    0
    Joined:
    Jul 19, 2009
    Messages:
    320
    Code (Text):
    1. NdisOpenAdapter(...)
    2. {
    3. //...
    4.     ndisFindRootDevice(
    5.       AdapterName,...
    6.       );
    7. //...
    8. }
    9.  
    10. ndisFindRootDevice(
    11.       PUNICODE_STRING AdapterName,...
    12.       )
    13. {
    14. //...
    15.      RtlUpcaseUnicodeString(&AdapterNameUpcased, AdapterName, 0);
    16. //...
    17. }
    внутри последней функции произойдет доступ к AdapterName->Buffer,
    тут и исключение
     
  19. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    Да уже дапёр, как то пропусти мимо ушей твой комментарий

    mov UsAdapterName._Length,36h
    mov UsAdapterName._MaximumLength,36h
    mov UsAdapterName._Buffer,offset AdapterName

    Усё работает и возвращает NDIS_STATUS_ADAPTER_NOT_FOUND, мда час от часу не легче
    :)
     
  20. skyproc

    skyproc New Member

    Blog Posts:
    0
    Joined:
    May 4, 2007
    Messages:
    217
    Да на счет имени я его беру при помощи PacketGetAdapterNames, возможно это не то?