IOKit, кажется, возвращает другой MAC-адрес для en0 для некоторых пользователей - PullRequest
0 голосов
/ 11 октября 2019

На основе примера кода Apple я получил MAC-адрес для en0 для идентификации уникального устройства.

С выпуском Catalina я видел часть пользователей на той же машине сMAC-адрес в Каталине отличается от Мохаве.

Я тестировал на нескольких машинах и не смог воспроизвести, но я знаю, что это происходит со значительной частью клиентов.

Есть кто-нибудьиспытали подобное или есть идеи относительно того, что может происходить?

kern_return_t           kr          = KERN_SUCCESS;
    CFMutableDictionaryRef  matching    = NULL;
    io_iterator_t           iterator    = IO_OBJECT_NULL;
    io_object_t             service     = IO_OBJECT_NULL;
    CFDataRef               result      = NULL;

    matching = IOBSDNameMatching( kIOMasterPortDefault, 0, "en0" );
    if ( matching == NULL )
    {
        fprintf( stderr, "IOBSDNameMatching() returned empty dictionary\n" );
        return ( NULL );
    }

    kr = IOServiceGetMatchingServices( kIOMasterPortDefault, matching, &iterator );
    if ( kr != KERN_SUCCESS )
    {
        fprintf( stderr, "IOServiceGetMatchingServices() returned %d\n", kr );
        return ( NULL );
    }

    while ( (service = IOIteratorNext(iterator)) != IO_OBJECT_NULL )
    {
        io_object_t parent = IO_OBJECT_NULL;

        kr = IORegistryEntryGetParentEntry( service, kIOServicePlane, &parent );
        if ( kr == KERN_SUCCESS )
        {
            if ( result != NULL )
                CFRelease( result );

            result = IORegistryEntryCreateCFProperty( parent, CFSTR("IOMACAddress"), kCFAllocatorDefault, 0 );
            IOObjectRelease( parent );
        }
        else
        {
            fprintf( stderr, "IORegistryGetParentEntry returned %d\n", kr );
        }

        IOObjectRelease( service );
    }

    return ((NSData *)CFBridgingRelease(result));
...