njtlxm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-04
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望28点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1829回复:10

Passthru在8139下的改造问题,HUYU的代码在里面不能执行

楼主#
更多 发布于:2002-07-31 14:19
我看了HUYU在白云上的文章(关于在两个Receive中将数据包DBPrint的),修改了passthru代码。
在D_Link530上走的是PtReceivePacket,可以得到整个数据包并显示出来。但是在8139上走的是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 PacketLen;
unsigned char * pbuf;
int i=0,j=0;
MDL* pNext;
PUCHAR pPacketContent;
UINT  bufLength;
if(!pAdapt->MiniportHandle)
{
      Status = NDIS_STATUS_FAILURE;
}
else do
{
if(pAdapt->isSecondary)
{
 DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
 ASSERT(0);
}
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen);
DbgPrint(\"Packet Len=%d\\n\",PacketLen);
pPacketContent= ExAllocatePool(  NonPagedPool , 2000);
RtlZeroMemory(pPacketContent,  2000  );
NdisQueryBufferSafe(Packet->Private.Head,&pbuf,&bufLength, 32 );
NdisMoveMemory(pPacketContent,pbuf,bufLength);
i=bufLength;
pNext=Packet->Private.Head;  // next 是一个mdl
for(;;)
{
if(pNext==Packet->Private.Tail)
break;
pNext=pNext->Next;  // next 是一个mdl
if (pNext==NULL)  break;
NdisQueryBufferSafe(pNext,&pbuf,&bufLength,32);
NdisMoveMemory(pPacketContent+i,pbuf,bufLength);
i+=bufLength;
}
ExFreePool(pPacketContent);
以下就和原来的passthru一样了,但是我在softice中发现,一执行NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen);
立即死机。不知道是为什么?
njtlxm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-04
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望28点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-31 14:34
ft!我在DriverEntry把PtReceive的派发给注销了(PChars.ReceiveHandler = NULL;)系统立即崩溃,怎么回事啊?是rt8139的网卡,2000pro操作系统
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2002-07-31 16:42
ft!我在DriverEntry把PtReceive的派发给注销了(PChars.ReceiveHandler = NULL;)系统立即崩溃,怎么回事啊?是rt8139的网卡,2000pro操作系统
 


因为rt8139需要receivehandler。
你不能让receivehandler=null,
只能让receivepacket=null。

ddk说了,第一个不能为null,第2个最好不为null。

不再回忆从前,我已经生活在幸福当中。
njtlxm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-04
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望28点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-07-31 16:45
多谢,等一会我试试。
还有,我的第一个问题是怎么回事?一执行到那条语句就完蛋
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2002-07-31 16:45
你的标题很是让我感觉不爽。
我建议你还是仔细看看ddk,而且不要把脏水泼到我的头上:-)。

我看了HUYU在白云上的文章(关于在两个Receive中将数据包DBPrint的),修改了passthru代码。
在D_Link530上走的是PtReceivePacket,可以得到整个数据包并显示出来。但是在8139上走的是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 PacketLen;
unsigned char * pbuf;
int i=0,j=0;
MDL* pNext;
PUCHAR pPacketContent;
UINT  bufLength;
if(!pAdapt->MiniportHandle)
{
      Status = NDIS_STATUS_FAILURE;
}
else do
{
if(pAdapt->isSecondary)
{
 DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
 ASSERT(0);
}
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen);
DbgPrint(\"Packet Len=%d\\n\",PacketLen);
pPacketContent= ExAllocatePool(  NonPagedPool , 2000);
RtlZeroMemory(pPacketContent,  2000  );
NdisQueryBufferSafe(Packet->Private.Head,&pbuf,&bufLength, 32 );
NdisMoveMemory(pPacketContent,pbuf,bufLength);
i=bufLength;
pNext=Packet->Private.Head;  // next 是一个mdl
for(;;)
{
if(pNext==Packet->Private.Tail)
break;
pNext=pNext->Next;  // next 是一个mdl
if (pNext==NULL)  break;
NdisQueryBufferSafe(pNext,&pbuf,&bufLength,32);
NdisMoveMemory(pPacketContent+i,pbuf,bufLength);
i+=bufLength;
}
ExFreePool(pPacketContent);
以下就和原来的passthru一样了,但是我在softice中发现,一执行NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen);
立即死机。不知道是为什么?
 
不再回忆从前,我已经生活在幸福当中。
njtlxm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-04
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望28点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-07-31 16:51
呵呵,对不起,不过只有这样才会引起你的注意。我现在在complete中得到完整的数据包了。不过我还是很奇怪
ufo_online
驱动牛犊
驱动牛犊
  • 注册日期2002-04-26
  • 最后登录2004-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-31 17:20
 
以下就和原来的passthru一样了,但是我在softice中发现,一执行NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen);
立即死机。不知道是为什么?

难道你就没注意到Packet为NULL?
ufo_online
驱动牛犊
驱动牛犊
  • 注册日期2002-04-26
  • 最后登录2004-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-31 17:27
 建议你看一下这个帖子!
[url] http://www.driverdevelop.com/forum/viewthread.php?fid=10&tid=8559&page=1&totalpost=26[/url]
fenger_li
驱动老牛
驱动老牛
  • 注册日期2002-03-26
  • 最后登录2005-04-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-31 18:01
有点意思,嗬嗬!
有点意思。。。 呵呵!
laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-10 17:55
上面哪个提到的帖子我也看过了,ddk里面我怎么找不到关于packet==null的怎么处理,按照胡的方法倒是可以运行,但是时间长了就不稳定了,而且我传输大量数据也不稳定,请问有没有那里有很好的例子,或者如果那位有兴趣的好心人帮我看看我整理的例子(在虚拟机上稳定,但是在8139上不稳定)
QQ:50528814,技术交流
laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-11-10 17:56
上面哪个提到的帖子我也看过了,ddk里面我怎么找不到关于packet==null的怎么处理,按照胡的方法倒是可以运行,但是时间长了就不稳定了,而且我传输大量数据也不稳定,请问有没有那里有很好的例子,或者如果那位有兴趣的好心人帮我看看我整理的例子(在虚拟机上稳定,但是在8139上不稳定)

这个帖子是两年前的,估计大家都比较清楚吧 ,帮在下一把
QQ:50528814,技术交流
游客

返回顶部