Ошибка при попытке создать и смонтировать новый том HFS (для проверки драйвера схемы фильтра)

Я пытаюсь протестировать пример приложения IO kit, в котором реализована схема фильтрации. См. Раздел 10.7.10 здесь для контекста. Поскольку источник трудно вырезать и вставить (и когда я попытался, я получил ошибки), я использую источник, который собирает.

На последнем рисунке на этой странице (1038) есть ряд шагов для создания и подключения нового тома HFS. Идея состоит в том, чтобы увидеть, что KEXT работает и выполняет шифрование. Я построил образец KEXT и протестировал его, но всегда получаю ошибку "Нет монтируемых файловых систем", когда я выполняю "открытый" вызов. Я убедился, что KEXT загружен правильно.

Если я удаляю "-partitionType", я могу нормально управлять громкостью (хотя это не включает KEXT).

Может кто-нибудь подсказать, что может быть не так?

Часть моей путаницы в сценарии на рисунке 1038 - это команда "detach", которая запускается перед открытием. Это терпит неудачу для меня, но я не уверен, что именно это вызывает "открытие" после того, как оно терпит неудачу, или не связано.

$ sudo kextload /System/Library/Extensions/IOKitDriverTestApp.kext/
$ hdiutil create -size 32m -partitionType osxbook_HFS /tmp/crypto.dmg 
created: /tmp/crypto.dmg
$ hdiutil attach -nomount /tmp/crypto.dmg 
/dev/disk2              Apple_partition_scheme          
/dev/disk2s1            Apple_partition_map             
/dev/disk2s2            osxbook_HFS
$ diskutil list
/dev/disk0 (internal, physical):
[cut]
/dev/disk1 (synthesized):
[cut]
/dev/disk2 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        +33.6 MB    disk2
   1:        Apple_partition_map                         32.3 KB    disk2s1
   2:                osxbook_HFS                         33.5 MB    disk2s2
$ newfs_hfs -v Crypto /dev/rdisk2s2
Initialized /dev/rdisk2s2 as a 32 MB case-insensitive HFS Plus volume
$ hdiutil detach /dev/disk2
hdiutil: detach failed - No such file or directory
$ open /tmp/crypto.dmg
==> Get popup window with error "crypto.dmg" "No mountable file systems"

ОБНОВЛЕНИЕ: вопрос первоначально предназначался для случая, когда KEXT не был загружен. С тех пор как я получил это на работу, я изменил его, чтобы отразить случай с KEXT, который в любом случае важнее.

ОБНОВЛЕНИЕ 2: Кажется, что в конечном итоге kext выгружается (возможно, происходит сбой). Иногда кажется, что во время "открытия", иногда после. Я попытался добавить операторы типа IOLog("CSD: init"), но ни один из них не появился в системном журнале или журнале консоли. Ищете, как еще я могу сортировать это (без необходимости отдельной машины).

ОБНОВЛЕНИЕ 3: Ниже вывод, когда я пытаюсь запустить KEXT. Есть множество предупреждений, но так как у меня отключена проверка подписи, я думаю, что она все еще загружается. Также я вижу, что он загружается через kextstat.

Другая странная вещь - я не вижу никаких признаков этого KEXT в выводе "ioreg", и при этом я не вижу никаких операторов печати из IOLog().

My-MacBook-Pro:Extensions myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
Warnings: 
    Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done): 
        SimpleCryptoDisk
    Personality CFBundleIdentifier names a kext that can't be found: 
        'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'

Warnings: 
    Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done): 
        SimpleCryptoDisk
    Personality CFBundleIdentifier names a kext that can't be found: 
        'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'

/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }

ОБНОВЛЕНИЕ 4: Я изменил идентификатор пакета в листе, чтобы он совпадал, и теперь он не выдает ошибку "имена не найдены":

My-MacBook-Pro:Debug myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Password:
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }

UPDATE5:

Теперь моя ОС постоянно вылетает каждый раз, когда я загружаю KEXT и затем выполняю "hdiutil attach -nomount /tmp/crypto.dmg" (после создания /tmp/crypto.dmg).

Кажется очевидным, что мой KEXT сейчас запущен, но по какой-то причине я до сих пор не вижу нигде операторов IOLog(). Придется просматривать системные журналы и видеть, есть ли какие-либо признаки, почему он дает сбой.

ОБНОВЛЕНИЕ 6: Я был в состоянии получить символическую панику ядра, но это указывает на другой KEXT (который я не думаю, что у меня также есть источник). Ниже приведена соответствующая часть.

