ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1793回复:12

page fault是什么错误?

楼主#
更多 发布于:2003-05-13 20:50
我在MPSend中申请了内存,把要发送的包拷贝,然后发送自己的包。
原来的包释放掉。最后发送完毕释放自己的包和内存,如果发送返回pending,则在ptsendcomplete中释放。
程序编译通过,安装后不久softice弹出,显示pagefault错误,这是什么错误啊?通常为什么出现?应该怎样解决?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-14 09:18
页面错误,基本上都是不正确的内存访问
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-14 10:44
不正确的内存访问包括什么?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-14 11:01
读写非法的内存地址。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-14 11:09
我在mpsend中申请内存然后把mypacket复制过来发出,当返回pending的时候应该如何释放内存?我的错误就在这里。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-14 11:37
pend就在sendcomplete里面释放,
不过你要在mpsend里面返回成功,通知协议释放老的packet
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-14 11:53
pend就在sendcomplete里面释放,
不过你要在mpsend里面返回成功,通知协议释放老的packet

哦?还有这一说?贴一下我的代码。
在mpsend中:
NdisSend(&Status, pAdapt->BindingHandle, MyNewPacket);
if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyNewPacket);
NdisFreePacket(MyNewPacket);
}
NdisFreePacket(MyPacket);//用不用设置它的状态?
return(Status);//这里必须要返回NDIS_STATUS_SUCCESS么?
在PtSendComplete中,我这样释放内存:
VOID
PtSendComplete(。。。)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET Pkt;
PRSVD Rsvd;
PNDIS_BUFFER pNdisBuffer;
PUCHAR pPacketContent;
UINT BufferLen;
DbgPrint(\"==>PtSendComplete...\\n\");

pAdapt = pAdapt->pPrimaryAdapt;

Rsvd =(PRSVD)(Packet->ProtocolReserved);
Pkt = Rsvd->OriginalPkt;
//一直不懂上面两句是什么意思,反正程序是走else,不是if...
if(Pkt)
{
NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);
NdisDprFreePacket(Packet);
NdisMSendComplete(pAdapt->MiniportHandle,Pkt,Status);
DBGPRINT((\"In PtSendcomplete And Free Memory...if\\n\"));
}
else
{
NdisUnchainBufferAtFront(Packet,&pNdisBuffer);
NdisQueryBufferSafe(pNdisBuffer,(PVOID *)&pPacketContent,&BufferLen,32);
NdisFreePacket(Packet);
NdisFreeBuffer(pNdisBuffer);
NdisFreeMemory(pPacketContent,2000,0);
DBGPRINT((\"In PtSendcomplete And Free Memory.\\n\"));
}
}
主要就这些代码,我把心里发虚的地方都注释了,另外PtSendComplete函数也请mikeluo大侠审查一下,我认为肯定有错误。
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-14 12:54
[quote]pend就在sendcomplete里面释放,
不过你要在mpsend里面返回成功,通知协议释放老的packet

哦?还有这一说?贴一下我的代码。
在mpsend中:
NdisSend(&Status, pAdapt->BindingHandle, MyNewPacket);
if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyNewPacket);
NdisFreePacket(MyNewPacket);
}
NdisFreePacket(MyPacket);//用不用设置它的状态?
return(Status);//这里必须要返回NDIS_STATUS_SUCCESS么?
在PtSendComplete中,我这样释放内存:
VOID
PtSendComplete(。。。)
{
pAdapt = pAdapt->pPrimaryAdapt;

Rsvd =(PRSVD)(Packet->ProtocolReserved);
Pkt = Rsvd->OriginalPkt;
//一直不懂上面两句是什么意思,反正程序是走else,不是if...
if(Pkt)
{
NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);
NdisDprFreePacket(Packet);
NdisMSendComplete(pAdapt->MiniportHandle,Pkt,Status);
DBGPRINT((\"In PtSendcomplete And Free Memory...if\\n\"));
}
else
{
NdisUnchainBufferAtFront(Packet,&pNdisBuffer);
NdisQueryBufferSafe(pNdisBuffer,(PVOID *)&pPacketContent,&BufferLen,32);
NdisFreePacket(Packet);
NdisFreeBuffer(pNdisBuffer);
NdisFreeMemory(pPacketContent,2000,0);
DBGPRINT((\"In PtSendcomplete And Free Memory.\\n\"));
}
}
主要就这些代码,我把心里发虚的地方都注释了,另外
 [/quote]

在你的MPSend中对上层传下来的Packet怎么处理的?
在PtSendComplete中,我觉得应该走else。
因为Pkt应该是指你在MPSend中由上层传下来的Packet
此时应该不会释放。
还有:你MPSend中MyNewPacket应该是你自己allocate的,那个MyPacket是什么?上层传下来的packet?如果是的话,那就不应该
在你这里释放。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-14 13:10
如果你已经把packet的内容都copy出来了,那就在mpsend里面返回success,如果你是象passthru那样分配一个新的paket,但是用的老的buffer,那就参考passthru的处理方式来处理,在sendcomplete里面释放你分配的packet,然后在调用NdisMSendComplete通知系统释放他们分配的packet和buffer
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-14 19:48
如果你已经把packet的内容都copy出来了,那就在mpsend里面返回success,如果你是象passthru那样分配一个新的paket,但是用的老的buffer,那就参考passthru的处理方式来处理,在sendcomplete里面释放你分配的packet,然后在调用NdisMSendComplete通知系统释放他们分配的packet和buffer

我也感觉我的程序比较乱的,大侠的意思是说我应该把passthru源码中的构造myPacket部分去掉么?然后分配内存,构造自己的数据包?
请明示。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-15 09:13
我说的 你分配的指的是在passthru中分配的packet和buffer,包括那个例子中分配的mypacket。对于你自己构造的用来发送的packet,你也可以使用mypacket。

似乎在passthru里面必须使用自己的packet 来发包才行。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-15 09:35
我说的 你分配的指的是在passthru中分配的packet和buffer,包括那个例子中分配的mypacket。对于你自己构造的用来发送的packet,你也可以使用mypacket。

似乎在passthru里面必须使用自己的packet 来发包才行。

还是不太明白,大侠不要见怪。
我说一下我的理解:根据我的学习,我认为2000DDK自己带的源码之中,在mpsend中的mypacket只是传递了一个包的指针,没有相应的分配内存什么的操作。
现在我为了实现特定功能,必须按照规范操作,就是申请内存,分配包描述符,然后ndissend自己的数据报。
我的问题是:
1。既然这样,mypacket的唯一作用是作为拷贝的原本,那么拷贝完成以后我可以直接free掉么?
2。我这样申请内存,在不返回pending和返回pending的时候应该如何释放内存?我查阅了DDK文档,但是没有找到关于这方面的更多资料,还请大侠指教。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-15 10:37
那个例子本身是演示了一下如何在passthru里面转发包。那个mypacket链接的是老的buffer,你当然可以分配新的buffer,然后chain到mypacket上,发送这个mypacket。这个mypacket也是你分配的,要由你来释放。如果发送的packet和buffer都是你分配的,和老的packet没有关系,那么就可以在mpsend里面返回一个success来通知协议层他的那个packet已经发送成功了,他可以释放他分配的packet和buffer了。然后你在根据ndissend的返回值来处理你自己分配的mypacket和buffer。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
游客

返回顶部