2011年4月12日 星期二

find element in ioregistry

from client program:


#include <IOKit/network/IOEthernetInterface.h>
#include <IOKit/IOType.h>




int findClassesInIoregistry(io_iterator_t*  iterator, char *match_name)
{
        CFDictionaryRef classToMatch;
kern_return_t kernResult; 
classToMatch = IOServiceMatching(match_name);
if (classToMatch == NULL)
        {
              return -1;
        }
// use class name to match
        kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,    
                      classToMatch, iterator);
if (kernResult != KERN_SUCCESS) 
        {
        
             return -1;
        }
return kIOReturnSuccess;
}


io_iterator_t ethernetInterfaceIterator;
result = findClassesInIoregistry(& ethernetInterfaceIterator, kIOEthernetInterfaceIterator);
if(result == kIOReturnSuccess)
{
        io_service_t ethernetInterface;
    while(ethernetInterface = IOIteratorNext(ethernetInterfaceIterator))
    {
        NSString *bsdName =
             (NSString*)IORegistryEntrySearchCFProperty(ethernetInterface,
                                                        kIOServicePlane, 
                                                        CFSTR("BSD Name"), 
                                                        kCFAllocatorDefault,
                                                   kIORegistryIterateRecursively);


       io_service_t ethernetController;
       result = IORegistryEntryGetParentEntry(ethernetInterface, 
                                           kIOServicePlane, 
                                           &ethernetController);
       if(result == kIOReturnSuccess)
       {
        
           IOObjectRelease(ethernetController);
       }



        IOObjectRelease(ethernetInterface);
        
    }
    IOObjectRelease(ethernetInterfaceIterator);
}



from driver program:


OSIterator *blockDriverIter =  this->getProviderIterator();
com_my_BlockStorageDriver *blockDriver;

if(blockDriverIter)

{
while (blockDriver = (com_my_BlockStorageDriver*)blockDriverIter->getNextObject()) 
        {
    
IOLog("blockDriver %p inAct %d\n", blockDriver,

blockDriver->isInactive());

   
}
blockDriverIter->release();
}






2011年4月11日 星期一

IO statistics in mac

From IORegistryExplorer, check IOBlockStorageDriver 

detect blow on iOS SDK

http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/

IOUserClient

reference sample code from Apple:
SimpleUserClient


IOExternalMethodDispatch structure:

struct IOExternalMethodDispatch
{
    IOExternalMethodAction function;
    uint32_t     checkScalarInputCount;
    uint32_t     checkStructureInputSize;
    uint32_t     checkScalarOutputCount;
    uint32_t     checkStructureOutputSize;
};