From 800a2819813a709f6af5eec6ed1824e2fcf754a8 Mon Sep 17 00:00:00 2001 From: jakeajames Date: Thu, 19 Mar 2020 13:42:32 +0100 Subject: [PATCH] Fix kexecute on iOS 13 --- include/IOKit/IOKitLib.c | 2639 ---------------------------------- include/IOKit/Readme.md | 10 - include/IOKit/screenshot.jpg | Bin 74438 -> 0 bytes jelbrekLib.h | 279 ---- kexecute.c | 2 +- offsetof.c | 1 + offsetof.h | 2 + offsets.m | 2 + 8 files changed, 6 insertions(+), 2929 deletions(-) delete mode 100644 include/IOKit/IOKitLib.c delete mode 100644 include/IOKit/Readme.md delete mode 100644 include/IOKit/screenshot.jpg delete mode 100644 jelbrekLib.h diff --git a/include/IOKit/IOKitLib.c b/include/IOKit/IOKitLib.c deleted file mode 100644 index 04dc117..0000000 --- a/include/IOKit/IOKitLib.c +++ /dev/null @@ -1,2639 +0,0 @@ -/* - * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. - * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#include -#include - -#include -#include - -#include -#include - -#include -#include - - -#include -#include -#include - -#include -#include - -#include - -#if __LP64__ -static const int kIsLP64 = 1; -typedef struct OSNotificationHeader64 NotificationHeader; - -// XXX gvdl: Need to conditionalise this for LP64 -#define mig_external __private_extern__ -#include -#undef mig_external - -#else - -// To stage the IOKitUser map the 64 bit aware APIs locally -# if EMULATE_IOCONNECT -# define EMULATE_IOCONNECT_64 1 -# define EMULATE_IOCONNECT_ASYNC_64 1 -# endif - -# if EMULATE_IOCONNECT_64 -# define io_connect_method em_connect_method -# endif - -# if EMULATE_IOCONNECT_ASYNC_64 -# define io_connect_async_method em_connect_async_method -# endif - -typedef struct OSNotificationHeader NotificationHeader; -static const int kIsLP64 = 0; -#include - -#endif - - -/* - * Ports - */ - -extern mach_port_t mach_task_self(); -const mach_port_t kIOMasterPortDefault = MACH_PORT_NULL; - -static mach_port_t -__IOGetDefaultMasterPort() -{ - mach_port_t masterPort; - - kern_return_t result = IOMasterPort(MACH_PORT_NULL, &masterPort); - if( KERN_SUCCESS != result) - masterPort = MACH_PORT_NULL; - - return( masterPort ); -} - -kern_return_t -IOMasterPort( mach_port_t bootstrapPort __unused, - mach_port_t * masterPort ) -{ - kern_return_t result = KERN_SUCCESS; - mach_port_t host_port = 0; - - host_port = mach_host_self(); - result = host_get_io_master(host_port, masterPort); - - /* Dispose of the host port to prevent security breaches and port - * leaks. We don't care about the kern_return_t value of this - * call for now as there's nothing we can do if it fails. - */ - if (host_port) mach_port_deallocate(mach_task_self(), host_port); - return result; -} - -kern_return_t -IOCreateReceivePort( uint32_t msgType, mach_port_t * recvPort ) -{ - kern_return_t res; - switch (msgType) { - case kOSNotificationMessageID: - case kOSAsyncCompleteMessageID: - res = mach_port_allocate(mach_task_self(), - MACH_PORT_RIGHT_RECEIVE, recvPort); - - break; - - default: - res = kIOReturnBadArgument; - } - return res; -} - -/* - * IOObject - */ - -kern_return_t -IOObjectRelease( - io_object_t object ) -{ - return( mach_port_deallocate( mach_task_self(), object )); -} - -kern_return_t -IOObjectRetain( - io_object_t object ) -{ - return( mach_port_mod_refs(mach_task_self(), - object, - MACH_PORT_RIGHT_SEND, - 1 )); -} - -kern_return_t -IOObjectGetClass( - io_object_t object, - io_name_t className ) -{ - return( io_object_get_class( object, className )); -} - - -CFStringRef -IOObjectCopyClass(io_object_t object) -{ - io_name_t my_name; - CFStringRef my_str = NULL; - - // if there's no argument, no point going on. Return NULL. - if (!object) - return my_str; - - io_object_get_class( object, my_name ); - my_str = CFStringCreateWithCString (kCFAllocatorDefault, my_name, kCFStringEncodingUTF8); - - return my_str; -} - -CFStringRef -IOObjectCopySuperclassForClass(CFStringRef classname) -{ - io_name_t my_name, orig_name; - CFStringRef my_str = NULL; - char * my_cstr; - kern_return_t kr; - - mach_port_t masterPort = __IOGetDefaultMasterPort(); - - // if there's no argument, no point going on. Return NULL. - if (classname == NULL) { - return my_str; - } - - my_cstr = malloc(sizeof(char) * 128); - CFStringGetCString (classname, my_cstr, 128, kCFStringEncodingUTF8); - - strncpy(orig_name, my_cstr, sizeof(io_name_t)); - - kr = io_object_get_superclass(masterPort, orig_name, my_name); - if (kr == kIOReturnSuccess) { - my_str = CFStringCreateWithCString (kCFAllocatorDefault, my_name, kCFStringEncodingUTF8); - } - free(my_cstr); - - return my_str; -} - -CFStringRef -IOObjectCopyBundleIdentifierForClass(CFStringRef classname) -{ - io_name_t my_name, orig_name; - CFStringRef my_str = NULL; - char * my_cstr; - kern_return_t kr; - - mach_port_t masterPort = __IOGetDefaultMasterPort(); - - // if there's no argument, no point going on. Return NULL. - if (classname == NULL) { - return my_str; - } - - my_cstr = malloc(sizeof(char) * 128); - CFStringGetCString (classname, my_cstr, 128, kCFStringEncodingUTF8); - - strncpy(orig_name, my_cstr, sizeof(io_name_t)); - - kr = io_object_get_bundle_identifier(masterPort, orig_name, my_name); - if (kr == kIOReturnSuccess) { - my_str = CFStringCreateWithCString (kCFAllocatorDefault, my_name, kCFStringEncodingUTF8); - } - free(my_cstr); - - return my_str; -} - -boolean_t -IOObjectConformsTo( - io_object_t object, - const io_name_t className ) -{ - boolean_t conforms; - - if( kIOReturnSuccess != io_object_conforms_to( - object, (char *) className, &conforms )) - conforms = 0; - - return( conforms ); -} - -boolean_t -IOObjectIsEqualTo( - io_object_t object, - io_object_t anObject ) -{ - return( object == anObject ); -} - -uint32_t -IOObjectGetRetainCount( - io_object_t object ) -{ - uint32_t count; - - if( kIOReturnSuccess != io_object_get_retain_count( object, &count)) - count = 0; - - return( count ); -} - - -/* - * IOIterator - */ - -io_object_t -IOIteratorNext( - io_iterator_t iterator ) -{ - io_object_t next; - - if( kIOReturnSuccess != io_iterator_next( iterator, &next)) - next = 0; - - return( next ); -} - -void -IOIteratorReset( - io_iterator_t iterator ) -{ - io_iterator_reset( iterator ); -} - -boolean_t -IOIteratorIsValid( - io_iterator_t iterator ) -{ - boolean_t valid; - - if( kIOReturnSuccess != io_iterator_is_valid( iterator, &valid )) - valid = FALSE; - - return( valid ); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * IOService - */ - -io_service_t -IOServiceGetMatchingService( - mach_port_t masterPort, - CFDictionaryRef matching ) -{ - io_iterator_t iter = MACH_PORT_NULL; - io_service_t service = MACH_PORT_NULL; - - IOServiceGetMatchingServices( masterPort, matching, &iter ); - - if( iter) { - - service = IOIteratorNext( iter ); - IOObjectRelease( iter ); - } - - return( service ); -} - -kern_return_t -IOServiceGetMatchingServices( - mach_port_t masterPort, - CFDictionaryRef matching, - io_iterator_t * existing ) -{ - kern_return_t kr; - CFDataRef data; - CFIndex dataLen; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - if( !matching) - return( kIOReturnBadArgument); - - data = IOCFSerialize( matching, kNilOptions ); - CFRelease( matching ); - if( !data) - return( kIOReturnUnsupported ); - - dataLen = CFDataGetLength(data); - - if ((size_t) dataLen < sizeof(io_string_t)) - kr = io_service_get_matching_services( masterPort, - (char *) CFDataGetBytePtr(data), existing ); - else { - kern_return_t result; - - kr = io_service_get_matching_services_ool( masterPort, - (char *) CFDataGetBytePtr(data), dataLen, &result, existing ); - if (KERN_SUCCESS == kr) - kr = result; - } - - CFRelease( data ); - - return( kr ); -} - -kern_return_t -IOServiceMatchPropertyTable( io_service_t service, CFDictionaryRef matching, - boolean_t * matches ) -{ - kern_return_t kr; - CFDataRef data; - CFIndex dataLen; - - if( !matching) - return( kIOReturnBadArgument); - - data = IOCFSerialize( matching, kNilOptions ); - if( !data) - return( kIOReturnUnsupported ); - - - dataLen = CFDataGetLength(data); - - if ((size_t) dataLen < sizeof(io_string_t)) - kr = io_service_match_property_table( service, - (char *) CFDataGetBytePtr(data), matches ); - else { - kern_return_t result; - - kr = io_service_match_property_table_ool( service, - (char *) CFDataGetBytePtr(data), dataLen, &result, matches ); - if (KERN_SUCCESS == kr) - kr = result; - } - - CFRelease( data ); - - return( kr ); -} - -kern_return_t -IOServiceAddNotification( - mach_port_t masterPort, - const io_name_t notificationType, - CFDictionaryRef matching, - mach_port_t wakePort, - uintptr_t reference, - io_iterator_t *notification ) -{ - kern_return_t kr; - CFDataRef data; - CFIndex dataLen; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - if( !matching) - return( kIOReturnBadArgument); - - data = IOCFSerialize( matching, kNilOptions ); - CFRelease( matching ); - if( !data) - return( kIOReturnUnsupported ); - - dataLen = CFDataGetLength(data); - - if ((size_t) dataLen < sizeof(io_string_t)) - kr = io_service_add_notification( masterPort, (char *) notificationType, - (char *) CFDataGetBytePtr(data), - wakePort, (io_user_reference_t *) &reference, 1, - notification ); - else { - kern_return_t result; - - kr = io_service_add_notification_ool( masterPort, (char *) notificationType, - (char *) CFDataGetBytePtr(data), dataLen, - wakePort, (io_user_reference_t *) &reference, 1, - &result, notification ); - if (KERN_SUCCESS == kr) - kr = result; - } - - CFRelease( data ); - - return( kr ); -} - -kern_return_t -IOServiceAddMatchingNotification( - IONotificationPortRef notifyPort, - const io_name_t notificationType, - CFDictionaryRef matching, - IOServiceMatchingCallback callback, - void * refcon, - io_iterator_t * notification ) -{ - kern_return_t kr; - CFDataRef data; - CFIndex dataLen; - io_user_reference_t asyncRef[kIOMatchingCalloutCount]; - - if( !matching) - return( kIOReturnBadArgument); - - data = IOCFSerialize( matching, kNilOptions ); - CFRelease( matching ); - if( !data) - return( kIOReturnUnsupported ); - - asyncRef[kIOMatchingCalloutFuncIndex] = (io_user_reference_t) callback; - asyncRef[kIOMatchingCalloutRefconIndex] = (io_user_reference_t) refcon; - - dataLen = CFDataGetLength(data); - - if ((size_t) dataLen < sizeof(io_string_t)) - kr = io_service_add_notification( notifyPort->masterPort, - (char *) notificationType, - (char *) CFDataGetBytePtr(data), - notifyPort->wakePort, - asyncRef, kIOMatchingCalloutCount, notification ); - else { - kern_return_t result; - - kr = io_service_add_notification_ool( notifyPort->masterPort, - (char *) notificationType, - (char *) CFDataGetBytePtr(data), dataLen, - notifyPort->wakePort, - asyncRef, kIOMatchingCalloutCount, &result, notification ); - if (KERN_SUCCESS == kr) - kr = result; - } - - CFRelease( data ); - - return( kr ); -} - -kern_return_t -IOServiceAddInterestNotification( - IONotificationPortRef notifyPort, - io_service_t service, - const io_name_t interestType, - IOServiceInterestCallback callback, - void * refcon, - io_object_t * notification ) -{ - io_user_reference_t asyncRef[kIOInterestCalloutCount]; - kern_return_t kr; - - asyncRef[kIOInterestCalloutFuncIndex] = (io_user_reference_t) callback; - asyncRef[kIOInterestCalloutRefconIndex] = (io_user_reference_t) refcon; - asyncRef[kIOInterestCalloutServiceIndex] = (io_user_reference_t) service; - - kr = io_service_add_interest_notification( service, (char *) interestType, - notifyPort->wakePort, - asyncRef, kIOInterestCalloutCount, - notification ); - - return( kr ); -} - -IONotificationPortRef -IONotificationPortCreate( - mach_port_t masterPort ) -{ - kern_return_t kr; - IONotificationPort * notify; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - notify = calloc( 1, sizeof( IONotificationPort)); - if( !notify) - return( 0 ); - - notify->masterPort = masterPort; - - kr = IOCreateReceivePort(kOSNotificationMessageID, ¬ify->wakePort); - if( kr != kIOReturnSuccess) { - free( notify ); - return( 0 ); - } - - return notify; -} - -void -IONotificationPortDestroy( - IONotificationPortRef notify ) -{ - if( notify->source) - CFRelease( notify->source); - - mach_port_destroy( mach_task_self(), notify->wakePort); - - free( notify ); -} - -CFRunLoopSourceRef -IONotificationPortGetRunLoopSource( - IONotificationPortRef notify ) -{ - CFMachPortRef cfPort; - CFMachPortContext context; - CFRunLoopSourceRef cfSource; - Boolean shouldFreeInfo; - - if( notify->source) - return( notify->source ); - - context.version = 1; - context.info = (void *) notify; - context.retain = NULL; - context.release = NULL; - context.copyDescription = NULL; - - cfPort = CFMachPortCreateWithPort(NULL, notify->wakePort, - IODispatchCalloutFromCFMessage, &context, &shouldFreeInfo); - if (!cfPort) - return( 0 ); - - cfSource = CFMachPortCreateRunLoopSource(NULL, cfPort, 0); - CFRelease(cfPort); - notify->source = cfSource; - return( cfSource ); -} - -mach_port_t -IONotificationPortGetMachPort( - IONotificationPortRef notify ) -{ - return( notify->wakePort ); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Matching creation helpers - */ - -CFMutableDictionaryRef -IOMakeMatching( - mach_port_t masterPort, - uint32_t type, - uint32_t options, - void * args, - uint32_t argsSize ) -{ - IOReturn err; - CFMutableDictionaryRef result = 0; - char * matching; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - matching = (char *) malloc( sizeof( io_string_t)); - - if( matching) { - err = io_make_matching( masterPort, type, options, - (char *)args, argsSize, matching ); - if( KERN_SUCCESS == err) { - result = (CFMutableDictionaryRef) IOCFUnserialize( matching, - kCFAllocatorDefault, kNilOptions, 0 ); - } - free( matching ); - } - - return( result ); -} - -static CFMutableDictionaryRef -MakeOneStringProp( - CFStringRef key, - const char * name ) -{ - CFMutableDictionaryRef dict; - CFStringRef string; - - dict = CFDictionaryCreateMutable( kCFAllocatorDefault, 0, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - - if( !dict) - return( dict); - - string = CFStringCreateWithCString( kCFAllocatorDefault, name, - kCFStringEncodingMacRoman ); - - if( string) { - CFDictionarySetValue( dict, key, string ); - CFRelease( string ); - } else { - CFRelease( dict ); - dict = 0; - } - - return( dict ); -} - -CFMutableDictionaryRef -IOServiceMatching( - const char * name ) -{ - return( MakeOneStringProp( CFSTR(kIOProviderClassKey), name ) ); -} - -CFMutableDictionaryRef -IOServiceNameMatching( - const char * name ) -{ - return( MakeOneStringProp( CFSTR(kIONameMatchKey), name )); -} - -CFMutableDictionaryRef -IOBSDNameMatching( - mach_port_t masterPort, - uint32_t options, - const char * name ) -{ - if (name == NULL) { return 0; } - else { - return( IOMakeMatching( masterPort, kIOBSDNameMatching, options, - (void *)name, strlen( name) + 1)); - } -} - -CFMutableDictionaryRef -IOOpenFirmwarePathMatching( - mach_port_t masterPort, - uint32_t options, - const char * path ) -{ - return( IOMakeMatching( masterPort, kIOOFPathMatching, options, - (void *)path, strlen( path) + 1)); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -OSGetNotificationFromMessage( - mach_msg_header_t *msg, - uint32_t index, - uint32_t *type, - uintptr_t *reference, - void **content, - vm_size_t *size ) -{ - // The kernel handles the downcast of the reference vector for 32bit tasks - NotificationHeader * header; - - if( msg->msgh_id != kOSNotificationMessageID) - return( kIOReturnBadMessageID ); - - if( msg->msgh_size < (sizeof( mach_msg_header_t) - + sizeof( NotificationHeader))) - return( kIOReturnNoResources ); - - if( index) - return( kIOReturnNoResources ); - - header = (NotificationHeader *) (msg + 1); - if( type) - *type = header->type; - if( reference) - *reference = (uintptr_t) header->reference[0]; - if( size) - *size = header->size; - if( content) { - if( header->size) - *content = &header->content[0]; - else - *content = 0; - } - - return( kIOReturnSuccess ); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -void -IODispatchCalloutFromMessage(void *cfPort, mach_msg_header_t *msg, void *info) -{ - return( IODispatchCalloutFromCFMessage( cfPort, msg, -1, info )); -} - -void -IODispatchCalloutFromCFMessage(CFMachPortRef port __unused, - void *_msg, CFIndex size __unused, void *info __unused) -{ - struct ComplexMsg { - mach_msg_header_t msgHdr; - mach_msg_body_t msgBody; - mach_msg_port_descriptor_t ports[1]; - } * complexMsg = NULL; - mach_msg_header_t * msg = (mach_msg_header_t *)_msg; - NotificationHeader * header; - io_iterator_t notifier = MACH_PORT_NULL; - io_service_t service = MACH_PORT_NULL; - uint32_t leftOver; - boolean_t deliver = TRUE; - - if( msg->msgh_id != kOSNotificationMessageID) - return; - - if( MACH_MSGH_BITS_COMPLEX & msg->msgh_bits) { - - complexMsg = (struct ComplexMsg *)_msg; - - if( complexMsg->msgBody.msgh_descriptor_count) - service = complexMsg->ports[0].name; - header = (NotificationHeader *) &complexMsg->ports[complexMsg->msgBody.msgh_descriptor_count]; - - } else - header = (NotificationHeader *) (msg + 1); - - leftOver = msg->msgh_size - (((vm_address_t) (header + 1)) - ((vm_address_t) msg)); - - // remote port is the notification (an iterator_t) that fired - notifier = msg->msgh_remote_port; - - if( MACH_PORT_NULL != notifier) { - kern_return_t kr; - mach_port_urefs_t urefs; - - kr = mach_port_get_refs( mach_task_self(), msg->msgh_remote_port, MACH_PORT_RIGHT_SEND, &urefs); - if( (KERN_SUCCESS != kr) || (urefs < 2)) { - // one ref carried by the message - < 2 means owner has released the notifier - deliver = false; - } - } - - if(deliver) - { - switch( header->type ) - { - case kIOAsyncCompletionNotificationType: - { - IOAsyncCompletionContent *asyncHdr; - - asyncHdr = (IOAsyncCompletionContent *)(header + 1); - leftOver = (leftOver - sizeof(*asyncHdr)) / sizeof(void *); - void *func = (void *) header->reference[kIOAsyncCalloutFuncIndex]; - void *refCon = (void *) header->reference[kIOAsyncCalloutRefconIndex]; - switch (leftOver) { - case 0: - ((IOAsyncCallback0) func)(refCon, asyncHdr->result); - break; - case 1: - ((IOAsyncCallback1) func)(refCon, asyncHdr->result, - asyncHdr->args[0]); - break; - case 2: - ((IOAsyncCallback2) func)(refCon, asyncHdr->result, - asyncHdr->args[0], asyncHdr->args[1]); - break; - default: - ((IOAsyncCallback) func)(refCon, asyncHdr->result, - asyncHdr->args, leftOver); - break; - } - break; - } - case kIOServiceMessageNotificationType: - { - IOServiceInterestContent * interestHdr; - void * arg; - - interestHdr = (IOServiceInterestContent *)(header + 1); - leftOver = (leftOver - sizeof(*interestHdr) + sizeof(interestHdr->messageArgument)) / sizeof(void *); - if (leftOver <= 1) - arg = interestHdr->messageArgument[0]; - else - arg = &interestHdr->messageArgument[0]; - - ((IOServiceInterestCallback)header->reference[kIOInterestCalloutFuncIndex])( - (void *) header->reference[kIOInterestCalloutRefconIndex], - service ? service : (io_service_t) header->reference[kIOInterestCalloutServiceIndex], - interestHdr->messageType, arg ); - break; - } - case kIOServicePublishNotificationType: - case kIOServiceMatchedNotificationType: - case kIOServiceTerminatedNotificationType: - - ((IOServiceMatchingCallback)header->reference[kIOMatchingCalloutFuncIndex])( - (void *) header->reference[kIOMatchingCalloutRefconIndex], - notifier); - break; - } - } - - if( MACH_PORT_NULL != notifier) - mach_port_deallocate( mach_task_self(), notifier ); - if( complexMsg) - { - uint32_t i; - for( i = 0; i < complexMsg->msgBody.msgh_descriptor_count; i++) - mach_port_deallocate( mach_task_self(), complexMsg->ports[i].name ); - } -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -IOServiceGetBusyState( - io_service_t service, - uint32_t * busyState ) -{ - kern_return_t kr; - - kr = io_service_get_busy_state( service, busyState ); - - if( kr != KERN_SUCCESS) - *busyState = 0; - - return( kr ); -} - -kern_return_t -IOServiceGetState( - io_service_t service, - uint64_t * state ) -{ - kern_return_t kr; - - kr = io_service_get_state( service, state ); - - if( kr != KERN_SUCCESS) - *state = 0; - - return( kr ); -} - -kern_return_t -IOKitGetBusyState( - mach_port_t masterPort, - uint32_t * busyState ) -{ - io_service_t root; - kern_return_t kr; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - kr = io_registry_entry_from_path( masterPort, - kIOServicePlane ":/", &root ); - - if( kr == KERN_SUCCESS) { - kr = io_service_get_busy_state( root, busyState ); - IOObjectRelease( root ); - - } else - *busyState = 0; - - return( kr ); -} - -kern_return_t -IOServiceWaitQuiet( - io_service_t service, - mach_timespec_t * waitTime ) -{ - kern_return_t kr; - mach_timespec_t defaultWait = { 0, -1 }; - - if( 0 == waitTime) - waitTime = &defaultWait; - - kr = io_service_wait_quiet( service, *waitTime ); - - return( kr ); -} - - -kern_return_t -IOKitWaitQuiet( - mach_port_t masterPort, - mach_timespec_t * waitTime ) -{ - io_service_t root; - kern_return_t kr; - mach_timespec_t defaultWait = { 0, -1 }; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - kr = io_registry_entry_from_path( masterPort, - kIOServicePlane ":/", &root ); - - if( kr == KERN_SUCCESS) { - if( 0 == waitTime) - waitTime = &defaultWait; - kr = io_service_wait_quiet( root, *waitTime ); - IOObjectRelease( root ); - } - - return( kr ); -} - -kern_return_t -IOServiceOpen( - io_service_t service, - task_port_t owningTask, - uint32_t type, - io_connect_t * connect ) -{ - kern_return_t kr; - kern_return_t result; - - kr = io_service_open_extended( service, - owningTask, type, NDR_record, NULL, 0, &result, connect ); - -#if 1 - if (MIG_BAD_ID == kr) - { - kr = io_service_open(service, owningTask, type, connect); - result = kr; - } -#endif - - if (KERN_SUCCESS == kr) - kr = result; - - return (kr); -} - -kern_return_t -IOServiceClose( - io_connect_t connect ) -{ - kern_return_t kr; - - kr = io_service_close( connect); - IOObjectRelease( connect ); - - return( kr ); -} - -kern_return_t -IOServiceRequestProbe( - io_service_t service, - uint32_t options ) -{ - return( io_service_request_probe( service, options )); -} - -/* - * IOService connection - */ -kern_return_t -IOConnectAddRef( - io_connect_t connect ) -{ - return mach_port_mod_refs(mach_task_self(), - connect, - MACH_PORT_RIGHT_SEND, - 1); -} - -kern_return_t -IOConnectRelease( - io_connect_t connect ) -{ - // XXX gvdl: Check with Simon about last reference removal - return mach_port_mod_refs(mach_task_self(), - connect, - MACH_PORT_RIGHT_SEND, - -1); -} - -kern_return_t -IOConnectGetService( - io_connect_t connect, - io_service_t * service ) -{ - return( io_connect_get_service( connect, service )); -} - -kern_return_t -IOConnectSetNotificationPort( - io_connect_t connect, - uint32_t type, - mach_port_t port, - uintptr_t reference ) -{ - return( io_connect_set_notification_port( connect, - type, port, reference)); -} - -#if !__LP64__ -kern_return_t -IOConnectMapMemory( - io_connect_t connect, - uint32_t memoryType, - task_port_t intoTask, - vm_address_t *atAddress, - vm_size_t *ofSize, - IOOptionBits options ) -{ - return io_connect_map_memory - (connect, memoryType, intoTask, atAddress, ofSize, options); -} - -kern_return_t IOConnectMapMemory64 -#else -kern_return_t IOConnectMapMemory -#endif - (io_connect_t connect, - uint32_t memoryType, - task_port_t intoTask, - mach_vm_address_t *atAddress, - mach_vm_size_t *ofSize, - IOOptionBits options ) -{ - return io_connect_map_memory_into_task - (connect, memoryType, intoTask, atAddress, ofSize, options); -} - -#if !__LP64__ -kern_return_t -IOConnectUnmapMemory( - io_connect_t connect, - uint32_t memoryType, - task_port_t fromTask, - vm_address_t atAddress ) -{ - return io_connect_unmap_memory - (connect, memoryType, fromTask, atAddress); -} - -kern_return_t IOConnectUnmapMemory64 -#else -kern_return_t IOConnectUnmapMemory -#endif - (io_connect_t connect, - uint32_t memoryType, - task_port_t fromTask, - mach_vm_address_t atAddress) -{ - return io_connect_unmap_memory_from_task - (connect, memoryType, fromTask, atAddress); -} - -kern_return_t -IOConnectAddClient( - io_connect_t connect, - io_connect_t client ) -{ - return( io_connect_add_client( connect, client)); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#if USE_TRAP_TRANSPORT - -#define kUseTrapTransport 1 -__private_extern__ char checkBegin = 0, checkEnd = 0; -static __inline__ void checkPtrRange(void *ptr, IOByteCount cnt) -{ - checkBegin = ((uint8_t *) ptr)[0]; - checkEnd = ((uint8_t *) ptr)[cnt]; -} - -#else - -#define kUseTrapTransport 0 - -#endif /* USE_TRAP_TRANSPORT */ - -#define reinterpret_cast_mach_vm_address_t(p) \ - ((mach_vm_address_t) (uintptr_t) p) - -kern_return_t -IOConnectCallMethod( - mach_port_t connection, // In - uint32_t selector, // In - const uint64_t *input, // In - uint32_t inputCnt, // In - const void *inputStruct, // In - size_t inputStructCnt, // In - uint64_t *output, // Out - uint32_t *outputCnt, // In/Out - void *outputStruct, // Out - size_t *outputStructCntP) // In/Out -{ - kern_return_t rtn; - - void *inb_input = 0; - mach_msg_type_number_t inb_input_size = 0; - void *inb_output = 0; - mach_msg_type_number_t inb_output_size = 0; - - mach_vm_address_t ool_input = 0; - mach_vm_size_t ool_input_size = 0; - mach_vm_address_t ool_output = 0; - mach_vm_size_t ool_output_size = 0; - - if (inputStructCnt <= sizeof(io_struct_inband_t)) { - inb_input = (void *) inputStruct; - inb_input_size = (mach_msg_type_number_t) inputStructCnt; - } - else { - ool_input = reinterpret_cast_mach_vm_address_t(inputStruct); - ool_input_size = inputStructCnt; - } - - if (!outputCnt) { - static uint32_t zero = 0; - outputCnt = &zero; - } - - if (outputStructCntP) { - size_t size = *outputStructCntP; - - if (size <= sizeof(io_struct_inband_t)) { - inb_output = outputStruct; - inb_output_size = (mach_msg_type_number_t) size; - } - else { - ool_output = reinterpret_cast_mach_vm_address_t(outputStruct); - ool_output_size = (mach_vm_size_t) size; - } - } - - rtn = io_connect_method(connection, selector, - (uint64_t *) input, inputCnt, - inb_input, inb_input_size, - ool_input, ool_input_size, - output, outputCnt, - inb_output, &inb_output_size, - ool_output, &ool_output_size); - - if (outputStructCntP) { - if (*outputStructCntP <= sizeof(io_struct_inband_t)) - *outputStructCntP = (size_t) inb_output_size; - else - *outputStructCntP = (size_t) ool_output_size; - } - - return rtn; -} - -kern_return_t -IOConnectCallAsyncMethod( - mach_port_t connection, // In - uint32_t selector, // In - mach_port_t wakePort, // In - uint64_t *reference, // In - uint32_t referenceCnt, // In - const uint64_t *input, // In - uint32_t inputCnt, // In - const void *inputStruct, // In - size_t inputStructCnt, // In - uint64_t *output, // Out - uint32_t *outputCnt, // In/Out - void *outputStruct, // Out - size_t *outputStructCntP) // In/Out -{ - kern_return_t rtn; - - void *inb_input = 0; - mach_msg_type_number_t inb_input_size = 0; - void *inb_output = 0; - mach_msg_type_number_t inb_output_size = 0; - - mach_vm_address_t ool_input = 0; - mach_vm_size_t ool_input_size = 0; - mach_vm_address_t ool_output = 0; - mach_vm_size_t ool_output_size = 0; - - if (inputStructCnt <= sizeof(io_struct_inband_t)) { - inb_input = (void *) inputStruct; - inb_input_size = (mach_msg_type_number_t) inputStructCnt; - } - else { - ool_input = reinterpret_cast_mach_vm_address_t(inputStruct); - ool_input_size = inputStructCnt; - } - - if (!outputCnt) { - static uint32_t zero = 0; - outputCnt = &zero; - } - - if (outputStructCntP) { - size_t size = *outputStructCntP; - - if (size <= sizeof(io_struct_inband_t)) { - inb_output = outputStruct; - inb_output_size = (mach_msg_type_number_t) size; - } - else { - ool_output = reinterpret_cast_mach_vm_address_t(outputStruct); - ool_output_size = (mach_vm_size_t) size; - } - } - - rtn = io_connect_async_method(connection, wakePort, - reference, referenceCnt, - selector, - (uint64_t *) input, inputCnt, - inb_input, inb_input_size, - ool_input, ool_input_size, - output, outputCnt, - inb_output, &inb_output_size, - ool_output, &ool_output_size); - - if (outputStructCntP) { - if (*outputStructCntP <= sizeof(io_struct_inband_t)) - *outputStructCntP = (size_t) inb_output_size; - else - *outputStructCntP = (size_t) ool_output_size; - } - - return rtn; -} - -kern_return_t -IOConnectCallStructMethod( - mach_port_t connection, // In - uint32_t selector, // In - const void *inputStruct, // In - size_t inputStructCnt, // In - void *outputStruct, // Out - size_t *outputStructCnt) // In/Out -{ - return IOConnectCallMethod(connection, selector, - NULL, 0, - inputStruct, inputStructCnt, - NULL, NULL, - outputStruct, outputStructCnt); -} - -kern_return_t -IOConnectCallAsyncStructMethod( - mach_port_t connection, // In - uint32_t selector, // In - mach_port_t wakePort, // In - uint64_t *reference, // In - uint32_t referenceCnt, // In - const void *inputStruct, // In - size_t inputStructCnt, // In - void *outputStruct, // Out - size_t *outputStructCnt) // In/Out -{ - return IOConnectCallAsyncMethod(connection, selector, wakePort, - reference, referenceCnt, - NULL, 0, - inputStruct, inputStructCnt, - NULL, NULL, - outputStruct, outputStructCnt); -} - -kern_return_t -IOConnectCallScalarMethod( - mach_port_t connection, // In - uint32_t selector, // In - const uint64_t *input, // In - uint32_t inputCnt, // In - uint64_t *output, // Out - uint32_t *outputCnt) // In/Out -{ - return IOConnectCallMethod(connection, selector, - input, inputCnt, - NULL, 0, - output, outputCnt, - NULL, NULL); -} - -kern_return_t -IOConnectCallAsyncScalarMethod( - mach_port_t connection, // In - uint32_t selector, // In - mach_port_t wakePort, // In - uint64_t *reference, // In - uint32_t referenceCnt, // In - const uint64_t *input, // In - uint32_t inputCnt, // In - uint64_t *output, // Out - uint32_t *outputCnt) // In/Out -{ - return IOConnectCallAsyncMethod(connection, selector, wakePort, - reference, referenceCnt, - input, inputCnt, - NULL, 0, - output, outputCnt, - NULL, NULL); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -IOConnectTrap0(io_connect_t connect, - uint32_t index) -{ - return iokit_user_client_trap(connect, index, 0, 0, 0, 0, 0, 0); -} - -kern_return_t -IOConnectTrap1(io_connect_t connect, - uint32_t index, - uintptr_t p1 ) -{ - return iokit_user_client_trap(connect, index, p1, 0, 0, 0, 0, 0); -} - -kern_return_t -IOConnectTrap2(io_connect_t connect, - uint32_t index, - uintptr_t p1, - uintptr_t p2 ) -{ - return iokit_user_client_trap(connect, index, p1, p2, 0, 0, 0, 0); -} - -kern_return_t -IOConnectTrap3(io_connect_t connect, - uint32_t index, - uintptr_t p1, - uintptr_t p2, - uintptr_t p3 ) -{ - return iokit_user_client_trap(connect, index, p1, p2, p3, 0, 0, 0); -} - -kern_return_t -IOConnectTrap4(io_connect_t connect, - uint32_t index, - uintptr_t p1, - uintptr_t p2, - uintptr_t p3, - uintptr_t p4 ) -{ - return iokit_user_client_trap(connect, index, p1, p2, p3, p4, 0, 0); -} - -kern_return_t -IOConnectTrap5(io_connect_t connect, - uint32_t index, - uintptr_t p1, - uintptr_t p2, - uintptr_t p3, - uintptr_t p4, - uintptr_t p5 ) -{ - return iokit_user_client_trap(connect, index, p1, p2, p3, p4, p5, 0); -} - -kern_return_t -IOConnectTrap6(io_connect_t connect, - uint32_t index, - uintptr_t p1, - uintptr_t p2, - uintptr_t p3, - uintptr_t p4, - uintptr_t p5, - uintptr_t p6 ) -{ - return iokit_user_client_trap(connect, index, p1, p2, p3, p4, p5, p6); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -IOConnectSetCFProperties( - io_connect_t connect, - CFTypeRef properties ) -{ - CFDataRef data; - kern_return_t kr; - kern_return_t result; - - data = IOCFSerialize( properties, kNilOptions ); - if( !data) - return( kIOReturnUnsupported ); - - kr = io_connect_set_properties( connect, - (char *) CFDataGetBytePtr(data), CFDataGetLength(data), - &result ); - - CFRelease(data); - - if( KERN_SUCCESS == kr) - kr = result; - - return( kr ); -} - -kern_return_t -IOConnectSetCFProperty( - io_connect_t connect, - CFStringRef propertyName, - CFTypeRef property ) -{ - CFDictionaryRef dict; - kern_return_t kr; - - CFTypeRef name = propertyName; - dict = CFDictionaryCreate( kCFAllocatorDefault, - &name, &property, 1, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks ); - if( !dict) - return( kIOReturnNoMemory ); - - kr = IOConnectSetCFProperties( connect, dict ); - CFRelease( dict ); - - return( kr ); -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * IORegistry accessors - */ - -kern_return_t -IORegistryCreateIterator( - mach_port_t masterPort, - const io_name_t plane, - IOOptionBits options, - io_iterator_t * iterator ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return( io_registry_create_iterator( masterPort, (char *) plane, - options, iterator)); -} - -kern_return_t -IORegistryEntryCreateIterator( - io_registry_entry_t entry, - const io_name_t plane, - IOOptionBits options, - io_iterator_t * iterator ) -{ - return( io_registry_entry_create_iterator( entry, (char *) plane, - options, iterator)); -} - -kern_return_t -IORegistryIteratorEnterEntry( - io_iterator_t iterator ) -{ - return( io_registry_iterator_enter_entry( iterator)); -} - - -kern_return_t -IORegistryIteratorExitEntry( - io_iterator_t iterator ) -{ - return( io_registry_iterator_exit_entry( iterator)); -} - -io_registry_entry_t -IORegistryEntryFromPath( - mach_port_t masterPort, - const io_string_t path ) -{ - kern_return_t kr; - io_registry_entry_t entry; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - kr = io_registry_entry_from_path( masterPort, (char *) path, &entry ); - if( kIOReturnSuccess != kr) - entry = 0; - - return( entry ); -} - -io_registry_entry_t -IORegistryGetRootEntry( - mach_port_t masterPort ) -{ - kern_return_t kr; - io_registry_entry_t entry; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - kr = io_registry_get_root_entry( masterPort, &entry ); - if( kIOReturnSuccess != kr) - entry = 0; - - return( entry ); -} - -kern_return_t -IORegistryEntryGetPath( - io_registry_entry_t entry, - const io_name_t plane, - io_string_t path ) -{ - return( io_registry_entry_get_path( entry, (char *) plane, path )); -} - -boolean_t -IORegistryEntryInPlane( - io_registry_entry_t entry, - const io_name_t plane ) -{ - boolean_t inPlane; - - if( kIOReturnSuccess != io_registry_entry_in_plane( - entry, (char *) plane, &inPlane )) - inPlane = false; - - return( inPlane ); -} - -kern_return_t -IORegistryEntryGetName( - io_registry_entry_t entry, - io_name_t name ) -{ - return( io_registry_entry_get_name( entry, name )); -} - -kern_return_t -IORegistryEntryGetNameInPlane( - io_registry_entry_t entry, - const io_name_t plane, - io_name_t name ) -{ - if( NULL == plane) - plane = ""; - return( io_registry_entry_get_name_in_plane( entry, - (char *) plane, name )); -} - -kern_return_t -IORegistryEntryGetLocationInPlane( - io_registry_entry_t entry, - const io_name_t plane, - io_name_t location ) -{ - if( NULL == plane) - plane = ""; - return( io_registry_entry_get_location_in_plane( entry, - (char *) plane, location )); -} - - -kern_return_t -IORegistryEntryCreateCFProperties( - io_registry_entry_t entry, - CFMutableDictionaryRef * properties, - CFAllocatorRef allocator, - IOOptionBits options __unused ) -{ - kern_return_t kr; - uint32_t size; - char * propertiesBuffer; - CFStringRef errorString; - const char * cstr; - - kr = io_registry_entry_get_properties(entry, &propertiesBuffer, &size); - if (kr != kIOReturnSuccess) return kr; - - *properties = (CFMutableDictionaryRef) - IOCFUnserialize(propertiesBuffer, allocator, - 0, &errorString); - if (!(*properties) && errorString) { - - if ((cstr = CFStringGetCStringPtr(errorString, - kCFStringEncodingMacRoman))) - printf("%s\n", cstr); - CFRelease(errorString); - } - - // free propertiesBuffer ! - vm_deallocate(mach_task_self(), (vm_address_t)propertiesBuffer, size); - - return( *properties ? kIOReturnSuccess : kIOReturnInternalError ); -} - -CFTypeRef -IORegistryEntryCreateCFProperty( - io_registry_entry_t entry, - CFStringRef key, - CFAllocatorRef allocator, - IOOptionBits options __unused ) -{ - IOReturn kr; - CFTypeRef type; - uint32_t size; - char * propertiesBuffer; - CFStringRef errorString; - const char * cStr; - char * buffer = NULL; - - cStr = CFStringGetCStringPtr( key, kCFStringEncodingMacRoman); - if( !cStr) { - CFIndex bufferSize = CFStringGetMaximumSizeForEncoding( CFStringGetLength(key), - kCFStringEncodingMacRoman) + sizeof('\0'); - buffer = malloc( bufferSize); - if( buffer && CFStringGetCString( key, buffer, bufferSize, kCFStringEncodingMacRoman)) - cStr = buffer; - } - - if( cStr) - kr = io_registry_entry_get_property(entry, (char *) cStr, &propertiesBuffer, &size); - else - kr = kIOReturnError; - - if( buffer) - free( buffer); - - if( kr != kIOReturnSuccess) - return( NULL ); - - type = (CFMutableDictionaryRef) - IOCFUnserialize(propertiesBuffer, allocator, - 0, &errorString); - if (!type && errorString) { - - if ((cStr = CFStringGetCStringPtr(errorString, - kCFStringEncodingMacRoman))) - printf("%s\n", cStr); - CFRelease(errorString); - } - - // free propertiesBuffer ! - vm_deallocate(mach_task_self(), (vm_address_t)propertiesBuffer, size); - - return( type ); -} - -CFTypeRef -IORegistryEntrySearchCFProperty( - io_registry_entry_t entry, - const io_name_t plane, - CFStringRef key, - CFAllocatorRef allocator, - IOOptionBits options ) -{ - IOReturn kr; - CFTypeRef type; - uint32_t size; - char * propertiesBuffer; - CFStringRef errorString; - const char * cStr; - char * buffer = NULL; - - cStr = CFStringGetCStringPtr( key, kCFStringEncodingMacRoman); - if( !cStr) { - CFIndex bufferSize = CFStringGetMaximumSizeForEncoding( CFStringGetLength(key), - kCFStringEncodingMacRoman) + sizeof('\0'); - buffer = malloc( bufferSize); - if( buffer && CFStringGetCString( key, buffer, bufferSize, kCFStringEncodingMacRoman)) - cStr = buffer; - } - - if( cStr) - kr = io_registry_entry_get_property_recursively(entry, (char *) plane, (char *) cStr, - options, &propertiesBuffer, &size); - else - kr = kIOReturnError; - - if( buffer) - free( buffer); - - if( kr != kIOReturnSuccess) - return( NULL ); - - type = (CFMutableDictionaryRef) - IOCFUnserialize(propertiesBuffer, allocator, - 0, &errorString); - if (!type && errorString) { - - if ((cStr = CFStringGetCStringPtr(errorString, - kCFStringEncodingMacRoman))) - printf("%s\n", cStr); - CFRelease(errorString); - } - - // free propertiesBuffer ! - vm_deallocate(mach_task_self(), (vm_address_t)propertiesBuffer, size); - - return( type ); -} - -kern_return_t -IORegistryEntryGetProperty( - io_registry_entry_t entry, - const io_name_t name, - io_struct_inband_t buffer, - uint32_t * size ) -{ - - - return( io_registry_entry_get_property_bytes( entry, (char *) name, - buffer, size )); -} - - -kern_return_t -IORegistryEntrySetCFProperties( - io_registry_entry_t entry, - CFTypeRef properties ) -{ - CFDataRef data; - kern_return_t kr; - kern_return_t result; - - data = IOCFSerialize( properties, kNilOptions ); - if( !data) - return( kIOReturnUnsupported ); - - kr = io_registry_entry_set_properties( entry, - (char *) CFDataGetBytePtr(data), CFDataGetLength(data), - &result ); - - CFRelease(data); - - if( KERN_SUCCESS == kr) - kr = result; - - return( kr ); -} - -kern_return_t -IORegistryEntrySetCFProperty( - io_registry_entry_t entry, - CFStringRef propertyName, - CFTypeRef property ) -{ - CFDictionaryRef dict; - kern_return_t kr; - - dict = CFDictionaryCreate( kCFAllocatorDefault, - (const void **) &propertyName, (const void **) &property, 1, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks ); - if( !dict) - return( kIOReturnNoMemory ); - - kr = IORegistryEntrySetCFProperties( entry, dict ); - CFRelease( dict ); - - return( kr ); -} - -kern_return_t -IORegistryEntryGetChildIterator( - io_registry_entry_t entry, - const io_name_t plane, - io_iterator_t * iterator ) -{ - return( io_registry_entry_get_child_iterator( entry, - (char *) plane, iterator)); -} - -kern_return_t -IORegistryEntryGetParentIterator( - io_registry_entry_t entry, - const io_name_t plane, - io_iterator_t * iterator ) -{ - return( io_registry_entry_get_parent_iterator( entry, - (char *) plane, iterator)); -} - -kern_return_t -IORegistryEntryGetChildEntry( - io_registry_entry_t entry, - const io_name_t plane, - io_registry_entry_t * child ) -{ - kern_return_t kr; - io_iterator_t iter; - - kr = IORegistryEntryGetChildIterator( entry, plane, &iter ); - - if( KERN_SUCCESS == kr) { - - *child = IOIteratorNext( iter ); - IOObjectRelease( iter ); - if( MACH_PORT_NULL == *child) - kr = kIOReturnNoDevice; - } - - return( kr ); -} - -kern_return_t -IORegistryEntryGetParentEntry( - io_registry_entry_t entry, - const io_name_t plane, - io_registry_entry_t * parent ) -{ - kern_return_t kr; - io_iterator_t iter; - - kr = IORegistryEntryGetParentIterator( entry, plane, &iter ); - - if( KERN_SUCCESS == kr) { - - *parent = IOIteratorNext( iter ); - IOObjectRelease( iter ); - if( MACH_PORT_NULL == *parent) - kr = kIOReturnNoDevice; - } - - return( kr ); -} -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -IOServiceOFPathToBSDName(mach_port_t masterPort, - const io_name_t openFirmwarePath, - io_name_t bsdName) -{ - kern_return_t kr; - io_registry_entry_t service; - io_iterator_t services; - - // Initialize return values. - - bsdName[0] = 0; - - // Find objects matching the given open firmware name. - - kr = IOServiceGetMatchingServices( - /* mach_port_t */ masterPort, - /* void * */ IOOpenFirmwarePathMatching( - /* mach_port_t */ masterPort, - /* uint32_t */ 0, - /* const char * */ openFirmwarePath ), - /* io_iterator * */ &services ); - - if( KERN_SUCCESS != kr ) return( kr ); - - // Obtain the first (and presumably the only) match. - - service = IOIteratorNext( services ); - - if( service ) { - - // Obtain the BSD name property from this object. - - uint32_t bsdNameSize = sizeof(io_name_t); - - kr = IORegistryEntryGetProperty( - /* mach_port_t */ service, - /* io_name_t */ kIOBSDNameKey, - /* io_struct_inband_t */ bsdName, - /* uint32_t * */ &bsdNameSize); - - if( KERN_SUCCESS != kr ) bsdName[0] = 0; - - IOObjectRelease( service ); - } - else { - kr = KERN_FAILURE; - } - - IOObjectRelease( services ); - - return kr; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -kern_return_t -IOCatalogueSendData( - mach_port_t masterPort, - uint32_t flag, - const char *buffer, - uint32_t size ) -{ - kern_return_t kr; - kern_return_t result; - - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - kr = io_catalog_send_data( masterPort, flag, - (char *) buffer, size, &result ); - if( KERN_SUCCESS == kr) - kr = result; - - return( kr ); -} - -kern_return_t -IOCatalogueTerminate( - mach_port_t masterPort, - uint32_t flag, - io_name_t description ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return( io_catalog_terminate( masterPort, flag, description )); -} - -kern_return_t -IOCatalogueGetData( - mach_port_t masterPort, - uint32_t flag, - char **buffer, - uint32_t *size ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return ( io_catalog_get_data( masterPort, flag, (char **)buffer, (unsigned *)size ) ); -} - -kern_return_t -IOCatlogueGetGenCount( - mach_port_t masterPort, - uint32_t *genCount ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return ( io_catalog_get_gen_count( masterPort, genCount ) ); -} - -kern_return_t -IOCatalogueModuleLoaded( - mach_port_t masterPort, - io_name_t name ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return ( io_catalog_module_loaded( masterPort, name ) ); -} - -kern_return_t -IOCatalogueReset( - mach_port_t masterPort, - uint32_t flag ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return ( io_catalog_reset(masterPort, flag) ); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -// obsolete API - -kern_return_t -IORegistryCreateEnumerator( - mach_port_t masterPort, - mach_port_t * enumerator ) -{ - if (MACH_PORT_NULL == masterPort) - masterPort = __IOGetDefaultMasterPort(); - - return( io_registry_create_iterator( masterPort, - "IOService", true, enumerator)); -} - -kern_return_t -IORegistryEnumeratorReset( - mach_port_t enumerator ) -{ - return( io_iterator_reset( enumerator)); -} - - -static io_object_t lastRegIter; - -kern_return_t -IORegistryEnumeratorNextConforming( - mach_port_t enumerator, - const char * name, - boolean_t recursive __unused ) -{ - io_object_t next = 0; - - while( (next = IOIteratorNext( enumerator ))) { - - if( IOObjectConformsTo( next, (char *) name )) - break; - - IOObjectRelease( next ); - } - - lastRegIter = next; - - return( next ? kIOReturnSuccess : kIOReturnNoDevice ); -} - - -#if 0 -kern_return_t -IORegistryGetProperties( - mach_port_t enumerator , - void ** properties ) -{ - return( IORegistryEntryGetProperties( lastRegIter, - (struct IOObject **)properties)); -} -#endif - -kern_return_t -IOOpenConnection( - mach_port_t enumerator __unused, - task_port_t owningTask, - uint32_t type, - mach_port_t * connect ) -{ - kern_return_t kr; - - kr = io_service_open( lastRegIter, - owningTask, type, connect ); - - IOObjectRelease( lastRegIter ); - - return( kr ); -} - - -kern_return_t -IOCloseConnection( - mach_port_t connect ) -{ - return( io_service_close( connect)); -} - - -kern_return_t -IOSetNotificationPort( - mach_port_t connect, - uint32_t type, - mach_port_t port ) -{ - return( io_connect_set_notification_port( connect, type, port, 0)); -} -kern_return_t -IORegisterClient( - mach_port_t connect, - mach_port_t client ) -{ - return( io_connect_add_client( connect, client)); -} - -kern_return_t -IORegistryDisposeEnumerator( - io_enumerator_t enumerator ) -{ - return( IOObjectRelease( enumerator )); -} - -/* -------------------------- */ - -kern_return_t -IOCompatibiltyNumber( - mach_port_t connect __unused, - uint32_t * objectNumber ) -{ - *objectNumber = 1; - return( kIOReturnSuccess); -} - - -void -IOInitContainerClasses() -{ -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* 32bit binary compatibility routines for deprecated APIs */ -#if !defined(__LP64__) - -// Compatability routines with 32bit IOKitLib -kern_return_t -IOConnectMethodScalarIScalarO( - io_connect_t connect, - uint32_t index, - IOItemCount inCount, - IOItemCount scalarOutputCount, - ... ) -{ - uint64_t inData[6], outData[6]; - kern_return_t err; - uint32_t i, outCount; - va_list val; - - if (inCount + scalarOutputCount > 6) - return MIG_ARRAY_TOO_LARGE; - - va_start(val, scalarOutputCount); - for (i = 0; i < inCount; i++) - inData[i] = va_arg(val, uint32_t); - - outCount = scalarOutputCount; - err = IOConnectCallScalarMethod(connect, index, - inData, inCount, outData, &outCount); - - if( kIOReturnSuccess == err) { - for (i = 0; i < outCount; i++) { - uint32_t *out = va_arg(val, uint32_t *); - *out = (uint32_t) outData[i]; - } - } - va_end(val); - - return err; -} - -kern_return_t -IOConnectMethodScalarIStructureO( - io_connect_t connect, - uint32_t index, - IOItemCount inCount, - IOByteCount * outSizeP, - ... ) -{ - uint64_t inData[6]; - void *out = NULL; - IOItemCount i; - va_list val; - - if (inCount > 6) - return MIG_ARRAY_TOO_LARGE; - - va_start(val, outSizeP); - for (i = 0; i < inCount; i++) - inData[i] = va_arg(val, uint32_t); - if (outSizeP && *outSizeP) - out = va_arg(val, void *); - - kern_return_t err = IOConnectCallMethod(connect, index, - inData, inCount, NULL, 0, - NULL, 0, out, outSizeP); - - va_end(val); - - return err; -} - -kern_return_t -IOConnectMethodScalarIStructureI( - io_connect_t connect, - uint32_t index, - IOItemCount inCount, - IOByteCount inSize, - ... ) -{ - uint64_t inData[6]; - uint8_t *in = NULL; - va_list val; - - if (inCount > 6) - return MIG_ARRAY_TOO_LARGE; - - va_start(val, inSize); - for (IOItemCount i = 0; i < inCount; i++) - inData[i] = va_arg(val, uint32_t); - if (inSize) - in = va_arg(val, void *); - - kern_return_t err = IOConnectCallMethod(connect, index, - inData, inCount, in, inSize, - NULL, NULL, NULL, NULL); - - va_end(val); - - return err; -} - -kern_return_t -IOConnectMethodStructureIStructureO( - io_connect_t connect, - uint32_t index, - IOItemCount inSize, - IOByteCount * outSizeP, - void * in, - void * out ) -{ - return IOConnectCallStructMethod(connect, index, in, inSize, out, outSizeP); -} - -kern_return_t -IOMapMemory( - io_connect_t connect, - uint32_t memoryType, - task_port_t intoTask, - vm_address_t * atAddress, - vm_size_t * ofSize, - uint32_t flags ) -{ - return( io_connect_map_memory( connect, memoryType, intoTask, - atAddress, ofSize, flags)); -} - -#if MAP_32B_METHODS || EMULATE_IOCONNECT_64 || EMULATE_IOCONNECT_ASYNC_64 - -// ILP32 - need to remap up to 64 bit scalars these are helpers -#define arrayCnt(type) (sizeof(type)/sizeof(type[0])) -static void inflate_vec(uint64_t *dp, int d, int *sp, int s) -{ - if (d > s) - d = s; - - for (int i = 0; i < d; i++) - dp[i] = (uint32_t) sp[i]; -} - -static void deflate_vec(int *dp, int d, uint64_t *sp, int s) -{ - if (d > s) - d = s; - - for (int i = 0; i < d; i++) - dp[i] = (int) sp[i]; -} -#endif // MAP_32B_METHODS || EMULATE_IOCONNECT_64 || EMULATE_IOCONNECT_ASYNC_64 - -#if MAP_32B_METHODS - -// Compatability routines with earlier Mig interface routines -// Remember only ILP32 ONLY -kern_return_t -io_connect_map_memory( - io_connect_t connect, - uint32_t memoryType, - task_port_t intoTask, - vm_address_t *atAddress, - vm_size_t *ofSize, - IOOptionBits options) -{ - kern_return_t rtn; - - mach_vm_address_t machAtAddress = *atAddress; - mach_vm_size_t machOfSize = *ofSize; - - rtn = io_connect_map_memory_into_task( - connect, memoryType, intoTask, &machAtAddress, &machOfSize, options); - - // Must be safe as we are have !__LP64__ checked - *atAddress = (vm_address_t) machAtAddress; - *ofSize = (vm_size_t) machOfSize; - - return rtn; -} - -kern_return_t -io_connect_unmap_memory( - io_connect_t connect, - uint32_t memoryType, - task_port_t fromTask, - vm_address_t atAddress) -{ - // Must be safe as we are have !__LP64__ checked - return io_connect_unmap_memory_from_task - (connect, memoryType, fromTask, (mach_vm_address_t) atAddress); -} - -kern_return_t -io_connect_method_scalarI_scalarO( - mach_port_t connection, - int selector, - int *input, - mach_msg_type_number_t inputCnt, - int *output, - mach_msg_type_number_t *outputCnt) -{ - kern_return_t rtn; - - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - - rtn = IOConnectCallMethod(connection, selector, - scalarData, inputCnt, NULL, 0, - scalarData, outputCnt, NULL, NULL); - - inputCnt = (rtn == KERN_SUCCESS && outputCnt)? *outputCnt : 0; - deflate_vec(output, inputCnt, scalarData, arrayCnt(scalarData)); - - return rtn; -} - -kern_return_t -io_async_method_scalarI_scalarO( - mach_port_t connection, - mach_port_t wakePort, - io_async_ref_t reference, - mach_msg_type_number_t referenceCnt, - int selector, - int *input, - mach_msg_type_number_t inputCnt, - int *output, - mach_msg_type_number_t *outputCnt) -{ - kern_return_t rtn; - - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - io_async_ref64_t refrncData; - inflate_vec(refrncData, arrayCnt(refrncData), (int *) reference, referenceCnt); - - rtn = IOConnectCallAsyncMethod(connection, selector, wakePort, - refrncData, referenceCnt, - scalarData, inputCnt, - NULL, 0, - scalarData, outputCnt, - NULL, NULL); - - inputCnt = (rtn == KERN_SUCCESS && outputCnt)? *outputCnt : 0; - deflate_vec(output, inputCnt, scalarData, arrayCnt(scalarData)); - - return rtn; -} - - -kern_return_t -io_connect_method_scalarI_structureO( - mach_port_t connection, - int selector, - int *input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t output, - mach_msg_type_number_t *outputCnt) -{ - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - - return IOConnectCallMethod(connection, selector, - scalarData, inputCnt, - NULL, 0, - NULL, NULL, - output, (size_t *) outputCnt); -} - -kern_return_t -io_async_method_scalarI_structureO( - mach_port_t connection, - mach_port_t wakePort, - io_async_ref_t reference, - mach_msg_type_number_t referenceCnt, - int selector, - int *input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t output, - mach_msg_type_number_t *outputCnt) -{ - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - io_async_ref64_t refrncData; - inflate_vec(refrncData, arrayCnt(refrncData), (int*)reference, referenceCnt); - - return IOConnectCallAsyncMethod(connection, selector, wakePort, - refrncData, referenceCnt, - scalarData, inputCnt, - NULL, 0, - NULL, NULL, - output, (size_t *) outputCnt); -} - - -kern_return_t -io_connect_method_scalarI_structureI( - mach_port_t connection, - int selector, - io_scalar_inband_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t inputStruct, - mach_msg_type_number_t inputStructCnt) -{ - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - - return IOConnectCallMethod(connection, selector, - scalarData, inputCnt, - inputStruct, inputStructCnt, - NULL, NULL, - NULL, NULL); -} - -kern_return_t -io_async_method_scalarI_structureI( - mach_port_t connection, - mach_port_t wakePort, - io_async_ref_t reference, - mach_msg_type_number_t referenceCnt, - int selector, - io_scalar_inband_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t inputStruct, - mach_msg_type_number_t inputStructCnt) -{ - // ILP32 - need to remap up to 64 bit scalars - io_scalar_inband64_t scalarData; - inflate_vec(scalarData, arrayCnt(scalarData), input, inputCnt); - io_async_ref64_t refrncData; - inflate_vec(refrncData, arrayCnt(refrncData), (int*)reference, referenceCnt); - - return IOConnectCallAsyncMethod(connection, selector, wakePort, - refrncData, referenceCnt, - scalarData, inputCnt, - inputStruct, inputStructCnt, - NULL, NULL, - NULL, NULL); -} - - -kern_return_t -io_connect_method_structureI_structureO( - mach_port_t connection, - int selector, - io_struct_inband_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t output, - mach_msg_type_number_t *outputCnt) -{ - return IOConnectCallMethod(connection, selector, - NULL, 0, - input, inputCnt, - NULL, NULL, - output, (size_t *) outputCnt); -} - -kern_return_t -io_async_method_structureI_structureO( - mach_port_t connection, - mach_port_t wakePort, - io_async_ref_t reference, - mach_msg_type_number_t referenceCnt, - int selector, - io_struct_inband_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t output, - mach_msg_type_number_t *outputCnt) -{ - // ILP32 - need to remap up to 64 bit scalars - io_async_ref64_t refrncData; - inflate_vec(refrncData, arrayCnt(refrncData), (int*)reference, referenceCnt); - - return IOConnectCallAsyncMethod(connection, selector, wakePort, - refrncData, referenceCnt, - NULL, 0, - input, inputCnt, - NULL, NULL, - output, (size_t *) outputCnt); -} -#endif // MAP_32B_METHODS - -#if EMULATE_IOCONNECT_64 -kern_return_t io_connect_method -( - mach_port_t connection, - uint32_t selector, - io_scalar_inband64_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t inband_input, - mach_msg_type_number_t inband_inputCnt, - mach_vm_address_t ool_input, - mach_vm_size_t ool_input_size __unused, - io_scalar_inband64_t output, - mach_msg_type_number_t *outputCnt, - io_struct_inband_t inband_output, - mach_msg_type_number_t *inband_outputCnt, - mach_vm_address_t ool_output, - mach_vm_size_t * ool_output_size __unused -) -{ - if (ool_input || ool_output) - return MIG_ARRAY_TOO_LARGE; - - if (inband_input && inband_output) { - // io_connect_method_structureI_structureO - return io_connect_method_structureI_structureO(connection, selector, - inband_input, inband_inputCnt, inband_output, inband_outputCnt); - } - - io_scalar_inband_t inData; - deflate_vec(inData, arrayCnt(inData), input, inputCnt); - - if (inband_input) { - // io_connect_method_scalarI_structureI - return io_connect_method_scalarI_structureI(connection, selector, - inData, inputCnt, inband_input, inband_inputCnt); - } - else if (inband_output) { - // io_connect_method_scalarI_structureO - return io_connect_method_scalarI_structureO(connection, selector, - inData, inputCnt, inband_output, inband_outputCnt); - } - - // io_connect_method_scalarI_scalarO - kern_return_t rtn = io_connect_method_scalarI_scalarO(connection, selector, - inData, inputCnt, inData, outputCnt); - inputCnt = (rtn == KERN_SUCCESS && outputCnt)? *outputCnt : 0; - inflate_vec(output, inputCnt, inData, arrayCnt(inData)); - return rtn; -} -#endif // EMULATE_IOCONNECT_64 - -#if EMULATE_IOCONNECT_ASYNC_64 -kern_return_t io_connect_async_method -( - mach_port_t connection, - mach_port_t wake_port, - io_async_ref64_t reference, - mach_msg_type_number_t referenceCnt, - uint32_t selector, - io_scalar_inband64_t input, - mach_msg_type_number_t inputCnt, - io_struct_inband_t inband_input, - mach_msg_type_number_t inband_inputCnt, - mach_vm_address_t ool_input, - mach_vm_size_t ool_input_size __unused, - io_scalar_inband64_t output, - mach_msg_type_number_t *outputCnt, - io_struct_inband_t inband_output, - mach_msg_type_number_t *inband_outputCnt, - mach_vm_address_t ool_output, - mach_vm_size_t * ool_output_size __unused -) -{ - if (ool_input || ool_output) - return MIG_ARRAY_TOO_LARGE; - - io_async_ref_t refData; - deflate_vec((int*)refData, arrayCnt(refData), reference, referenceCnt); - - if (inband_input && inband_output) { - // io_async_method_structureI_structureO - return io_async_method_structureI_structureO( - connection, wake_port, refData, referenceCnt, selector, - inband_input, inband_inputCnt, inband_output, inband_outputCnt); - } - - io_scalar_inband_t inData; - deflate_vec(inData, arrayCnt(inData), input, inputCnt); - - if (inband_input) { - // io_async_method_scalarI_structureI - return io_async_method_scalarI_structureI( - connection, wake_port, refData, referenceCnt, selector, - inData, inputCnt, inband_input, inband_inputCnt); - } - else if (inband_output) { - // io_async_method_scalarI_structureO - return io_async_method_scalarI_structureO( - connection, wake_port, refData, referenceCnt, selector, - inData, inputCnt, inband_output, inband_outputCnt); - } - - // io_async_method_scalarI_scalarO - kern_return_t rtn = io_async_method_scalarI_scalarO( - connection, wake_port, refData, referenceCnt, selector, - inData, inputCnt, inData, outputCnt); - inputCnt = (rtn == KERN_SUCCESS && outputCnt)? *outputCnt : 0; - inflate_vec(output, inputCnt, inData, arrayCnt(inData)); - return rtn; -} -#endif // EMULATE_IOCONNECT_ASYNC_64 - - -#endif /* !__LP64__ */ - diff --git a/include/IOKit/Readme.md b/include/IOKit/Readme.md deleted file mode 100644 index fc83921..0000000 --- a/include/IOKit/Readme.md +++ /dev/null @@ -1,10 +0,0 @@ -IOKit for iOS SDK7.0 -======= - -![](https://github.com/obaby/IOKit/blob/master/screenshot.jpg?raw=true) - -在某些时候可能会用到IOKit来获取一些信息,但是将sdk从6.x升级到7.0的sdk之后就会发现那个libIOKit.dylib找不到了。晚上的办法是将6.x的sdk复制到7.0的sdk下,或者创建一个符号链接。 - -其实还有另外的一个解决办法,在7.0之后这个东西只是不是dylib了,而是成了一个framework。在这个目录下 - - /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/IOKit.framework,所以只需要将工程中的iokit用framework替换掉就可以了。另外这个并没有头文件,如果要用也得自己去提取相关的头文件。可以用classdump来生成。我用的是apple xun中的头文件,效果是一样的,这里整理了一下,需要的直接放入工程目录下引入IOKitLib.h就可以了。 \ No newline at end of file diff --git a/include/IOKit/screenshot.jpg b/include/IOKit/screenshot.jpg deleted file mode 100644 index 7c16938c5ce9092531de4e184d40277b87b17c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74438 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