PyType PyType::lookupType(const std::string &typeNameIn, ULONG64 module) { if (debuggingTypeEnabled()) DebugPrint() << "lookup type '" << typeNameIn << "'"; std::string typeName = typeNameIn; trimBack(typeName); trimFront(typeName); if (isPointerType(typeName) || isArrayType(typeName)) return PyType(0, 0, typeName); if (typeName.find("enum ") == 0) typeName.erase(0, 5); if (endsWith(typeName, " const")) typeName.erase(typeName.length() - 6); if (typeName == "__int64" || typeName == "unsigned __int64") typeName.erase(typeName.find("__"), 2); const static std::regex typeNameRE("^[a-zA-Z_][a-zA-Z0-9_]*!?[a-zA-Z0-9_<>:, \\*\\&\\[\\]]*$"); if (!std::regex_match(typeName, typeNameRE)) return PyType(); CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG typeId; HRESULT result = S_FALSE; if (module != 0 && !isIntegralType(typeName) && !isFloatType(typeName)) result = symbols->GetTypeId(module, typeName.c_str(), &typeId); if (FAILED(result) || result == S_FALSE) result = symbols->GetSymbolTypeId(typeName.c_str(), &typeId, &module); if (FAILED(result)) return createUnresolvedType(typeName); return PyType(module, typeId, typeName); }
PyType PyValue::type() { if (!m_symbolGroup) return PyType(); DEBUG_SYMBOL_PARAMETERS params; if (FAILED(m_symbolGroup->GetSymbolParameters(m_index, 1, ¶ms))) return PyType(); ULONG size = 0; m_symbolGroup->GetSymbolTypeName(m_index, NULL, 0, &size); if (size != 0) { std::string typeName(size - 1, '\0'); if (SUCCEEDED(m_symbolGroup->GetSymbolTypeName(m_index, &typeName[0], size, NULL))) return PyType(params.Module, params.TypeId, typeName); } return PyType(params.Module, params.TypeId); }
PyType PyType::target() const { const std::string &typeName = name(); if (isPointerType(typeName) || isArrayType(typeName)) return lookupType(targetName(), m_module); return PyType(); }
PyField::PyField(std::string name, const PyType &parentType) : d(new PyFieldPrivate(name, parentType)) { auto extcmd = ExtensionCommandContext::instance(); unsigned long typeID = 0; if (SUCCEEDED(extcmd->symbols()->GetFieldTypeAndOffset( d->parentType.getModule(), d->parentType.getTypeId(), d->name.c_str(), &typeID, &d->offset))) { d->type = PyType(d->parentType.getModule(), typeID); } }
static PyObject *cdbext_call(PyObject *, PyObject *args) { char *function; if (!PyArg_ParseTuple(args, "s", &function)) return NULL; std::wstring woutput; std::string error; if (!ExtensionContext::instance().call(function, 0, &woutput, &error)) { DebugPrint() << "Failed to call function '" << function << "' error: " << error; Py_RETURN_NONE; } CIDebugRegisters *registers = ExtensionCommandContext::instance()->registers(); ULONG retRegIndex; if (FAILED(registers->GetPseudoIndexByName("$callret", &retRegIndex))) Py_RETURN_NONE; ULONG64 module; ULONG typeId; if (FAILED(registers->GetPseudoDescription(retRegIndex, NULL, 0, NULL, &module, &typeId))) Py_RETURN_NONE; DEBUG_VALUE value; if (FAILED(registers->GetPseudoValues(DEBUG_REGSRC_EXPLICIT, 1, NULL, retRegIndex, &value))) Py_RETURN_NONE; ULONG index = DEBUG_ANY_ID; const std::string name = SymbolGroupValue::pointedToSymbolName( value.I64, PyType(module, typeId).name()); if (debugPyCdbextModule) DebugPrint() << "Call ret value expression: " << name; IDebugSymbolGroup2 *symbolGroup = CurrentSymbolGroup::get(); if (FAILED(symbolGroup->AddSymbol(name.c_str(), &index))) Py_RETURN_NONE; return createPythonObject(PyValue(index, symbolGroup)); }