阅读:1829回复:10
Passthru在8139下的改造问题,HUYU的代码在里面不能执行
我看了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); 立即死机。不知道是为什么? |
|
沙发#
发布于:2002-07-31 14:34
ft!我在DriverEntry把PtReceive的派发给注销了(PChars.ReceiveHandler = NULL;)系统立即崩溃,怎么回事啊?是rt8139的网卡,2000pro操作系统
|
|
板凳#
发布于:2002-07-31 16:42
ft!我在DriverEntry把PtReceive的派发给注销了(PChars.ReceiveHandler = NULL;)系统立即崩溃,怎么回事啊?是rt8139的网卡,2000pro操作系统 因为rt8139需要receivehandler。 你不能让receivehandler=null, 只能让receivepacket=null。 ddk说了,第一个不能为null,第2个最好不为null。 |
|
|
地板#
发布于:2002-07-31 16:45
多谢,等一会我试试。
还有,我的第一个问题是怎么回事?一执行到那条语句就完蛋 |
|
地下室#
发布于:2002-07-31 16:45
你的标题很是让我感觉不爽。
我建议你还是仔细看看ddk,而且不要把脏水泼到我的头上:-)。 我看了HUYU在白云上的文章(关于在两个Receive中将数据包DBPrint的),修改了passthru代码。 |
|
|
5楼#
发布于:2002-07-31 16:51
呵呵,对不起,不过只有这样才会引起你的注意。我现在在complete中得到完整的数据包了。不过我还是很奇怪
|
|
6楼#
发布于:2002-07-31 17:20
以下就和原来的passthru一样了,但是我在softice中发现,一执行NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketLen); 难道你就没注意到Packet为NULL? |
|
7楼#
发布于:2002-07-31 17:27
建议你看一下这个帖子!
[url] http://www.driverdevelop.com/forum/viewthread.php?fid=10&tid=8559&page=1&totalpost=26[/url] |
|
8楼#
发布于:2002-07-31 18:01
有点意思,嗬嗬!
|
|
|
9楼#
发布于:2004-11-10 17:55
上面哪个提到的帖子我也看过了,ddk里面我怎么找不到关于packet==null的怎么处理,按照胡的方法倒是可以运行,但是时间长了就不稳定了,而且我传输大量数据也不稳定,请问有没有那里有很好的例子,或者如果那位有兴趣的好心人帮我看看我整理的例子(在虚拟机上稳定,但是在8139上不稳定)
|
|
|
10楼#
发布于:2004-11-10 17:56
上面哪个提到的帖子我也看过了,ddk里面我怎么找不到关于packet==null的怎么处理,按照胡的方法倒是可以运行,但是时间长了就不稳定了,而且我传输大量数据也不稳定,请问有没有那里有很好的例子,或者如果那位有兴趣的好心人帮我看看我整理的例子(在虚拟机上稳定,但是在8139上不稳定)
这个帖子是两年前的,估计大家都比较清楚吧 ,帮在下一把 |
|
|