1*d8b80295SApple OSS Distributionsfrom ioreg import * 2*d8b80295SApple OSS Distributions 3*d8b80295SApple OSS Distributions@lldb_command("shownvram") 4*d8b80295SApple OSS Distributionsdef PrintNvramVars(cmd_args=[]): 5*d8b80295SApple OSS Distributions """ 6*d8b80295SApple OSS Distributions Print NVRAM variables. 7*d8b80295SApple OSS Distributions """ 8*d8b80295SApple OSS Distributions dt_plane = GetRegistryPlane("IODeviceTree") 9*d8b80295SApple OSS Distributions if dt_plane is None: 10*d8b80295SApple OSS Distributions raise ValueError("Couldn't obtain a pointer to IODeviceTree") 11*d8b80295SApple OSS Distributions 12*d8b80295SApple OSS Distributions # Registry API functions operate on "plane" global variable 13*d8b80295SApple OSS Distributions global plane 14*d8b80295SApple OSS Distributions prev_plane = plane 15*d8b80295SApple OSS Distributions plane = dt_plane 16*d8b80295SApple OSS Distributions options = FindRegistryObjectRecurse(kern.globals.gRegistryRoot, "options") 17*d8b80295SApple OSS Distributions # Restore original plane after getting options 18*d8b80295SApple OSS Distributions plane = prev_plane 19*d8b80295SApple OSS Distributions if options is None: 20*d8b80295SApple OSS Distributions print("Couldn't obtain options IORegistryEntry") 21*d8b80295SApple OSS Distributions return 22*d8b80295SApple OSS Distributions 23*d8b80295SApple OSS Distributions var_dict = kern.GetValueFromAddress('((IODTNVRAM*)' + hex(options) + ')->_varDict', 'OSDictionary *') 24*d8b80295SApple OSS Distributions if var_dict is None: 25*d8b80295SApple OSS Distributions print("Couldn't obtain varDict") 26*d8b80295SApple OSS Distributions return 27*d8b80295SApple OSS Distributions 28*d8b80295SApple OSS Distributions for x in range(var_dict.count): 29*d8b80295SApple OSS Distributions name = var_dict.dictionary[x].key.string 30*d8b80295SApple OSS Distributions value = var_dict.dictionary[x].value 31*d8b80295SApple OSS Distributions 32*d8b80295SApple OSS Distributions # get value type 33*d8b80295SApple OSS Distributions value_info = GetObjectTypeStr(value) 34*d8b80295SApple OSS Distributions if value_info is None: 35*d8b80295SApple OSS Distributions print("Couldn't obtain object type for name:", name, "value:", value) 36*d8b80295SApple OSS Distributions continue 37*d8b80295SApple OSS Distributions srch = re.search(r'vtable for ([A-Za-z].*)', value_info) 38*d8b80295SApple OSS Distributions if not srch: 39*d8b80295SApple OSS Distributions print("Couldn't find type in value_info:", value_info) 40*d8b80295SApple OSS Distributions continue 41*d8b80295SApple OSS Distributions value_type = srch.group(1) 42*d8b80295SApple OSS Distributions 43*d8b80295SApple OSS Distributions if (value_type == 'OSString'): 44*d8b80295SApple OSS Distributions print(name, '=', GetString(value)) 45*d8b80295SApple OSS Distributions elif (value_type == 'OSData'): 46*d8b80295SApple OSS Distributions data_ptr = Cast(value.data, 'uint8_t *') 47*d8b80295SApple OSS Distributions print (name, '= ', end ='') 48*d8b80295SApple OSS Distributions data_buffer = "" 49*d8b80295SApple OSS Distributions for i in range(value.length): 50*d8b80295SApple OSS Distributions if ((data_ptr[i] >= 0x20 and data_ptr[i] <= 0x7e) and chr(data_ptr[i]) != '%'): 51*d8b80295SApple OSS Distributions data_buffer += chr(data_ptr[i]) 52*d8b80295SApple OSS Distributions else: 53*d8b80295SApple OSS Distributions data_buffer += "%%%02x" % data_ptr[i] 54*d8b80295SApple OSS Distributions print (data_buffer) 55*d8b80295SApple OSS Distributions elif (value_type == 'OSNumber'): 56*d8b80295SApple OSS Distributions print(name, '=', GetNumber(value)) 57*d8b80295SApple OSS Distributions elif (value_type == 'OSBoolean'): 58*d8b80295SApple OSS Distributions print(name, '=', GetBoolean(value)) 59*d8b80295SApple OSS Distributions else: 60*d8b80295SApple OSS Distributions print("Invalid type:", value_type)