Выгрузка / загрузка расширения ядра в Mac OS - PullRequest
0 голосов
/ 02 июня 2018

Мне нужно выгрузить кучу драйверов (kext) в начале моего приложения Qt Desktop на Mac OS.Я пробовал с QProcess, но kextunload требует наличия прав администратора.Кто-нибудь знает обходной путь?Или как запустить QProcess с помощью sudo?Мне нужно, чтобы это было легко для конечного пользователя: нужно только ввести пароль администратора по запросу, а приложение сделает все остальное.

Проблема в том, что Apple загружает собственный драйвер на устройство, с которым я хочу использоватьопределенный драйвер (FTDI232H с драйвером FT2Dxx).

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Если kext, который вы пытаетесь загрузить или выгрузить, не был специально отмечен как загружаемый непривилегированными пользователями, вам определенно понадобятся права root.Есть C API для загрузки и выгрузки кексов.Он определен в <libkern/OSKext.h>, и следующие функции, вероятно, следующие:

  • OSKextCreate()
  • OSKextLoadWithOptions()
  • OSKextUnloadKextWithIdentifier()

Рекомендуемый метод для вызова функций с повышенными привилегиями - установить привилегированный вспомогательный инструмент с помощью SMJobBless(), запустить его и связаться с ним через XPC.Таким образом, пароль администратора пользователя требуется только один раз, во время вызова SMJobBless, и он также работает для пользователей, у которых sudo не работает.(sudo работает только в том случае, если пользователь входит в группу wheel, и только если у него установлен пароль пользователя.)

0 голосов
/ 04 июня 2018

Я нашел что-то, что, кажется, работает для меня:

QString password = "yourRootPassword"; //could be asked with QInputDialog::getText(...)
QString cmd = QString("sudo -S kextunload -b %1 > /dev/null").arg(driverName);
FILE *pipe = popen(cmd.toStdString().c_str(), "w");
if(pipe != nullptr)
{
    fprintf(pipe, "%s\n", password.toStdString().c_str());
    if (ferror(pipe))
    {
        qDebug() << "Failed to write to pipe";
    }
    else
    {
        qDebug() << "Written to pipe";
    }
}
else
{
   qDebug() << "Failed to open pipe";
}
qDebug() << "Pipe returned : " << pclose(pipe);
...