mingbao
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:920回复:1

高手们帮小弟看看 Passthru 为何不能截包

楼主#
更多 发布于:2004-12-13 11:09
我把 PAssthru 里的 NDIS_STATUS PtReceive( ) 函数改成了如下的形式, 我只想截获所有的 IP 数据报. 可是没有用!

NDIS_STATUS
PtReceive(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  NDIS_HANDLE MacReceiveContext,
IN  PVOID HeaderBuffer,
IN  UINT HeaderBufferSize,
IN  PVOID LookAheadBuffer,
IN  UINT LookAheadBufferSize,
IN  UINT PacketSize
)
/*++

Routine Description:
LBFO - need to use primary for all receives

Arguments:


Return Value:

--*/
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET MyPacket, Packet;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

//-----Variables added declare
int nPacketSize;
PUCHAR        pPacketContent;
PUCHAR        pBuf;
UINT         BufLength;
MDL    *     pNext;
UINT         i;
//-----------规则标志位(1表示过滤,0表示放行,你可以通过改这个数值来配置规则)

UINT        IP = 1;     //IP数据报规则
UINT        ICMP = 0;     //ICMP数据报规则
UINT        IGMP = 0;    //IGMP数据报规则
UINT        TCP = 0;    //TCP数据报规则
UINT        UDP = 0;    //UDP数据报规则

//----end of declare



if(!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;

}
else do
{
//
// We should not be getting Receives on a Secondary, this is just specific to our  LBFO driver
//

if(pAdapt->isSecondary)
{
DBGPRINT("PASSTHRU GETTING RECIEVES ON SECONDARY\n");
ASSERT(0);
}

//
// If this was indicated by the miniport below as a packet, then get that packet pointer and indicate
// it as a packet as well(with appropriate status). This way the OOB stuff is accessible to the
// transport above us.
//
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if(Packet != NULL)
{
//---------------------------------------------------------
        
    
    //把数据包内容从Packet拷贝到pPacketContent

    NdisQueryPacket( Packet,NULL,NULL,NULL,&nPacketSize);
    
    Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax);
    if (Status!=NDIS_STATUS_SUCCESS ) return Status;
    NdisZeroMemory (pPacketContent, 2000);
    
    NdisQueryBufferSafe(Packet->Private.Head, &pBuf, &BufLength, 32 );
    NdisMoveMemory(pPacketContent, pBuf, BufLength);

    i = BufLength;
    pNext = Packet->Private.Head;
    
    for(;;)
    {
        if(pNext == Packet->Private.Tail)
            break;
            pNext = pNext->Next;   //指针后移
            if(pNext == NULL)
                break;

            NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
            NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
            i+=BufLength;
    }
    
    //数据拷贝完毕
    //---------------------------------------------------------


        
    
        //-----------------规则判断


if (IP == 1)
    {
        if(  pPacketContent[12] == 8 &&
             pPacketContent[13] == 0    )
        {
            DbgPrint("IP被拦截!\n");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }




    if (ICMP == 1)
    {
        if( pPacketContent[12] == 8 &&
            pPacketContent[13] == 0 &&
            pPacketContent[23] == 1     )
        {
            DbgPrint("ICMP被拦截!\n");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (IGMP == 1)
    {
        if( pPacketContent[12] == 8 &&
            pPacketContent[13] == 0 &&
            pPacketContent[23] == 2      )
        {
            DbgPrint("IGMP被拦截!\n");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (TCP == 1)
    {
        if( pPacketContent[12] == 8 &&
            pPacketContent[13] == 0 &&
            pPacketContent[23] == 6      )
        {
            DbgPrint("TCP被拦截!\n");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (UDP == 1)
    {
        if( pPacketContent[12] == 8 &&
            pPacketContent[13] == 0 &&
            pPacketContent[23] == 17     )
        {
            DbgPrint("UDP被拦截!\n");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }

NdisFreeMemory(pPacketContent, 2000, 0);

    //规则判断结束
    //---------------------------------------------------------        

    

// Get a packet off the pool and indicate that up
//
NdisDprAllocatePacket(&Status,
 &MyPacket,
 pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
 MyPacket->Private.Head = Packet->Private.Head;
 MyPacket->Private.Tail = Packet->Private.Tail;

 //
 // Get the original packet(it could be the same packet as one received or a different one
 // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible
 // correctly at the top.
 //
 NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));
 NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

 //
 // Set Packet Flags
 //
 NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

 //
 // Make sure the status is set to NDIS_STATUS_RESOURCES.
 //
 NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

 ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);
 NdisDprFreePacket(MyPacket);
 break;
}
}

//
// Fall through if the miniport below us has either not indicated a packet or we could not
// allocate one
//
pAdapt->IndicateRcvComplete = TRUE;
switch(pAdapt->Medium)
{
 case NdisMedium802_3:
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;

 case NdisMedium802_5:
NdisMTrIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;

 case NdisMediumFddi:
NdisMFddiIndicateReceive(pAdapt->MiniportHandle,
 MacReceiveContext,
 HeaderBuffer,
 HeaderBufferSize,
 LookAheadBuffer,
 LookAheadBufferSize,
 PacketSize);
break;

 default:
ASSERT(0);
break;
}

} while(FALSE);

return Status;
}

最新喜欢:

lsq77lsq77
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-13 12:31
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if(Packet != NULL)
{
}

Packet == NULL的情况你也要处理!!!!
游客

返回顶部