Привет Всем! Может кто сталкивался с подобной проблемой и подскажет почему не вызывается функция NdisProtocolBindAdapter. Вот исходник DriverEntry: Код (Text): #define NDIS_DEVICE_NAME L"\\DEVICE\\NETWORKANALIZER" #define NDIS_SYM_LINK_NAME L"\\DosDevices\\NetworkAnalizer" typedef struct _NDIS_EXTENSION { PDEVICE_OBJECT pDeviceObject; UNICODE_STRING ustrSymLinkName; NDIS_HANDLE NdisProtocolHandle; } NDIS_EXTENSION, *PNDIS_EXTENSION; extern NDIS_EXTENSION GlobalNdisExtension; typedef struct _OPEN_INSTANCE { NDIS_HANDLE AdapterHandle; NDIS_HANDLE PacketPool; KSPIN_LOCK ReciveSpinLock; LIST_ENTRY ReciveList; } OPEN_INSTANCE, *POPEN_INSTANCE; KSPIN_LOCK GlobalSpinLock; NDIS_EXTENSION GlobalNdisExtension={0}; #pragma code_seg("INIT") extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NDIS_PROTOCOL_CHARACTERISTICS ProtocolChar; NDIS_STATUS Status=STATUS_SUCCESS; PDEVICE_OBJECT pDeviceObject; UNICODE_STRING devName; UNICODE_STRING ustrSymLinkName; NDIS_STRING DeviceName=NDIS_STRING_CONST("NETWORKANALIZER"); #if DBG DbgPrint("-Sniffer- In DriverEntry"); DbgPrint("-Sniffer- RegistryPath= %ws.\n", RegistryPath->Buffer); #endif NdisZeroMemory(&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); ProtocolChar.Ndis40Chars.Ndis30Chars.MajorNdisVersion = 5; ProtocolChar.Ndis40Chars.Ndis30Chars.MinorNdisVersion = 0; ProtocolChar.Ndis40Chars.Ndis30Chars.Name = DeviceName; ProtocolChar.Ndis40Chars.BindAdapterHandler = NdisProtocolBindAdapter; ProtocolChar.Ndis40Chars.UnbindAdapterHandler = NdisProtocolUnbindAdapter; ProtocolChar.Ndis40Chars.Ndis30Chars.OpenAdapterCompleteHandler = NdisProtocolOpenAdapterComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.CloseAdapterCompleteHandler = NdisProtocolCloseAdapterComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.SendCompleteHandler = NdisProtocolSendComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.TransferDataCompleteHandler = NdisProtocolTransferDataComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.ResetCompleteHandler = NdisProtocolResetComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.RequestCompleteHandler = NdisProtocolRequestComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.ReceiveHandler = NdisProtocolReceive; ProtocolChar.Ndis40Chars.Ndis30Chars.ReceiveCompleteHandler = NdisProtocolReceiveComplete; ProtocolChar.Ndis40Chars.Ndis30Chars.StatusHandler = NdisProtocolStatus; ProtocolChar.Ndis40Chars.Ndis30Chars.StatusCompleteHandler = NdisProtocolStatusComplete; ProtocolChar.Ndis40Chars.ReceivePacketHandler = NdisProtocolReceivePacket; ProtocolChar.Ndis40Chars.UnloadHandler = NULL; NdisRegisterProtocol(&Status, &GlobalNdisExtension.NdisProtocolHandle,&ProtocolChar, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); if (Status!=NDIS_STATUS_SUCCESS) { #if DBG DbgPrint("-Sniffer- Protocol is not registered."); #endif return Status; } else #if DBG DbgPrint("-Sniffer- Protocol registered.\n"); #endif DriverObject->DriverUnload=NdisSnifferUnload; DriverObject->MajorFunction[IRP_MJ_CREATE]=NdisSnifferCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE]=NdisSnifferClose; RtlInitUnicodeString(&devName, NDIS_DEVICE_NAME); Status=IoCreateDevice(DriverObject, sizeof(NDIS_EXTENSION), &devName,FILE_DEVICE_NETWORK, FILE_DEVICE_SECURE_OPEN , FALSE, &pDeviceObject); if(!NT_SUCCESS(Status)) { #if DBG DbgPrint("-Sniffer- Error create Device.\n"); #endif return Status; } pDeviceObject->Flags|=DO_DIRECT_IO; GlobalNdisExtension.pDeviceObject=pDeviceObject; RtlInitUnicodeString(&ustrSymLinkName, NDIS_SYM_LINK_NAME); Status=IoCreateSymbolicLink(&ustrSymLinkName, &devName); if(!NT_SUCCESS(Status)) { IoDeleteDevice(pDeviceObject); #if DBG DbgPrint("-Sniffer- Error create symbolic link.\n"); #endif return Status; } GlobalNdisExtension.ustrSymLinkName=ustrSymLinkName; #if DBG DbgPrint("-Sniffer- DriverObject %X, Ext=%X.\n", DriverObject, &GlobalNdisExtension); #endif KeInitializeSpinLock(&GlobalSpinLock); #if DBG DbgPrint("-Sniffer- DriverEntry successfully complited.\n"); #endif return Status; } #pragma code_seg()
У меня была проблема с тем что невызывался БиндАдаптер.. Но у меня просто Имя протокола (ProtocolChar.Name) было не равно имени службы (устройства) .. вот и не вызывался бинд . У тебя же вроде эти имена равны. Но есть ошибка ПРОКОЛ без устройства незабиндиться никода ! Вначале создавай устройство а потом регистрируй протокол. Возможно в этом твоя ошибка.
Вроде бы нашел причину: ProtocolChar.Name должен быть ndisuio. Правда никаких логических объяснений этому факту я не нашел.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E3 25-11CE-BFC1-08002bE10318}\0003\Linkage\UpperBind - Нужно вписать имя протокола(ProtocolChar.Name). Тогда будет вызываться ProtocolBindAdapter.
А как ты устанавливаешь драйвер? Через SCM или с помощью .inf файла? Если через SCM, то наверное в этом вся проблема. Ведь все примеры из DDK устанавливаются с помощью .inf файла. А ndisuio - такой драйвер уже установлен в системе, раньше он входил в состав DDK в качестве примера, но потом мелкософт его стал использовать для своих целей, этот драйвер стал частью винды. Это обычный NDIS protocol driver, расшифровывается как NDIS User-mode I/O, к нему прилагаются DLL уровня пользователя, которые общаются с драйвером через функцию DeviceIoControl. Драйвер и соответствующие DLL были созданы для упрощенного доступа к NDIS из уровня пользователя. Поэтому не советую давать твоему драйверу такое же имя.