【问题标题】:Can I open a DriverKit user client with a daemon?我可以使用守护程序打开 DriverKit 用户客户端吗?
【发布时间】:2021-06-28 06:28:36
【问题描述】:

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

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

我通过守护程序很好地匹配了我的驱动程序服务,但是当我尝试打开服务时,我得到了-536870174,它来自what I see here,表示kIOReturnNotPermitted

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

那么,我的问题:

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

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

所以它会是这样的:

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

编辑: 要添加到下面关于将应用程序作为守护程序运行的 Phil 答案,有一些 Apple written guidance here

【问题讨论】:

    标签: macos iokit entitlements launch-daemon driverkit


    【解决方案1】:

    如果您采用上述apple resource 中将应用程序作为守护进程运行的路径,则以下代码是爱斯基摩人发布的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);
    

    【讨论】:

      【解决方案2】:

      简而言之:没必要那么费劲。守护进程可以拥有权利。

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

      非正式地,我也成功地将 Info.plist 直接嵌入到守护程序的二进制文件中,而无需周围的捆绑目录。这通常用于与SMJobBless() 一起使用的特权帮助工具,并在including here 的许多地方进行了描述。本质上,在 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 的情况下不会接受它。

      【讨论】:

      • 非常感谢 pmdj!并特别感谢您在此处提供的有关驱动程序套件的持续帮助。
      • 在我上面的问题中添加了注释,您可以在此处查看 Eskimo 将应用程序作为守护进程运行的“官方”指南 - developer.apple.com/forums/thread/129596
      • @Chris 谢谢,我认为我看到的摘要比我最初链接的摘要更好,但再也找不到了。我也编辑了答案以添加该链接。
      猜你喜欢
      • 2016-03-28
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2020-08-30
      • 2011-10-11
      相关资源
      最近更新 更多