MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / GetBitFieldPos

Method GetBitFieldPos

PdbParser/SymbolHandler.cpp:267–307  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

265}
266
267DWORD SymbolHandler::GetBitFieldPos(std::string name, std::string fieldName) {
268 DWORD pos = 0;
269
270 auto symbol = std::make_unique<SymbolInfo>();
271 auto info = symbol->GetSymbolInfo();
272 SymGetTypeFromName(m_hProcess, _address, name.c_str(), symbol->GetSymbolInfo());
273
274 ULONG childrenCount;
275 SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_GET_CHILDRENCOUNT, &childrenCount);
276 TI_FINDCHILDREN_PARAMS* childrenParams = (TI_FINDCHILDREN_PARAMS*)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + sizeof(ULONG) * childrenCount);
277 if (childrenParams == nullptr) {
278 return pos;
279 }
280 childrenParams->Count = childrenCount;
281 childrenParams->Start = 0;
282 PSYMBOL_INFO pMemberInfo = (PSYMBOL_INFO)malloc((sizeof(SYMBOL_INFO) +
283 MAX_SYM_NAME * sizeof(TCHAR) +
284 sizeof(ULONG64) - 1) /
285 sizeof(ULONG64));
286 if (pMemberInfo == nullptr) {
287 free(childrenParams);
288 return pos;
289 }
290 pMemberInfo->SizeOfStruct = sizeof(SYMBOL_INFO);
291 pMemberInfo->MaxNameLen = MAX_SYM_NAME;
292 SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_FINDCHILDREN, childrenParams);
293
294 for (ULONG i = 0; i < childrenParams->Count; i++) {
295 ULONG child = childrenParams->ChildId[i];
296 SymFromIndex(m_hProcess, _address, child, pMemberInfo);
297 if (!::strcmp(pMemberInfo->Name, fieldName.c_str())) {
298 SymGetTypeInfo(m_hProcess, _address, child, TI_GET_BITPOSITION, &pos);
299 break;
300 }
301 }
302
303 free(pMemberInfo);
304 free(childrenParams);
305
306 return pos;
307}

Callers 1

GetKernelBitFieldPosMethod · 0.80

Calls 1

GetSymbolInfoMethod · 0.45

Tested by

no test coverage detected