kern_return_t SMCReadKey(io_connect_t conn, const UInt32Char_t key, SMCVal_t *val) { kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; memset(&inputStructure, 0, sizeof(SMCKeyData_t)); memset(&outputStructure, 0, sizeof(SMCKeyData_t)); memset(val, 0, sizeof(SMCVal_t)); inputStructure.key = _strtoul(key, 4, 16); snprintf(val->key, 5, "%s", key); inputStructure.data8 = SMC_CMD_READ_KEYINFO; result = SMCCall(conn, KERNEL_INDEX_SMC, &inputStructure, &outputStructure); if (result != kIOReturnSuccess) return result; val->dataSize = outputStructure.keyInfo.dataSize; _ultostr(val->dataType, outputStructure.keyInfo.dataType); inputStructure.keyInfo.dataSize = val->dataSize; inputStructure.data8 = SMC_CMD_READ_BYTES; result = SMCCall(conn, KERNEL_INDEX_SMC, &inputStructure, &outputStructure); if (result != kIOReturnSuccess) return result; memcpy(val->bytes, outputStructure.bytes, sizeof(outputStructure.bytes)); return kIOReturnSuccess; }
kern_return_t SMCReadKey(io_connect_t conn, const UInt32Char_t key, SMCVal_t *val) { kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; memset(&inputStructure, 0, sizeof(SMCKeyData_t)); memset(&outputStructure, 0, sizeof(SMCKeyData_t)); memset(val, 0, sizeof(SMCVal_t)); inputStructure.key = _strtoul(key, 4, 16); //REVEIW_REHABMAN: mempcy used to avoid deprecated strcpy... //strcpy(val->key, key); memcpy(val->key, key, sizeof(val->key)); result = SMCGetKeyInfo(conn, inputStructure.key, &outputStructure.keyInfo); if (result != kIOReturnSuccess) return result; val->dataSize = outputStructure.keyInfo.dataSize; _ultostr(val->dataType, outputStructure.keyInfo.dataType); inputStructure.keyInfo.dataSize = val->dataSize; inputStructure.data8 = SMC_CMD_READ_BYTES; result = SMCCall(conn, KERNEL_INDEX_SMC, &inputStructure, &outputStructure); if (result != kIOReturnSuccess) return result; memcpy(val->bytes, outputStructure.bytes, sizeof(outputStructure.bytes)); return kIOReturnSuccess; }
kern_return_t smcPrintAll(void) { kern_return_t result; SMCKeyData_t inputStructure; SMCKeyData_t outputStructure; int totalKeys, i; UInt32Char_t key; SMCVal_t val; totalKeys = smcReadIndexCount(); totalKeys = 500; for (i = 0; i < totalKeys; i++) { memset(&inputStructure, 0, sizeof(SMCKeyData_t)); memset(&outputStructure, 0, sizeof(SMCKeyData_t)); memset(&val, 0, sizeof(SMCVal_t)); inputStructure.data8 = SMC_CMD_READ_INDEX; inputStructure.data32 = i; result = smcCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); if (result != kIOReturnSuccess) continue; _ultostr(key, outputStructure.key); result = smcReadKey(key, &val); printVal(val); } return kIOReturnSuccess; }
char *_ultostr(void *str, unsigned long val, unsigned base) { char *_str = (char *)str; _uldiv_t r; if(base > 64) {//36 _str[0] = '\0'; return NULL; } r = _uldiv(val, base); if(r.quot > 0) { _str = _ultostr(_str, r.quot, base); } *_str++ = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,."[(int)r.rem]; *_str = '\0'; return _str; }
IOReturn FakeSMCKeyStoreUserClient::externalMethod(uint32_t selector, IOExternalMethodArguments* arguments, IOExternalMethodDispatch * dispatch, OSObject * target, void * reference ) { IOReturn result = kIOReturnError; if (keyStore == NULL || isInactive()) { result = kIOReturnNotAttached; } else if (!keyStore->isOpen(this)) { result = kIOReturnNotOpen; } SYNCLOCK; switch (selector) { case KERNEL_INDEX_SMC: { SMCKeyData_t *input = (SMCKeyData_t*)arguments->structureInput; SMCKeyData_t *output = (SMCKeyData_t*)arguments->structureOutput; switch (input->data8) { case SMC_CMD_READ_INDEX: { FakeSMCKey *key = keyStore->getKey(input->data32); output->key = _strtoul(key->getKey(), 4, 16); result = kIOReturnSuccess; break; } case SMC_CMD_READ_KEYINFO: { char name[5]; _ultostr(name, input->key); FakeSMCKey *key = keyStore->getKey(name); if (key) { output->keyInfo.dataSize = key->getSize(); output->keyInfo.dataType = _strtoul(key->getType(), 4, 16); result = kIOReturnSuccess; } else result = kIOReturnNotFound; break; } case SMC_CMD_READ_BYTES: { char name[5]; _ultostr(name, input->key); FakeSMCKey *key = keyStore->getKey(name); if (key) { memcpy(output->bytes, key->getValue(), key->getSize()); result = kIOReturnSuccess; } else result = kIOReturnNotFound; break; } case SMC_CMD_WRITE_BYTES: { char name[5]; _ultostr(name, input->key); IOLog("FakeSMCKeyStoreUserClient: SMC_CMD_WRITE_BYTES key=%s", name); FakeSMCKey *key = keyStore->getKey(name); if (key) { key->setValueFromBuffer(input->bytes, input->keyInfo.dataSize); result = kIOReturnSuccess; } else { char type[5]; if (input->keyInfo.dataType) { _ultostr(type, input->keyInfo.dataType); } else { type[0] = '\0'; } keyStore->addKeyWithValue(name, type, input->keyInfo.dataSize, input->bytes); result = kIOReturnSuccess; } break; } default: result = kIOReturnBadArgument; break; } break; } default: result = kIOReturnBadArgument; break; } SYNCUNLOCK; return result; }