void BrcmPatchRAM::removePersonality() { DebugLog("removePersonality\n"); #ifdef DEBUG printPersonalities(); #endif // remove Broadcom matching personality OSDictionary* dict = OSDictionary::withCapacity(5); if (!dict) return; setStringInDict(dict, kIOProviderClassKey, kIOUSBDeviceClassName); setNumberInDict(dict, kUSBProductID, mProductId); setNumberInDict(dict, kUSBVendorID, mVendorId); dict->setObject(kBundleIdentifier, brcmBundleIdentifier); gIOCatalogue->removeDrivers(dict, true); // remove generic matching personality dict->removeObject(kUSBProductID); dict->removeObject(kUSBVendorID); setStringInDict(dict, kBundleIdentifier, "com.apple.iokit.IOBluetoothHostControllerUSBTransport"); setNumberInDict(dict, "bDeviceClass", 224); setNumberInDict(dict, "bDeviceProtocol", 1); setNumberInDict(dict, "bDeviceSubClass", 1); gIOCatalogue->removeDrivers(dict, true); dict->release(); #ifdef DEBUG printPersonalities(); #endif }
bool BrcmPatchRAM::publishResourcePersonality(const char* classname) { // matching dictionary for disabled BrcmFirmwareStore OSDictionary* dict = OSDictionary::withCapacity(3); if (!dict) return false; setStringInDict(dict, kIOProviderClassKey, "disabled_IOResources"); setStringInDict(dict, kIOClassKey, classname); setStringInDict(dict, kIOMatchCategoryKey, classname); // retrieve currently matching IOKit driver personalities OSDictionary* personality = NULL; SInt32 generationCount; if (OSOrderedSet* set = gIOCatalogue->findDrivers(dict, &generationCount)) { if (set->getCount()) DebugLog("%d matching driver personalities for %s.\n", set->getCount(), classname); // should be only one, so we can grab just the first if (OSCollectionIterator* iterator = OSCollectionIterator::withCollection(set)) { personality = OSDynamicCast(OSDictionary, iterator->getNextObject()); iterator->release(); } set->release(); } // if we don't find it, then something is really wrong... if (!personality) { AlwaysLog("unable to find disabled %s personality.\n", classname); dict->release(); return false; } // make copy of personality *before* removing from IOcatalog personality = OSDynamicCast(OSDictionary, personality->copyCollection()); if (!personality) { AlwaysLog("copyCollection failed."); return false; } // unpublish disabled personality gIOCatalogue->removeDrivers(dict, false); // no nub matching on removal dict->release(); // Add new personality into the kernel if (OSArray* array = OSArray::withCapacity(1)) { // change from disabled_IOResources to IOResources setStringInDict(personality, kIOProviderClassKey, "IOResources"); array->setObject(personality); if (gIOCatalogue->addDrivers(array, true)) AlwaysLog("Published new IOKit personality for %s.\n", classname); else AlwaysLog("ERROR in addDrivers for new %s personality.\n", classname); array->release(); } personality->release(); return true; }
void BrcmPatchRAM::printPersonalities() { // Matching dictionary for the current device OSDictionary* dict = OSDictionary::withCapacity(5); if (!dict) return; setStringInDict(dict, kIOProviderClassKey, kIOUSBDeviceClassName); setNumberInDict(dict, kUSBProductID, mProductId); setNumberInDict(dict, kUSBVendorID, mVendorId); SInt32 generatonCount; if (OSOrderedSet* set = gIOCatalogue->findDrivers(dict, &generatonCount)) { AlwaysLog("[%04x:%04x]: %d matching driver personalities.\n", mVendorId, mProductId, set->getCount()); if (OSCollectionIterator* iterator = OSCollectionIterator::withCollection(set)) { while (OSDictionary* personality = static_cast<OSDictionary*>(iterator->getNextObject())) { OSString* bundleId = OSDynamicCast(OSString, personality->getObject(kBundleIdentifier)); AlwaysLog("[%04x:%04x]: existing IOKit personality \"%s\".\n", mVendorId, mProductId, bundleId->getCStringNoCopy()); } iterator->release(); } set->release(); } dict->release(); }
void BrcmPatchRAM::publishPersonality() { // Matching dictionary for the current device OSDictionary* dict = OSDictionary::withCapacity(5); if (!dict) return; setStringInDict(dict, kIOProviderClassKey, kIOUSBDeviceClassName); setNumberInDict(dict, kUSBProductID, mProductId); setNumberInDict(dict, kUSBVendorID, mVendorId); // Retrieve currently matching IOKit driver personalities OSDictionary* personality = NULL; SInt32 generationCount; if (OSOrderedSet* set = gIOCatalogue->findDrivers(dict, &generationCount)) { if (set->getCount()) DebugLog("[%04x:%04x]: %d matching driver personalities.\n", mVendorId, mProductId, set->getCount()); if (OSCollectionIterator* iterator = OSCollectionIterator::withCollection(set)) { while ((personality = OSDynamicCast(OSDictionary, iterator->getNextObject()))) { if (OSString* bundleId = OSDynamicCast(OSString, personality->getObject(kBundleIdentifier))) if (strncmp(bundleId->getCStringNoCopy(), kAppleBundlePrefix, strlen(kAppleBundlePrefix)) == 0) { AlwaysLog("[%04x:%04x]: Found existing IOKit personality \"%s\".\n", mVendorId, mProductId, bundleId->getCStringNoCopy()); break; } } iterator->release(); } set->release(); } if (!personality && brcmBundleIdentifier) { // OS X does not have a driver personality for this device yet, publish one DebugLog("brcmBundIdentifier: \"%s\"\n", brcmBundleIdentifier->getCStringNoCopy()); DebugLog("brcmIOClass: \"%s\"\n", brcmIOClass->getCStringNoCopy()); dict->setObject(kBundleIdentifier, brcmBundleIdentifier); dict->setObject(kIOClassKey, brcmIOClass); // Add new personality into the kernel if (OSArray* array = OSArray::withCapacity(1)) { array->setObject(dict); if (gIOCatalogue->addDrivers(array, true)) AlwaysLog("[%04x:%04x]: Published new IOKit personality.\n", mVendorId, mProductId); else AlwaysLog("[%04x:%04x]: ERROR in addDrivers for new IOKit personality.\n", mVendorId, mProductId); array->release(); } } dict->release(); #ifdef DEBUG printPersonalities(); #endif }