阅读:1215回复:0
DriverNetWorks的加密发包代码
下面是将接收的数据加密,然后交给协议层的代码,问题是如果加密后的数据长度小于等于收到的数据,则成功发送,否则,进入了死循环,不知道如何解决,请大侠指点,谢谢!
NDIS_STATUS MyAdapter::OnReceive (const KNdisPacket& Original, KNdisPacket& Repackaged) { TRACE("OnReceive() %ul bytes\n", (ULONG) Original.QueryTotalLength()); // This implementation simply points the Repackaged to the buffers of the // Original and forwards it over the binding. NDIS_STATUS Status = NDIS_STATUS_SUCCESS; Repackaged.CloneUp(Original); KNdisPacket MyPacket = m_RxPool.Allocate(); if (MyPacket.IsValid()) { bool b = CreateNewPacket(Repackaged, MyPacket); if (b) { NDIS_SET_ORIGINAL_PACKET((PNDIS_PACKET)MyPacket, NDIS_GET_ORIGINAL_PACKET((PNDIS_PACKET)Repackaged)); MyPacket.SetFlags(Repackaged.GetFlags()); m_RxPool.GetContext(MyPacket)->FrameworkPacket = Repackaged; ForwardUp(MyPacket); Status = NDIS_STATUS_NOT_ACCEPTED; } else { m_RxPool.Free(MyPacket); } } return Status; } VOID MyAdapter::OnReturnPacket(PNDIS_PACKET pPacket) { // OnReturnPacket will not be called if private packet pool is not implemented because // DriverNetworks RePackaged will be recycled in KNdisFilterAdapter::ReturnPacket ASSERT (m_RxPool.IsFrom(pPacket)); KNdisPacket Repackaged = m_RxPool.GetContext(pPacket)->FrameworkPacket; ASSERT(Repackaged.IsValid()); // Recycle our own packet PUCHAR pPacketContent; PNDIS_BUFFER PacketBuffer; UINT bufLength; NdisUnchainBufferAtFront(pPacket, &PacketBuffer); NdisQueryBufferSafe(PacketBuffer, (PVOID *)&pPacketContent, &bufLength, 32); NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0); m_Pool.Free(PacketBuffer); KNdisPacket::Reinitialize(pPacket); m_RxPool.Free(pPacket); // return Repackaged to the framework/originating miniport if (Repackaged.IsValid()) { KNdisFilterAdapter::ReturnPacket(Repackaged); } } |
|