#include "GetMACAddress.h"
static kern_return_t FindEthernetInterfaces(io_iterator_t *matchingServices);
static kern_return_t GetMACAddress(io_iterator_t intfIterator, UInt8 *MACAddress);
static kern_return_t FindEthernetInterfaces(io_iterator_t *matchingServices)
{
kern_return_t kernResult = KERN_FAILURE;
mach_port_t masterPort = MACH_PORT_NULL;
CFMutableDictionaryRef classesToMatch = NULL;
kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
if ( kernResult == KERN_SUCCESS )
{
classesToMatch = IOServiceMatching(kIOEthernetInterfaceClass);
if ( classesToMatch != NULL )
{
kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, matchingServices);
}
}
return kernResult;
}
static kern_return_t GetMACAddress(io_iterator_t intfIterator, UInt8 *MACAddress)
{
io_object_t intfService = MACH_PORT_NULL;
io_object_t controllerService = MACH_PORT_NULL;
kern_return_t kernResult = KERN_FAILURE;
intfService = IOIteratorNext(intfIterator);
if ( intfService != MACH_PORT_NULL )
{
CFTypeRef MACAddressAsCFData = NULL;
kernResult = IORegistryEntryGetParentEntry( intfService,
kIOServicePlane,
&controllerService );
if ( kernResult == KERN_SUCCESS )
{
MACAddressAsCFData = IORegistryEntryCreateCFProperty( controllerService,
CFSTR(kIOMACAddress),
kCFAllocatorDefault,
0);
if (MACAddressAsCFData != NULL)
{
CFDataGetBytes(MACAddressAsCFData, CFRangeMake(0, kIOEthernetAddressSize), MACAddress);
CFRelease(MACAddressAsCFData);
}
(void) IOObjectRelease(controllerService);
}
(void) IOObjectRelease(intfService);
}
return kernResult;
}
sInt32 GetEthernetAddress( CFStringRef *theLZMACAddress, CFStringRef *theNLZMACAddress)
{
kern_return_t kernResult = KERN_SUCCESS;
io_iterator_t intfIterator = MACH_PORT_NULL;
unsigned char macAddress[ kIOEthernetAddressSize ];
kernResult = FindEthernetInterfaces(&intfIterator);
if (kernResult == KERN_SUCCESS)
{
kernResult = GetMACAddress(intfIterator, &macAddress[0]);
if (kernResult == KERN_SUCCESS)
{
if (theLZMACAddress != nil)
*theLZMACAddress = GetMACAddressFormattedStr(&macAddress[0], true);
if (theNLZMACAddress != nil)
*theNLZMACAddress = GetMACAddressFormattedStr(&macAddress[0], false);
}
IOObjectRelease(intfIterator); }
return kernResult;
}
CFStringRef GetMACAddressFormattedStr(unsigned char* addr, bool bLeadingZeros)
{
char buffer[32];
char *p = buffer;
short i;
CFStringRef outString;
if (bLeadingZeros)
{
for (i = 0; i < 6; ++i )
p += sprintf( p, "%2.2x:", addr[i] );
}
else
{
for (i = 0; i < 6; ++i )
p += sprintf( p, "%x:", addr[i] );
}
*(--p) = '\0';
outString = CFStringCreateWithCString(kCFAllocatorDefault, buffer, kCFStringEncodingMacRoman);
return outString;
}