阅读:2779回复:18
在passthru里面的RecieveHandler里面NdisSend的问题
小弟想做数据包转发,所以在passthru里面的PtReceivePacket里面做文章,在使用NdisQueryPacket,NdisQueryBuffer获取包的内容后,将数据包的以太网头作了一点修改,然后调用NdisSend将数据报发送出去,结果系统蓝屏,错误码是DRIVER_IRQL_LESS_OR_EQUAL,莫非在PtReceivePacket里面不能调用NdisSend?请版主和各位兄弟帮小弟一把~~:>
|
|
最新喜欢:suerdj...
|
沙发#
发布于:2002-11-26 15:58
我也想知道,帮你 UP!
|
|
板凳#
发布于:2002-11-26 16:04
应该做一个队列,把包插入队列,然后一个定时函数去查队列发包吧,在receive里面调用send肯定是不行
|
|
|
地板#
发布于:2002-11-26 16:20
在驱动程序里面,怎么做定时程序呢?
还有,为什么在Receive里面做Send就一定不行呢? 请指教! |
|
|
地下室#
发布于:2002-11-26 16:36
可以用ndissettimer,看一下这个的DDK就可以了,
至于为什么收包的时候不能发包,我还没有仔细想过,不过我肯定不会这么干的,ndis在等待收包函数的返回,你却调用发包函数,估计ndis不会支持这种操作 |
|
|
5楼#
发布于:2002-11-26 17:01
mikeluo,可我在我的 VxD 程序里就是这样做的啊
|
|
6楼#
发布于:2002-11-26 19:00
记得edust说可以,你问问她吧!!我觉得你只要告诉NDIS这是个有错误的包不就得了吗?反正你只要让NDIS不要往上传就可以了!不然肯定会出错了!
|
|
|
7楼#
发布于:2002-11-27 08:42
不让NDIS上传数据包倒是很简单阿,在Receive里面直接返回就行了嘛.但是我想要的是根据Receive的包的状态的不同将其转发到不同的地方去阿...... :o
|
|
|
8楼#
发布于:2002-12-02 08:52
我翻了翻前面的帖子,hu大侠说过在PtReceive里面做转发也是可以的,我查了查DDK,也觉得应该没有问题--我发出去的包是完全拷贝的,所以不存在NDIS在等着接收这个包,我却在同时把这个包发出去的问题.经过近一周的郁闷之后,我终于找到了蓝屏的原因,其实很简单,passthru在MPSend里面给出的代码只是做了packet descriptor的重新分配拷贝,其实数据包的具体内容它是没有采取完全拷贝的方式,而是用指针直接指了过去.在NDIS返回pendding时,对应要调用的PtSendComplete里面是对应这种方式来释放内存的,而我的转发是将数据包完全拷贝了一个再转发,所以这种释放内存方式对于我的程序行不通,只要相应的将MPSend里面的方式和PtSendComplete的内存释放方式改过来,就不会蓝屏了.
|
|
|
9楼#
发布于:2002-12-02 08:58
谢谢,经验之谈!
|
|
10楼#
发布于:2002-12-02 10:08
大家共同学习阿,希望能帮得上其他后来的朋友少走一点弯路:>
|
|
|
11楼#
发布于:2002-12-02 12:03
顶一顶
|
|
|
12楼#
发布于:2002-12-06 14:18
错误码是DRIVER_IRQL_LESS_OR_EQUAL是释放方式不对吗?
难道不是内存访问错误吗??? 我也是老是出错在这里。。。 PtSendComplete内存释放方式应该怎么改呢??? 能不能把具体的PtSendComplete部分的代码给帖出来呀? 最好把你包的复制部分的原代码也帖出来,让我们这些初学者分享一下经验吧。。。 |
|
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的初学者。。。。。希望大家多多给我帮助,多多给我鼓励 |
|
14楼#
发布于:2002-12-06 14:24
这里的连续访问和非连续访问应该怎么理解呢??? 是串行和非串行吧?! |
|
15楼#
发布于:2002-12-06 16:46
[quote] 这里的连续访问和非连续访问应该怎么理解呢??? 是串行和非串行吧?! [/quote] 是串行和非串行吧?!是指的什么情况呀? 非串行又是指的什么情况呀? 能否列举一些具体的情况或是例子呀? |
|
16楼#
发布于:2002-12-06 17:21
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护
|
|
17楼#
发布于:2002-12-06 17:36
bingjie
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护 如果加自旋锁,对数据广播的效率会有多大的影响? 如果使用队列的话,是否还得建立线程? 用队列的话,需要管理那些东西? bingjie随便说说:)))))))))))))))))))))))))))))) |
|
|
18楼#
发布于:2002-12-07 00:24
serialize 和deserialize是指你在调用NdisMSetAttributes是的属性,当你设定serialize时ndis将保证对你的操作是串行的,即不会由重入和多线程冲突问题,但若你设为deserialize时ndis将会在你还未处理完一个发送时有可能会再让你发送另外一个packet,此时的同步需要你自己来完成,比如使用队列或加锁保护 原来是这样呀~~~经过指点后,我总算弄明白了。。。谢谢 |
|