diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2779回复:18

在passthru里面的RecieveHandler里面NdisSend的问题

楼主#
更多 发布于:2002-11-26 15:06
小弟想做数据包转发,所以在passthru里面的PtReceivePacket里面做文章,在使用NdisQueryPacket,NdisQueryBuffer获取包的内容后,将数据包的以太网头作了一点修改,然后调用NdisSend将数据报发送出去,结果系统蓝屏,错误码是DRIVER_IRQL_LESS_OR_EQUAL,莫非在PtReceivePacket里面不能调用NdisSend?请版主和各位兄弟帮小弟一把~~:>

最新喜欢:

suerdj2ksuerdj...
I believv i can fly I believe i can touch sky
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-26 15:58
我也想知道,帮你 UP!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-26 16:04
应该做一个队列,把包插入队列,然后一个定时函数去查队列发包吧,在receive里面调用send肯定是不行
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-26 16:20
在驱动程序里面,怎么做定时程序呢?
还有,为什么在Receive里面做Send就一定不行呢?
请指教!
I believv i can fly I believe i can touch sky
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-26 16:36
可以用ndissettimer,看一下这个的DDK就可以了,

至于为什么收包的时候不能发包,我还没有仔细想过,不过我肯定不会这么干的,ndis在等待收包函数的返回,你却调用发包函数,估计ndis不会支持这种操作
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-26 17:01
mikeluo,可我在我的 VxD 程序里就是这样做的啊
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-26 19:00
记得edust说可以,你问问她吧!!我觉得你只要告诉NDIS这是个有错误的包不就得了吗?反正你只要让NDIS不要往上传就可以了!不然肯定会出错了!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-27 08:42
不让NDIS上传数据包倒是很简单阿,在Receive里面直接返回就行了嘛.但是我想要的是根据Receive的包的状态的不同将其转发到不同的地方去阿...... :o
I believv i can fly I believe i can touch sky
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-02 08:52
我翻了翻前面的帖子,hu大侠说过在PtReceive里面做转发也是可以的,我查了查DDK,也觉得应该没有问题--我发出去的包是完全拷贝的,所以不存在NDIS在等着接收这个包,我却在同时把这个包发出去的问题.经过近一周的郁闷之后,我终于找到了蓝屏的原因,其实很简单,passthru在MPSend里面给出的代码只是做了packet descriptor的重新分配拷贝,其实数据包的具体内容它是没有采取完全拷贝的方式,而是用指针直接指了过去.在NDIS返回pendding时,对应要调用的PtSendComplete里面是对应这种方式来释放内存的,而我的转发是将数据包完全拷贝了一个再转发,所以这种释放内存方式对于我的程序行不通,只要相应的将MPSend里面的方式和PtSendComplete的内存释放方式改过来,就不会蓝屏了.
I believv i can fly I believe i can touch sky
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-02 08:58
谢谢,经验之谈!
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-02 10:08
大家共同学习阿,希望能帮得上其他后来的朋友少走一点弯路:>
I believv i can fly I believe i can touch sky
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-02 12:03
顶一顶
==寂寞骆驼==
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-06 14:18
错误码是DRIVER_IRQL_LESS_OR_EQUAL是释放方式不对吗?
难道不是内存访问错误吗???
我也是老是出错在这里。。。
PtSendComplete内存释放方式应该怎么改呢???
能不能把具体的PtSendComplete部分的代码给帖出来呀?
最好把你包的复制部分的原代码也帖出来,让我们这些初学者分享一下经验吧。。。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-06 14:18
Serialized callers of NdisMSendComplete must run at IRQL DISPATCH_LEVEL. Deserialized callers of NdisMSendComplete can run at IRQL <= DISPATCH_LEVEL.
应该怎么解释这句呀?连续的NdisMSendComplete访问必须运行在DISPATCH_LEVEL
级,非连续的NdisMSendComplete访问可以运行在IRQL <= DISPATCH_LEVEL级。
这里的连续访问和非连续访问应该怎么理解呢???

非常不好意思,我是NDIS的初学者。。。。。希望大家多多给我帮助,多多给我鼓励
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-06 14:24
 
这里的连续访问和非连续访问应该怎么理解呢???


是串行和非串行吧?!
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-06 16:46
[quote] 这里的连续访问和非连续访问应该怎么理解呢???


是串行和非串行吧?! [/quote]


是串行和非串行吧?!是指的什么情况呀?
非串行又是指的什么情况呀?
能否列举一些具体的情况或是例子呀?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-06 17:21
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护
fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-06 17:36
bingjie
 
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护


如果加自旋锁,对数据广播的效率会有多大的影响?
如果使用队列的话,是否还得建立线程?
用队列的话,需要管理那些东西?

bingjie随便说说:))))))))))))))))))))))))))))))
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-07 00:24
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护


原来是这样呀~~~经过指点后,我总算弄明白了。。。谢谢
游客

返回顶部