我正在开发一个虚拟的HID设备。
我想从守护进程中与虚拟设备驱动程序进行通信,因为守护进程是生成从驱动程序发送的HID事件所必需的。
我通过守护进程对驱动程序服务进行了很好的匹配,但是当我试图打开服务时,我从我在这里看到的获得了我在这里看到的的意思是kIOReturnNotPermitted。
据我所知,设备驱动程序用户客户端只能通过苹果授予com.apple.developer.driverkit.userclient-access权限的应用程序打开。
所以,我的问题是:
是否完全不可能在驱动程序工具包中使用守护进程打开设备驱动程序的用户客户端?
这里我唯一的选择是有一个带有com.apple.developer.driverkit.userclient-access权限的中间应用程序,它可以充当守护进程和驱动程序之间的代理?
所以应该是这样的:
守护进程<--xpc连接-->中间应用程序<--用户客户机-->虚拟HID设备
编辑:为了添加到菲尔下面关于将应用程序作为守护进程运行的答案,有一些这里是苹果的书面指南。
发布于 2021-04-01 09:48:45
最重要的是:没有必要花这么长时间。守护进程可以有权限。
从操作系统的角度来看,官场 解决方案将使守护进程成为一个应用程序。本质上,将您的守护进程构建为一个应用程序包,只是不要将其称为.app。您的launchd plist可以指向嵌入式可执行文件,它将继承周围包的权限。
非正式地说,我也成功地将Info.plist直接嵌入到守护进程的二进制文件中,而没有周围的包目录。这通常用于与SMJobBless()一起使用的特权助手工具,并在许多地方包括这里中进行了描述。本质上,在Xcode中启用“在二进制中创建Info.plist节”构建设置,或者在使用其他构建系统时将-sectcreate __TEXT __info_plist path/to/Info.plist添加到链接器标志中。然而,,我最终没有发布这个(最终不需要它),所以我只在禁用的情况下测试了它。因此,我目前还不能确定,当使用适当的配置配置文件进行签名时,它是否会工作。
这两种方法都允许您通过在Info.plist中指定应用程序包ID来为二进制文件提供一个应用程序包ID,这也使您能够在代码签名期间包含一个应享权利文件。由于com.apple.developer.driverkit.userclient-access不是来自com.apple.security.*命名空间的“开放”权限之一,您还需要包含它的供应配置文件,或者在启用SIP时操作系统不会接受它。
发布于 2021-04-16 11:16:17
如果像上面提到的苹果资源那样以守护进程的形式运行应用程序,那么下面的代码是Eskimo发布的目标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);https://stackoverflow.com/questions/66901433
复制相似问题