######################################
plane = None
+#####################################
+# Utility functions.
+#####################################
+def CastIOKitClass(obj, target_type):
+ """ Type cast an object to another IOKIT CPP class.
+ params:
+ obj - core.value object representing some C construct in lldb
+ target_type - str : ex 'OSString *'
+ - lldb.SBType :
+ """
+ v = Cast(obj, target_type)
+ v.GetSBValue().SetPreferDynamicValue(lldb.eNoDynamicValues)
+ return v
+
######################################
# Type Summaries
######################################
ztvAddr = kern.GetLoadAddressForSymbol('_ZTV7OSArray')
if vt == ztvAddr:
- out_string += "(" + GetArray(Cast(obj, 'OSArray *')) + ")"
+ out_string += "(" + GetArray(CastIOKitClass(obj, 'OSArray *')) + ")"
return out_string
ztvAddr = kern.GetLoadAddressForSymbol('_ZTV5OSSet')
if vt == ztvAddr:
- out_string += GetSet(Cast(obj, 'OSSet *'))
+ out_string += GetSet(CastIOKitClass(obj, 'OSSet *'))
return out_string
ztvAddr = kern.GetLoadAddressForSymbol('_ZTV12OSDictionary')
if vt == ztvAddr:
- out_string += GetDictionary(Cast(obj, 'OSDictionary *'))
+ out_string += GetDictionary(CastIOKitClass(obj, 'OSDictionary *'))
return out_string
return out_string
name = LookupKeyInOSDict(propertyTable, kern.globals.gIOClassKey)
if name is not None:
- out_string += "+-o {0:s} ".format(GetString(Cast(name, 'OSString *')))
- elif Cast(entry, 'IOService *').pwrMgt and Cast(entry, 'IOService *').pwrMgt.Name:
- out_string += "+-o {0:s} ".format(Cast(entry, 'IOService *').pwrMgt.Name)
+ out_string += "+-o {0:s} ".format(GetString(CastIOKitClass(name, 'OSString *')))
+ elif CastIOKitClass(entry, 'IOService *').pwrMgt and CastIOKitClass(entry, 'IOService *').pwrMgt.Name:
+ out_string += "+-o {0:s} ".format(CastIOKitClass(entry, 'IOService *').pwrMgt.Name)
else:
out_string += "+-o ?? "
ztvAddr = kern.GetLoadAddressForSymbol('_ZTV15IORegistryEntry')
if vtableAddr != ztvAddr:
out_string += ", "
- state = Cast(entry, 'IOService *').__state[0]
+ state = CastIOKitClass(entry, 'IOService *').__state[0]
# kIOServiceRegisteredState
if 0 == state & 2:
out_string += "!"
#kIOServiceInactiveState
if 0 != state & 1:
out_string += "in"
- busyCount = (Cast(entry, 'IOService *').__state[1] & 0xff)
- retCount = (Cast(entry, 'IOService *').retainCount & 0xffff)
+ busyCount = (CastIOKitClass(entry, 'IOService *').__state[1] & 0xff)
+ retCount = (CastIOKitClass(entry, 'IOService *').retainCount & 0xffff)
out_string += "active, busy {0}, retain count {1}>".format(busyCount, retCount)
- #else:
- # out_string += "\n"
return out_string
######################################
count = unsigned(kern.globals.sAllClassesDict.count)
while idx < count:
- meta = Cast(kern.globals.sAllClassesDict.dictionary[idx].value, 'OSMetaClass *')
+ meta = CastIOKitClass(kern.globals.sAllClassesDict.dictionary[idx].value, 'OSMetaClass *')
idx += 1
print GetMetaClass(meta)
childArray = LookupKeyInOSDict(registryTable, childKey)
if childArray is not None:
idx = 0
- ca = Cast(childArray, 'OSArray *')
+ ca = CastIOKitClass(childArray, 'OSArray *')
count = unsigned(ca.count)
while idx < count:
if plen != 0 and plen != 1 and (plen & (plen - 1)) == 0:
- ShowRegistryEntryRecurse(Cast(ca.array[idx], 'IORegistryEntry *'), prefix + "| ", printProps)
+ ShowRegistryEntryRecurse(CastIOKitClass(ca.array[idx], 'IORegistryEntry *'), prefix + "| ", printProps)
else:
- ShowRegistryEntryRecurse(Cast(ca.array[idx], 'IORegistryEntry *'), prefix + " ", printProps)
+ ShowRegistryEntryRecurse(CastIOKitClass(ca.array[idx], 'IORegistryEntry *'), prefix + " ", printProps)
idx += 1
def FindRegistryEntryRecurse(entry, search_name, stopAfterFirst):
name = LookupKeyInOSDict(propertyTable, kern.globals.gIOClassKey)
if name is not None:
- if str(Cast(name, 'OSString *').string) == search_name:
+ if str(CastIOKitClass(name, 'OSString *').string) == search_name:
print GetRegistryEntrySummary(entry)
if stopAfterFirst is True:
return True
- elif Cast(entry, 'IOService *').pwrMgt and Cast(entry, 'IOService *').pwrMgt.Name:
- name = Cast(entry, 'IOService *').pwrMgt.Name
+ elif CastIOKitClass(entry, 'IOService *').pwrMgt and CastIOKitClass(entry, 'IOService *').pwrMgt.Name:
+ name = CastIOKitClass(entry, 'IOService *').pwrMgt.Name
if str(name) == search_name:
print GetRegistryEntrySummary(entry)
if stopAfterFirst is True:
childArray = LookupKeyInOSDict(registryTable, childKey)
if childArray is not None:
idx = 0
- ca = Cast(childArray, 'OSArray *')
+ ca = CastIOKitClass(childArray, 'OSArray *')
count = unsigned(ca.count)
while idx < count:
- if FindRegistryEntryRecurse(Cast(ca.array[idx], 'IORegistryEntry *'), search_name, stopAfterFirst) is True:
+ if FindRegistryEntryRecurse(CastIOKitClass(ca.array[idx], 'IORegistryEntry *'), search_name, stopAfterFirst) is True:
return True
idx += 1
return False
name = LookupKeyInOSDict(propertyTable, kern.globals.gIOClassKey)
if name is not None:
- if str(Cast(name, 'OSString *').string) == search_name:
+ if str(CastIOKitClass(name, 'OSString *').string) == search_name:
return entry
- elif Cast(entry, 'IOService *').pwrMgt and Cast(entry, 'IOService *').pwrMgt.Name:
- name = Cast(entry, 'IOService *').pwrMgt.Name
+ elif CastIOKitClass(entry, 'IOService *').pwrMgt and CastIOKitClass(entry, 'IOService *').pwrMgt.Name:
+ name = CastIOKitClass(entry, 'IOService *').pwrMgt.Name
if str(name) == search_name:
return entry
childKey = plane.keys[1]
childArray = LookupKeyInOSDict(registryTable, childKey)
if childArray is not None:
- ca = Cast(childArray, 'OSArray *')
+ ca = CastIOKitClass(childArray, 'OSArray *')
for idx in range(ca.count):
- registry_object = FindRegistryObjectRecurse(Cast(ca.array[idx], 'IORegistryEntry *'), search_name)
+ registry_object = FindRegistryObjectRecurse(CastIOKitClass(ca.array[idx], 'IORegistryEntry *'), search_name)
if not registry_object or int(registry_object) == int(0):
continue
else:
def GetString(string):
""" Returns the python string representation of a given OSString
"""
- out_string = "\"{0:s}\"".format(Cast(string, 'OSString *').string)
+ out_string = "\"{0:s}\"".format(CastIOKitClass(string, 'OSString *').string)
return out_string
def GetNumber(num):
- out_string = "{0:d}".format(Cast(num, 'OSNumber *').value)
+ out_string = "{0:d}".format(CastIOKitClass(num, 'OSNumber *').value)
return out_string
def GetBoolean(b):
print header_format.format("Name", "Index", "Count")
for i in kern.interrupt_stats:
- owner = Cast(i.owner, 'IOInterruptEventSource *')
- nub = Cast(owner.provider, 'IORegistryEntry *')
+ owner = CastIOKitClass(i.owner, 'IOInterruptEventSource *')
+ nub = CastIOKitClass(owner.provider, 'IORegistryEntry *')
name = None
# To uniquely identify an interrupt, we need the nub name and the index. The index
if name is None:
nub_name = "Unknown"
else:
- nub_name = GetString(Cast(name, 'OSString *'))
+ nub_name = GetString(CastIOKitClass(name, 'OSString *'))
# We now have everything we need; spew the requested data.
print header_format.format("Name", "Index", "Interrupt Count", "Interrupt Time", "Workloop Count", "Workloop CPU Time", "Workloop Time")
for i in kern.interrupt_stats:
- owner = Cast(i.owner, 'IOInterruptEventSource *')
- nub = Cast(owner.provider, 'IORegistryEntry *')
+ owner = CastIOKitClass(i.owner, 'IOInterruptEventSource *')
+ nub = CastIOKitClass(owner.provider, 'IORegistryEntry *')
name = None
# To uniquely identify an interrupt, we need the nub name and the index. The index
if name is None:
nub_name = "Unknown"
else:
- nub_name = GetString(Cast(name, 'OSString *'))
+ nub_name = GetString(CastIOKitClass(name, 'OSString *'))
# We now have everything we need; spew the requested data.