20120808
书 P.463 对应 pdf P.489 。
分析网络包 --> 需要它的网络数据 --> 而我们有的是 NDIS_PACKET结构(网络包的描述符结构) --> 需要得到网络包的实际内容 --> 参考 AnalysisPacket
--> AnalysisPacket共有6处被调用 : MPSend、MPSendPackets、MPTransferData、PtTransferDataComplete、PtReceive、PtReceivePacket 。
把 AnalysisPacket 放在任何有 PNDIS_PACHET 参数的地方,对网络报数据进行分析 --> 过滤的结果不外乎3种 : 放过、拒绝、修改 。
1)、拒绝一个包 。
A)、MPSend :
- return NDIS_STATUS_FAILURE; // 丢弃之
B)、MPSendPackets :
- // 在这个函数中,任何一个被放弃的包,都必须调用NdisMSendComplete。
- NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
- Packet,
- NDIS_STATUS_FAILURE);
C)、MPTransferData :
- Status = NDIS_STATUS_FAILURE; // 丢弃之
D)、PtTransferDataComplete :
- Status = NDIS_STATUS_FAILURE;// 丢弃之
E)、PtReceive :
- Status = NDIS_STATUS_FAILURE;// 丢弃之
F)、PtReceivePacket :
其中,返回的值有不同(要注意) ,但是效果呢?PtReceivePacket 中也返回 NDIS_STATUS_FAILURE 会咋样?
- #define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) // NDIS.h
- #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) // ntstatus.h
- // 2.3.1 NTSTATUS values - MSDN - Microsoft ()
2)、修改数据包 --> 包括两个方面 ①转发 和 ②加/解密 。
其中说到 转发 的原理比较简单 ,A)、发送过程中进行转发 -->更改包头中的目标地址 --> 直接调用 NdisSend发送即可 ;B)、接收过程中转发 --> 一边要完成原始的包,一边要转发新建的包 。
zc 问题 : 应该还是要重新计算 checksum 的吧???
>>
阅读(1214) | 评论(0) | 转发(0) |