nangfeng
驱动牛犊
驱动牛犊
  • 注册日期2006-06-03
  • 最后登录2014-07-23
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望183点
  • 贡献值0点
  • 好评度51点
  • 原创分0分
  • 专家分0分
阅读:3148回复:1

ndisfilter的菜鸟问题

楼主#
更多 发布于:2007-08-03 16:44
根据WDK6000的例子做的
VOID FilterSendNetBufferLists(
        IN  NDIS_HANDLE         FilterModuleContext,
        IN  PNET_BUFFER_LIST    NetBufferLists,
        IN  NDIS_PORT_NUMBER    PortNumber,
        IN  ULONG               SendFlags
        )

{
    PMS_FILTER          pFilter = (PMS_FILTER)FilterModuleContext;
    NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;
    PNET_BUFFER_LIST    CurrNbl;
    BOOLEAN             DispatchLevel;
    
  //这里开始分析PNET_BUFFER_LIST指向的网络数据,并显示如何获得MAC地址
    PNET_BUFFER_LIST      pNetBufList,pNextNetBufList;
    PMDL                  pMdl;
    PNDISPROT_ETH_HEADER  pEthHeader = NULL;
    PIP_HEADER            pIPHeader=NULL;
    ULONG                 TotalLength,Offset,BufferLength;
    char srcip[16] = {'\0'};
    char destip[16] = {'\0'};

    pNetBufList = NetBufferLists;

    while (pNetBufList != NULL)
    {
        pNextNetBufList = NET_BUFFER_LIST_NEXT_NBL (pNetBufList);
        //得到当前和包相关的MDL,MDL里即MAC帧,详细的NET_BUFFER_LIST结构请参阅微软相关文档
        pMdl = NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(pNetBufList));    
        TotalLength = NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pNetBufList));
        Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NET_BUFFER_LIST_FIRST_NB(pNetBufList));
        BufferLength = 0;
        do
        {
            ASSERT(pMdl != NULL);
            if (pMdl)
            {
                NdisQueryMdl(
                    pMdl,
                    &pEthHeader,
                    &BufferLength,
                    NormalPagePriority);
            }

            if (pEthHeader == NULL)
            {
                BufferLength = 0;
                break;
            }

            if (BufferLength == 0)
            {
                break;
            }
            ASSERT(BufferLength > Offset);

            BufferLength -= Offset;

            pEthHeader = (PNDISPROT_ETH_HEADER)((PUCHAR)pEthHeader + Offset);
            pIPHeader = (PIP_HEADER)((PUCHAR)pEthHeader +14);
            if(pEthHeader->EthType == 0x8 )
              {  


                 DbgPrint("srcip:%x\n",ntohl(pIPHeader->iph_src));
                         DbgPrint("dstip:%x\n",ntohl(pIPHeader->iph_dest));

                     DbgPrint("\n");
            

             if (BufferLength < sizeof(NDISPROT_ETH_HEADER))
             {
                break;
             }
         }
        }while (FALSE);
        pNetBufList = pNextNetBufList;
    }
   DEBUGP(DL_TRACE, ("===>SendNetBufferList: NBL = %p.\n", NetBufferLists));



    do
    {

       DispatchLevel = NDIS_TEST_SEND_AT_DISPATCH_LEVEL(SendFlags);
       if (pFilter->TrackSends)
        {
            FILTER_ACQUIRE_LOCK(&pFilter->Lock, DispatchLevel);
            CurrNbl = NetBufferLists;
            while (CurrNbl)
            {
                pFilter->OutstandingSends++;
                FILTER_LOG_SEND_REF(1, pFilter, CurrNbl, pFilter->OutstandingSends);

                CurrNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);
            }
            FILTER_RELEASE_LOCK(&pFilter->Lock, DispatchLevel);
        }
        //
        // If necessary, queue the NetBufferList in a local structure for later processing
        //
        NdisFSendNetBufferLists(pFilter->FilterHandle, NetBufferLists, PortNumber, SendFlags);


    }
    while (FALSE);

    DEBUGP(DL_TRACE, ("<===SendNetBufferList: Status = %8x.\n", Status));

}

前面是获取数据包的源地主和目的地址,如果我想过滤掉制定的IP,比如目标IP为192.168.1.1,就丢弃数据包,应该怎么处理
游客

返回顶部