проблема с NDIS

Тема в разделе "WASM.NT.KERNEL", создана пользователем goga2007, 17 дек 2007.

  1. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    всем привет, пишу первый NDIS драйвер. но система не вызывает функцию protocolbindadapter. пример из ddk(ndisprot) работает, а мой драйвер(я назвал его тоже NDISPROT, чтобы не сомневаться в правильной инсталляции, и при тестировании просто заменяю пример из ддк своим в системной дирректории system32\drivers) всплывает только на driverentry & pnpeventproc. две недели уже ломаю голову. в ддк написано, что система вызывает все нужные (как я понял без дополнительных действий)функции при успешной регистрации with ndisregisterprotocol .как я понял - как обічніе диспетчерские функции обічного драйвера.
    помогите пожалуйста найти ошибку...
    думаю, что ошибка в driverentry or pnpeventproc тк другие ф-ции не вызываются до бинда
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Поиск по форуму, было уже (или в DDK ищи). Имя протокола нужно в уже не помню какой ключ реестра добавить.
     
  3. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Вы установили драйвер через сетевое окружение? Просто вызвать NdisRegsiterProtocol - мало, такой протокол не будет привязан ни к одному адаптеру. При установке через сетевое окружение работает специальный коинсталлер, который правильно настраивает привязку протокола к минипортам. Можно тоже самое сделать программно, через Network Configuration Interface
     
  4. Termo_in_work

    Termo_in_work TermoSINteZ

    Публикаций:
    0
    Регистрация:
    31 июл 2007
    Сообщения:
    20
    Адрес:
    на работе
    http://www.wasm.ru/forum/viewtopic.php?id=12161
    Когда то и сам напарывался ) Кучу времени убил... Сочувствую
    А ддк кстати не верь - там много ошибок.
     
  5. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    переименовал протокол в ндиспрот - щас работает. но теперь не перевести адаптер в promiscuous mode. requestcomplete вызывается со статусом завершения NDIS_STATUS_NOT_SUPPORTED . причем и wi-fi и ethernet адаптер:
    Код (Text):
    1. ****************************************************************************************
    2. ; definitions
    3.  
    4. ;------------------------------------------------------------------------
    5. ; prototypes
    6. ;------------------------------------------------------------------------
    7.  
    8. OpenAdapterComplete proto   stdcall     :dword, :dword, :dword
    9. CloseAdapterComplete    proto   stdcall     :dword, :dword
    10. SetPromiscuousMode      proto   stdcall         :dword, :dword
    11.  
    12. ;------------------------------------------------------------------------
    13. ; constants
    14. ;------------------------------------------------------------------------
    15.  
    16. NDIS_BINDING_STATE  equ 1
    17. NDIS_UNBINDING_STATE    equ 2
    18. NDIS_BINDING_END    equ 0FFFFFFFEh
    19. NDIS_UNBINDING_END  equ 0FFFFFFFDh
    20. MEDIUM_SUPPORTED_NUM    equ 1
    21.  
    22. ;------------------------------------------------------------------------
    23. ; ctlcodes
    24. ;------------------------------------------------------------------------
    25.  
    26. CTL_DEVICE_ENUM     equ CTL_CODE(FILE_DEVICE_NETWORK, 800h, METHOD_NEITHER, FILE_ANY_ACCESS)
    27. CTL_SET_PROMISCUOUS equ CTL_CODE(FILE_DEVICE_NETWORK, 801h, METHOD_NEITHER, FILE_ANY_ACCESS)
    28. CTL_DEST_IP     equ CTL_CODE(FILE_DEVICE_NETWORK, 802h, METHOD_NEITHER, FILE_ANY_ACCESS)
    29. CTL_SORC_IP     equ CTL_CODE(FILE_DEVICE_NETWORK, 803h, METHOD_NEITHER, FILE_ANY_ACCESS)
    30.  
    31.  
    32. ;------------------------------------------------------------------------
    33. ; structs
    34. ;------------------------------------------------------------------------
    35.  
    36.  
    37. NDIS_OPEN_CONTEXT   STRUCT
    38.     AdapterContext      dd  ?
    39.     BindingHandle       dd  ?
    40.     AdapterHandle       dd  ?
    41.     StateFlags      dd  ?   ;reserved
    42.     DevNameBound        dd  ?   ;UNICODE_STRING  <>
    43.                 dd  ?
    44.     UnbindContext       dd  ?
    45.     NextContext     dd  ?   ;Flink
    46.     PrevContext     dd  ?   ;Blink
    47. NDIS_OPEN_CONTEXT   ENDS
    48.  
    49. ;-------------------------------------------------------
    50. ;*******************************************************
    51.  
    52. _QUERY_SET_INFO   STRUCT
    53.  
    54.     Oid             DWORD   ?
    55.     InformationBuffer       DWORD   ?
    56.     InformationBufferLength     DWORD   ?
    57.     BytesWritten            DWORD   ?
    58.     BytesNeeded         DWORD   ?
    59.  
    60. _QUERY_SET_INFO  ENDS
    61.  
    62. NDIS_REQUEST    STRUCT          ; size 28h
    63.  
    64.     MacReserved         DD  4 DUP(?)
    65.     RequestType         DWORD   ?
    66.     QuerySetInformation    _QUERY_SET_INFO  <>
    67.  
    68. NDIS_REQUEST ENDS
    69.  
    70.  
    71.  
    72. ;*******************************************************
    73. ;-------------------------------------------------------
    74. SetPromiscuousMode      proc    uses esi ebx     IoStackLocation:DWORD, pStatus:DWORD ; sets to promiscuous mode of selected adapter
    75.  
    76. local Mode:DWORD
    77.  
    78.  
    79.                 xor     ecx,ecx
    80.                 mov     eax,FirstContext    ; pointer to the first bound adapter NDIS_OPEN_CONTEXT struct
    81.                 test    eax,eax
    82.                 jz      err_no_adapter
    83.             @@:
    84.                 inc     ecx
    85.                 assume  eax:ptr NDIS_OPEN_CONTEXT
    86.                 mov     eax,[eax].NextContext     ; pointer to next bound adapter context
    87.                 assume  eax:nothing
    88.                 test    eax,eax
    89.                 jnz     @b
    90.  
    91.                 mov     eax,IoStackLocation       ; parameter passed to the DispatchIo routine because it is called from DispatchIo
    92.                 assume  eax:ptr IO_STACK_LOCATION
    93.                 mov     edx,[eax].Parameters.DeviceIoControl.Type3InputBuffer         ; size of this buffer is 4 bytes always
    94.                 assume  eax:nothing
    95.                 mov     eax,[edx]                                                     ; get adapter number which to set promiscuous mode
    96.                 test    eax,eax
    97.                 jz      err_no_adapter  ; STATUS_UNSUCCESSFUL
    98.  
    99.                 cmp     eax,ecx
    100.                 jg      err_no_adapter  ; no adapter needed
    101.  
    102.                 mov     ecx,FirstContext
    103.                 assume  ecx:ptr NDIS_OPEN_CONTEXT
    104.  
    105.     nextadapter:
    106.                 dec     eax
    107.                 mov     edx,ecx
    108.                 mov     ecx,[ecx].NextContext
    109.                 assume  ecx:nothing
    110.                 jnz     nextadapter
    111.      setpromisc:
    112.                 assume  edx:ptr NDIS_OPEN_CONTEXT
    113.                 lea     ecx,request     ; request is a struct like NDIS_REQUEST and is located in section '.data'
    114.                 assume  ecx:ptr NDIS_REQUEST
    115.                 mov     eax,[edx].BindingHandle
    116.                 push    edx     ; save pOpenAdapter
    117.                 assume  edx:nothing
    118.                 mov     Mode,NDIS_PACKET_TYPE_PROMISCUOUS
    119.                 mov     [ecx].RequestType,NdisRequestSetInformation
    120.                 mov     [ecx].QuerySetInformation.Oid,OID_GEN_CURRENT_PACKET_FILTER
    121.                 lea     edx,Mode
    122.                 mov     [ecx].QuerySetInformation.InformationBuffer,edx
    123.                 mov     [ecx].QuerySetInformation.InformationBufferLength,4
    124.                 assume  ecx:nothing
    125.                 mov     ebx,pStatus      ; ebx!!!!!!!!!!!!!!!!!!! (for myself)
    126.         invoke  NdisRequest, ebx, eax, ecx
    127.                 mov     ecx,pStatus
    128.                 pop     edx   ; edx = pOpenContext
    129.                 mov     eax,[ecx]
    130.                 test    eax,eax
    131.                 jz      success
    132.                 cmp     eax,STATUS_PENDING
    133.                 jz      success
    134.                 jmp     @f
    135.         success:
    136.                 and     dword ptr[ecx],STATUS_SUCCESS     ; this status will be returned by DispatchIo routine
    137.                 jmp     @f
    138.  
    139.                         err_no_adapter:
    140.                                        mov      eax,pStatus
    141.                                        mov      ecx,STATUS_UNSUCCESSFUL     ; see previous comment
    142.                                        mov      dword ptr[eax],ecx
    143.                                    @@:
    144.                                        ret
    145.  
    146.  
    147.  
    148. SetPromiscuousMode      endp
    149. ;-------------------------------------------------------
    подскажите пожалста что не так...
     
  6. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    можно ли как-нибудь перевести адаптер, не поддерживающий OID_GEN_CURRENT_PAcKET_FILTER , в прослушивающий режим?
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    goga2007
    Хм, а че там за адаптер такой? Что он не поддерживает прослушивающий режим (0_o)
     
  8. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Promiscuous mode вроде как определяется OID'ом OID_GEN_PROMISCUOUS_MODE
     
  9. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    Windows Driver Kit: Network Devices and Protocols
    OID_GEN_PROMISCUOUS_MODE

    As a query, NDIS and overlying drivers use the OID_GEN_PROMISCUOUS_MODE OID to determine whether a network interface is promiscuous or not (ifPromiscuousMode from RFC 2863).
    Version Information
    Windows Vista
    Supported.
    NDIS 6.0 drivers
    Supported.


    Comments

    NDIS handles this OID for miniport adapters and filter modules, and only NDIS interface providers receive this OID query.

    If the interface provider returns NDIS_STATUS_SUCCESS and if the interface accepts only packets that are addressed to that interface, the result value should be FALSE. This value should be TRUE if the interface accepts all network packets


    ...да, если нам нужно узнать в promiscuous ли наш адаптер. те это только c NdisRequestQueryInformation в поле RequestType.
    а мне надо УСТАНОВИТЬ этот ружим. в ддк написано что он устанавливается OID'om OID_GEN_CURRENT_PACKET_FILTER, и в поле NDIS_REQUEST.SET_INFORMATION.InformationBuffer должен лежать указатель на буфер размером 4 байта , в котором лежит NDIS_PACKET_TYPE_PROMISCUOUS...
    но как я писал выше, минипорт возвращает в RequestComplete в параметре статуса NDIS_STATUS_NOT_SUPPORTED...
    мож есть еще какиенть способы установки promiscuous mode???