Articles of ndis

什么是Linux中的NDISfilter的模拟?

我正在linux上as close to real-time系统,只要收到一个特定的数据包就需要在TCP数据包中发送大约600-800字节的数据。 为了获得最好的延迟,我希望这个数据包直接从内核发送,而不是直接从用户空间和应用程序接收数据包,然后再返回。 如果我在窗户上,我会写一个NDISfilter,我将caching要发送的数据包和匹配的参数,以便检查接收到的数据包,并在匹配的情况下将预caching的数据包发送到networking上,而不经过接收到的数据包直到更高层。 所以我的问题是什么是在Linux上的NDISfilter最接近的模拟器? 我已经阅读了关于netfilter,也许这是我会用,但我不知道这是否是最好的方式。 我还能做些什么来实现尽可能低的延迟? 我目前纯粹的用户空间代码在2.6.3x内核上运行Ubuntu 10.04的英特尔至强3.7 GHz处理器上给我提供了大约80-100微秒的时间。

以编程方式安装NDIS筛选驱动程序

我正在尝试编写以编程方式安装NDIS 6.0轻量级筛选器驱动程序的C ++代码。 在审查了WinDDK,在线示例和MSDN文档后,我最终得到了下面的代码示例。 (为了清楚起见,error handling被跳过)问题是INetCfgClassSetup :: Install总是返回错误0x8004a024。 (我找不到头文件中的错误代码。) 使用相同的.inf文件手动安装驱动程序就可以。 WinDDK的Bindview示例安装驱动程序就好,只要它调用INetCfgClassSetup :: SelectAndInstall的path即可。 使用INetCfgClassSetup :: Install的替代path不起作用。 内核debugging在我的机器上启用,所以不需要驱动程序签名。 下面的代码有什么问题吗? 谢谢。 …. isCopied = SetupCopyOEMInfA(pathToInf, // path to inf file pathToBin, // dir containing driver binary SPOST_PATH, 0, DestinationInfFileName, 256, NULL, NULL); …. INetCfg *pnc = NULL; INetCfgClassSetup *pncClassSetup = NULL; HRESULT hr; OBO_TOKEN OboToken; …. hr […]

为什么NdisFRegisterFilterDriver在Windows 8下使用NDIS_STATUS_FAILURE失败?

大家。 我正在开发一个NDIS 6filter驱动程序(LWF)。 DriverEntry例程中的NdisFRegisterFilterDriver调用由于NDIS_STATUS_FAILURE失败。 这只发生在Win8 x86上,驱动程序通常可以在Win7 x86下运行。 真奇怪 我已经看到这个线程,但没有用: 为什么NdisFRegisterFilterDriver返回NDIS_STATUS_FAILURE? 这是我的DriverEntry例程和inf文件。 _Use_decl_annotations_ NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NDIS_FILTER_DRIVER_CHARACTERISTICS FChars; NTSTATUS Status = STATUS_SUCCESS; // NDIS_STRING FriendlyName = NDIS_STRING_CONST("WinPcap NDIS LightWeight Filter"); // NDIS_STRING UniqueName = NDIS_STRING_CONST("{5cbf81bd-5055-47cd-9055-a76b2b4e2637}"); //unique name, quid name // NDIS_STRING ServiceName = NDIS_STRING_CONST("npf6x"); //this to match the service […]

FilterSendNetBufferLists是否必须为NDISfilter使用NdisFSendNetBufferLists?

大家好,我将WinPcap从NDIS6协议移植到NDIS6filter。 这几乎已经完成了,但是我仍然有一些问题: ndislwf的评论说:“一个不提供FilerSendNetBufferList处理程序的filter不能自行发起一个发送。 这是否意味着如果我使用NdisFSendNetBufferLists函数,我必须提供FilerSendNetBufferList处理程序? 我的驱动程序将发送由NdisFSendNetBufferLists自行构build的数据包,但我不想过滤其他程序的发送数据包。 与FilterReturnNetBufferLists相同,它表示“不提供FilterReturnNetBufferLists处理程序的filter不能自行发起接收指示。” “产生接收指示”是什么意思? NdisFIndicateReceiveNetBufferLists或NdisFReturnNetBufferLists或两者? 另外,对于我的驱动程序,我只想捕获收到的数据包,而不是返回的数据包。 所以如果可能的话,我不希望提供FilterReturnNetBufferLists函数用于性能目的。 另一个重新组合的例子是FilterOidRequestComplete和NdisFOidRequest,事实上,我的filter驱动程序只想通过NdisFOidRequest自己发送Oid请求,而不是过滤其他人发送的Oid请求。 我可以将FilterOidRequest,FilterCancelOidRequest和FilterOidRequestComplete保留为NULL吗? 或者哪一个是必须使用NdisFOidRequest? 谢谢。

如何确定NDIS 6filter驱动程序中的802.11原始数据包是否具有FCS(4字节)?

我有一个NDIS 6filter驱动程序在Windows Vista和更高版本的系统上工作。 我把它绑定在NativeWiFi Filter下面,所以我可以看到802.11 packets而不是fake Ethernet packets 。 我已经在数据包filter中设置了NDIS_PACKET_TYPE_802_11_RAW_DATA和NDIS_PACKET_TYPE_802_11_RAW_MGMT : https : NDIS_PACKET_TYPE_802_11_RAW_DATA ( NDIS_PACKET_TYPE_802_11_RAW_MGMT ,所以我可以接收来自微型端口的Raw 802.11 Packets指示。 然后,我将无线适配器切换到Monitor Mode 。 现在我的filter驱动程序可以接收所有的802.11 control and management数据包。 我的问题是如何确定一个802.11原始数据包是否在我的驱动程序中有FCS(帧检查序列,4字节) ? 我这样问,因为我将Radiotap header ( http://radiotap.org/ )添加到数据包,radiotap有一个Flags字段,指定802.11数据包是否有FCS。 我的带有无线适配器Qualcomm Atheros AR9485WB-EG Wireless Network Adapter笔记本电脑的实验显示Beacon和Reassociation Response数据包含有FCS,而其他所有802.11数据包都没有。 而radiotap头文件中的错误Flags将导致Wireshark显示这些数据包的格式错误的数据包。 这就是为什么我需要确定我的驱动程序中FCS的可用性。 我的代码就像下面,我想知道如何写if条件。 // [Radiotap] "Flags" field. if (TRUE) // The packet doesn't have FCS. […]

NDISfilter驱动程序“FilterReceiveNetBufferLists处理程序不被调用

我正在开发一个NDISfilter驱动程序,并且在某些情况下(例如打开Wireshark或单击它的“Interface List”button),我从不调用FilterReceiveNetBufferLists (networking被阻止)。 但是当我开始捕获, FilterReceiveNetBufferLists变得正常(networking恢复),这是如此奇怪。 我发现,当我在WinPcap驱动程序的OID原始位置(NPF_IoControl的BIOCQUERYOID&BIOCSETOID开关分支)的NdisFOidRequest函数中手动返回NDIS_STATUS_FAILURE时,驱动程序不会阻塞networking(winpcap无法工作)。 NdisFOidRequest调用有问题吗? Packet.c中产生OID请求的DeviceIO例程: case BIOCQUERYOID: case BIOCSETOID: TRACE_MESSAGE(PACKET_DEBUG_LOUD, "BIOCSETOID – BIOCQUERYOID"); // // gain ownership of the Ndis Handle // if (NPF_StartUsingBinding(Open) == FALSE) { // // MAC unbindind or unbound // SET_FAILURE_INVALID_REQUEST(); break; } // Extract a request from the list of free ones RequestListEntry = ExInterlockedRemoveHeadList(&Open->RequestList, &Open->RequestSpinLock); if […]