WDM/WDF驱动 管理员权限问题

我的驱动开发使用WDM/WDF驱动模型。
在创建设备时,使用WdfDeviceCreateDeviceInterface来注册设备接口,调用 WdfDeviceRetrieveDeviceInterfaceString 以获取系统分配给设备接口的符号链接名称,
这样在应用层就可以通过CreateFile函数就可以打开这个设备,然后通过DeviceIoControl来进行应用层与设备对象的数据通讯了。

但是目前发现应用层必须使用管理员权限才能使用CreateFile,不然将会打开失败,导致无法与设备对象通讯。请问应该怎么样才能不用管理员权限也可以正常打开设备。

您可以在WDF驱动程序的设备配置函数(例如EvtDeviceAdd)中调用WdfDeviceInitAssignName函数,并在该函数的第三个参数中传递一个文件访问权限,如下所示:

WdfDeviceInitAssignName(DeviceInit, &deviceName, FILE_ATTRIBUTE_NORMAL);

这样就可以使应用程序不需要管理员权限就可以打开设备了。

如果你想使用WDF_DEVICE_IO_TYPE_BUFFERED或WDF_DEVICE_IO_TYPE_DIRECT可以在调用WdfDeviceCreate(设备工厂函数)的时候设置对应的参数。

WdfDeviceCreate(&deviceInit, WDF_NO_OBJECT_ATTRIBUTES, &device);

WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchSequential);
ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl;
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
attributes.SynchronizationScope = WdfSynchronizationScopeDevice;
WdfIoQueueCreate(device, &ioQueueConfig, &attributes, &queue);

这样就可以使用WDF_DEVICE_IO_TYPE_BUFFERED或WDF_DEVICE_IO_TYPE_DIRECT模式。

望采纳!!!点击回答右侧采纳即可!!
可能需要进行一些配置。

检查设备安装:确保设备已经正确安装并且驱动程序已经被加载。

检查设备权限:确保设备的权限设置允许非管理员用户访问。

检查设备接口:确保设备接口已经被正确注册并且具有足够的权限。

检查驱动程序安装:确保驱动程序是否在系统路径中,并且是否具有足够的权限。

检查驱动程序配置:确保驱动程序已经被配置为允许非管理员用户访问。

还有可能是驱动程序的问题,您可以检查驱动程序的代码是否在设备打开之后调用了WdfDeviceInitAssignSDDLString 或 WdfDeviceInitAssignSDDLStringFromSDDL 这些函数来赋予驱动程序正确的访问权限。

在驱动开发中,有些设备需要使用管理员权限才能访问,这是因为设备驱动程序需要访问某些系统资源或者某些硬件资源。所以在驱动开发中需要使用管理员权限才能打开设备。

如果想要不用管理员权限也能访问设备,可以考虑在驱动中使用以下方法:

1.使用特权模式,在驱动中使用特权模式,使用特权模式可以访问系统资源而不需要管理员权限。

2.更改驱动的安全属性,在驱动中更改安全属性可以让普通用户也能访问设备。

3.通过代码签名,通过代码签名让系统信任驱动,从而让普通用户也能访问设备。

需要注意的是,更改驱动的安全属性和通过代码签名需要涉及到许可证的问题,所以需要谨慎使用。