标签: driverkit

如何使用 PCIDriverKit 内存映射 PCI BAR?

如何将 PCI 基地址寄存器 (BAR) 从 PCIDriverKit 驱动程序 (DEXT) 内存映射到用户空间应用程序?

从驱动程序扩展到应用程序的内存映射可以通过在用户客户端子类(在驱动程序端)中实现IOUserClient::CopyClientMemoryForType然后调用IOConnectMapMemory64(从用户空间应用程序端)来完成。这在相关的答案中已经得到了非常好的和彻底的解释。

唯一缺少的一点是获取与所需 PCI BAR 相对应的IOMemoryDe​​scriptor,以便从CopyClientMemoryForType实现中返回它。

示例代码

另一种方式问,给定以下简化代码,会执行什么imaginaryFunctionWhichReturnsTheBARBuffer

kern_return_t IMPL(MyUserClient, CopyClientMemoryForType) //(uint64_t type, uint64_t *options, IOMemoryDescriptor **memory)
{
    IOMemoryDescriptor* buffer = nullptr;
    
    imaginaryFunctionWhichReturnsTheBARBuffer(ivars->pciDevice /* IOPCIDevice */, kPCIMemoryRangeBAR0, &buffer);

    *memory = buffer;

    return kIOReturnSuccess;
}
Run Code Online (Sandbox Code Playgroud)

前面的代码ivars->pciDevice中指的是一个现成的IOPCIDevice(例如:它已经根据最新的最佳实践成功匹配、打开和配置)。

这意味着已经可以使用各种配置内存读/写方法来访问所需 PCI BAR 内存的显式偏移量。缺少(或不清楚)的是如何使用这些 API(或等效 API)将与 PCI BAR 对应的整个缓冲区映射到用户空间应用程序。

可能相关也可能不相关的随机注释 …

c++ macos iokit macos-system-extension driverkit

9
推荐指数
1
解决办法
903
查看次数

如何为 Mac OS catalina 编写驱动程序包扩展

我正在尝试为其中一个设备编写驱动程序套件扩展。我没有关于如何为 mac os Catalina 编写驱动程序扩展的信息。我得到的唯一文档是

DriverKit 参考:https : //developer.apple.com/documentation/driverkit? language = objc

& WWDC 视频:https : //developer.apple.com/videos/play/wwdc2019/702/

是否有关于如何编写驱动程序套件扩展和用于安装它的系统扩展的示例。提前致谢。

macos-catalina macos-system-extension driverkit

5
推荐指数
1
解决办法
1397
查看次数

我可以在 DriverKit 驱动程序中使用 STL 吗?

例如,我可以std::vector在 macOs/XCode 中的 DriverKit 驱动程序中使用吗?

DriverKit 有一些容器类,例如https://developer.apple.com/documentation/driverkit/osarray?language=objcOSArray

如果我创建一个新的“DriverKit 驱动程序”项目并包含,<vector>那么我会收到构建错误。这些错误来自包含<cstring>,错误是

No member named 'strcpy' in the global namespace

No member named 'strcat' in the global namespace

stl macos-catalina macos-system-extension driverkit xcode11.4

5
推荐指数
1
解决办法
356
查看次数

将无代码 KEXT 迁移到无代码 DEXT

我正在将无代码 KEXT 迁移到无代码 DEXT。我观看了 WWDC 视频并阅读了 Apple 开发者网站上的大量信息。我遇到的困难不是找到要做什么,而是找到如何开始。带有示例项目的不错的教程会有所帮助。

在我的无代码 KEXT 中,对于 4 个独立的设备,每个设备都有 IOUSBDevice 和 IOUSBInterface 的 IOKitPersonalities。KEXT 允许我将我的设备与我的“驱动程序”相匹配,这样 Apple HID 驱动程序就不会抓住它们。我希望在无代码 DEXT 中做相同或类似的事情。

到目前为止,我已经在应用程序中创建了一个名为 MyUsbDriver 的 DriverKit 目标(用于 DriverKit.framework),并添加了 USBDriverKit.framework。这会向我的项目添加一个文件夹 MyUsbDriver,其中包含文件 MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist 和 MyUsbDriver.entitlements。这是我的问题:

  1. 看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?

  2. DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?

  3. IOUSBHostDevice 是否等同于 IOUSBDevice?

  4. 对于无代码 DEXT,我需要对 .cpp 或 .iig 执行任何操作吗?我的大部分工作不是要在 plist 和 entitlements 文件中完成吗?

  5. 我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?

  6. 我在哪里可以找到如何完成此迁移的合适示例?

任何帮助将不胜感激。

更新:

使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“Doh”时刻:我最初的测试项目类型是命令行工具,但我永远无法嵌入 DEXT。我几乎只是手工编辑了 pbxproj 文件。然而,在查看 Scott Knight 的原始示例 USBApp …

macos iokit kernel-extension driverkit

5
推荐指数
1
解决办法
2052
查看次数

DriverKit驱动程序如何通知应用程序?

我知道如何将数据发送到 DriverKit 并返回一些值,即应用程序调用和驱动程序从应用程序IOConnectCallStructMethod()填充。OSDatastructureOutput

在我的应用程序中,它使用IOConnectCallAsyncScalarMethod()kext 来sendAsyncResult64()让应用程序知道传入的事件。但是,该方法sendAsyncResult64()在 DriverKit 中不可用。

我看到AsyncCompletion看起来像解决方案,但不知道如何实现它。有人知道该怎么办吗?感谢任何建议!

macos iokit driverkit

5
推荐指数
1
解决办法
672
查看次数

macOS 系统扩展:权利和使用配置文件签名

我有一个用于 USB 设备驱动程序的 macOS 系统扩展。当我禁用 SIP 并使用我的 cosign 身份(使用终端的“安全查找身份”从我的 Apple ID 生成)手动签名时,它会起作用 - 如此处所述:https : //github.com/knightsc/USBApp/issues/1

我可以激活和停用 dext 并在激活时将其与设备一起使用 - 我所做的和最终的例子如下:

将无代码 KEXT 迁移到无代码 DEXT

和这里:

激活无代码 DEXT 后获取 OSSystemExtensionErrorCodeSignatureInvalid

我获得了 Apple 的授权,并按照他们概述的步骤创建了一个配置文件,然后下载并安装了它。然后我按照 Apple 的授权电子邮件中引用的步骤手动签署应用程序:https : //help.apple.com/xcode/mac/current/#/dev1bf96f17e

我重建了我的应用程序并停用了我的驱动程序的所有现有实例。当我尝试激活新驱动程序时,激活请求失败并显示权利错误:“Error Domain=OSSystemExtensionErrorDomain Code=8”,我知道这表明存在权利/签名问题。

  • 使用 Apple 的配置文件对我的应用程序和驱动程序进行签名的正确方法是什么?

  • 我需要更新我的权利文件吗?这是我现有的文件:

应用程序

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
    <key>com.apple.developer.system-extension.install</key>
    <true/>
    <key>com.apple.developer.system-extension.uninstall</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

右旋

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" …
Run Code Online (Sandbox Code Playgroud)

macos code-signing-entitlements macos-catalina macos-system-extension driverkit

5
推荐指数
1
解决办法
1418
查看次数

Apple DriverKit SDK 相机驱动注册

我是 Apple DriverKit SDK 的新手,我不清楚如何注册我的设备驱动程序,以便它可以作为操作系统中的相机使用。我是否必须在 IOService 的 Start 函数中注册流函数?我在互联网上搜索答案,但找不到。

我需要从自定义 USB 摄像头读取数据,然后通过自定义驱动程序使其可用。

你们有人能帮我吗?

macos camera driver iokit driverkit

5
推荐指数
1
解决办法
242
查看次数

如何设置“com.apple.developer.driverkit.transport.usb”权限?

我不确定如何com.apple.developer.driverkit.transport.usb在我的 dext 权利文件中设置密钥。Info.plist 文件已经包含该IOKitPersonalities字典,并且阅读该com.apple.developer.driverkit.transport.usb字典后,它看起来应该包含与 的条目具有相同信息的条目IOKitPersonalities

项目的权利文件与WWDC 驱动程序套件视频中显示的内容非常相似,将其设置为:

<key>com.apple.developer.driverkit.transport.usb</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

当我将其设置为 时<true/>,系统扩展启动。在看到应用程序的日志行之前,我确实看到了这样的一些行:

...
2020-05-06 12:23:19.229709+0200 0x51ac2    Default     0x0                  0      0    kernel: DK: IOUserServer(sc.example.MyUserUSBInterfaceDriver-0x100002aad)::exit(CDHash check failed)
Run Code Online (Sandbox Code Playgroud)

这个权利应该只反映字典中的内容吗IOKitPersonalities

钥匙完全拔掉后,我得到:

...
2020-05-06 12:23:19.229709+0200 0x51ac2    Default     0x0                  0      0    kernel: DK: IOUserServer(sc.example.MyUserUSBInterfaceDriver-0x100002aad)::exit(CDHash check failed)
2020-05-06 12:23:19.253517+0200 0x51ac2    Default     0x0                  0      0    kernel: DK: IOUserServer(sc.example.MyUserUSBInterfaceDriver-0x100002aae)::exit(Entitlements check failed)
Run Code Online (Sandbox Code Playgroud)

..所以我想钥匙一定在那里。

我正在查看与应用程序相关的日志行log stream --source | grep MyUserUSBInterfaceDriver

usb iokit entitlements macos-system-extension driverkit

4
推荐指数
1
解决办法
1842
查看次数

如何获得“com.apple.developer.driverkit.userclient-access”权限?

我们已请求与 DriverKit 相关的所有权利。我们得到的内容如下:

  • com.apple.developer.driverkit
  • com.apple.developer.driverkit.transport.hid
  • com.apple.developer.driverkit.family.hid.device
  • com.apple.developer.driverkit.family.hid.eventservice
  • com.apple.developer.driverkit.family.hid.virtual.device

我们刚刚了解到,如果我们想要分发能够与 DriverKit 通信的应用程序,则com.apple.developer.driverkit.userclient-access需要授权。但是我们不知道如何生成包含此权利的配置文件。在向 Apple 发送请求权利时,我们是否遗漏了某些内容?或者当我们选择适当的功能时,该权利已在某些项目上准备就绪?

macos code-signing entitlements driverkit

4
推荐指数
1
解决办法
1320
查看次数

我应该使用 IOKit 或 DriverKIt(或 HIDDriverKit)为 macOS 中的 USB 或蓝牙多点触控设备编写驱动程序吗?

我打算为 USB 或蓝牙多点触控设备编写驱动程序,类似于 Mac 的 Apple Magic Trackpad 或 Logitech 触控板。

这个想法是所有 macOS 应用程序都可以使用这个多点触控设备。由于新推出的DriverKit(或HIDDriverKit)将与应用程序捆绑在一起,我应该继续使用IOKit还是应该使用DriverKit?

谢谢。

macos bluetooth iokit hid driverkit

3
推荐指数
1
解决办法
1183
查看次数