Создание простейшего NDIS протокола

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 30 авг 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Пытаюсь создать протокол
    Код (Text):
    1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
    2. {
    3.     UNICODE_STRING DeviceName,Win32Device;
    4.     PDEVICE_OBJECT DeviceObject = NULL;
    5.     NTSTATUS status;
    6.        
    7.     NDIS_PROTOCOL_DRIVER_CHARACTERISTICS    protocolChar;
    8.     NDIS_STRING protoName = NDIS_STRING_CONST("MyOwnProtokol");
    9.     NDIS_STATUS NdisStatus;
    10.    
    11.     DbgPrint("TestDriver: Loading...\n");
    12.  
    13.     NdisZeroMemory(&protocolChar,sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS));
    14.  
    15.     protocolChar.Header.Type                = NDIS_OBJECT_TYPE_PROTOCOL_DRIVER_CHARACTERISTICS,
    16.     protocolChar.Header.Size                = sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS);
    17.     protocolChar.Header.Revision            = NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1;
    18.  
    19.     protocolChar.MajorNdisVersion            = 0x06;
    20.     protocolChar.MinorNdisVersion            = 0x00;
    21.     protocolChar.Name                        = protoName;
    22.     protocolChar.SetOptionsHandler           = MyProtocolSetOptions;
    23.     protocolChar.OpenAdapterCompleteHandlerEx  = MyNdisprotOpenAdapterComplete;
    24.     protocolChar.CloseAdapterCompleteHandlerEx = MyNdisprotCloseAdapterComplete;
    25.     protocolChar.SendNetBufferListsCompleteHandler = MyNdisprotSendComplete;
    26.     protocolChar.OidRequestCompleteHandler   = MyNdisprotRequestComplete;
    27.     protocolChar.StatusHandlerEx             = NULL;
    28.     protocolChar.UninstallHandler            = NULL;
    29.     protocolChar.ReceiveNetBufferListsHandler = MyNdisprotReceiveNetBufferLists;
    30.     protocolChar.NetPnPEventHandler          = NULL;
    31.     protocolChar.BindAdapterHandlerEx        = MyNdisprotBindAdapter;
    32.     protocolChar.UnbindAdapterHandlerEx      = MyNdisprotUnbindAdapter;
    33.  
    34.     __try
    35.     {
    36.         NdisStatus = NdisRegisterProtocolDriver(NULL,&protocolChar,&ourProtocolHandle);
    37.         if(NdisStatus!=NDIS_STATUS_SUCCESS)
    38.         {
    39.             DbgPrint("TestDriver: NdisRegisterProtocolDriver Uncomplete 0x%x\n",NdisStatus);
    40.             return STATUS_SUCCESS;
    41.         }
    42.     }
    43.     __except(EXCEPTION_EXECUTE_HANDLER)
    44.     {
    45.         DbgPrint("TestDriver: Exception raised in NdisRegisterProtocolDriver...\n");
    46.     }
    47.  
    48.     DbgPrint("TestDriver: NdisRegisterProtocolDriver Complete 0x%x\n",NdisStatus);
    49.     RtlInitUnicodeString(&DeviceName,L"\\Device\\DriverTest");
    50.     RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\DriverTest");
    51.  
    52.     for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    53.         DriverObject->MajorFunction[i] = DriverTestDefaultHandler;
    54.  
    55.     DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverTestCreateClose;
    56.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverTestCreateClose;
    57.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlHandler;
    58.    
    59.     DriverObject->DriverUnload = DriverTestUnload;
    60.     status = IoCreateDevice(DriverObject,
    61.                             0,
    62.                             &DeviceName,
    63.                             FILE_DEVICE_UNKNOWN,
    64.                             0,
    65.                             FALSE,
    66.                             &DeviceObject);
    67.     if (!NT_SUCCESS(status))
    68.         return status;
    69.     if (!DeviceObject)
    70.         return STATUS_UNEXPECTED_IO_ERROR;
    71.  
    72.     DeviceObject->Flags |= DO_DIRECT_IO;
    73.     DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;
    74.     status = IoCreateSymbolicLink(&Win32Device, &DeviceName);
    75.  
    76.     DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    77.  
    78.     return STATUS_SUCCESS;
    79. }
    где все функции протокола пустышки
    Код (Text):
    1. VOID
    2.     MyNdisprotOpenAdapterComplete(
    3.     IN NDIS_HANDLE                  ProtocolBindingContext,
    4.     IN NDIS_STATUS                  Status
    5.     )
    6. {
    7.     DbgPrint("NdisprotOpenAdapterComplete\n");
    8. }
    9.  
    10. VOID
    11.     MyNdisprotSendComplete(
    12.     IN NDIS_HANDLE                  ProtocolBindingContext,
    13.     IN PNET_BUFFER_LIST             pNetBufferList,
    14.     IN ULONG                        SendCompleteFlags
    15.     )
    16. {
    17.     DbgPrint("NdisprotSendComplete\n");
    18. }
    19.  
    20. VOID
    21.     MyNdisprotCloseAdapterComplete(
    22.     IN NDIS_HANDLE                  ProtocolBindingContext
    23.     )
    24. {
    25.     DbgPrint("NdisprotCloseAdapterComplete\n");
    26. }
    27. VOID
    28.     MyNdisprotRequestComplete(
    29.     IN NDIS_HANDLE                  ProtocolBindingContext,
    30.     IN PNDIS_OID_REQUEST            pNdisRequest,
    31.     IN NDIS_STATUS                  Status
    32.     )
    33. {
    34.     DbgPrint("NdisprotRequestComplete\n");
    35. }
    36. VOID
    37.     MyNdisprotReceiveNetBufferLists(
    38.     IN NDIS_HANDLE                  ProtocolBindingContext,
    39.     IN PNET_BUFFER_LIST             pNetBufferLists,
    40.     IN NDIS_PORT_NUMBER             PortNumber,
    41.     IN ULONG                        NumberOfNetBufferLists,
    42.     IN ULONG                        ReceiveFlags
    43.     )
    44. {
    45.     DbgPrint("NdisprotReceiveNetBufferLists\n");
    46. }
    47. NDIS_STATUS
    48.     MyNdisprotBindAdapter(
    49.     IN NDIS_HANDLE                  ProtocolDriverContext,
    50.     IN NDIS_HANDLE                  BindContext,
    51.     IN PNDIS_BIND_PARAMETERS        BindParameters
    52.     )
    53. {
    54.     DbgPrint("MyNdisprotBindAdapter\n");
    55.     return NDIS_STATUS_SUCCESS;
    56. }
    57. NDIS_STATUS
    58.     MyNdisprotUnbindAdapter(
    59.     IN NDIS_HANDLE                  UnbindContext,
    60.     IN NDIS_HANDLE                  ProtocolBindingContext
    61.     )
    62. {
    63.     DbgPrint("NdisprotUnbindAdapter\n");
    64.     return NDIS_STATUS_SUCCESS;
    65. }
    66.  
    67. NDIS_STATUS
    68.     MyProtocolSetOptions(
    69.     IN NDIS_HANDLE  NdisDriverHandle,
    70.     IN NDIS_HANDLE  DriverContext
    71.     )
    72. {
    73.     DbgPrint("ProtocolSetOptions\n");
    74.     return NDIS_STATUS_SUCCESS;
    75. }
    но упираюсь в ошибку 0хс0010005, что значит неправильно заданы характеристики протокола, но в чем я ошибаюсь?? Пишу под Vista SP1
     
  2. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    1) Попробуйте вначале создать девайс с символиклинком, а потом уже регистрировать протокол.
    2) protocolChar.Name = protoName; И вообще име протокола лучше не делать большим. Сделайте для теста в 3 символа.
    Попробуйте проинициализировать юникод строку на подобие:
    3) Вставьте обработчик PnPEventHandler (вроде у вас NULL там)
    4) RequestCompleteHandler - не вижу тоже
    5) В некоторых обработчиках (таких как OpenAdapterCompleteHandler (и других Complete) надо указывать NdisSetEvent надо передавать BindEvent из NDIS_OPEN_CONTEXT (это ProtocolBindingContext)

    Ну пока больше мыслей нету. В общем в таких вещах такие болванки писать некорректно - нужно некоторые процедуры полностью обрабатывать в соответствии с документацией\другими сорцами)
    Может, кто еще что подскажет.
     
  3. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    а какая версия ндиса используется ?
     
  4. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    может ты хедер от ндис4 юзаеш а виста тебя шлёт ..
     
  5. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Вопрос решился
    TermoSINteZ прав, пункт три, нельзя ставить на обработчик нул, хотя в ДДк написано что можно