| 199 | |
| 200 | |
| 201 | BOOL SymParser::DumpSymbol(LPCWSTR SymbolName, OUT SYM_INFO& SymInfo) { |
| 202 | SymInfo = {}; |
| 203 | |
| 204 | // Obtaining root symbol: |
| 205 | const ULONG SymNameLength = 128; |
| 206 | const ULONG SymInfoSize = sizeof(SYMBOL_INFO) + SymNameLength * sizeof(WCHAR); |
| 207 | std::vector<BYTE> RootSymbolInfoBuffer(SymInfoSize); |
| 208 | auto RootSymbolInfo = reinterpret_cast<PSYMBOL_INFO>(&RootSymbolInfoBuffer[0]); |
| 209 | RootSymbolInfo->SizeOfStruct = SymInfoSize; |
| 210 | BOOL Status = SymGetTypeFromName(hProcess, ModuleBase, SymbolName, RootSymbolInfo); |
| 211 | if (!Status) return FALSE; |
| 212 | |
| 213 | ULONG RootIndex = RootSymbolInfo->Index; |
| 214 | |
| 215 | SymInfo.Name = GetSymName(RootIndex); |
| 216 | SymInfo.Size = GetSymSize(RootIndex); |
| 217 | SymInfo.Offset = GetSymOffset(RootIndex, &Status); |
| 218 | if (!Status) SymInfo.Offset = GetSymAddressOffset(RootIndex); |
| 219 | |
| 220 | // Obtaining root symbol children count: |
| 221 | ULONG ChildrenCount = 0; |
| 222 | Status = SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_GET_CHILDRENCOUNT, &ChildrenCount); |
| 223 | if (!Status) return FALSE; |
| 224 | |
| 225 | SymInfo.Name = SymbolName; |
| 226 | SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_GET_LENGTH, &SymInfo.Size); |
| 227 | |
| 228 | if (ChildrenCount) { |
| 229 | // Obtaining children indices: |
| 230 | std::vector<BYTE> FindChildrenParamsBuffer(sizeof(TI_FINDCHILDREN_PARAMS) + ChildrenCount * sizeof(ULONG)); |
| 231 | auto Children = reinterpret_cast<TI_FINDCHILDREN_PARAMS*>(&FindChildrenParamsBuffer[0]); |
| 232 | Children->Count = ChildrenCount; |
| 233 | Status = SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_FINDCHILDREN, Children); |
| 234 | if (!Status) return FALSE; |
| 235 | |
| 236 | for (unsigned int i = 0; i < ChildrenCount; i++) { |
| 237 | SYM_CHILD_ENTRY Entry = {}; |
| 238 | ULONG ChildIndex = Children->ChildId[i]; |
| 239 | ULONG TypeId = GetSymTypeId(ChildIndex); |
| 240 | Entry.Name = GetSymName(ChildIndex); |
| 241 | Entry.Size = GetSymSize(TypeId); |
| 242 | Entry.Offset = GetSymOffset(ChildIndex); |
| 243 | Entry.BitPosition = GetSymBitPosition(ChildIndex, &Entry.IsBitField); |
| 244 | UINT64 BaseTypeSize = 0; |
| 245 | Entry.TypeName = GetSymTypeName(TypeId, &BaseTypeSize); |
| 246 | Entry.ElementsCount = BaseTypeSize != 0 ? Entry.Size / BaseTypeSize : 1; |
| 247 | |
| 248 | if (Entry.Name.empty()) Entry.Name = L"UNKNOWN_NAME"; |
| 249 | if (Entry.TypeName.empty()) Entry.TypeName = L"UNKNOWN_TYPE"; |
| 250 | |
| 251 | SymInfo.Entries.emplace_back(Entry); |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | return TRUE; |
| 256 | } |
nothing calls this directly
no outgoing calls
no test coverage detected