IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针
2016-02-19 11:22
495 查看
//IoGetDeviceObjectPointer得到设备对象指针 UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName,L"\\Device\\MyDDKDeviceA"); PDEVICE_OBJECT DeviceObject=NULL; PFILE_OBJECT FileObject=NULL; NTSTATUS ntStatus=IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&FileObject,&DeviceObject); //判断设备是否被成功打开 if(!NT_SUCCESS(ntStatus))return; //将文件对象指针的引用计数减1 ObDereferenceObject(FileObject); //ObReferenceObjectByName获得设备指针 #ifdef __cplusplus extern "c" { #endif #include<NTDDK.h> NTKERNELAPI NTSTATUS ObreferenceObjectByName( IN PUNICODE_STRING objectName, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState OPTIONAL, IN ACCESS_MASK DesiredAccess OPTIONAL, IN POBJECT_TYPE objectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, OUT PVOID *Object ); extern POBJECT_TYPE IoDeviceObjectType; } #endif UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName,L"\\??\\HelloDDKA"); PDEVICE_OBJECT DeviceObject=NULL; PFILE_OBJECT FileObject=NULL; NTSTATUS ntStatus=ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&DeviceObject); //判断设备是否被成功打开 if(!NT_SYCCESS(ntStatus))return; //模拟IoGetDeviceObjectPointer函数 1.用InitializeObjectAttributes内核函数构造OBJECT_ATTRIBUTES结构体 2.用ZwOpenFile内核函数打开设备对象的句柄 3.用ObRefenenceObjectByHandle内核函数将设备对象的句柄转化成设备对象相关的文件对象句柄 4.用IoGetBaseFileSystemDeviceObject内核函数从设备相关文件对象指针得到设备对象指针 NTSTATUS MyIoGetDeviceObjectPointer(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; //设置要打开的设备的设备名 InitializeObjectAttributes(&objectAttributes,ObjectName,OBJ_KERNEL_HANDLE,NULL,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; //得到设备对象指针 *DeviceObject=IoGetBaseFileSystemDeviceObject(FileObject); } //关闭设备句柄 ZwClose(fileHandle); } return status; }
相关文章推荐
- Odoo8查询产品时提示"maximum recursion depth exceeded while calling a Python object"
- firefox下jquery ajax 返回 [object XMLDocument]处理
- 仿函数(functors/function objects)原理及使用
- 刨根问底Objective-C Runtime
- Objective-C总Runtime的那点事儿(一)消息机制
- Struts的ObjectFactory
- Objective-C 中Self 和 Super 详解
- 用EL表达式取List<Map<String, Object>>map的值(查阅了很久,总结一下)
- Objective-C内存管理
- React Native开发坑之null is not an object (evaluating 'inst.componentWillReceiveProps')
- 继承自NSObject的不常用又很有用的函数(2)
- 笔记:harvesting discriminative meta objects with deep CNN features for scene classification
- JavaScript 中的Object的使用详解笔记(一)
- 【书籍篇】《Objective-C程序设计》语法相关
- 三言两语 - 理解Objective-C的meta-class
- iOS中js与objective-c的交互
- iOS开发之Objective-C与JavaScript的交互
- ios经验收藏 使用objection来模块化开发iOS项目
- The Java™ Tutorials — Concurrency :Lock Objects 锁对象
- JSONObject与JSONArray的使用