OSReturn KextManagerUnloadKextWithIdentifier( CFStringRef kextIdentifier) { OSReturn result = kOSReturnError; OSKextLogSpec oldUserLogSpec = OSKextGetLogFilter(/* kernel? */ false); OSKextLogSpec oldKernelLogSpec = OSKextGetLogFilter(/* kernel? */ true); if (!kextIdentifier) { result = kOSKextReturnInvalidArgument; goto finish; } OSKextSetLogFilter(kOSKextLogSilentFilter, /* kernelFlag */ false); OSKextSetLogFilter(kOSKextLogSilentFilter, /* kernelFlag */ true); result = OSKextUnloadKextWithIdentifier(kextIdentifier, /* terminateServicesAndRemovePersonalities */ TRUE); finish: OSKextSetLogFilter(oldUserLogSpec, /* kernelFlag */ false); OSKextSetLogFilter(oldKernelLogSpec, /* kernelFlag */ true); return result; }
int main(int argc, char * const * argv) { ExitStatus result = EX_SOFTWARE; KcgenArgs toolArgs; Boolean fatal = false; /***** * Find out what the program was invoked as. */ progname = rindex(argv[0], '/'); if (progname) { progname++; // go past the '/' } else { progname = (char *)argv[0]; } /* Set the OSKext log callback right away. */ OSKextSetLogOutputFunction(&tool_log); /* Make the library not sort opened kexts by version for bundle ID lookups. */ _OSKextSetStrictRecordingByLastOpened(TRUE); /***** * Check if we were spawned by kextd, set up straightaway * for service log filtering, and hook up to ASL. */ if (getenv("KEXTD_SPAWNED")) { OSKextSetLogFilter(kDefaultServiceLogFilter | kOSKextLogKextOrGlobalMask, /* kernel? */ false); OSKextSetLogFilter(kDefaultServiceLogFilter | kOSKextLogKextOrGlobalMask, /* kernel? */ true); tool_openlog("com.apple.kcgen"); } /***** * Process args & check for permission to load. */ result = readArgs(&argc, &argv, &toolArgs); if (result != EX_OK) { if (result == kKcgenExitHelp) { result = EX_OK; } goto finish; } result = checkArgs(&toolArgs); if (result != EX_OK) { goto finish; } /* From here on out the default exit status is ok. */ result = EX_OK; /* The whole point of this program is to update caches, so let's not * try to read any (we'll briefly turn this back on when checking them). */ OSKextSetUsesCaches(false); /* If we're compressing the prelinked kernel, take care of that here * and exit. */ if (toolArgs.prelinkedKernelPath && !CFArrayGetCount(toolArgs.argURLs) && (toolArgs.compress || toolArgs.uncompress)) { result = compressPrelinkedKernel(toolArgs.prelinkedKernelPath, toolArgs.compress); goto finish; } /***** * Read the kexts we'll be working with; first the set of all kexts, then * the repository and named kexts for use with mkext-creation flags. */ if (toolArgs.printTestResults) { OSKextSetRecordsDiagnostics(kOSKextDiagnosticsFlagAll); } toolArgs.allKexts = OSKextCreateKextsFromURLs(kCFAllocatorDefault, toolArgs.argURLs); if (!toolArgs.allKexts || !CFArrayGetCount(toolArgs.allKexts)) { OSKextLog(/* kext */ NULL, kOSKextLogErrorLevel | kOSKextLogGeneralFlag, "Error - no kernel extensions found."); result = EX_SOFTWARE; goto finish; } toolArgs.repositoryKexts = OSKextCreateKextsFromURLs(kCFAllocatorDefault, toolArgs.repositoryURLs); toolArgs.namedKexts = OSKextCreateKextsFromURLs(kCFAllocatorDefault, toolArgs.namedKextURLs); if (!toolArgs.repositoryKexts || !toolArgs.namedKexts) { OSKextLog(/* kext */ NULL, kOSKextLogErrorLevel | kOSKextLogGeneralFlag, "Error - failed to read extensions."); result = EX_SOFTWARE; goto finish; } if (result != EX_OK) { goto finish; } if (toolArgs.prelinkedKernelPath) { result = createPrelinkedKernel(&toolArgs); if (result != EX_OK) { goto finish; } } finish: /* We're actually not going to free anything else because we're exiting! */ exit(result); SAFE_RELEASE(toolArgs.kextIDs); SAFE_RELEASE(toolArgs.argURLs); SAFE_RELEASE(toolArgs.repositoryURLs); SAFE_RELEASE(toolArgs.namedKextURLs); SAFE_RELEASE(toolArgs.allKexts); SAFE_RELEASE(toolArgs.repositoryKexts); SAFE_RELEASE(toolArgs.namedKexts); SAFE_RELEASE(toolArgs.kernelFile); SAFE_RELEASE(toolArgs.symbolDirURL); SAFE_FREE(toolArgs.prelinkedKernelPath); SAFE_FREE(toolArgs.kernelPath); return result; }