Я переношу свой драйвер PCI с iokit на dext с помощью PCIDriverkit. Я загружаю образец "MyUserUSBInterfaceDriver", изменяю компиляцию, подписываю и запускаю. dext может загружаться, но есть много ошибок:
kernel: serviceMatchesCDHa sh: требуется cdha sh 3 ... 3 в личности не соответствует служебному ядру: DK: IOUserServer (s c .knight.MyUserUSBInterfaceDriver-0x1000064a c) :: exit (CDHa sh проверка не удалась) ядро:
(выше: эта ошибка повторяется 5 раз) ............ ............ ............ ............ ............ .. .......... ............ ....
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) test init init
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) test init init fini sh 1
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) ядро: ( AppleMobileFileIntegrity) AMFI: SIP выключен, разрешает дамп ядра для pid 9259 (s c .knight.MyUser), ядро: (AppleMobileFileIntegrity) AMFI: SIP выключен, разрешает дамп ядра для pid 9259 (s c .knight.MyUser) )
ReportCra sh: Разбор данных трупа для pid 9259
ReportCra sh: Разбор данных трупа для pr ocess s c .knight.MyUser [pid 9259]
ReportCra sh: (AppStoreFoundation) [com.apple.appstorefoundation: по умолчанию] Сообщение об ошибке чтения: Error Domain = NSCocoaErrorDomain Code = 260 "Файл «Квитанцию» не удалось открыть, так как такого файла нет ». UserInfo = {NSFilePath = / Library / SystemExtensions / 0 ... 0 / s c .knight.MyUserUSBInterfaceDriver.dext // Contents / _MASReceipt / чек, NSUnderlyingError = 0x7fcc681d4b70 {Error Domain = NSPOSIXErrorDomain Code = NSPOSIXErrorDomain Code = No such file = directory "}}
(вверху: вызывается функция драйвера init () и повторяется много раз)
............ ..... ....... ............ ............ ............ ....... ..... ............ ....
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) test init init
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) test init init fini sh 1
ядро: (s c .knight.MyUserUSBInterfaceDriver.dext) ядро: (AppleMobileFileIntegrity) AMFI: SIP выключен, разрешен дамп ядра для ядра pid 10191 (s c .knight.MyUser): Процесс [10191] потерпел крах: s c .knight.MyUser. Создается слишком много трупов. kernelmanagerd: Получено уведомление о загрузке kext: (вверху: это последняя ошибка)
............................ ........................................
Вот мое право
<?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.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.pci</key>
<array>
<dict>
<key>IOPCIPrimaryMatch</key>
<string>0xbbbbaaaa</string>
</dict>
</array>
</dict>
</plist>
Это мой info.plist
<?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>OSBundleUsageDescription</key>
<string>Example user space PCI driver</string>
<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>IOKitPersonalities</key>
<dict>
<key>MyUserUSBInterfaceDriver</key>
<dict>
<key>IOResourceMatch</key>
<string>IOKit</string>
<key>IOMatchCategory</key>
<string>IOService</string>
<key>IOPCITunnelCompatible</key>
<true/>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>IOClass</key>
<string>IOService</string>
<key>ProductID</key>
<integer>bbbb</integer>
<key>VendorID</key>
<integer>aaaa</integer>
<key>IOProviderClass</key>
<string>IOPCIDevice</string>
<key>IOPCIPrimaryMatch</key>
<string>0xaaaabbbb</string>
<key>bConfigurationValue</key>
<integer>1</integer>
<key>IOUserClass</key>
<string>MyUserUSBInterfaceDriver</string>
<key>IOUserServerName</key>
<string>sc.knight.MyUserUSBInterfaceDriver</string>
</dict>
</dict>
</dict>
</plist>
Это часть исходного кода.
class MyUserUSBInterfaceDriver: public IOService
boolMyUserUSBInterfaceDriver::init()
{
bool result = false;
os_log(OS_LOG_DEFAULT, "test %{public}s init", __FUNCTION__);
result = super::init();
ivars = IONewZero(MyUserUSBInterfaceDriver_IVars, 1);
os_log(OS_LOG_DEFAULT, "test %{public}s init finish %{public}d", __FUNCTION__, result);
Exit:
return result;
}
У меня 2 вопроса.
1, «требуемый cdha sh в личности не соответствует услуге», что это значит? Неправильный формат прав?
2, почему мой декст разбился? Вызывается функция init (), но перед вызовом start () вызывается cra sh. Я что-то пропустил или сделал что-то не так?
Большое спасибо за любую помощь.