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

note : ObReferenceObjectByName usage

2013-09-11 17:20 405 查看

得到驱动对象

.h
/// 系统全局变量声明
extern POBJECT_TYPE *IoDriverObjectType;


/// 常量, 用WinObj.exe 可以看到
#define DRVOBJ_NAME_XX    L"\\xx"


NTSTATUS
GetDriverObject(
    WCHAR * pcDriverObjectName, 
    PDRIVER_OBJECT * ppDrvObj);


.c
NTSTATUS GetDriverObject(WCHAR * pcDriverObjectName, PDRIVER_OBJECT * ppDrvObj)
{
    NTSTATUS        status = STATUS_UNSUCCESSFUL;
    UNICODE_STRING  strDrvObjName;

    if (NULL == ppDrvObj)
        return status;

    /// 得到驱动对象
    /// 参数2 参考 InitializeObjectAttributes.Attributes
    /// 内核句柄 |大小写不敏感
    RtlInitUnicodeString(&strDrvObjName, pcDriverObjectName);
    status = ObReferenceObjectByName(
        &strDrvObjName,    ///< IN PUNICODE_STRING ObjectName,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, ///< IN ULONG Attributes,
        NULL, ///< IN PACCESS_STATE PassedAccessState OPTIONAL,
        0, ///< IN ACCESS_MASK DesiredAccess OPTIONAL,
        *IoDriverObjectType, ///< IN POBJECT_TYPE ObjectType,
        KernelMode, ///< IN KPROCESSOR_MODE AccessMode,
        NULL, ///< IN OUT PVOID ParseContext OPTIONAL,
        ppDrvObj ///< OUT PVOID *Object
        );

    return status;
}


调用代码
NTSTATUS ProcessXX()
{
    NTSTATUS        status = STATUS_UNSUCCESSFUL;
    PDRIVER_OBJECT  pDrvObj = NULL;
    
    DBGPRT((">> ProcessXX\n"));

    status = GetDriverObject(DRVOBJ_NAME_XX, &pDrvObj);
    if (!NT_SUCCESS(status))
        goto _ProcessXX_END;

    DBGPRT((\
        "pDrvObj->DriverName = %wZ\n" \
        "pDrvObj->HardwareDatabase = %wZ\r\n", 
        &pDrvObj->DriverName,
        pDrvObj->HardwareDatabase));

_ProcessXX_END:    
    if (NULL != pDrvObj)
        ObDereferenceObject(pDrvObj); ///< !
        
    DBGPRT(("<< ProcessXX\n"));
    return status;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: