CreateFile打开驱动设备权限不足

记得以前写了一个文件过滤驱动,使用的是minifilter的框架。
在创建设备时,很常规的使用IoCreateDevice来创建一个命名的设备对象,然后对这个设备名使用IoCreateSymbolicLink创建其应用层的链接符号名,这样我们在应用层就可以通过CreateFile函数就可以打开这个设备,然后通过WriteFile,ReadFile和DeviceIoControl来进行应用层与设备对象的数据通讯了。

我是在虚拟机下开发的,所以虚拟机使用的是管理员模式,所以一切都很OK.
不过在正式环境中,做上层的同事告诉我说,设备打不开,GetLastError()=5即权限不够。

当然,如果使用右键管理员的方式运行应用程序,是可以的~~

原因,从GetLastError()的返回值已经知道结果了,该怎么解决问题了?
我以前做普通设备驱动的时候,也没有遇到这个问题啊~

最后,经过调试,发现在创建设备设置相关的权限,这样就可以了。大致流程如下:

  1. 使用ObOpenObjectByPointer函数获取设备的句柄,当然这个模式得是内核模式。
  2. 使用ExAllocatePool函数分配一个安全描述符结构体SECURITY_DESCRIPTOR的内存。
  3. 使用RtlCreateSecurityDescriptor函数初始化安全描述符结构体内存。
  4. 使用NtSetSecurityObject函数对我们1中获取的结构体对象设置2和3创建的安全描述符对象。

相关代码如下:

PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
HANDLE hDevice = NULL;
do
{
    status = ObOpenObjectByPointer(DeviceObject,
        0,
        NULL,
        FILE_ALL_ACCESS,
        NULL, KernelMode,
        &hDevice);
    if (!NT_SUCCESS(status))
    {
        KdPrint(("ObOpenObjectByPointer err 0x%08x\n", status));
        break;
    }

    //ObDereferenceObject(DeviceObject); 打开这句蓝屏

    SecurityDescriptor = (PSECURITY_DESCRIPTOR)ExAllocatePool(NonPagedPool, sizeof(SECURITY_DESCRIPTOR));
    status = RtlCreateSecurityDescriptor(SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
    if (!NT_SUCCESS(status))
    {
        DPrint1(("RtlCreateSecurityDescriptor err 0x%08x\n", status));
        break;
    }

    status = NtSetSecurityObject(CtlDevHandle, DACL_SECURITY_INFORMATION, SecurityDescriptor);
    if (!NT_SUCCESS(status))
    {
        DPrint1(("RtlCreateSecurityDescriptor err 0x%08x\n", status));
        break;
    }
} while (0);


if (hDevice != NULL)
{
    ZwClose(hDevice);
    hDevice = NULL;
}

if (SecurityDescriptor != NULL)
{
    ExFreePool(SecurityDescriptor);
    SecurityDescriptor = NULL;
}

设备安全描述符

每个设备对象都有一个安全描述符,安全描述符包括一个DACL,每个DACL中包含各个用户对象对本设备的权限信息,大体见下图:

DACL

一个DACL(Discretionary Access Control List),其指出了允许和拒绝某用户或用户组的存取控制列表。 当一个进程需要访问安全对象,系统就会检查DACL来决定进程的访问权。如果一个对象没有DACL,那么就是说这个对象是任何人都可以拥有完全的访问权限。

  • USB基础
  • USB摄像头UVC
  • USB人机交互HID
  • USB音频UAC
  • Windows基础
  • 磁盘与文件系统
  • Windows编程
  • Windows驱动
  • 开发模块
  • Windows运维
  • Linux相关
  • C语言学习
  • 高级语言
  • 前端开发
  • 服务器开发
  • 数据库
  • 字节流笔记
  • 字节流
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    Powered by bytekits.com,汇天下文字,成非凡梦想!!!