4821|8

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请问高手一个请教NDIS驱动 [复制链接]

1)NDIS中间驱动绑定的设备是指网卡吗?我电脑只有1块网卡,但是发现他调用了2次绑定函数,那就是绑定了2个设备,会不会虚拟网卡他也绑定?

2)挂载点如Miniport_Send之类的函数,如果NDIS绑定了多个设备,那么,这些函数会不会被设备同时调用?函数里面的访问的全局变量需要同步吧?

3)NDIS中间驱动和exe通讯问题,我在NDIS里面调用IoCreateNotificationEvent函数创建了一个事件,然后调用KeResetEvent函数设置事件为NonSingal状态,exe进程里面调用Waitfor...函数去等待这个事件,现在的问题是:当在驱动调用KeSetEvent函数的时候:KeSetEvent(hEvent,0,false) ,系统蓝屏,显示信息是IRQL_NOT_LESS_OR_EQUAL ,我估计是IRQL出了问题,DDK上说KeSetEvent最后一个参数为false的时候,必须运行在IRQL <= DISPATCH_LEVEL上,为true时,需要运行在 IRQL = PASSIVE_LEVEL 上,而另外一本书说,NDIS驱动是运行在IRQL <= DISPATCH_LEVEL上的,如果是这样,那IRQL符合KeSetEvent函数的要求啊,那为什么还会出错呢?

最新回复

yzgxcm你好,我刚开始研究NDIS,希望能和你一起探讨,共同进步,我的QQ:109971320  详情 回复 发表于 2008-4-29 02:11
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1)各种驱动程序都是绑定一类设备,而不是单独的某一个设备。
2)即使只有一个设备,也可能被多个线程同时调用,全局数据肯定要考虑线程同步。另外应尽量不使用或者少使用全局数据。
3)应用程序是不能使用内核事件对象的,最好是应用程序创建一个事件,将句柄传给驱动程序,驱动程序用ZwSetEvent来设置事件(IRQL必须是PASSIVE_LEVEL)。
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
万分感谢cnzdgs的回答!!
对于第3个问题,我已经解决了,原因是KeSetEvent的时候,事件句柄为NULL。。。。
再请教一下,我在NDIS中间驱动的绑定设备的函数里面,调用IoCreateNotificationEvent函数创建事件对象,每次开机的时候都会蓝屏。。。这是为什么呢?同时,DDK上说IoCreateNotificationEvent这个函数在创建的对象在用户态下是可以访问的阿,只要对象名字符合一定的格式就可以。。
谢谢!!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
蓝屏可能与IRQL有关,也有很多其它可能的原因,最好调试一下来分析。
驱动程序可以直接访问内核对象,而应用程序必须使用句柄。在应用程序与驱动程序之间的通讯都是有应用程序主动发起的,所以由应用程序来创建对象并传递给驱动程序比较合适。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢cnzdgs,我在驱动里面调用IoCreateNotificationEvent,在exe里面OpenEvent,发现在exe程序里面Waitfor失败,打算放弃在驱动里面创建Event,按照你的建议在Exe里面创建。。谢谢你的建议!!
另外,还有一个问题想不出:


我那个NDIS例子:在DevIoControl函数里面(该函数是处理IRP_MJ_DEVICE_CONTROL的,即:DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl),
函数主要代码:
.....
ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
.....
case IOCTL_PTUSERIO_OPEN_ADAPTER:
    pIrpStack->FileObject->FsContext = pOpenContext;//pOpenContext是一个结构体指针
case IOCTL_PTUSERIO_ADD_FILTER_ADAPTER:
    POPEN_CONTEXT       pOpenContext = pIrpStack->FileObject->FsContext;//这里有疑问
我调用DeiceIoControl(..,IOCTL_PTUSERIO_OPEN_ADAPTER,...)的时候,NDIS把pOpenContext和IRP关联起来,可以,该IRP处理完毕后,不是被删除了吗?为什么在IOCTL_PTUSERIO_ADD_FILTER_ADAPTER的case里面可以获取回来的?
谢谢!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

6
 
不太明白你的意思。
pIrpStack->FileObject->FsContext = pOpenContext是把pOpenContext保存在了文件对象里面(而不是Irp里面),只要文件对象不释放(关闭),随时都可以在取出来。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼上的大哥 ,你是做NDIS驱动方面的的嘛?小弟也在搞这方面的,希望能与大哥一起学习。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
感谢cnzdgs的回答,原来pIrpStack->FileObject->FsContext = pOpenContext的意思是保存在文件对象里面,谢谢。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
yzgxcm你好,我刚开始研究NDIS,希望能和你一起探讨,共同进步,我的QQ:109971320
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表