2012-11-25 5 views
3

IOKit/kext/KextManager.h의 함수 중 일부를 사용하여 프로그래밍 방식으로 커널을로드하고 새로운 오류 값이 발생했습니다. 예를 들면 :OSReturn 값을 사람이 읽을 수있는 정의로 변환

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

어떻게 libkern/OSReturn.h에있는 사람이 읽을 수있는 정의 중 하나에이 값을 변환 할 수 있습니까?

+0

저는이 작업을 수행하는 기존 방법을 알지 못합니다. 디버깅 용이라면 값을 16 진수로 인쇄하십시오. 비트 맵처럼 더 이해하기 쉬울 것입니다. 그것을 사용자에게 출력하려면 OSReturn 값의 사전을 문자열로 작성해야합니다. – pmdj

답변

1

@ 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; 
    } 
} 
관련 문제