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); }
static PyObject *cdbext_resolveSymbol(PyObject *, PyObject *args) // -> Value { enum { bufSize = 2048 }; char *pattern; if (!PyArg_ParseTuple(args, "s", &pattern)) Py_RETURN_NONE; CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); auto rc = PyList_New(0); ULONG64 handle = 0; // E_NOINTERFACE means "no match". Apparently, it does not always // set handle. HRESULT hr = symbols->StartSymbolMatch(pattern, &handle); if (hr == E_NOINTERFACE || FAILED(hr)) { if (handle) symbols->EndSymbolMatch(handle); return rc; } char buf[bufSize]; ULONG64 offset; while (true) { hr = symbols->GetNextSymbolMatch(handle, buf, bufSize - 1, 0, &offset); if (hr == E_NOINTERFACE) break; if (hr == S_OK) PyList_Append(rc, Py_BuildValue("s", buf)); } symbols->EndSymbolMatch(handle); return rc; }
std::string PyType::module() const { CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG size; symbols->GetModuleNameString(DEBUG_MODNAME_MODULE, DEBUG_ANY_ID, m_module, NULL, 0, &size); std::string name(size - 1, '\0'); if (SUCCEEDED(symbols->GetModuleNameString(DEBUG_MODNAME_MODULE, DEBUG_ANY_ID, m_module, &name[0], size, NULL))) { return name; } return std::string(); }
IDebugSymbolGroup2 *CurrentSymbolGroup::create(ULONG threadId, ULONG64 frameNumber) { CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); currentSymbolGroup.releaseSymbolGroup(); if (FAILED(symbols->GetScopeSymbolGroup2(DEBUG_SCOPE_GROUP_ALL, NULL, ¤tSymbolGroup.m_symbolGroup))) { currentSymbolGroup.releaseSymbolGroup(); return nullptr; } currentSymbolGroup.m_frameNumber = frameNumber; currentSymbolGroup.m_threadId = threadId; return currentSymbolGroup.m_symbolGroup; }
static PyObject *cdbext_getAddressByName(PyObject *, PyObject *args) { char *name = 0; if (!PyArg_ParseTuple(args, "s", &name)) Py_RETURN_NONE; CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG64 address = 0; if (FAILED(symbols->GetOffsetByName(name, &address))) address = 0; return Py_BuildValue("K", address); }
PyFields PyType::fields() const { CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); PyFields fields; if (isArrayType(name()) || isPointerType(name())) return fields; for (ULONG fieldIndex = 0;; ++fieldIndex) { ULONG size = 0; symbols->GetFieldName(m_module, m_typeId, fieldIndex, NULL, 0, &size); if (size == 0) break; std::string name(size - 1, '\0'); if (FAILED(symbols->GetFieldName(m_module, m_typeId, fieldIndex, &name[0], size, NULL))) break; fields.push_back(PyField(name, *this)); } return fields; }
static PyObject *cdbext_listOfModules(PyObject *, PyObject *) { auto modules = PyList_New(0); CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); ULONG moduleCount; ULONG unloadedModuleCount; if (FAILED(symbols->GetNumberModules(&moduleCount, &unloadedModuleCount))) return modules; moduleCount += unloadedModuleCount; for (ULONG i = 0; i < moduleCount; ++i) { ULONG size; symbols->GetModuleNameString(DEBUG_MODNAME_MODULE, i, 0, NULL, 0, &size); char *name = new char[size]; const HRESULT hr = symbols->GetModuleNameString(DEBUG_MODNAME_MODULE, i, 0, name, size, 0); if (SUCCEEDED(hr)) PyList_Append(modules, PyUnicode_FromString(name)); delete[] name; } return modules; }
static PyObject *cdbext_getNameByAddress(PyObject *, PyObject *args) { ULONG64 address = 0; if (!PyArg_ParseTuple(args, "K", &address)) Py_RETURN_NONE; CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); PyObject* ret = NULL; ULONG size; symbols->GetNameByOffset (address, NULL, 0, &size, NULL); char *name = new char[size]; const HRESULT hr = symbols->GetNameByOffset (address, name, size, NULL, NULL); if (SUCCEEDED(hr)) ret = PyUnicode_FromString(name); delete[] name; if (ret == NULL) Py_RETURN_NONE; return ret; }