Попробовал написать простейший протокольный драйвер, который регистрирует протокол, создает устройство и открывает адаптер. Проблема в том, что пр вызове 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] |