//.........这里部分代码省略......... junk = CFQDictionarySetNumber(interfaceInfo, kSortOrderKey, kEthernetPCISortOrder); assert(junk == 0); // Get "AAPL,slot-name" property from I/O Registry and copy it into // our interfaceInfo dictionary. But first, mutate the slot name // into a user-visible name version. slotName = NULL; slotNameAsData = (CFDataRef) IORegistryEntryCreateCFProperty(bus, CFSTR("AAPL,slot-name"), NULL, kNilOptions); if (slotNameAsData != NULL) { slotName = CreateStringFromData(slotNameAsData); } if (slotName != NULL) { CFStringRef tmp; tmp = CopyUserVisibleSlotName(slotName); if (tmp != NULL) { CFQRelease(slotName); slotName = tmp; } } if (slotName == NULL) { CFDictionarySetValue(interfaceInfo, CFSTR("AAPL,slot-name"), CFSTR("unknown")); } else { CFDictionarySetValue(interfaceInfo, CFSTR("AAPL,slot-name"), slotName); } CFQRelease(slotName); // Now get the IOChildIndex property to decide whether it's a single // or multi-port Ethernet card. portNum = (CFNumberRef) CFDictionaryGetValue(busDict, CFSTR("IOChildIndex")); if ( (portNum == NULL) || ! CFNumberGetValue(portNum, kCFNumberSInt32Type, &junkNum) ) { // single-port pci enet card // Either there is no IOChildIndex property, or it doesn't contain a // valid number. *userVisibleName = (CFStringRef) CFQRetain( kMoreSCPortLabelEthernetPCI ); } else { CFNumberRef portNumRef; SInt32 portNum; CFStringRef portNumString; // multi-port pci enet card // Get "IOChildIndex" property from I/O Registry and copy it into // our interfaceInfo dictionary. portNumString = NULL; portNumRef = (CFNumberRef) IORegistryEntryCreateCFProperty(bus, CFSTR("IOChildIndex"), NULL, kNilOptions); if ( (portNumRef != NULL) && CFNumberGetValue(portNumRef, kCFNumberSInt32Type, &portNum) ) { portNumString = CFStringCreateWithFormat(NULL, NULL, CFSTR("%ld"), portNum + 1); } if (portNumString == NULL) { CFDictionarySetValue(interfaceInfo, CFSTR("IOChildIndex"), CFSTR("unknown")); } else { CFDictionarySetValue(interfaceInfo, CFSTR("IOChildIndex"), portNumString); } CFQRelease(portNumString); CFQRelease(portNumRef); *userVisibleName = (CFStringRef) CFQRetain( kMoreSCPortLabelEthernetPCIMultiport ); } } else {