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

为什麽在PtReceivePacket中看不到包的信息,但能看到机器是跑了PtReceivePacket的~~附源码

楼主#
更多 发布于:2004-05-23 15:01
我只在PtReceivePacket和MPSend中作了修改而已

INT
PtReceivePacket(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet
)

{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
NDIS_STATUS Status;
PNDIS_PACKET MyPacket;
PRSVD Resvd;
//---------------------------------------------------------
int PacketSize;
PUCHAR pPacketContent;
PUCHAR pBuf;
UINT BufLength;
MDL *pNext;
UINT i;
//---------------------------------------------------------

UINT workmode=0; //自己用来定义的工作模式
DbgPrint(\"===============>正在运行中的资料:PtReceivePacket<===============\\n\");
if(!pAdapt->MiniportHandle)
{
return 0;
}


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

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

//
// Get a packet off the pool and indicate that up
//

NdisDprAllocatePacket(&Status,&MyPacket,pAdapt->RecvPacketPoolHandle);
if(Status == NDIS_STATUS_SUCCESS)
{
Resvd =(PRSVD)(MyPacket->MiniportReserved);
Resvd->OriginalPkt = Packet;
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));

//
// Set Packet Flags
//

NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);
Status = NDIS_GET_PACKET_STATUS(Packet);
NDIS_SET_PACKET_STATUS(MyPacket, Status);
NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet));

if(workmode==1)
{
NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1);
DbgPrint(\"现在的工作模式是=====>允许包通过<=====\\n\");
}
else

{
DbgPrint(\"现在的工作模式是=====>封包截获<=====\\n\");

//把数据包内容从Packet拷贝到pPacketContent
NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize);
Status= NdisAllocateMemory( &pPacketContent,2000,0,HighestAcceptableMax);
if (Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"=====>分配一个系统空间 NdisAllocateMemory 失败<=====\\n\");
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 (pPacketContent[13] != 0)
{
DbgPrint(\"===============>这不是一个 IP 包.<===============\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1);
return NDIS_STATUS_SUCCESS;

/*
if(Status == NDIS_STATUS_RESOURCES)
{
NdisDprFreePacket(MyPacket);
}
return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);
*/
}

switch (pPacketContent[23])
{
case 1:
DbgPrint(\"===============>这是一个 IP/ICMP 包.<===============\\n\");
DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0],
pPacketContent[1],
pPacketContent[2],
pPacketContent[3],
pPacketContent[4],
pPacketContent[5]);
DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6],
pPacketContent[7],
pPacketContent[8],
pPacketContent[9],
pPacketContent[10],
pPacketContent[11]);
DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26],
pPacketContent[27],
pPacketContent[28],
pPacketContent[29]);
DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30],
pPacketContent[31],
pPacketContent[32],
pPacketContent[33]);

//释放之前所分配的缓存空间
NdisFreeMemory(pPacketContent, 2000, 0);
break;

case 6:
DbgPrint(\"===============>这是一个 IP/TCP 包.<===============\\n\");
DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0],
pPacketContent[1],
pPacketContent[2],
pPacketContent[3],
pPacketContent[4],
pPacketContent[5]);
DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6],
pPacketContent[7],
pPacketContent[8],
pPacketContent[9],
pPacketContent[10],
pPacketContent[11]);
DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26],
pPacketContent[27],
pPacketContent[28],
pPacketContent[29]);
DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30],
pPacketContent[31],
pPacketContent[32],
pPacketContent[33]);
DbgPrint(\"源 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[34],pPacketContent[35]);

DbgPrint(\"目的 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[36],pPacketContent[37]);

//释放之前所分配的缓存空间
NdisFreeMemory(pPacketContent, 2000, 0);
break;

case 17:
DbgPrint(\"===============>这是一个 IP/UDP 包.<===============\\n\");
DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0],
pPacketContent[1],
pPacketContent[2],
pPacketContent[3],
pPacketContent[4],
pPacketContent[5]);
DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6],
pPacketContent[7],
pPacketContent[8],
pPacketContent[9],
pPacketContent[10],
pPacketContent[11]);
DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26],
pPacketContent[27],
pPacketContent[28],
pPacketContent[29]);
DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30],
pPacketContent[31],
pPacketContent[32],
pPacketContent[33]);
DbgPrint(\"源 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[34],pPacketContent[35]);
DbgPrint(\"目的 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[36],pPacketContent[37]);

//释放之前所分配的缓存空间
NdisFreeMemory(pPacketContent, 2000, 0);
break;

default:
NdisFreeMemory(pPacketContent, 2000, 0);
break;
}

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

if(Status == NDIS_STATUS_RESOURCES)
{
NdisDprFreePacket(MyPacket);
}
return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);
}
else
{
//
// We are out of packets. Silently drop it. Alternatively we can deal with it:
// - By keeping separate send and receive pools
// - Dynamically allocate more pools as needed and free them when not needed
//
return(0);
}
}
附件名称/大小 下载次数 最后更新
2004-05-23_3.rar (354KB)  15
游客

返回顶部