bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:3059回复:33

关于ProtocolReceive!急救!!!!

楼主#
更多 发布于:2003-03-11 11:34
本人想对在ProtocolReceive中收到的数据进行处理。可是当数据不全时,要调用NdisTransferData函数来接收其实的数据(DDK文档上说得)。可是看DDK的例子,它是在MiniPortTransferData中调用的。请大侠们给解释一下。还有我在什么地方处理数据(比如解压)什么时候释放资源!谢谢!!!

最新喜欢:

txysptxysp
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-11 14:53
本人想对在ProtocolReceive中收到的数据进行处理。可是当数据不全时,要调用NdisTransferData函数来接收其实的数据(DDK文档上说得)。可是看DDK的例子,它是在MiniPortTransferData中调用的。请大侠们给解释一下。还有我在什么地方处理数据(比如解压)什么时候释放资源!谢谢!!!


我刚刚在一个帖子里做了些解释,去看看吧,就怕有说错的地方。
 
http://www.driverdevelop.com/forum/html_36170.html?1047365499
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-11 16:57
 
          收 件 箱
   删除         文章标题        From: 驱动开发网论坛管理员<        发送日期
               <没有标题>        bluetiger                  2003/3/12 - 00:27
               关于调用Dll       bluetiger           2003/3/11 - 20:05
               请问!            bluetiger               2003/3/11 - 19:42

 


我这几次一上来就看到这些东西,是不是你老兄给我发什么东西了?可除了看见的这点东西之外,什么都翻不出来了,我左点右点前点后点上点下点鼠标都快点坏了也点不出什么新东西来。

突然发现,现在才2003年3月11日17时不到,怎么老兄你发送上面<没有标题>的日期已经是3月12日凌晨了?让我算算看,你呆的地方比北京时间早了8个小时,莫非老兄你在大不列颠?



[编辑 -  3/14/03 by  SharpShooter]
写驱动不如买足彩!!
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-12 11:10
不会吧!
我是问你一些问题了!怎么看不见呢??

问题是,按你所说:在protocolreceivecomplete中向上指示数据(NdisMindicateReceivePacket)。可是我这里调用总是不成功!
是不是得设置一下packet的什么属性呀?还有,在调用 NdisTransferData之前,我的包怎么分配缓冲区描述符(MDL)
你有这方面的例子吗?如果有给我一份好吗?bluesas007@sina.com
我把我的115分都给你。

谢谢!!!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-12 16:43
不会吧!
我是问你一些问题了!怎么看不见呢??

问题是,按你所说:在protocolreceivecomplete中向上指示数据(NdisMindicateReceivePacket)。可是我这里调用总是不成功!
是不是得设置一下packet的什么属性呀?还有,在调用 NdisTransferData之前,我的包怎么分配缓冲区描述符(MDL)
你有这方面的例子吗?如果有给我一份好吗?bluesas007@sina.com
我把我的115分都给你。

谢谢!!!!
 

调用不成功?不会的,你确认参数给对了吗?如果你收到的不是整包的话,你需要调用NdisAllocatePacket分配Packet描述符,然后把你调用NdisAllocateBuffer分配的MDL挂上去,NdisMIndicateReceivePacket的第二个参数就是Packet描述符的指针。好像NdisTransferData没有参数需要填MDL吧?看仔细了。这方面的例子就是Passthru,里面各种调用的情况都有,够你用了。
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-13 11:34
我觉得问题不大,这是你代码的Copy吗?如果是的话,你返回的值不对,NTSTATUS 0表示成功,1就是失败了。
写驱动不如买足彩!!
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-13 13:11
当返回0时,我在ProtocolReceive中设置Status = NDIS_STATUS_FAILURE 反之为  NDIS_STATUS_SUCCESS
这个没有多大的关系。

可是,当NdisMindicatePacket()后检查pMyPakcet 的状态总是NDIS_STATUS_PENDING 而且,MiniPortTransDataComplete()和MiniPortReturnPakcet()都没有反映。

