INT natpReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ) { PFILTER_ADAPTER pAdapt; NDIS_STATUS Status; PNDIS_BUFFER NdisBuffer; NDIS_STATUS PacketStatus; FLT_PKT *pFltPkt; pAdapt = (PFILTER_ADAPTER)ProtocolBindingContext; if (NULL == pAdapt->MiniportHandle || pAdapt->natmDeviceState > NdisDeviceStateD0) return 0; pFltPkt = AllocateFltPacket(); if(NULL == pFltPkt) return 0; if(!natbParsePacket(Packet, pFltPkt)){ if(g_LogPktDrop) PrintFtlPkt("DROP ", pFltPkt, 0, FALSE); FreeFltPkt(pFltPkt); return 0; } // // Translate // TranslatePktIncoming(&pAdapt->ctrl, pFltPkt); // // Filter // if(!FilterPkt(&pAdapt->ctrl, pFltPkt, FALSE)){ if(g_LogPktDrop) PrintFtlPkt("DROP ", pFltPkt, 0, FALSE); FreeFltPkt(pFltPkt); return 0; } if(g_LogPktPass) PrintFtlPkt("PASS ", pFltPkt, 0, FALSE); if(NULL == pFltPkt->pBuf){ FreeFltPkt(pFltPkt); pFltPkt = NULL; } return natpReceivePacketPassThrough( ProtocolBindingContext, Packet, pFltPkt ); }
FLT_PKT* CreateFltPacketWithBuffer() { FLT_PKT* pFltPkt; pFltPkt = AllocateFltPacket(); if (NULL == pFltPkt) return NULL; pFltPkt->pBuf = ExAllocateFromNPagedLookasideList(&g_DataLookaside); if (NULL == pFltPkt->pBuf) { FreeFltPkt(pFltPkt); return NULL; } RtlZeroMemory(pFltPkt->pBuf, MAX_ETHER_SIZE); return pFltPkt; }
NDIS_STATUS natpReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PFILTER_ADAPTER pAdapt; PNDIS_PACKET Packet; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; NDIS_STATUS PacketStatus; PNDIS_PACKET pNewPacket; ULONG nDataSize; FLT_PKT *pFltPkt; PNDIS_BUFFER pNewBuffer; pAdapt = (PFILTER_ADAPTER)ProtocolBindingContext; if ((!pAdapt->MiniportHandle) || (pAdapt->natmDeviceState > NdisDeviceStateD0)){ return NDIS_STATUS_FAILURE; } nDataSize = HeaderBufferSize + PacketSize; if ( nDataSize > MAX_ETHER_SIZE ){ return NDIS_STATUS_FAILURE; } Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if (NULL == Packet) return NDIS_STATUS_NOT_ACCEPTED; pFltPkt = AllocateFltPacket(); if(NULL == pFltPkt) return NDIS_STATUS_NOT_ACCEPTED; if(!natbParsePacket(Packet, pFltPkt)){ if(g_LogPktDrop) PrintFtlPkt("DROP ", pFltPkt, 0, FALSE); FreeFltPkt(pFltPkt); return NDIS_STATUS_NOT_ACCEPTED; } // // Translate // TranslatePktIncoming(&pAdapt->ctrl, pFltPkt); // // Filter // if(!FilterPkt(&pAdapt->ctrl, pFltPkt, FALSE)){ if(g_LogPktDrop) PrintFtlPkt("DROP ", pFltPkt, 0, FALSE); FreeFltPkt(pFltPkt); return NDIS_STATUS_NOT_ACCEPTED; } if(g_LogPktPass) PrintFtlPkt("PASS ", pFltPkt, 0, FALSE); if(NULL == pFltPkt->pBuf){ FreeFltPkt(pFltPkt); pFltPkt = NULL; NdisDprAllocatePacket( &Status, &pNewPacket, pAdapt->RcvPP1 ); if (Status != NDIS_STATUS_SUCCESS) { return NDIS_STATUS_NOT_ACCEPTED; } *((PVOID*)&pNewPacket->MiniportReserved) = NULL; pNewPacket->Private.Head = Packet->Private.Head; pNewPacket->Private.Tail = Packet->Private.Tail; }else{ NdisDprAllocatePacket( &Status, &pNewPacket, pAdapt->RcvPP2 ); if (Status != NDIS_STATUS_SUCCESS) return NDIS_STATUS_NOT_ACCEPTED; *((PVOID*)&pNewPacket->MiniportReserved) = pFltPkt; NdisAllocateBuffer( &Status, &pNewBuffer, pAdapt->RcvBP, pFltPkt->pBuf, pFltPkt->uLen ); if ( Status != NDIS_STATUS_SUCCESS ){ NdisReinitializePacket (pNewPacket); NdisFreePacket (pNewPacket); return NDIS_STATUS_NOT_ACCEPTED; } NdisChainBufferAtFront(pNewPacket, pNewBuffer ); } NdisGetPacketFlags(pNewPacket) = NdisGetPacketFlags(Packet); NDIS_SET_PACKET_STATUS(pNewPacket, NDIS_STATUS_RESOURCES); NDIS_SET_ORIGINAL_PACKET(pNewPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(pNewPacket, HeaderBufferSize); natpQueueReceivedPacket(pAdapt, pNewPacket, TRUE); natmReturnPacket( ProtocolBindingContext, pNewPacket ); return Status; }