Macos 我可以用守护进程打开DriverKit用户客户端吗?

Macos 我可以用守护进程打开DriverKit用户客户端吗?,macos,iokit,entitlements,launch-daemon,driverkit,Macos,Iokit,Entitlements,Launch Daemon,Driverkit,我正在驱动程序工具包中构建一个虚拟HID设备 我想从守护进程与虚拟设备驱动程序通信,因为守护进程对于生成从驱动程序发送的HID事件是必需的 我通过守护进程很好地匹配了驱动程序服务,但是当我尝试打开服务时,我得到了-536870174,这意味着kioreturnnotallowed 据我所知,设备驱动程序用户客户端只能通过苹果授予com.apple.developer.driverkit.userclient访问权限的应用程序打开 那么,我的问题是: 是否完全不可能用守护进程打开驱动程序工具包中设

我正在驱动程序工具包中构建一个虚拟HID设备

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

我通过守护进程很好地匹配了驱动程序服务,但是当我尝试打开服务时,我得到了
-536870174
,这意味着
kioreturnnotallowed

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

那么,我的问题是:

是否完全不可能用守护进程打开驱动程序工具包中设备驱动程序的用户客户端

在这里,我唯一的选择是使用
com.apple.developer.driverkit.userclient access
权限的中间应用程序,它可以充当守护进程和驱动程序之间的代理

所以它会是这样的:

守护进程中间应用程序虚拟HID设备

编辑:
对于Phil下面关于将应用程序作为守护进程运行的回答,还有一些补充。

其不足之处:没有必要走这么长的路。守护进程可以具有权限

从操作系统的角度来看,最重要的是使您的守护进程成为一个应用程序。本质上,将守护进程构建为一个应用程序包,只是不要调用它。app。您的launchd plist可以指向嵌入的可执行文件,它将继承周围包的权限

非正式地说,我还成功地将Info.plist直接嵌入到守护进程的二进制文件中,而不需要周围的bundle目录。这通常是针对与一起使用的特权助手工具完成的,并在许多地方进行了描述。基本上,在Xcode中启用“Create Info.plist Section in Binary”生成设置,或者在使用其他生成系统时,将
-sectcreate\uuuuuu TEXT\uuuuuu Info\plist path/to/Info.plist
添加到链接器标志中然而,我最终并没有发布这个(最终不需要它),所以我只在禁用SIP的情况下测试过它。因此,我目前无法确定在使用适当的资源调配配置文件进行签名时,它是否会工作


这两种方法都允许您通过在Info.plist中指定二进制文件来为二进制文件提供应用程序包ID,这样还允许您在代码签名期间包含权限文件。由于
com.apple.developer.driverkit.userclient access
不是
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);

非常感谢pmdj!特别感谢您在这里提供的关于驱动程序工具包的持续帮助。在我上面的问题中添加了说明,您可以在这里看到爱斯基摩的“官方”应用程序作为守护程序运行指南-@Chris谢谢,我想我看到的摘要比我最初链接到的要好,但再也找不到了。我已经编辑了我的答案,添加了链接。