Пытаюсь создать протокол Код (Text): NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { UNICODE_STRING DeviceName,Win32Device; PDEVICE_OBJECT DeviceObject = NULL; NTSTATUS status; NDIS_PROTOCOL_DRIVER_CHARACTERISTICS protocolChar; NDIS_STRING protoName = NDIS_STRING_CONST("MyOwnProtokol"); NDIS_STATUS NdisStatus; DbgPrint("TestDriver: Loading...\n"); NdisZeroMemory(&protocolChar,sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS)); protocolChar.Header.Type = NDIS_OBJECT_TYPE_PROTOCOL_DRIVER_CHARACTERISTICS, protocolChar.Header.Size = sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS); protocolChar.Header.Revision = NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1; protocolChar.MajorNdisVersion = 0x06; protocolChar.MinorNdisVersion = 0x00; protocolChar.Name = protoName; protocolChar.SetOptionsHandler = MyProtocolSetOptions; protocolChar.OpenAdapterCompleteHandlerEx = MyNdisprotOpenAdapterComplete; protocolChar.CloseAdapterCompleteHandlerEx = MyNdisprotCloseAdapterComplete; protocolChar.SendNetBufferListsCompleteHandler = MyNdisprotSendComplete; protocolChar.OidRequestCompleteHandler = MyNdisprotRequestComplete; protocolChar.StatusHandlerEx = NULL; protocolChar.UninstallHandler = NULL; protocolChar.ReceiveNetBufferListsHandler = MyNdisprotReceiveNetBufferLists; protocolChar.NetPnPEventHandler = NULL; protocolChar.BindAdapterHandlerEx = MyNdisprotBindAdapter; protocolChar.UnbindAdapterHandlerEx = MyNdisprotUnbindAdapter; __try { NdisStatus = NdisRegisterProtocolDriver(NULL,&protocolChar,&ourProtocolHandle); if(NdisStatus!=NDIS_STATUS_SUCCESS) { DbgPrint("TestDriver: NdisRegisterProtocolDriver Uncomplete 0x%x\n",NdisStatus); return STATUS_SUCCESS; } } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("TestDriver: Exception raised in NdisRegisterProtocolDriver...\n"); } DbgPrint("TestDriver: NdisRegisterProtocolDriver Complete 0x%x\n",NdisStatus); RtlInitUnicodeString(&DeviceName,L"\\Device\\DriverTest"); RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\DriverTest"); for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) DriverObject->MajorFunction[i] = DriverTestDefaultHandler; DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverTestCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverTestCreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlHandler; DriverObject->DriverUnload = DriverTestUnload; status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject); if (!NT_SUCCESS(status)) return status; if (!DeviceObject) return STATUS_UNEXPECTED_IO_ERROR; DeviceObject->Flags |= DO_DIRECT_IO; DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT; status = IoCreateSymbolicLink(&Win32Device, &DeviceName); DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; } где все функции протокола пустышки Код (Text): VOID MyNdisprotOpenAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status ) { DbgPrint("NdisprotOpenAdapterComplete\n"); } VOID MyNdisprotSendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_BUFFER_LIST pNetBufferList, IN ULONG SendCompleteFlags ) { DbgPrint("NdisprotSendComplete\n"); } VOID MyNdisprotCloseAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext ) { DbgPrint("NdisprotCloseAdapterComplete\n"); } VOID MyNdisprotRequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_OID_REQUEST pNdisRequest, IN NDIS_STATUS Status ) { DbgPrint("NdisprotRequestComplete\n"); } VOID MyNdisprotReceiveNetBufferLists( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_BUFFER_LIST pNetBufferLists, IN NDIS_PORT_NUMBER PortNumber, IN ULONG NumberOfNetBufferLists, IN ULONG ReceiveFlags ) { DbgPrint("NdisprotReceiveNetBufferLists\n"); } NDIS_STATUS MyNdisprotBindAdapter( IN NDIS_HANDLE ProtocolDriverContext, IN NDIS_HANDLE BindContext, IN PNDIS_BIND_PARAMETERS BindParameters ) { DbgPrint("MyNdisprotBindAdapter\n"); return NDIS_STATUS_SUCCESS; } NDIS_STATUS MyNdisprotUnbindAdapter( IN NDIS_HANDLE UnbindContext, IN NDIS_HANDLE ProtocolBindingContext ) { DbgPrint("NdisprotUnbindAdapter\n"); return NDIS_STATUS_SUCCESS; } NDIS_STATUS MyProtocolSetOptions( IN NDIS_HANDLE NdisDriverHandle, IN NDIS_HANDLE DriverContext ) { DbgPrint("ProtocolSetOptions\n"); return NDIS_STATUS_SUCCESS; } но упираюсь в ошибку 0хс0010005, что значит неправильно заданы характеристики протокола, но в чем я ошибаюсь?? Пишу под Vista SP1
1) Попробуйте вначале создать девайс с символиклинком, а потом уже регистрировать протокол. 2) protocolChar.Name = protoName; И вообще име протокола лучше не делать большим. Сделайте для теста в 3 символа. Попробуйте проинициализировать юникод строку на подобие: 3) Вставьте обработчик PnPEventHandler (вроде у вас NULL там) 4) RequestCompleteHandler - не вижу тоже 5) В некоторых обработчиках (таких как OpenAdapterCompleteHandler (и других Complete) надо указывать NdisSetEvent надо передавать BindEvent из NDIS_OPEN_CONTEXT (это ProtocolBindingContext) Ну пока больше мыслей нету. В общем в таких вещах такие болванки писать некорректно - нужно некоторые процедуры полностью обрабатывать в соответствии с документацией\другими сорцами) Может, кто еще что подскажет.
Вопрос решился TermoSINteZ прав, пункт три, нельзя ставить на обработчик нул, хотя в ДДк написано что можно