Hi Kevin, thanks for your reply. Sorry for the delay, I was out for a while.
Here's my current personality dictionary. With this dictionary, the driver crashes, presumably in its init. The crashed thread has OSMetaClassBase::Invoke(RPC) in its stack trace, none of the code appears to be mine. I can see my driver as an object in the IORegistry called "driver" - I use SetName late in my Start_Impl() to give it a globally unique name, so I crash before this.
I also tried setting IOProviderClass to IOSCSIPeripheralDeviceNub, but my driver didn't appear to load at all then.
As you can see, I changed the name of IOPropertyMatch so that it won't be considered, but I would prefer to match on USB vendor and product ID, rather than a name. Does the property I'm trying to match on have to be a property of the provider, or a property of the provider or any of its parents? And is IOPropertyMatch always considered, regardless of family, or are only some family-dependent property keys considered?
<dict>
<key>OSBundleUsageDescription</key>
<string>do stuff with a disk</string>
<key>IOKitPersonalities</key>
<dict>
<key>driver</key>
<dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER) </string>
<key>CFBundleIdentifierKernel</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOSCSIPeripheralDeviceType00</string>
<key>IOProviderClass</key>
<string>IOSCSILogicalUnitNub</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOResourceMatch</key>
<string>IOKit</string>
<key>IOUserClass</key>
<string>driver</string>
<key>IOUserServerName</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>Peripheral Device Type</key>
<integer>0</integer>
<key>Product Identification</key>
<string>EX400U</string>
<key>Vendor Identification</key>
<string>Corsair</string>
<key>IOProbeScore</key>
<string>5001</string>
<key>IOMatchCategory</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER) </string>
<key>xxIOPropertyMatchxx</key>
<dict>
<key>idVendor</key>
<integer>6940</integer>
<key>idProduct</key>
<integer>6688</integer>
</dict>
<key>UserClientProperties</key>
<dict>
<key>IOClass</key>
<string>IOUserUserClient</string>
<key>IOUserClass</key>
<string>userClient</string>
</dict>
</dict>
</dict>
when I use this IOKitPersonality, my "driver" object appears in the IORegistry in line with the driver stack. Its parent is IOSCSILogicalUnitNub, and its child is IOBlockStorageServices. Is this correct or should there be a system supplied IOSCSIPeripheralDeviceType00 next to it in the IORegistry?