in Exdi/exdigdbsrv/GdbSrvControllerLib/XmlDataHelpers.cpp [1115:1203]
bool XmlDataGdbServerRegisterFile::SetRegistersByTargetFile(_In_ TAG_ATTR_LIST* const pTagAttrList,
_Out_ ConfigExdiGdbSrvData* pConfigTable)
{
HRESULT hr;
bool isSet = false;
ConfigTargetRegisterDescriptionFileEntry registerFileData = { 0 };
if (IsFeatureRegisterFile(pTagAttrList->tagName))
{
hr = XmlDataHelpers::GetXmlTagAttributeValues(pTagAttrList, attrRegistersFile, ARRAYSIZE(attrRegistersFile),
sizeof(ConfigTargetRegisterDescriptionFileEntry), static_cast<void*>(®isterFileData));
if (SUCCEEDED(hr))
{
// Check if the feature is supported
auto it = pConfigTable->gdbServerRegisters.featureNameSupported->find(pConfigTable->file.registerGroupArchitecture);
if (it == pConfigTable->gdbServerRegisters.featureNameSupported->end())
{
throw _com_error(E_INVALIDARG);
}
if ((it->second->compare(L"all") == 0) ||
(wcsstr(registerFileData.featureName, it->second->c_str()) != nullptr))
{
pConfigTable->gdbServerRegisters.featureName = registerFileData.featureName;
}
pConfigTable->gdbServerRegisters.spRegisterSystemSet.reset(new(std::nothrow) GdbServerRegisterMap());
if (pConfigTable->gdbServerRegisters.spRegisterSystemSet == nullptr)
{
throw _com_error(E_OUTOFMEMORY);
}
pConfigTable->gdbServerRegisters.spRegisterSystemSet->emplace(
pConfigTable->file.registerGroupArchitecture,
new(std::nothrow) RegisterVector());
isSet = true;
}
}
else if (!pConfigTable->gdbServerRegisters.featureName.empty() &&
IsRegisterFileEntry(pTagAttrList->tagName))
{
hr = XmlDataHelpers::GetXmlTagAttributeValues(pTagAttrList, attrRegistersFile, ARRAYSIZE(attrRegistersFile),
sizeof(ConfigTargetRegisterDescriptionFileEntry), static_cast<void*>(®isterFileData));
if (SUCCEEDED(hr))
{
char nameBuf[256] = {};
if (WideCharToMultiByte(CP_ACP, 0, registerFileData.RegisterName, static_cast<int>(wcslen(registerFileData.RegisterName)),
nameBuf, sizeof(nameBuf), nullptr, nullptr) == 0)
{
throw _com_error(E_INVALIDARG);
}
size_t registerSize = static_cast<size_t>(_wtoi(registerFileData.RegistBitSize));
size_t leftBits = registerSize % 8;
registerSize /= 8;
if (leftBits != 0)
{
registerSize++;
}
size_t regOrder = static_cast<size_t>(_wtoi(registerFileData.RegisterNum));
char nameOrderBuf[128] = {};
sprintf_s(nameOrderBuf, _countof(nameOrderBuf), "%zx", regOrder);
char groupBuf[128] = {};
if (WideCharToMultiByte(CP_ACP, 0, registerFileData.RegisterGroup, static_cast<int>(wcslen(registerFileData.RegisterGroup)),
groupBuf, sizeof(groupBuf), nullptr, nullptr) == 0)
{
throw _com_error(E_INVALIDARG);
}
RegistersStruct registerSet = {};
registerSet.name = nameBuf;
registerSet.nameOrder = nameOrderBuf;
registerSet.registerSize = registerSize;
registerSet.group = groupBuf;
auto it = pConfigTable->gdbServerRegisters.spRegisterSystemSet->find(pConfigTable->file.registerGroupArchitecture);
if (it == pConfigTable->gdbServerRegisters.spRegisterSystemSet->end())
{
throw _com_error(E_INVALIDARG);
}
it->second->push_back(move(registerSet));
isSet = true;
}
}
return isSet;
}