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

问一下大家我所遇到的问题,我是菜鸟,希望大侠看一下为什麽:)谢谢了(50分)

楼主#
更多 发布于:2004-05-25 00:21
我在我的机器和我机器机上的虚拟机上安装后都可以看到我在PtReceive中所要显示的包的内容~

但为什么我将这个程序安装在其他的2000机器上后就不好使了~~

只输出了一句"===============>正在运行中的资料:PtReceive<==============="~~

好像没有运行下去了~~为什麽呢???

开始我以为是我用XPDDK编译二者不兼容,但我在2000DDK中又编译了一次,情况还在~~

希望大家可以看一下~~谢谢大家了~~

PtReceive源码是:
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
)

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

//---------------------------------------------------------
int Size;
PUCHAR pPacketContent;
PUCHAR pBuf;
UINT BufLength;
MDL *pNext;
UINT i;
//---------------------------------------------------------

UINT workmode=0; //自己用来定义的工作模式

DbgPrint(\"===============>正在运行中的资料:PtReceive<===============\\n\");

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)
{

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

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

//把数据包内容从Packet拷贝到pPacketContent
NdisQueryPacket( Packet,NULL,NULL,NULL,&Size);
Status= NdisAllocateMemory( &pPacketContent,2000,0,HighestAcceptableMax);

if (Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"=====>分配一个系统空间 NdisAllocateMemory 失败<=====\\n\");
return Status;
}

//初始化所分配的缓冲区
NdisZeroMemory(pPacketContent,2000);
NdisMoveMemory(pPacketContent,HeaderBuffer,HeaderBufferSize);
NdisMoveMemory(pPacketContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize);

//数据拷贝完毕

if (pPacketContent[13] != 0)
{
DbgPrint(\"===============>这不是一个 IP 包.<===============\\n\\n\\n\");
// 向上层协议驱动指示数据包,防真网卡行为。
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);
NdisFreeMemory(pPacketContent, 2000, 0);
NdisDprFreePacket(MyPacket);
return NDIS_STATUS_SUCCESS;
}


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\\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(\"源 端口 为: %u \\n\\n\",((pPacketContent[34]*0x100)+pPacketContent[35]));
DbgPrint(\"目的 端口 为: %u \\n\\n\\n\\n\",((pPacketContent[36]*0x100)+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(\"源 端口 为: %u \\n\\n\",((pPacketContent[34]*0x100)+pPacketContent[35]));
DbgPrint(\"目的 端口 为: %u \\n\\n\\n\\n\",((pPacketContent[36]*0x100)+pPacketContent[37]));

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


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

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

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;
}
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-25 07:37
可能与网卡型号有关,对于一些网卡Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);的返回值总为空,这样后面的处理自然不会执行。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-25 08:39
新网卡用PtReceivePacket,老式的RTL8029等用PtReceive.就这么简单。
从本质上讲,PtReceive被调用有两种情况:
1、当下层的miniport调用NdisMXxxIndicate的时候,NDIS总是调用ProtocolReceive函数。
2、这时候底层的miniport有可能资源不足,为了能够让上层驱动程序迅速放弃对数据包控制权,它在每一个数据包的带外数据块中设置status属性为NDIS_STATUS_SOURCE,这样就迫使NDIS转而调用ProtocolReceive函数,强迫IMD拷贝每一个数据包。
当情况2发生时,Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);就不返回空。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-25 08:40
PtReceivePacket和PtReceive都应该处理。就能兼容各种情况。
chansiio
驱动牛犊
驱动牛犊
  • 注册日期2004-03-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-26 01:49
哦~~
等我试一下~~
chansiio
驱动牛犊
驱动牛犊
  • 注册日期2004-03-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-26 15:34
可能与网卡型号有关,对于一些网卡Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);的返回值总为空,这样后面的处理自然不会执行。


那是不是会自动 执行PtReceivePacket这个函数的??
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-27 08:52
不会的,不会的,ProtocolReceive和 ProtocolReceivePacket同时只有一个会被调用。调用的原则上面说了。
如果NdisGetReceivedPacket返回NULL,就表示数据在LookAheadBuffer中,这时依然在ProtocolReceive中处理。
chansiio
驱动牛犊
驱动牛犊
  • 注册日期2004-03-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-28 12:50
那如果我只要看一下包头的东西,不是在HeaderBuffer中已有了吗?

我想问一点的是HeaderBuffer是不是只包含一些帧头的东西?

而LookAheadBuffer中包含了帧数据的内容呢??

所以要在PtTransferDataComplete中处理一下呢?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-28 17:53
我想问一点的是HeaderBuffer是不是只包含一些帧头的东西?

是。
而LookAheadBuffer中包含了帧数据的内容呢??
有时不完全,要调用NdisTransferdat补全剩余的数据。

chansiio
驱动牛犊
驱动牛犊
  • 注册日期2004-03-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-29 23:54
那我在上面的程序中应该可以输出帧头的东西啊~~


例如应该可以输出一些MAC地址的东西啊??

为什麽我什麽都看不见呢?

只看见输出了一句"(\"===============>正在运行中的资料PtReceive<==============="
游客

返回顶部