您的位置:首页 > 移动开发 > Objective-C

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: