【发布时间】:2020-05-01 15:34:06
【问题描述】:
我正在尝试与应用程序中的 dext 进行交互。我能够使用IOServiceOpen 找到服务,并且我接到了对我的dext 的NewUserClient 的调用(我可以看到传递的type 参数正在日志中输出)。在此之后,我有点失落。在这里阅读NewUserClient 我可以看到应该使用Create 来创建一个新的服务对象。
讨论部分here 说propertiesKey 字典中的键描述了新服务。
这个字典应该放在系统扩展的plist文件中作为顶级条目,还是应该用IOKitPersonalities中的键放置字典?
我可以将IOServiceDEXTEntitlements 键保留为空值,以便不对连接到系统扩展的应用程序的权利施加任何限制吗?
我的 plist 看起来像这样(MyUserClientProperties 键/字典在两个地方)。
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>MyUserClientProperties</key>
<dict>
<key>IOClass</key>
<string>MyUserClient</string>
<key>IOUserClass</key>
<string>MyUserUSBInterfaceDriver</string>
<key>IOServiceDEXTEntitlements</key>
<string></string>
</dict>
<key>IOKitPersonalities</key>
<dict>
<key>example_device</key>
<dict>
<key>MyUserClientProperties</key>
<dict>
<key>IOClass</key>
<string>MyUserClient</string>
<key>IOUserClass</key>
<string>MyUserUSBInterfaceDriver</string>
<key>IOServiceDEXTEntitlements</key>
<string></string>
</dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>IOClass</key>
<string>IOUserService</string>
<key>IOProviderClass</key>
<string>IOUSBHostInterface</string>
<key>IOUserClass</key>
<string>MyUserUSBInterfaceDriver</string>
<key>IOUserServerName</key>
<string>sc.example.MyUserUSBInterfaceDriver</string>
<key>bConfigurationValue</key>
<integer>0x1</integer>
<key>bInterfaceNumber</key>
<integer>0x0</integer>
<key>idVendor</key>
<integer>0x123</integer>
<key>idProduct</key>
<integer>0x08</integer>
</dict>
</dict>
<key>OSBundleUsageDescription</key>
<string>Example user space USB driver</string>
</dict>
</plist>
我是否需要将SUPERDISPATCH 作为最后一个参数传递给Create?
来自“OSX 和 iOS 内核编程”第 5 章第 81 页:
I/O Kit 设计的独创性在于用户客户端对象本身就是一个驱动程序对象:IOUserClient 类继承自 IOService,并且与任何其他 IOService 实例一样,每个用户客户端都有一个提供者类,对于用户客户端,是应用程序控制的驱动程序实例。
虽然上述内容可能只对 kext (?) 正确,但我认为对于 dext,事情的工作方式相同,
来自Create 文档:使用 kIOUserClassKey 键指定您希望系统实例化的自定义 IOService 子类的名称。
为什么需要实例化另一个IOService 类?这门课的目的是什么?它是继承自IOUserClient 的我的班级的提供者吗?如果是这样,我怎样才能使我的驱动程序实例(实现NewUserClient 的驱动程序)成为提供程序?
来自Create 文档:使用kIOClassKey 指定自定义IOUserClient 子类的名称以返回给您的服务的客户端。
将创建并分配给Create 的第三个参数的类的类型是什么?如果是这样,那是我应该分配IOUserClient*指针的那个,它被传递给NewUserClient吗?
kern_return_t IMPL(MyUserUSBInterfaceDriver, NewUserClient) {
os_log(OS_LOG_DEFAULT, "%{public}d:", type);
IOPropertyName propertiesKey = "MyUserClientProperties";
IOService* client;
auto ret = Create(this, propertiesKey, &client, SUPERDISPATCH);
// Need to do more things here...
return ret;
}
无论我尝试什么,我总是得到一个断言,但我看不出是什么原因造成的。
3 com.apple.DriverKit 0x0000000102f2b24b __assert_rtn + 102
4 com.apple.DriverKit 0x0000000102f2c20a IOService::Create_Impl(IOService*, char const*, IOService**) (.cold.2) + 35
5 com.apple.DriverKit 0x0000000102f1766b IOService::Create_Impl(IOService*, char const*, IOService**) + 91
6 com.apple.DriverKit 0x0000000102f2668f IOService::Create_Invoke(IORPC, OSMetaClassBase*, int (*)(OSMetaClassBase*, IOService*, char const*, IOService**)) + 135
7 com.apple.DriverKit 0x0000000102f276d7 IOService::Create(IOService*, char const*, IOService**, int (*)(OSMetaClassBase*, IORPC)) + 267
8 sc.example.MyUserUSBInterfaceDriver 0x0000000102ee0c89 MyUserUSBInterfaceDriver::NewUserClient_Impl(unsigned int, IOUserClient**) + 313 (MyUserUSBInterfaceDriver.cpp:155)
【问题讨论】:
标签: c++ macos-catalina iokit macos-system-extension driverkit