Завершение работы и перезапуск уведомлений в macOS

Я хочу, чтобы мой драйвер IOKit получил уведомление о power off а также restart События. К счастью, IOKit предоставляет такие уведомления, используя IOService::systemWillShutDown метод, который должен быть переписан и включать мою логику.

Вот пример из Техническая документация Apple:

void MyExampleDriver::systemWillShutdown( IOOptionBits specifier )
{
if ( kIOMessageSystemWillPowerOff == specifier ) {
// System is shutting down; perform appropriate processing.
} else if ( kIOMessageSystemWillRestart == specifier ) {
// System is restarting; perform appropriate processing.
}
/*
* You must call your superclass's implementation of systemWillShutdown as
* soon as you're finished processing your shutdown or restart
* because the shutdown will not proceed until you do.
*/
super::systemWillShutdown( specifier );
}

Тем не менее, событие не показывает, как ожидалось.

Возможно, пропущена регистрация в фазе плоскости питания (хотя это явно не является обязательным условием для переопределения метода systemWillShutDown от IOService.)

PMinit();
provider->joinPMtree(this);
registerPowerDriver(this, myPowerStates, 3);

Обязательно ли присоединение к PMTree для того, чтобы события включения питания перезапускались и отключались?

При попытке отладить проблему я поставил точку останова в методе IOService::systemWillShutdown и после выключения он действительно вызывается со следующей обратной трассировкой много раз:

frame #0: 0xffffff80134b1b04 kernel`IOService::systemWillShutdown(this=0xffffff801a0cf800, specifier=3758096976) at IOServicePM.cpp:7167 [opt]
frame #1: 0xffffff80135123f1 kernel`PMHaltWorker::work(me=<unavailable>) at IOPMrootDomain.cpp:8165 [opt]
frame #2: 0xffffff8013512178 kernel`PMHaltWorker::main(arg=<unavailable>, waitResult=<unavailable>) at IOPMrootDomain.cpp:8095 [opt]

Таким образом, кажется, что есть другие расширения ядра, которые получают этот вызов, и они перечислены в gPMHaltArray — но мой kext, вероятно, не там ..

2

Решение

Я думаю, что PMinit () вызов является обязательным, как указано в документации:

Чтобы участвовать в управлении питанием, чтобы получать уведомления о событиях питания, убедитесь, что ваш драйвер правильно подключен к плоскости питания

https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/PowerMgmt/PowerMgmt.html#//apple_ref/doc/uid/TP0000020-TPXREF104

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]