2012-11-25 25 views
3

我正在使用IOKit/kext/KextManager.h的一些函数以编程方式加载内核扩展,并遇到新的错误值。例如:将OS返回值转换为人类可读的定义

OSReturn osr = KextManagerLoadKextWithIdentifier(...); 
// => -603947004 

我怎么能翻译此值以人类可读的定义之一libkern/OSReturn.h发现了什么?

+0

我不知道现有的做法。如果只是为了调试,将值作为十六进制打印出来 - 这样做会更有意义,因为它是一个位域。如果你想输出给用户,你必须建立你自己的OSReturn值字典的字典。 – pmdj

回答

1

Per @ pmjordan的comment,我刚刚使用OSReturn.h中的定义创建了一个简单的映射函数。

- (void)human_readable_libkern_metaclass_error_message:(int) n { 
    switch(n){ 
    case 0: 
     printf("%s", "no error"); 
     break; 
    case kOSMetaClassInternal: 
     // libkern_metaclass_err(1) -603979775 
     printf("%s", "Internal OSMetaClass run-time error."); 
     break; 
    case kOSMetaClassHasInstances: 
     // libkern_metaclass_err(2) -603979774 
     printf("%s", "A kext cannot be unloaded because there are instances derived from Libkern C++ classes that it defines."); 
     break; 
    case kOSMetaClassNoInit: 
     // libkern_metaclass_err(3) -603979773 
     printf("%s", "Internal error: The Libkern C++ class registration system was not properly initialized during kext loading."); 
     break; 
    case kOSMetaClassNoTempData: 
     // libkern_metaclass_err(4) -603979772 
     printf("%s", "Internal error: An allocation failure occurred registering Libkern C++ classes during kext loading."); 
     break; 
    case kOSMetaClassNoDicts: 
     // libkern_metaclass_err(5) -603979771 
     printf("%s", "Internal error: An allocation failure occurred registering Libkern C++ classes during kext loading."); 
     break; 
    case kOSMetaClassNoKModSet: 
     // libkern_metaclass_err(6) -603979770 
     printf("%s", "Internal error: An allocation failure occurred registering Libkern C++ classes during kext loading."); 
     break; 
    case kOSMetaClassNoInsKModSet: 
     // libkern_metaclass_err(7) -603979769 
     printf("%s", "Internal error: An error occurred registering a specific Libkern C++ class during kext loading."); 
     break; 
    case kOSMetaClassNoSuper: 
     // libkern_metaclass_err(8) -603979768 
     printf("%s", "Internal error: No superclass can be found for a specific Libkern C++ class during kext loading."); 
     break; 
    case kOSMetaClassInstNoSuper: 
     // libkern_metaclass_err(9) -603979767 
     printf("%s", "Internal error: No superclass can be found when constructing an instance of a Libkern C++ class."); 
     break; 
    case kOSMetaClassDuplicateClass: 
     // libkern_metaclass_err(10) -603979766 
     printf("%s", "A duplicate Libkern C++ classname was encountered during kext loading."); 
     break; 
    case kOSMetaClassNoKext: 
     // libkern_metaclass_err(11) -603979765 
     printf("%s", "Internal error: The kext for a Libkern C++ class can't be found during kext loading."); 
     break; 
    default: 
     printf("%s", "Unknown: error not defined in <libkern/OSReturn.h>)"); 
     break; 
    } 
} 
相关问题