作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我了解了WinPcap如何过滤数据包here,并从GitHub(Microsoft/Windows-driver-samples)检查了ndis/filter project。我在下面提供了WinPcap页面中的主要数据,因为它们与问题有关。
我的主要问题:如果 NPF 丢弃一个数据包(数据包),这意味着将不捕获数据包还是不发送/接收数据包?
例如(如我所见):
最佳答案
if NPF drops a packet (packets) it means that packets will not be captured or that packets will not be sent/received?
void
FilterSendNetBufferLists(NET_BUFFER_LIST *nblChain, ULONG sendFlags)
{
NET_BUFFER_LIST *drop = NULL;
NET_BUFFER_LIST *keep = NULL;
NET_BUFFER_LIST *next = NULL;
NET_BUFFER_LIST *nbl = NULL;
for (nbl = nblChain; nbl != NULL; nbl = next) {
next = nbl->Next;
// If the first NB in the NBL is drop-worthy, then all NBs are
if (MyShouldDropPacket(nbl->FirstNetBuffer)) {
nbl->Next = drop;
drop = nbl;
nbl->Status = NDIS_STATUS_FAILURE; // tell the protocol
} else {
nbl->Next = keep;
keep = nbl;
}
}
// Above would reverse the order of packets; let's undo that here.
keep = ReverseNblChain(keep);
. . . do something with the NBLs you want to keep. . .;
// Send the keepers down the stack to be transmitted by the NIC.
NdisFSendNetBufferLists(context, keep, portNumber, sendFlags);
// Return the dropped packets back up to whoever tried to send them.
NdisFSendCompleteNetBufferLists(context, drop, 0);
}
在接收路径上,可以确保每个NET_BUFFER_LIST仅一个NET_BUFFER。 (NIC无法完全知道哪些数据包是同一数据流的一部分,因此还没有完成分组。)因此,这个小难题已不复存在,但有一个新的难题:您必须检查NDIS_RECEIVE_FLAGS_RESOURCES标志。不检查该标志是浪费时间追逐筛选器驱动程序中的错误的第一大原因,因此我必须对此做很多事情。
void
FilterReceiveNetBufferLists(NET_BUFFER_LIST *nblChain, ULONG count, ULONG receiveFlags)
{
NET_BUFFER_LIST *drop = NULL;
NET_BUFFER_LIST *keep = NULL;
NET_BUFFER_LIST *next = NULL;
NET_BUFFER_LIST *nbl = NULL;
for (nbl = nblChain; nbl != NULL; nbl = next) {
next = nbl->Next;
// There's only one packet in the NBL
if (MyShouldDropPacket(nbl->FirstNetBuffer)) {
nbl->Next = drop;
drop = nbl;
count -= 1; // decrement the NumberOfNetBufferLists
} else {
nbl->Next = keep;
keep = nbl;
}
}
keep = ReverseNblChain(keep);
. . . do something with the NBLs you want to keep. . .;
// Pass the keepers up the stack to be processed by protocols.
NdisFIndicateReceiveNetBufferLists(context, keep, portNumber, count, receiveFlags);
// Checking this flag is critical; never ever call
// NdisFReturnNetBufferLists if the flag is set.
if (0 == (NDIS_RECEIVE_FLAGS_RESOURCES & receiveFlags)) {
NdisFReturnNetBufferLists(context, keep, 0);
}
}
请注意,我使用了一个名为
ReverseNblChain
的辅助函数。颠倒数据包的顺序在技术上是合法的,但会降低性能。仅当数据包通常按顺序到达时,TCPIP才能达到其最佳性能。示例代码中的链表操作循环具有反转NBL列表的副作用,因此我们可以使用
ReverseNblChain
消除损害。我们不需要颠倒丢弃链,因为没有人试图重组丢弃的数据包。您可以按任何顺序保留它们。
NET_BUFFER_LIST * ReverseNblChain(NET_BUFFER_LIST *nblChain)
{
NET_BUFFER_LIST *head = NULL;
NET_BUFFER_LIST *next = NULL;
NET_BUFFER_LIST *nbl = NULL;
for (nbl = nblChain; nbl != NULL; nbl = next) {
next = nbl->Next;
nbl->Next = head;
head = nbl;
}
return head;
}
最后,如果您要在 future 的几年中阅读此书,建议您从Microsoft查找一个名为
nblutil.h
的示例头文件。 (我们尚未发布它,但是我正在研究它。)它有一个非常漂亮的例程
ndisClassifyNblChain
,它几乎可以为您完成所有工作。它具有较高的可扩展性,并使用了多种技巧来提高性能,而您所发现的结果已经塞满了已经很长的StackOverflow答案。
NdisClassifyNblChain2
关于c - 如何捕获数据包(NPF; WinPcap)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601283/
我了解了WinPcap如何过滤数据包here,并从GitHub(Microsoft/Windows-driver-samples)检查了ndis/filter project。我在下面提供了WinPc
大家。我正在为 WinPcap 做一些改进。现在我已经将 npf.sys 驱动程序从 NDIS5.0 移植到 NDIS6.0。这个驱动还有改进的空间吗,比如移植到LWF(Light-Weight Fi
我是一名优秀的程序员,十分优秀!