4178|6

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

初学驱动,学到一个函数,希望高手能帮忙解惑,听说标题要长。。。。。。。。。。。。。 [复制链接]

Windows 下的驱动编程


有个函数

NTKERNELAPI
NTSTATUS
IoGetDeviceObjectPointer(
  __in PUNICODE_STRING ObjectName,
  __in ACCESS_MASK DesiredAccess,
  __out PFILE_OBJECT *FileObject,
  __out PDEVICE_OBJECT *DeviceObject
  );


其中有2个指针 PFILE_OBJECT *FileObject, 是什么?


我知道创建驱动的时候,会创建设备,这个时候有 PDEVICE_OBJECT *DeviceObject 设备对象指针是正常的 ,那么文件对象指针是什么,我不记得创建过啊?



我刚学驱动几天,忘高手解惑

最新回复

帮顶,坐等高手!!  详情 回复 发表于 2010-6-18 12:53
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮你顶

应该问  张帆
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你问的问题比较笼统,所以,最好的答案就是WDK里面的解释说明。

驱动程序对应的File Object经常在IRP_MJ_CREATE的时候被创建。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
打开文件或设备时,系统会创建一个FileObject,用来记录此次打开该文件或设备的一些信息,例如名称、访问权限、共享方式、状态等,具体见MSDN中FILE_OBJECT的相关说明。IoGetDeviceObjectPointer实际上就是打开设备,所以会得到一个FileObject,类似于句柄,在访问完该设备后,需要调用ObDereferenceObject解除对FileObject的引用,类似于关闭句柄,之后不可再使用DeviceObject。如要长时间使用DeviceObject,可以先调用ObReferenceObjectByPointer引用DeviceObject,然后再ObDereferenceObject解除对FileObject的引用,最后不需要再访问DeviceObject,再调用ObDereferenceObject解除对DeviceObject的引用。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
PFILE_OBJECT *FileObject 是文件对象啊。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
IoGetDeviceObjectPointer函数从下层的设备对象名称来获得下层设备指针。该函数造成了对下层设备对象以及下层设备对象所对应的文件对象的引用。如果本层驱动在卸载之前对下层的设备对象的引用还没有消除,则下层驱动的卸载会被停止。因此必须要消除对下层设备对象的引用。
但是程序一般不会直接对下层设备对象的引用减少。原因在于当文件对象的引用减小后,设备对象的引用也会相应自动减小。因此只要减少对文件对象的引用就可以减少文件对象和设备对象两个对象的引用。而如果单独再减少对设备对象的引用,会导致两次减少对设备对象的引用。但是,如果在本驱动的卸载例程之前减少了对文件对象的引用,从而导致设备对象的引用降为0,则有可能导致下层驱动对象的过早删除。因此,如果想在卸载例程之外减小对文件对象的引用,又要在减少对文件对象的引用之前对设备对象增加一次额外的引用,然后在减少对文件对象的引用之后再减小对设备对象的引用。
事实上,IoGetDeviceObjectPointer返回的并不是下层设备对象的指针。而是该设备堆栈中顶层的设备对象的指针。当然,IRP会一层一层的转发下去,因此下层驱动会得到该IRP。
IoGetDeviceObjectPointer在内部干了如下的操作。ZwCreateFile ObReferenceObjectByHandle ZwClose IoGetRelatedDeviceObject。在IoGetDeviceObjectPointer后如果调用了IoCallDriver发送私有IRP,然后又调用ObDereferenceObject,这一系列的操作会引发如下的IRP被发送到目标设备对象。IRP_MJ_CREATE IRP_MJ_CLEANUP IRP_MJ_DEVICECONTROL IRP_MJ_CLOSE。当有文件句柄被创建时,IRP_MJ_CREATE被发送;当所有文件句柄关闭时,IRP_MJ_CLEANUP被发送;IRP_MJ_DEVICECONTROL对应私有IRP发送;IRP_MJ_CLOSE则是ObDereferenceObject后文件对象的引用为0后被发送。由此可看出,IRP_MJ_CLEANUP是文件对象句柄计数为0时被发送,而IRP_MJ_CLOSE是文件对象的引用计数为0时发送。
http://wangjiajun53880.blog.163.com/blog/static/11700139420094187540796/
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
帮顶,坐等高手!!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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