2

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

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

我通过守护程序很好地匹配了我的驱动程序服务,但是当我尝试打开服务时,我-536870174这里看到的意思是kIOReturnNotPermitted.

据我了解,设备驱动程序用户客户端只能com.apple.developer.driverkit.userclient-access通过 Apple 授权的应用程序打开。

所以,我的问题:

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

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

所以它会是这样的:

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

编辑:要添加到下面关于将应用程序作为守护程序运行的 Phil 答案,这里有一些Apple 书面指南

4

2 回答 2

3

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

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

非正式地,我也成功地将 Info.plist 直接嵌入到守护进程的二进制文件中,而没有周围的捆绑目录。这通常是为使用的特权帮助工具完成的,SMJobBless()并且在很多地方都有描述,包括这里。本质上,在 Xcode 中启用“在二进制中创建 Info.plist 部分”构建设置,或者-sectcreate __TEXT __info_plist path/to/Info.plist在使用另一个构建系统时添加到您的链接器标志。但是,我最终没有发货(最终不需要它),所以我只在禁用 SIP 的情况下对其进行了测试。因此,我目前无法确定在使用适当的配置文件签名时它是否会起作用。

这两种方法都允许您通过在 Info.plist 中指定二进制文件来为二进制文件提供应用程序包 ID,然后您还可以在代码签名期间包含一个权利文件。由于com.apple.developer.driverkit.userclient-access不是com.apple.security.*命名空间中的“开放”权利之一,您还需要一个包含它的配置文件,否则操作系统不会在启用 SIP 的情况下接受它。

于 2021-04-01T09:48:45.223 回答
1

如果您采用上述苹果资源中的作为守护进程运行应用程序的路径,则以下代码是 Eskimo 发布的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);
于 2021-04-16T11:16:17.213 回答