|
|
< Previous PageNext Page > |
Although Mac OS X does not have traditional BSD-style shutdown hooks, the I/O Kit provides equivalent functionality in recent versions. Since the I/O Kit provides this functionality, you must call it from C++ code.
To register for notification, you call registerSleepWakeInterest
(described in IOKit/RootDomain.h
) and register for sleep notification. If the system is about to be shut down, your handler is called with the message type kIOMessageSystemWillPowerOff
. If the system is about to reboot, your handler gets the message type kIOMessageSystemWillRestart
. If the system is about to reboot, your handler gets the message type kIOMessageSystemWillSleep
.
If you no longer need to receive notification (for example, if your KEXT gets unloaded), be certain to release the notifier with IONofitier::release
to avoid a kernel panic on shutdown.
For example, the following sample KEXT registers for sleep notifications, then logs a message with IOLog when a sleep notification occurs:
#include <IOKit/IOLib.h> |
#include <IOKit/pwr_mgt/RootDomain.h> |
#include <IOKit/pwr_mgt/IOPM.h> |
#include <IOKit/IOService.h> |
#include <IOKit/IONotifier.h> |
#define ALLOW_SLEEP 1 |
IONotifier *notifier; |
extern "C" { |
IOReturn mySleepHandler( void * target, void * refCon, |
UInt32 messageType, IOService * provider, |
void * messageArgument, vm_size_t argSize ) |
{ |
IOLog("Got sleep/wake notice. Message type was %d\n", messageType); |
#if ALLOW_SLEEP |
acknowledgeSleepWakeNotification(refCon); |
#else |
vetoSleepWakeNotification(refCon); |
#endif |
return 0; |
} |
kern_return_t sleepkext_start (kmod_info_t * ki, void * d) { |
void *myself = NULL; // Would pass the self pointer here if in a class instance |
notifier = registerPrioritySleepWakeInterest( |
&mySleepHandler, myself, NULL); |
return KERN_SUCCESS; |
} |
kern_return_t sleepkext_stop (kmod_info_t * ki, void * d) { |
notifier->remove(); |
return KERN_SUCCESS; |
} |
} // extern "C" |
< Previous PageNext Page > |
Last updated: 2006-11-07
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |