修改 DDK 自带的 PASSTHRU,如何彻底拦截指定的域名?目前能够解析出指定的域名,但在 PtReceive 、 PtReceivePacket最后返回 if(fStatus == STATUS_DROP)
{
DbgPrint("[xiaoc httpfilter] PtReceive is STATUS_DROP");
Status =  NDIS_STATUS_NOT_ACCEPTED; return Status;
}不能拦截改网页,只是访问很慢了,一直再重发,最后客户端还是显示出了网页。。
怎么能彻底而又快速的让客户端显示无法访问该页?

解决方案 »

  1.   

    想要在google中输入和鞋关键字那样的效果?
      

  2.   

    可以自定义一个页面,发现指定域名后,直接返回你的Block页面的HTTP包,让浏览器显示拦截页面.
      

  3.   


    已经可以了显示我的页面了,但是它蓝屏了,我就郁闷了.在PtReceivePacket
    检测到是要拦截的HTTP包后,就发送我的页面过去,
    结果 在调用
    NdisSend(&Status,
    pAdapt->BindingHandle,
    MyPacket);
    的时候蓝屏了,客户端已经显示出我的拦截页面了..求解.
      

  4.   

    下面是发送拦截数据报的函数
    NDIS_STATUS SendBlockPacket(PADAPT pAdapt, PUCHAR pPacketContent)
    { PNDIS_PACKET        MyPacket;
    PNDIS_BUFFER        tmpBuffer, MyBuffer;
    NDIS_STATUS Status;
    UINT OffsetSize = 0;
    PSEND_RSVD          SendRsvd;
    PVOID Address;
    UINT Current_length; DbgPrint("[xiaoc httpfilter] PtReceivePacket is STATUS_DROP");
    DbgBreakPoint();
    NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);
    if (Status == NDIS_STATUS_SUCCESS)
    {
    // 在缓冲池中分配缓冲描述符,将包描述符与缓冲描述符关联。
    NdisAllocateBuffer(&Status, &MyBuffer, pAdapt->SendPacketPoolHandle, pPacketContent, OffsetSize);  if (NDIS_STATUS_SUCCESS != Status) 
    {
    NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0);
    return NDIS_STATUS_NOT_ACCEPTED;
    }
    NdisChainBufferAtFront(MyPacket, MyBuffer);  SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
    SendRsvd->OriginalPkt = MyPacket; NdisSend(&Status,
    pAdapt->BindingHandle,
    MyPacket); if (Status != NDIS_STATUS_PENDING)
    {
    NdisUnchainBufferAtFront(MyPacket ,&MyBuffer);     
    while (NULL != MyBuffer)
    {
    NdisQueryBufferSafe(MyBuffer, &Address, &Current_length, NormalPagePriority);
    NdisFreeMemory(Address, Current_length, 0);
    tmpBuffer = MyBuffer;
    NdisGetNextBuffer(tmpBuffer, &MyBuffer);
    NdisFreeBuffer(tmpBuffer);
    }
    return Status;
    } //ResetPacketToServer(pAdapt, Packet, pPacketContent);
    NdisUnchainBufferAtFront(MyPacket ,&MyBuffer);     
    while (NULL != MyBuffer)
    {
    NdisQueryBufferSafe(MyBuffer, &Address, &Current_length, NormalPagePriority);
    NdisFreeMemory(Address, Current_length, 0);
    tmpBuffer = MyBuffer;
    NdisGetNextBuffer(tmpBuffer, &MyBuffer);
    NdisFreeBuffer(tmpBuffer);
    }
    NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0); 
    return Status;
    }
    return NDIS_STATUS_NOT_ACCEPTED;
    }