#ifndef _KEXTUTIL_MAIN_H
#define _KEXTUTIL_MAIN_H
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/kext/OSKext.h>
#include <getopt.h>
#include <sysexits.h>
#include <IOKit/kext/OSKext.h>
#include "kext_tools_util.h"
#pragma mark Basic Types & Constants
enum {
kKextutilExitOK = EX_OK,
kKextutilExitNotFound,
kKextutilExitArchNotFound,
kKextutilExitUserAbort,
kKextutilExitKextBad,
kKextutilExitSafeBoot,
kKextutilExitLoadFailed,
kKextutilExitInteractionRequired,
kKextutilExitUnspecified = 11,
kKextutilExitHelp = 33,
kKextutilExitNoStart
};
#pragma mark Command-line Option Definitions
#define kOptNamePersonality "personality"
#define kOptNameDependency "dependency"
#define kOptNameNoCaches "no-caches"
#define kOptNameNoLoadedCheck "no-loaded-check"
#define kOptNameNoSystemExtensions "no-system-extensions"
#define kOptNameInteractive "interactive"
#define kOptNameInteractiveAll "interactive-all"
#define kOptNameLoadOnly "load-only"
#define kOptNameMatchOnly "match-only"
#define kOptNameNoLoad "no-load"
#define kOptNameSymbolsDirectory "symbols"
#define kOptNameAddress "address"
#define kOptNameUseKernelAddresses "use-load-addresses"
#define kOptNameTests "print-diagnostics"
#define kOptNameNoResolveDependencies "no-resolve-dependencies"
#define kOptNameLongindexHack "________"
#define kOptPersonality 'p'
#define kOptKernel 'k'
#define kOptDependency 'd'
#define kOptRepository 'r'
#define kOptNoCaches 'c'
#define kOptNoLoadedCheck 'D'
#define kOptNoSystemExtensions 'e'
#define kOptInteractive 'i'
#define kOptInteractiveAll 'I'
#define kOptLoadOnly 'l'
#define kOptMatchOnly 'm'
#define kOptNoLoad 'n'
#define kOptSymbolsDirectory 's'
#define kOptAddress 'a'
#define kOptUseKernelAddresses 'A'
#define kOptTests 't'
#define kOptSafeBoot 'x'
#define kOptNoAuthentication 'z'
#define kOptNoResolveDependencies 'Z'
#define kLongOptLongindexHack (-2)
#define kLongOptArch (-3)
#define kLongOptLegacyLayout (-4)
#define kOptChars "a:Ab:cd:DehiIk:lmnp:qr:s:tvxzZ"
int longopt = 0;
struct option sOptInfo[] = {
{ kOptNameLongindexHack, no_argument, &longopt, kLongOptLongindexHack },
{ kOptNameHelp, no_argument, NULL, kOptHelp },
{ kOptNameBundleIdentifier, required_argument, NULL, kOptBundleIdentifier },
{ kOptNamePersonality, required_argument, NULL, kOptPersonality },
{ kOptNameKernel, required_argument, NULL, kOptKernel },
{ kOptNameDependency, required_argument, NULL, kOptDependency },
{ kOptNameRepository, required_argument, NULL, kOptRepository },
{ kOptNameNoCaches, no_argument, NULL, kOptNoCaches },
{ kOptNameNoLoadedCheck, no_argument, NULL, kOptNoLoadedCheck },
{ kOptNameNoSystemExtensions, no_argument, NULL, kOptNoSystemExtensions },
{ kOptNameInteractive, no_argument, NULL, kOptInteractive },
{ kOptNameInteractiveAll, no_argument, NULL, kOptInteractiveAll },
{ kOptNameLoadOnly, no_argument, NULL, kOptLoadOnly },
{ kOptNameMatchOnly, no_argument, NULL, kOptMatchOnly },
{ kOptNameNoLoad, no_argument, NULL, kOptNoLoad },
{ kOptNameSymbolsDirectory, required_argument, NULL, kOptSymbolsDirectory },
{ kOptNameAddress, required_argument, NULL, kOptAddress },
{ kOptNameUseKernelAddresses, no_argument, NULL, kOptUseKernelAddresses },
{ kOptNameQuiet, no_argument, NULL, kOptQuiet },
{ kOptNameVerbose, optional_argument, NULL, kOptVerbose },
{ kOptNameTests, no_argument, NULL, kOptTests },
{ kOptNameSafeBoot, no_argument, NULL, kOptSafeBoot },
{ kOptNameNoAuthentication, no_argument, NULL, kOptNoAuthentication },
{ kOptNameNoResolveDependencies, no_argument, NULL, kOptNoResolveDependencies },
{ kOptNameArch, required_argument, &longopt, kLongOptArch },
{ NULL, 0, NULL, 0 } };
typedef struct {
int flag_n; int flag_l; int flag_m;
Boolean getAddressesFromKernel; Boolean useRepositoryCaches; Boolean useSystemExtensions;
Boolean overwriteSymbols; OSKextExcludeLevel interactiveLevel;
Boolean doLoad; Boolean doStartMatching;
Boolean printDiagnostics; Boolean safeBootMode; Boolean skipAuthentication; Boolean skipDependencies; Boolean checkLoadedForDependencies; Boolean logFilterChanged;
CFMutableDictionaryRef loadAddresses; CFMutableArrayRef kextIDs; CFMutableArrayRef personalityNames; CFMutableArrayRef dependencyURLs; CFMutableArrayRef repositoryURLs; CFMutableArrayRef kextURLs; CFMutableArrayRef scanURLs;
CFURLRef kernelURL; CFDataRef kernelFile; CFURLRef symbolDirURL; const NXArchInfo * archInfo; } KextutilArgs;
#pragma mark Function Prototypes
ExitStatus readArgs(
int argc,
char * const * argv,
KextutilArgs * toolArgs);
ExitStatus checkArgs(KextutilArgs * toolArgs);
void adjustLogFilterForInteractive(KextutilArgs * toolArgs);
ExitStatus createKextsToProcess(
KextutilArgs * toolArgs,
CFArrayRef * outArray,
Boolean * fatal);
ExitStatus processKexts(
CFArrayRef kextURLsToUse,
KextutilArgs * toolArgs);
ExitStatus processKext(
OSKextRef aKext,
KextutilArgs * toolArgs,
Boolean * fatal);
ExitStatus runTestsOnKext(
OSKextRef aKext,
char * kextPathCString,
KextutilArgs * toolArgs,
Boolean * fatal);
ExitStatus loadKext(
OSKextRef aKext,
char * kextPathCString,
KextutilArgs * toolArgs,
Boolean * fatal);
void notifyNonsecureKextload(OSKextRef aKext);
ExitStatus generateKextSymbols(
OSKextRef aKext,
char * kextPathCString,
KextutilArgs * toolArgs,
Boolean saveFlag,
Boolean * fatal);
void setKextLoadAddress(
const void * vKey,
const void * vValue,
void * vContext);
int requestLoadAddress(
OSKextRef aKext);
ExitStatus startKextsAndSendPersonalities(
OSKextRef aKext,
KextutilArgs * toolArgs,
Boolean * fatal);
ExitStatus startKext(
OSKextRef aKext,
char * kextPathCString,
KextutilArgs * toolArgs,
Boolean * started,
Boolean * yesToAll,
Boolean * fatal);
ExitStatus sendPersonalities(
OSKextRef aKext,
char * kextPathCString,
KextutilArgs * toolArgs,
Boolean isMainFlag,
Boolean * yesToAll,
Boolean * fatal);
Boolean serializeLoad(
KextutilArgs * toolArgs,
Boolean loadFlag);
static void usage(UsageLevel usageLevel);
extern kern_return_t kextmanager_lock_kextload(
mach_port_t server,
mach_port_t client,
int * lockstatus);
kern_return_t kextmanager_unlock_kextload(
mach_port_t server,
mach_port_t client);
#endif