0.driverbase-IoGetDeviceObjectPointer源码(need ObDereferenceObject)
来源:互联网 发布:java list 合并去重 编辑:程序博客网 时间:2024/06/05 11:37
NTSTATUS IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName,//设备名IN ACCESS_MASK DesiredAccess,//期望访问权限OUT PFILE_OBJECT *FileObject,//OUT文件对象,在驱动卸载前必须把这个文件对象解引用,可以看源码OUT PDEVICE_OBJECT *DeviceObject//OUT设备对象);源码如下: NTSTATUSIoGetDeviceObjectPointer( IN PUNICODE_STRING ObjectName, //设备名 IN ACCESS_MASK DesiredAccess, //期望访问权限 OUT PFILE_OBJECT *FileObject, //文件对象 OUT PDEVICE_OBJECT *DeviceObject //设备对象 ){PFILE_OBJECT fileObject;OBJECT_ATTRIBUTES objectAttributes;HANDLE fileHandle;IO_STATUS_BLOCK ioStatus;NTSTATUS status; PAGED_CODE(); //must be running at IRQL = PASSIVE_LEVEL InitializeObjectAttributes( &objectAttributes,ObjectName,OBJ_KERNEL_HANDLE,(HANDLE) NULL,(PSECURITY_DESCRIPTOR) NULL );//打开文件,获得文件句柄,注意不是文件对象status = ZwOpenFile( &fileHandle,DesiredAccess,&objectAttributes,&ioStatus,0,FILE_NON_DIRECTORY_FILE ); if (NT_SUCCESS( status )){ // 文件句柄映射到文件对象status = ObReferenceObjectByHandle( fileHandle,0,IoFileObjectType,KernelMode,(PVOID *) &fileObject,NULL );if (NT_SUCCESS( status )){*FileObject = fileObject;// oGetRelatedDeviceObject 获得文件对象中设备对象所在设备栈栈顶的设备对象*DeviceObject = IoGetRelatedDeviceObject( fileObject );}(VOID) ZwClose( fileHandle );}return status;}
可以看出几点
1.内部调用了ObReferenceObjectByHandle,所以外部需要ObDereferenceObject(文件对象)
2.DeviceObject返回的是返回的是【Attach】在这个名字对应【设备对象】所在【栈】的【栈顶设备对象指针】,如果没有Attach的设备,就是这个名字对应【设备对象】,可以通过IoGetRelatedDeviceObject看到
3.FileObject->DeviceObject 返回的是这个名字对应【设备对象】
0 0
- 0.driverbase-IoGetDeviceObjectPointer源码(need ObDereferenceObject)
- IoGetDeviceObjectPointer
- IoGetDeviceObjectPointer
- 0.driverbase-控制寄存器(CR0~CR3)
- 0.driverbase-WDM和NT驱动
- 0.driverbase-makefile和source简单语法
- 0.driverbase-prefmon查看驱动性能
- 0.driverbase-内存管理相关函数
- 0.driverbase-字符串、文件、注册表相关函数
- 0.driverbase-枚举进程,枚举模块,操作注册表随手代码
- 0.driverbase-VS2008+DDKWIZARD+WDK基于WIN7编程环境配置
- 0.driverbase-驱动编译环境--x86 Checked Build Environment
- 0.driverbase-自旋锁(SpinLock)wrk代码分析
- 关于IoGetDeviceObjectPointer函数
- 关于IoGetDeviceObjectPointer函数
- 0.driverbase-Wait函数和创建线程(sytem和本进程)
- 0.driverbase-WDM驱动在win7和XP下系统方式加载
- 0.driverbase-驱动对象、设备对象、DriverEntry、IoCreateDevice、符号链接、DriverUnLoad、WDM
- Gluster常见故障处理和HOWTO资源
- Android特效 五种Toast详解
- 微店挑战淘宝,能否活着出去
- 黑马程序员_java高新技术总结【2】(反射)
- 黑马程序员_代理
- 0.driverbase-IoGetDeviceObjectPointer源码(need ObDereferenceObject)
- 使CEdit滚动到最下面的方法
- nyoj 303-序列互换
- Opentaps(OFBiz)在Eclipse下调试配置
- 奇异值分解(SVD)详解
- Spring--quartz中cronExpression配置说明
- 视频服务器:监控中的作用与选购要点
- java设计模式---单例模式
- Eclipse is running in a JRE, but a JDK is require错误解析