我可以用守护程序打开DriverKit用户客户端吗



我正在Driver Kit中构建一个虚拟HID设备。

我想通过守护进程与虚拟设备驱动程序通信,因为守护进程对于生成将从驱动程序发送的HID事件是必要的。

我通过守护进程在驱动程序服务上进行了匹配,但当我尝试打开服务时,我会得到-536870174,在这里我看到的意思是kIOReturnNotPermitted

据我所知,设备驱动程序用户客户端只能通过苹果授予com.apple.developer.driverkit.userclient-access权限的应用程序打开。

所以,我的问题是:

在driver Kit中使用守护程序打开设备驱动程序的用户客户端完全不可能吗?

我唯一的选择是拥有一个具有com.apple.developer.driverkit.userclient-access权限的中间应用程序,它可以充当守护进程和驱动程序之间的代理吗?

所以它应该是类似于:

守护程序&lt---xpc连接--&gt中间应用程序<---用户客户端--->虚拟HID设备

编辑:为了补充Phil下面关于将应用程序作为守护程序运行的回答,这里有一些苹果的书面指导。

简而言之:没有必要走这么长的路。守护进程可以拥有权利。

从操作系统的角度来看,官方的解决方案是将守护程序变成一个应用程序。本质上,将守护进程构建为一个应用程序包,只是不要称之为.app。您的launchd-plist可以指向嵌入的可执行文件,它将继承周围包的权限。

非官方地,我还成功地将Info.plist直接嵌入到守护进程的二进制文件中,而不需要周围的bundle目录。这通常是为与SMJobBless()一起使用的特权助手工具所做的,并在包括此处在内的许多地方进行了描述。本质上;在二进制文件中创建Info.plist部分;Xcode中的生成设置,或者在使用其他生成系统时将-sectcreate __TEXT __info_plist path/to/Info.plist添加到链接器标志中然而,我最终没有发货(最终不需要它(,所以我只在禁用SIP的情况下测试过它。因此,我目前还不能确定当使用适当的配置文件进行签名时,它是否会工作。

这两种方法都允许您通过在Info.plist中指定二进制文件来为其提供应用程序捆绑包ID,这样您还可以在代码签名期间包含一个授权文件。由于CCD_;打开";来自com.apple.security.*命名空间的授权,您还需要一个包含它的配置文件,否则操作系统将不接受启用了SIP的配置文件。

如果你像上面提到的苹果资源中那样,将应用程序作为守护进程运行,那么下面的代码就是爱斯基摩发布的objective-c的快速变体。

import Foundation
import Security
import OSLog;
var me:SecCode? = nil;
let kSecCSDefaultFlags:SecCSFlags = SecCSFlags(rawValue: SecCSFlags.RawValue(0))
var err = SecCodeCopySelf(kSecCSDefaultFlags, &me);
assert(err == errSecSuccess)
var infoCF:CFDictionary? = nil;
var staticMe:SecStaticCode? = nil;
err = SecCodeCopyStaticCode(me!, kSecCSDefaultFlags, &staticMe)
assert(err == errSecSuccess);
err = SecCodeCopySigningInformation(staticMe!, kSecCSDefaultFlags, &infoCF);
assert(err == errSecSuccess);
print(infoCF);
os_log("%{public}s", infoCF.debugDescription);

最新更新