Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > NDIS 6.20 - помогите разобраться в теории!


Автор: Jenaro 13.4.2012, 17:17
Здравствуйте.

Недавно начал разбираться с NDIS. У меня возник вот такой вопрос: как открыть адаптер в "чистом" NDIS 6.20? Какие функции и структуры для этого использовать?

P.S.: DDK читал, но не вычитал... Там написано, что NdisOpenAdapter поддерживается NDIS 5.1, NdisOpenAdapterEx поддерживается только NDIS 6.0, а какая функция "родная" для NDIS 6.20 - там не написано.

Автор: feodorv 13.4.2012, 21:10
Цитата(Jenaro @  13.4.2012,  18:17 Найти цитируемый пост)
NdisOpenAdapterEx поддерживается только NDIS 6.0

Почему "только"?
Цитата

Supported for NDIS 6.0 drivers in Windows Vista.

То есть для версий 5.xx - NdisOpenAdapter, а для 6.xx - NdisOpenAdapterEx. Смена поколений)))


Цитата(Jenaro @  13.4.2012,  18:17 Найти цитируемый пост)
Какие функции и структуры для этого использовать?

Вы NdisOpenAdapterEx пробовали?

Автор: Jenaro 13.4.2012, 21:38
Попробовал написать простейший протокольный драйвер, который регистрирует протокол, создает устройство и открывает адаптер. Проблема в том, что пр вызове NdisOpenAdapterEx получается BSOD и 0000007E (C0000005, ...), т.е.
acces vialetion. Вот DriverEntry. Может кто подскажет в чем дело?

Код
NDIS_STATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{
    NDIS_STATUS status;
    NDIS_STATUS OpenErrorStatus;
    NDIS_HANDLE hProtocol;
    NDIS_HANDLE hBinding;
    NDIS_PROTOCOL_DRIVER_CHARACTERISTICS ch;
    NDIS_OPEN_PARAMETERS op;
    NDIS_STRING ProtocolName;
    NDIS_STRING AdapterName;
    PDEVICE_OBJECT ProtocolDeviceObject;
    UNICODE_STRING ProtocolDeviceName;
    PSRP_DX pdx;
    
    NDIS_MEDIUM MediumArray[1] = {NdisMedium802_3};
    NET_FRAME_TYPE FrameTypeArray[2] = {NDIS_ETH_TYPE_802_1X, NDIS_ETH_TYPE_802_1Q};
    UINT SelectedMediumIndex;
    
    NdisInitUnicodeString(&ProtocolName, L"SRP");
    NdisInitUnicodeString(&ProtocolDeviceName, L"\\Device\\srp_dev");
    NdisInitUnicodeString(&AdapterName, L"\\Device\\{2619D684-898C-4A27-8D6F-8BD15D12430E}");
    
    DriverObject->DriverUnload = DriverUnload;
    
    (NTSTATUS) status = IoCreateDevice(DriverObject, sizeof(SRP_DX), &ProtocolDeviceName, FILE_DEVICE_NETWORK, 0, FALSE, &ProtocolDeviceObject);
    if(status == STATUS_SUCCESS) {
       DbgPrint("SRP : protocol device created successful.");
    } else {
       DbgPrint("SRP : protocol device creating failed. status %08X", status);
    }  
    
    ch.MajorNdisVersion = 0x06;
    ch.MinorNdisVersion = 0x02;
    ch.MajorDriverVersion = 0x01;
    ch.MinorDriverVersion = 0x00;
    ch.Flags = 0;
    ch.Name = ProtocolName;
    ch.SetOptionsHandler = ProtocolSetOptions;
    ch.BindAdapterHandlerEx = ProtocolBindAdapterEx;
    ch.UnbindAdapterHandlerEx = ProtocolUnbindAdapterEx;
    ch.OpenAdapterCompleteHandlerEx = ProtocolOpenAdapterCompleteEx;
    ch.CloseAdapterCompleteHandlerEx = ProtocolCloseAdapterCompleteEx;
    ch.NetPnPEventHandler = ProtocolNetPnPEvent;
    ch.UninstallHandler = ProtocolUninstall;
    ch.OidRequestCompleteHandler = ProtocolOidRequestComplete;
    ch.StatusHandlerEx = ProtocolStatusEx;
    ch.ReceiveNetBufferListsHandler = ProtocolReceiveNetBufferLists;
    ch.SendNetBufferListsCompleteHandler = ProtocolSendNetBufferListsComplete;
    ch.DirectOidRequestCompleteHandler = ProtocolDirectOidRequestComplete;
    
    status = NdisRegisterProtocolDriver(NULL, &ch, &hProtocol);
    
    if(status != NDIS_STATUS_SUCCESS) {
    #ifdef DBG
       DbgPrint("SRP : protocol registered successful.");
    #endif   
    } else {
    #ifdef DBG
       DbgPrint("SRP : protocol registering failed.");
    #endif 
      pdx = (PSRP_DX) DriverObject->DeviceObject->DeviceExtension;
      pdx->hProtocol = hProtocol;    
    }
    
    NdisZeroMemory(&op, sizeof(NDIS_OPEN_PARAMETERS));
    op.Header.Revision = NDIS_OPEN_PARAMETERS_REVISION_1;
    op.Header.Size = sizeof(NDIS_OPEN_PARAMETERS);
    op.Header.Type = NDIS_OBJECT_TYPE_OPEN_PARAMETERS;
    op.AdapterName = &AdapterName;
    op.MediumArray = &MediumArray[0];
    op.MediumArraySize = sizeof(MediumArray) / sizeof(NDIS_MEDIUM);
    op.SelectedMediumIndex = &SelectedMediumIndex;
    op.FrameTypeArray = &FrameTypeArray[0];
    op.FrameTypeArraySize = sizeof(FrameTypeArray) / sizeof(NET_FRAME_TYPE);
    
    status = NdisOpenAdapterEx(hProtocol, NULL, &op, NULL, &hBinding);
    if(status == NDIS_STATUS_SUCCESS || status == NDIS_STATUS_PENDING) {
       DbgPrint("NdisOpenAdapterEx success.");
    } else {
       DbgPrint("NdisOpenAdapterEx failed.");
    }
    
    return NDIS_STATUS_SUCCESS; 
}

Спасибо.



[/code]

Автор: Олег2005 14.4.2012, 22:16
Гляньте http://groups.google.com/groups/search?hl=ru&q=NdisOpenAdapter+access+violation&sa=X&oi=spell&spell=1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)