【问题标题】:In-app kernel extension unloading/loading on Mac OSMac OS 上的应用内内核扩展卸载/加载
【发布时间】:2018-11-12 10:11:14
【问题描述】:
我需要在 Mac OS 上的 Qt 桌面应用程序的开头卸载一堆驱动程序 (kext)。
我尝试使用 QProcess,但 kextunload 需要具有管理员权限。
有人知道解决方法吗?或者如何使用 sudo 启动 QProcess?
我需要这对最终用户来说很容易:只需在出现提示时输入管理员密码,其余的由应用程序完成。
问题是苹果在我想与特定驱动程序一起使用的设备上加载他们自己的驱动程序(带有 FT2Dxx 驱动程序的 FTDI232H)。
【问题讨论】:
标签:
macos
qt
admin
qprocess
kernel-extension
【解决方案1】:
我发现了一些似乎对我有用的东西:
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);
【解决方案2】:
除非您尝试加载或卸载的 kext 已明确标记为可由非特权用户加载,否则您肯定需要具有 root 权限。有一个用于加载和卸载 kexts 的 C API。它在<libkern/OSKext.h>中定义,你所追求的功能大概是:
OSKextCreate()
OSKextLoadWithOptions()
OSKextUnloadKextWithIdentifier()
使用提升权限调用函数的推荐方法是使用SMJobBless() 安装一个有权限的帮助工具,并通过XPC 启动它并与之通信。这样,在SMJobBless 调用期间,用户的管理员密码只需要一次,它也适用于sudo 不起作用的用户。 (sudo 仅适用于用户在 wheel 组中且设置了用户密码的情况。)