如何将用户设置传递给驱动程序扩展 (MacOS)?

How to pass user setting to Driver Extension (MacOS)?

我正在编写一个驱动程序包扩展,其目标是阻止某些类别的 USB 设备,例如闪存驱动器。驱动程序应阻止(匹配到)相关设备 类 的任何设备,但列入白名单的设备除外(基于其供应商和产品 ID)。白名单可以由应用程序的用户动态设置。

问题是,如何将这些数据传递给驱动程序,如从文件或类似 Windows 注册表中读取的内容在 DriverKit 中不可用。棘手的部分是驱动程序需要白名单数据 before 设备匹配。

据我了解,通过从 Start() 方法返回错误并过早地从中返回,可以拒绝设备。我想到了在驱动程序 运行 此功能时发送数据,但是这是不可能的,因为在 Start 方法 returns.

之前,通过 IOUserClass 的通信不可用

这是否可行?

  1. 据我所知,DriverKit 扩展无法通过初始 Start() 方法与用户 space 应用程序通信。正如您所说,IOUserClients 是用于用户 space 通信的机制,这些在服务启动和注册之前不可用。你可以让你的 driver 匹配 IOResources/IOUserResources 所以它总是被加载,但是每个匹配的服务都会启动你的 dext 的独立进程,我不知道有什么方法可以在这些实例之间直接通信。
  2. 如果我没理解错的话,您是在试图阻止 other drivers 获取设备。我认为您想到的解决方案不会帮助您解决这个问题。如果您 return 从 Start() 成功, 您的 dext 将驱动设备。如果你return失败,没有driver为设备加载,因为匹配已经结束。所以其他 driver 永远不会有机会,不管设备是在你的 allow-list 还是 deny-list.
  3. 它是 DriverKit 21(即 macOS Monterey)中的新功能,我还没有机会尝试它,但是有一个 API 用于读取文件,OSMappedFile。我想 DriverKit 沙箱会说明 dext 可以打开哪些文件,但这似乎是一个值得探索的途径,你是否可以通过这种方式打开配置文件。
  4. 请注意,其中的 none 将在早期启动期间为您提供帮助,如 your dext will never be considered for matching at that time. And you may not be able to get required entitlements from Apple to build a dext which matches USB device classes rather than specific product/vendor ID patterns. (Apologies for repeating myself,但其他用户可能会遇到此答案而没有意识到此问题。)