Я попытался использовать другую версию того же самого теста KEXT ( здесь) без каких-либо изменений (пока я удалил операторы IOLog (), так как они не показывались).

Я вижу примечание, что это было проверено на Mac OS 10.6, но кто-нибудь заставил этот образец работать на 10.13.16 (High Sierra)?

...
0xffffff800c94f540 : 0xffffff800cb8776f mach_kernel : _kernel_trap + 0x70f
0xffffff800c94f6b0 : 0xffffff800ca1e1e0 mach_kernel : _return_from_trap + 0xe0
0xffffff800c94f6d0 : 0xffffff7f8d527251 com.apple.iokit.IOStorageFamily : __ZN9IOStorage8completeEP19IOStorageCompletioniy + 0x27
0xffffff81f7a4b980 : 0xffffff7f8d51a0c4 com.apple.iokit.IOStorageFamily : __ZN20IOBlockStorageDriver24prepareRequestCompletionEPvS0_iy + 0xc2
0xffffff81f7a4b9e0 : 0xffffff7f903afa7a com.apple.driver.DiskImages : __ZN13IOHDIXCommand8completeEiy + 0x26
0xffffff81f7a4ba00 : 0xffffff7f903adbfe com.apple.driver.DiskImages : __ZN22IOHDIXHDDriveOutKernel12processReplyEPK13HDIReplyOOL64P18IOMemoryDescriptor + 0x2be
0xffffff81f7a4ba60 : 0xffffff7f903aee9b com.apple.driver.DiskImages : __ZN32IOHDIXHDDriveOutKernelUserClient14processReply64EPK13HDIReplyOOL64 + 0xd3
0xffffff81f7a4bac0 : 0xffffff800d0c3959 mach_kernel : _shim_io_connect_method_structureI_structureO + 0x1c9
0xffffff81f7a4bb20 : 0xffffff800d0c1ae0 mach_kernel : __ZN12IOUserClient14externalMethodEjP25IOExternalMethodArgumentsP24IOExternalMethodDispatchP8OSObjectPv + 0x340
0xffffff81f7a4bb70 : 0xffffff800d0ca567 mach_kernel : _is_io_connect_method + 0x217
...

ОБНОВЛЕНИЕ 7: Я прекратил попытки использовать тестовое приложение SimpleCryptoDisk.cpp и начал с нуля, добавляя немного кода за раз. У меня был некоторый успех (драйвер запускается, и я вижу журнал), хотя у меня пока ничего не работает.

Если я застряну в этом, я могу опубликовать еще один вопрос, но я продолжу и отмечу ответ pmdj как правильный, так как он ответил на мой первоначальный вопрос.

Если кто-нибудь знает модифицированную версию SimpleCryptoDisk, которая работает на High Sierra, я все же хотел бы знать, однако.

1 ответ

Решение

Чтобы ответить на ваши оригинальные вопросы:

[Почему "Нет монтируемых файловых систем", когда не загружается kext и не используется тип раздела "osxbook_HFS"]

Как видите, схема разделов Apple использует произвольные текстовые строки для определения типа раздела. macOS дословно использует эту строку в качестве "подсказки содержимого", которая выбирает тип файловой системы, который будет пытаться автоматически смонтировать этот том. Файловая система HFS+ ищет только Apple_HFS (а также Apple_HFSX с учетом регистра)

Идея, стоящая за kext, заключается в том, что он сам соответствует вновь определенной подсказке содержимого и публикует новый объект-хранилище, который, в свою очередь, содержит подсказку содержимого HFS+ для файловой системы.

Зачем hdiutil detach терпел неудачу

$ hdiutil detach /dev/disk2
hdiutil: detach failed - No such file or directory

В текущих версиях macOS вам нужно переписать команду как:

$ hdiutil detach disk2
или же
$ hdiutil detach /Volumes/VOLUMENAME

Я не могу сразу ответить на ваш текущий вопрос о том, почему он не работает с kext, но я могу предложить вам посмотреть, работает ли ваш kext в соответствии с ожиданиями в отношении реестра ввода-вывода. Проверьте с IO RegistryExplorer или ioreg соответствует ли он тому типу специального раздела, и создает ли он и регистрирует виртуальный (расшифрованный) том с помощью Apple_HFS Содержание подсказки. Добавить ioreg выход (ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME) на ваш вопрос, если не уверены.

Другие вопросы по тегам