kernelmanagement_shims.c [plain text]
#include <pthread/pthread.h>
#include <sys/sysctl.h>
#include <SoftLinking/SoftLinking.h>
#include "OSKext.h"
#include "OSKextPrivate.h"
SOFT_LINK_OPTIONAL_FRAMEWORK(Frameworks, KernelManagement);
SOFT_LINK_FUNCTION(KernelManagement, KMLoadExtensionsWithPaths, SOFT_KMLoadExtensionsWithPaths,
OSReturn,
(CFArrayRef paths),
(paths));
SOFT_LINK_FUNCTION(KernelManagement, KMExtensionPathForBundleIdentifier, SOFT_KMExtensionPathForBundleIdentifier,
CFStringRef,
(CFStringRef identifier),
(identifier));
SOFT_LINK_FUNCTION(KernelManagement, KMLoadExtensionsWithIdentifiers, SOFT_KMLoadExtensionsWithIdentifiers,
OSReturn,
(CFArrayRef identifiers),
(identifiers));
bool shimmingEnabled()
{
uint32_t backOff = 0; size_t sizeOfBackOff = sizeof(backOff);
if (!(sysctlbyname("hw.use_kernelmanagerd", &backOff, &sizeOfBackOff, NULL, 0) == 0 && backOff)) {
OSKextLog(NULL,
kOSKextLogErrorLevel | kOSKextLogGeneralFlag,
"Shimming not enabled - defaulting to legacy behavior.");
return false;
}
if (!isKernelManagementAvailable()) {
OSKextLog(NULL,
kOSKextLogErrorLevel | kOSKextLogGeneralFlag,
"KernelManagement soft link failed - defaulting to legacy behavior.");
return false;
}
return true;
}
CFStringRef kernelmanagement_path_for_bundle_id(CFStringRef identifier)
{
CFStringRef result = SOFT_KMExtensionPathForBundleIdentifier(identifier);
return result;
}
OSReturn kernelmanagement_load_kext_url(CFURLRef url)
{
CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
if (!path) {
return kOSReturnError;
}
const void *pathArray[] = { (void *)path };
CFArrayRef paths = CFArrayCreate(kCFAllocatorDefault, (const void **)&pathArray, 1, &kCFTypeArrayCallBacks);
if (!paths) {
return kOSReturnError;
}
OSReturn result = SOFT_KMLoadExtensionsWithPaths(paths);
CFRelease(paths);
return result;
}
OSReturn kernelmanagement_load_kext_identifier(CFStringRef identifier)
{
const void *identifiersArray[] = { (void *)identifier };
CFArrayRef identifiers = CFArrayCreate(kCFAllocatorDefault, (const void **)&identifiersArray, 1, &kCFTypeArrayCallBacks);
if (!identifiers) {
return kOSReturnError;
}
OSReturn result = SOFT_KMLoadExtensionsWithIdentifiers(identifiers);
CFRelease(identifiers);
return result;
}