Почему не вызывается NdisProtocolBindAdapter?

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

  1. saggitarius

    saggitarius New Member

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

    Может кто сталкивался с подобной проблемой и подскажет почему не вызывается функция NdisProtocolBindAdapter.

    Вот исходник DriverEntry:

    Код (Text):
    1. #define NDIS_DEVICE_NAME L"\\DEVICE\\NETWORKANALIZER"
    2.  
    3. #define NDIS_SYM_LINK_NAME L"\\DosDevices\\NetworkAnalizer"
    4.  
    5.  
    6.  
    7. typedef struct _NDIS_EXTENSION
    8.  
    9. {
    10.  
    11.     PDEVICE_OBJECT pDeviceObject;
    12.  
    13.     UNICODE_STRING ustrSymLinkName;
    14.  
    15.  
    16.  
    17.     NDIS_HANDLE NdisProtocolHandle;
    18.  
    19. } NDIS_EXTENSION, *PNDIS_EXTENSION;
    20.  
    21.  
    22.  
    23. extern NDIS_EXTENSION GlobalNdisExtension;
    24.  
    25.  
    26.  
    27. typedef struct _OPEN_INSTANCE
    28.  
    29. {
    30.  
    31.     NDIS_HANDLE AdapterHandle;
    32.  
    33.     NDIS_HANDLE PacketPool;
    34.  
    35.  
    36.  
    37.     KSPIN_LOCK  ReciveSpinLock;
    38.  
    39.     LIST_ENTRY  ReciveList;
    40.  
    41. } OPEN_INSTANCE, *POPEN_INSTANCE;
    42.  
    43.  
    44.  
    45. KSPIN_LOCK GlobalSpinLock;
    46.  
    47.  
    48.  
    49. NDIS_EXTENSION GlobalNdisExtension={0};
    50.  
    51.  
    52.  
    53. #pragma code_seg("INIT")
    54.  
    55. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject,IN PUNICODE_STRING  RegistryPath)
    56.  
    57. {
    58.  
    59.     NDIS_PROTOCOL_CHARACTERISTICS ProtocolChar;
    60.  
    61.     NDIS_STATUS Status=STATUS_SUCCESS;
    62.  
    63.     PDEVICE_OBJECT pDeviceObject;
    64.  
    65.     UNICODE_STRING devName;
    66.  
    67.     UNICODE_STRING ustrSymLinkName;
    68.  
    69.     NDIS_STRING DeviceName=NDIS_STRING_CONST("NETWORKANALIZER");
    70.  
    71.  
    72.  
    73. #if DBG
    74.  
    75.     DbgPrint("-Sniffer- In DriverEntry");
    76.  
    77.     DbgPrint("-Sniffer- RegistryPath= %ws.\n", RegistryPath->Buffer);
    78.  
    79. #endif
    80.  
    81.  
    82.  
    83.     NdisZeroMemory(&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
    84.  
    85.  
    86.  
    87.     ProtocolChar.Ndis40Chars.Ndis30Chars.MajorNdisVersion             = 5;
    88.  
    89.     ProtocolChar.Ndis40Chars.Ndis30Chars.MinorNdisVersion             = 0;
    90.  
    91.     ProtocolChar.Ndis40Chars.Ndis30Chars.Name                         = DeviceName;
    92.  
    93.     ProtocolChar.Ndis40Chars.BindAdapterHandler                       = NdisProtocolBindAdapter;
    94.  
    95.     ProtocolChar.Ndis40Chars.UnbindAdapterHandler                     = NdisProtocolUnbindAdapter;
    96.  
    97.     ProtocolChar.Ndis40Chars.Ndis30Chars.OpenAdapterCompleteHandler   = NdisProtocolOpenAdapterComplete;
    98.  
    99.     ProtocolChar.Ndis40Chars.Ndis30Chars.CloseAdapterCompleteHandler  = NdisProtocolCloseAdapterComplete;
    100.  
    101.     ProtocolChar.Ndis40Chars.Ndis30Chars.SendCompleteHandler          = NdisProtocolSendComplete;
    102.  
    103.     ProtocolChar.Ndis40Chars.Ndis30Chars.TransferDataCompleteHandler  = NdisProtocolTransferDataComplete;
    104.  
    105.     ProtocolChar.Ndis40Chars.Ndis30Chars.ResetCompleteHandler         = NdisProtocolResetComplete;
    106.  
    107.     ProtocolChar.Ndis40Chars.Ndis30Chars.RequestCompleteHandler       = NdisProtocolRequestComplete;
    108.  
    109.     ProtocolChar.Ndis40Chars.Ndis30Chars.ReceiveHandler               = NdisProtocolReceive;
    110.  
    111.     ProtocolChar.Ndis40Chars.Ndis30Chars.ReceiveCompleteHandler       = NdisProtocolReceiveComplete;
    112.  
    113.     ProtocolChar.Ndis40Chars.Ndis30Chars.StatusHandler                = NdisProtocolStatus;
    114.  
    115.     ProtocolChar.Ndis40Chars.Ndis30Chars.StatusCompleteHandler        = NdisProtocolStatusComplete;
    116.  
    117.     ProtocolChar.Ndis40Chars.ReceivePacketHandler                     = NdisProtocolReceivePacket;
    118.  
    119.     ProtocolChar.Ndis40Chars.UnloadHandler                            = NULL;
    120.  
    121.    
    122.  
    123.     NdisRegisterProtocol(&Status, &GlobalNdisExtension.NdisProtocolHandle,&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
    124.  
    125.  
    126.  
    127.     if (Status!=NDIS_STATUS_SUCCESS)
    128.  
    129.     {
    130.  
    131. #if DBG
    132.  
    133.         DbgPrint("-Sniffer- Protocol is not registered.");
    134.  
    135. #endif
    136.  
    137.         return Status;
    138.  
    139.     }
    140.  
    141.     else
    142.  
    143. #if DBG
    144.  
    145.         DbgPrint("-Sniffer- Protocol registered.\n");
    146.  
    147. #endif
    148.  
    149.  
    150.  
    151.     DriverObject->DriverUnload=NdisSnifferUnload;
    152.  
    153.     DriverObject->MajorFunction[IRP_MJ_CREATE]=NdisSnifferCreate;
    154.  
    155.     DriverObject->MajorFunction[IRP_MJ_CLOSE]=NdisSnifferClose;
    156.  
    157.  
    158.  
    159.     RtlInitUnicodeString(&devName, NDIS_DEVICE_NAME);
    160.  
    161.  
    162.  
    163.     Status=IoCreateDevice(DriverObject, sizeof(NDIS_EXTENSION), &devName,FILE_DEVICE_NETWORK, FILE_DEVICE_SECURE_OPEN , FALSE,
    164.  
    165.                           &pDeviceObject);
    166.  
    167.  
    168.  
    169.     if(!NT_SUCCESS(Status))
    170.  
    171.     {
    172.  
    173.         #if DBG
    174.  
    175.             DbgPrint("-Sniffer- Error create Device.\n");
    176.  
    177.         #endif
    178.  
    179.         return Status;
    180.  
    181.     }
    182.  
    183.  
    184.  
    185.     pDeviceObject->Flags|=DO_DIRECT_IO;
    186.  
    187.     GlobalNdisExtension.pDeviceObject=pDeviceObject;
    188.  
    189.  
    190.  
    191.     RtlInitUnicodeString(&ustrSymLinkName, NDIS_SYM_LINK_NAME);
    192.  
    193.    
    194.  
    195.     Status=IoCreateSymbolicLink(&ustrSymLinkName, &devName);
    196.  
    197.  
    198.  
    199.     if(!NT_SUCCESS(Status))
    200.  
    201.     {
    202.  
    203.         IoDeleteDevice(pDeviceObject);
    204.  
    205.         #if DBG
    206.  
    207.             DbgPrint("-Sniffer- Error create symbolic link.\n");
    208.  
    209.         #endif
    210.  
    211.         return Status;
    212.  
    213.     }
    214.  
    215.     GlobalNdisExtension.ustrSymLinkName=ustrSymLinkName;
    216.  
    217.  
    218.  
    219. #if DBG
    220.  
    221.     DbgPrint("-Sniffer- DriverObject %X, Ext=%X.\n", DriverObject, &GlobalNdisExtension);
    222.  
    223. #endif
    224.  
    225.  
    226.  
    227.     KeInitializeSpinLock(&GlobalSpinLock);
    228.  
    229.  
    230.  
    231. #if DBG
    232.  
    233.     DbgPrint("-Sniffer- DriverEntry successfully complited.\n");
    234.  
    235. #endif
    236.  
    237.  
    238.  
    239.     return Status;
    240.  
    241. }
    242.  
    243. #pragma code_seg()
     
  2. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    У меня была проблема с тем что невызывался БиндАдаптер.. Но у меня просто Имя протокола (ProtocolChar.Name) было не равно имени службы (устройства) .. вот и не вызывался бинд .

    У тебя же вроде эти имена равны.

    Но есть ошибка ПРОКОЛ без устройства незабиндиться никода ! Вначале создавай устройство а потом регистрируй протокол. Возможно в этом твоя ошибка.
     
  3. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    Вроде бы нашел причину: ProtocolChar.Name должен быть ndisuio. Правда никаких логических объяснений этому факту я не нашел.
     
  4. saggitarius

    saggitarius New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2005
    Сообщения:
    7
    Адрес:
    Ukraine
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E3 25-11CE-BFC1-08002bE10318}\0003\Linkage\UpperBind - Нужно вписать имя протокола(ProtocolChar.Name). Тогда будет вызываться ProtocolBindAdapter.
     
  5. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    А как ты устанавливаешь драйвер? Через SCM или с помощью .inf файла? Если через SCM, то наверное в этом вся проблема. Ведь все примеры из DDK устанавливаются с помощью .inf файла. А ndisuio - такой драйвер уже установлен в системе, раньше он входил в состав DDK в качестве примера, но потом мелкософт его стал использовать для своих целей, этот драйвер стал частью винды. Это обычный NDIS protocol driver, расшифровывается как NDIS User-mode I/O, к нему прилагаются DLL уровня пользователя, которые общаются с драйвером через функцию DeviceIoControl. Драйвер и соответствующие DLL были созданы для упрощенного доступа к NDIS из уровня пользователя. Поэтому не советую давать твоему драйверу такое же имя.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Да, в этом трудность, надо через .inf у меня тоже были такие же "грабли"