如果 不调用NDIS_SET_PACKET_STATUS(pMyPacket, NDIS_STATUS_RESOURCES),MiniPortReturnPakcet() 会有反映,MiniPortTransDataComplete()没有,而且在MiniPortReturnPakcet() 检查pMyPacket的状态是NDIS_STATUS_PENDING

哎,实在是没有办法了。就是搞不通。这可怎么办。头还让我这个星期出东东呢!大家救救我吧! :( :( :( :( :( :mad: :mad:
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-13 15:54
当返回0时,我在ProtocolReceive中设置Status = NDIS_STATUS_FAILURE 反之为  NDIS_STATUS_SUCCESS
这个没有多大的关系。

可是,当NdisMindicatePacket()后检查pMyPakcet 的状态总是NDIS_STATUS_PENDING 而且,MiniPortTransDataComplete()和MiniPortReturnPakcet()都没有反映。

如果 不调用NDIS_SET_PACKET_STATUS(pMyPacket, NDIS_STATUS_RESOURCES),MiniPortReturnPakcet() 会有反映,MiniPortTransDataComplete()没有,而且在MiniPortReturnPakcet() 检查pMyPacket的状态是NDIS_STATUS_PENDING

哎,实在是没有办法了。就是搞不通。这可怎么办。头还让我这个星期出东东呢!大家救救我吧! :( :( :( :( :( :mad: :mad:


那我就搞不清了,你还是拿Passthru慢慢改吧,先把它的接收时直接向上递的做法改成整包向上递,通了的话,再做别的处理吧。或者你先把你对包的处理部分都砍掉,往来的包看一眼就往上送、往外发,拿两台机器调调看发出来没有,也可以拿Sniffer看看上层收到没有。
写驱动不如买足彩!!
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-13 16:16
我怎么给不了分了!

哎!没有办法呀。我把所有的处理都去掉了。可是还是不行!

就是向上传递不通。向外发送没有问题了!
谢谢了!
真是郁闷呀! :( :( :( :(
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-13 16:39
没有办法了,还是没有反映!你帮我看一下我的代码:这是在ProtocolReceive中实现的:
NdisAllocatePacket(&Status, &pMyPacket, pAdapt->RecvPacketPoolHandle);
if (Status != NDIS_STATUS_SUCCESS){
DbgPrint(\"###In PtReceive NdisAllocatePacket-pMyPacket Failed \");
break;
}
((PRSVD)(pMyPacket->MiniportReserved))->OriginalPkt = NULL;

NDIS_SET_PACKET_HEADER_SIZE(pMyPacket, HeaderBufferSize);
NDIS_SET_PACKET_STATUS(pMyPacket, NDIS_STATUS_RESOURCES);

NdisGetCurrentSystemTime(&sysTime);
NDIS_SET_PACKET_TIME_RECEIVED(pMyPacket, (ULONGLONG)sysTime.QuadPart);

NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(pMyPacket, NULL, 0 );

if(IP_RecProccess(pMyPacket,HeaderBuffer, HeaderBufferSize,
LookAheadBuffer,LookAheadBufferSize,PacketSize,pAdapt,MacReceiveContext) == 0)
Status=NDIS_STATUS_FAILURE;

IP_RecProccess()是我写得一个子函数!如下:
{
//为头分配一个buffer描述符:
NdisAllocateMemoryWithTag(&tmp, HeadBufSize, TAG);
NdisZeroMemory(tmp, HeadBufSize);

NdisMoveMemory(tmp, HeadBuf, HeadBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, HeadBufSize);

if (Status != NDIS_STATUS_SUCCESS){
DbgPrint(\"IP_RecProccess Allocate HeadBuffer is Error\\n\");
NdisZeroMemory(tmp, HeadBufSize);
NdisFreeMemory(tmp, HeadBufSize, 0);
return 0;
}
NdisChainBufferAtBack(Packet, buf);
//为预览区分配一个buffer描述符
NdisAllocateMemoryWithTag(&tmp, LookBufSize, TAG);
NdisZeroMemory(tmp, LookBufSize);
NdisMoveMemory(tmp, LookBuf, LookBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, LookBufSize);
if (Status != NDIS_STATUS_SUCCESS){
NdisZeroMemory(tmp, LookBufSize);
NdisFreeMemory(tmp, LookBufSize, 0);

FreeReSource(Packet);
DbgPrint(\"AllocateBuffer-LookBuffer  is Error\\n\");
return 0;
}
NdisChainBufferAtBack(Packet, buf);
NdisQueryPacket(Packet, NULL, NULL, NULL, &btCount);
//如果还有数据没有接收,再分配一个描述符!
if (PacketSize != LookBufSize){
NdisAllocateMemoryWithTag(&tmp, PacketSize - LookBufSize, TAG);
NdisZeroMemory(tmp, PacketSize - LookBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, PacketSize - LookBufSize);
if (Status != NDIS_STATUS_SUCCESS){
NdisZeroMemory(tmp, PacketSize - LookBufSize);
NdisFreeMemory(tmp, PacketSize - LookBufSize, 0);
FreeReSource(Packet);
DbgPrint(\"AllocateBuffer  is Error\\n\");
return 0;
}
NdisChainBufferAtBack(Packet, buf);
NdisQueryPacket(Packet, NULL, NULL, NULL, &btCount);

NdisTransferData(&Status, pAdapt->BindingHandle,
MacReceiveContext, LookBufSize + 1,PacketSize - LookBufSize,
Packet, &btCount);
if (Status == NDIS_STATUS_SUCCESS || Status == NDIS_STATUS_PENDING){
DbgPrint(\"TrasferData is OK\\n\");
return 1;
}else{
FreeReSource(Packet);
return 0;
}
}

在ProtocolReceiveComplete中我调用了
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pMyPacket, 1);

加载后,所有的数据包都没有传递上去。
请帮我看看!!谢谢!!!

[编辑 -  3/12/03 by  bluetiger]


粗看了一下你的代码,没太大的问题。
可能的原因你有没有NdisMEthIndicateReceiveComplete,告知上层一个接收结束?
我思故我在,脑袋不会坏.
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-13 16:40
没有办法了,还是没有反映!你帮我看一下我的代码:这是在ProtocolReceive中实现的:
NdisAllocatePacket(&Status, &pMyPacket, pAdapt->RecvPacketPoolHandle);
if (Status != NDIS_STATUS_SUCCESS){
DbgPrint(\"###In PtReceive NdisAllocatePacket-pMyPacket Failed \");
break;
}
((PRSVD)(pMyPacket->MiniportReserved))->OriginalPkt = NULL;

NDIS_SET_PACKET_HEADER_SIZE(pMyPacket, HeaderBufferSize);
NDIS_SET_PACKET_STATUS(pMyPacket, NDIS_STATUS_RESOURCES);

NdisGetCurrentSystemTime(&sysTime);
NDIS_SET_PACKET_TIME_RECEIVED(pMyPacket, (ULONGLONG)sysTime.QuadPart);

NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(pMyPacket, NULL, 0 );

if(IP_RecProccess(pMyPacket,HeaderBuffer, HeaderBufferSize,
LookAheadBuffer,LookAheadBufferSize,PacketSize,pAdapt,MacReceiveContext) == 0)
Status=NDIS_STATUS_FAILURE;

IP_RecProccess()是我写得一个子函数!如下:
{
//为头分配一个buffer描述符:
NdisAllocateMemoryWithTag(&tmp, HeadBufSize, TAG);
NdisZeroMemory(tmp, HeadBufSize);

NdisMoveMemory(tmp, HeadBuf, HeadBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, HeadBufSize);

if (Status != NDIS_STATUS_SUCCESS){
DbgPrint(\"IP_RecProccess Allocate HeadBuffer is Error\\n\");
NdisZeroMemory(tmp, HeadBufSize);
NdisFreeMemory(tmp, HeadBufSize, 0);
return 0;
}
NdisChainBufferAtBack(Packet, buf);
//为预览区分配一个buffer描述符
NdisAllocateMemoryWithTag(&tmp, LookBufSize, TAG);
NdisZeroMemory(tmp, LookBufSize);
NdisMoveMemory(tmp, LookBuf, LookBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, LookBufSize);
if (Status != NDIS_STATUS_SUCCESS){
NdisZeroMemory(tmp, LookBufSize);
NdisFreeMemory(tmp, LookBufSize, 0);

FreeReSource(Packet);
DbgPrint(\"AllocateBuffer-LookBuffer  is Error\\n\");
return 0;
}
NdisChainBufferAtBack(Packet, buf);
NdisQueryPacket(Packet, NULL, NULL, NULL, &btCount);
//如果还有数据没有接收,再分配一个描述符!
if (PacketSize != LookBufSize){
NdisAllocateMemoryWithTag(&tmp, PacketSize - LookBufSize, TAG);
NdisZeroMemory(tmp, PacketSize - LookBufSize);

NdisAllocateBuffer(&Status, &buf, pAdapt->hSendBufPool, tmp, PacketSize - LookBufSize);
if (Status != NDIS_STATUS_SUCCESS){
NdisZeroMemory(tmp, PacketSize - LookBufSize);
NdisFreeMemory(tmp, PacketSize - LookBufSize, 0);
FreeReSource(Packet);
DbgPrint(\"AllocateBuffer  is Error\\n\");
return 0;
}
NdisChainBufferAtBack(Packet, buf);
NdisQueryPacket(Packet, NULL, NULL, NULL, &btCount);

NdisTransferData(&Status, pAdapt->BindingHandle,
MacReceiveContext, LookBufSize + 1,PacketSize - LookBufSize,
Packet, &btCount);
if (Status == NDIS_STATUS_SUCCESS || Status == NDIS_STATUS_PENDING){
DbgPrint(\"TrasferData is OK\\n\");
return 1;
}else{
FreeReSource(Packet);
return 0;
}
}

在ProtocolReceiveComplete中我调用了
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pMyPacket, 1);

加载后,所有的数据包都没有传递上去。
请帮我看看!!谢谢!!!

[编辑 -  3/12/03 by  bluetiger]

粗看了一下你的代码,没太大的问题。
可能的原因你有没有NdisMEthIndicateReceiveComplete,告知上层一个接收结束?
我思故我在,脑袋不会坏.
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-13 16:44
我觉得没有这个必要吧!我试试!等一会!!
谢谢!!!! :) :) :)
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-13 16:56
不行呀!
你看我这样调用可以吗?
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pMyPacket, 1);
NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle);

你有这方面的例程吗?
谢谢!!! :D :D :D :D
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-03-13 16:58
非常的必要

[编辑 -  3/13/03 by  mikeluo]
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-03-13 16:58
我觉得没有这个必要吧!我试试!等一会!!
谢谢!!!! :) :) :)

非常的有必要,看DDK文档。
我思故我在,脑袋不会坏.
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-03-13 17:02
我调用的是NdisMIndicateReceivePacket()
上层应该收到得是一个整包呀!
不用调用NdisMIndicateReceivePacket吧!
我也只是猜测!

你作过用NdisMIndicateReceivePacket()向上传包吗?
有的话,把你这块代码给我看看好吗?
我把我所有的分都给你。
如果的话,请你吃饭了!
请大家都帮我看看好吗?
菜鸟在此谢谢了!!!
 :mad: :mad:
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-03-13 17:10
看一下NdisMEthIndicateReceiveComplete的说明,

ddk里面的
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-03-13 17:23
按你所说,我调用了。
可是还是不行!!!
这可怎么办??????????????
附件名称/大小 下载次数 最后更新
2003-03-13_TestDD.rar (115KB)  6
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-03-13 17:37
你调用ndistransferdata,怎么处理的ndistransferdatacomplete?
为什么在receivpcomplete里面向上交包?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
bluetiger
驱动牛犊
驱动牛犊
  • 注册日期2003-02-22
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望100点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-03-13 17:48
调用NdisTransferData后,MiniPortTransDataComplete就没有响应过。(我保持原来的Passthru的部分没有动!)
看ddk文档上说,就好在此处处理数据,所以在处理完后,再向上批示数据。
SharpShooter也这么说得。而且我调用ndistransferdata后,MiniPortTransferDataComplete就没有响应过!我也不知为什么?
很郁闷呀!!
谢谢!!!

 :( :(
上一页
游客

返回顶部