Как Apple это делает
После некоторой работы с otool
и дизассемблером, я решил, что diskutil
от Apple использует некоторые частные фреймворки для работы. (Я посмотрел на версию командной строки, но набор функций и сообщения о состоянии / ошибках графического интерфейса пользователя Дисковая утилита так близко совпадают, я сомневаюсь, что есть разница) В частности, Objective-C DiskManagement.framework
содержит классы и методы, которые отображают команды от 1: 1 до diskutil
. Многие сообщения об ошибках появляются из MediaKit.framework
, который не основан на Objective-C, поэтому его API не виден прямо в otool
.
Вкратце рассмотрев разбор некоторых функций, кажется, что порты Маха и MIG используются интенсивно. Я понятия не имею, насколько глубока кроличья нора обратного инжиниринга, и насколько она полезна. В конце концов, DiskManagement.framework
, кажется, делает именно то, что делает diskutil
, и не более, так что это не включает прямое редактирование таблицы разделов. Даже если бы я понял, как это происходит под капотом, это может не помочь мне решить мою проблему.
Как я это делаю
Итак, чтобы не тратить больше времени на действия с сомнительными шансами на успех, я закончил тем, что делал это через расширение ядра, чего я и пытался избежать. Я в основном построил общий IOService
подкласс вместе с IOUserClient
вспомогательным подклассом. Это предоставляет некоторые методы для замены существующей таблицы разделов на новые процессы в пространстве пользователя, выполняющиеся от имени пользователя root. Он ищет объект IOMedia
, соответствующий имени устройства, и с некоторой хитростью выполняет операции чтения / записи непосредственно над этим. Я передаю ему старую таблицу разделов, чтобы она могла убедиться, что она действительно обновляет нужные данные. Что касается пользовательского пространства, я изменил утилиту gpt
, чтобы использовать библиотеки пользовательского пространства I / O Kit для связи с kext. Я только временно загружаю kext для внесения изменений, а затем снова выгружаю его. Это заняло у меня большую часть двух дней, но это хорошо работает.