阅读:1336回复:1
关于NDIS OOB。。。
我贴两个我写的函数:
CopySendOOBData: 在发送packet时复制oob数据。 CopyReceiveOOBData: 在接收到包时复制oob数据。 然后做一下说明,希望能对初学者有所帮助,也希望 大家能指出这两个函数有什么问题。 NDIS_STATUS SendCopyOOBData (PNDIS_PACKET pSendNdisPacket, PNDIS_PACKET pSrcNdisPacket) { PVOID MediaSpecificInfo; UINT MediaSpecificInfoSize; // Initialize local vairalbes. MediaSpecificInfo = NULL; MediaSpecificInfoSize = 0; // Set packet flags. NdisSetPacketFlags (pSendNdisPacket, NdisGetPacketFlags (pSrcNdisPacket)); // Copy the OOB data from the original packet to the new packet. NdisMoveMemory (NDIS_OOB_DATA_FROM_PACKET (pSendNdisPacket), NDIS_OOB_DATA_FROM_PACKET (pSrcNdisPacket), sizeof (NDIS_PACKET_OOB_DATA)); // Copy relevant parts of the per packet info into the new packet. NdisIMCopySendPerPacketInfo (pSendNdisPacket, pSrcNdisPacket); // Copy the Media specific information. NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO (pSrcNdisPacket, &MediaSpecificInfo, &MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO (pSendNdisPacket, MediaSpecificInfo, MediaSpecificInfoSize); } // Return. return NDIS_STATUS_SUCCESS; } NDIS_STATUS ReceiveCopyOOBData (PNDIS_PACKET pIndicateNdisPacket, PNDIS_PACKET pSrcNdisPacket) { PVOID MediaSpecificInfo; UINT MediaSpecificInfoSize; // Initialize local vairalbes. MediaSpecificInfo = NULL; MediaSpecificInfoSize = 0; // Set packet flags. NdisSetPacketFlags (pIndicateNdisPacket, NdisGetPacketFlags (pSrcNdisPacket)); // Copy the OOB data from the original packet to the new packet. NdisMoveMemory (NDIS_OOB_DATA_FROM_PACKET (pIndicateNdisPacket), NDIS_OOB_DATA_FROM_PACKET (pSrcNdisPacket), sizeof (NDIS_PACKET_OOB_DATA)); // Copy relevant parts of the per packet info into the new packet. NDIS_SET_ORIGINAL_PACKET (pIndicateNdisPacket, NDIS_GET_ORIGINAL_PACKET (pSrcNdisPacket)); // Copy the Media specific information. NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO (pSrcNdisPacket, &MediaSpecificInfo, &MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO (pIndicateNdisPacket, MediaSpecificInfo, MediaSpecificInfoSize); } // Return. return NDIS_STATUS_SUCCESS; } OOB有三个部分: NDIS_PACKET_OOB_DATA MEDIA_SPECIFIC_INFORMATION NDIS_PER_PACKET_INFO。 NDIS_PACKET_OOB_DATA 和 MEDIA_SPECIFIC_INFORMATION 都好处理,但是NDIS_PER_PACKET_INFO在SendCopyOOBData中, 可以调用NdisIMCopySendPerPacketInfo,而在 ReceiveCopyOOBData中则没有相应的函数了。 另外一个就是original packet.对于NDIS IM Driver stack,只需要设置original packet就可以了, 而不需要复制OOB.反过来,要复制OOB的话,也应该 复制original packet的,而不是刚好下一层的packet 的。是这样的吗? |
|
沙发#
发布于:2002-05-06 00:23
反过来,要复制OOB的话,也应该
复制original packet的,而不是刚好下一层的packet 的。是这样的吗? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 如果这个判断正确的话,那 ReceiveCopyOOBData 的实现是有问题的。 |
|