https://www.cnblogs.com/M-Mr/p/3970003.html
| 110 | |
| 111 | // https://www.cnblogs.com/M-Mr/p/3970003.html |
| 112 | DWORD SymbolHandler::GetStructMemberOffset(std::string name,std::string memberName) { |
| 113 | DWORD offset = -1; |
| 114 | |
| 115 | auto symbol = std::make_unique<SymbolInfo>(); |
| 116 | auto info = symbol->GetSymbolInfo(); |
| 117 | SymGetTypeFromName(m_hProcess, _address, name.c_str(), symbol->GetSymbolInfo()); |
| 118 | |
| 119 | ULONG childrenCount = 0; |
| 120 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_GET_CHILDRENCOUNT, &childrenCount); |
| 121 | TI_FINDCHILDREN_PARAMS* childrenParams = (TI_FINDCHILDREN_PARAMS*)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + sizeof(ULONG) * childrenCount); |
| 122 | if (childrenParams == nullptr) { |
| 123 | return offset; |
| 124 | } |
| 125 | childrenParams->Count = childrenCount; |
| 126 | childrenParams->Start = 0; |
| 127 | PSYMBOL_INFO pMemberInfo = (PSYMBOL_INFO)malloc((sizeof(SYMBOL_INFO) + |
| 128 | MAX_SYM_NAME * sizeof(TCHAR) + |
| 129 | sizeof(ULONG64) - 1) / |
| 130 | sizeof(ULONG64)); |
| 131 | if (pMemberInfo == nullptr) { |
| 132 | return offset; |
| 133 | } |
| 134 | pMemberInfo->SizeOfStruct = sizeof(SYMBOL_INFO); |
| 135 | pMemberInfo->MaxNameLen = MAX_SYM_NAME; |
| 136 | SymGetTypeInfo(m_hProcess, _address, info->TypeIndex, TI_FINDCHILDREN, childrenParams); |
| 137 | |
| 138 | for (ULONG i = 0; i < childrenParams->Count; i++) { |
| 139 | ULONG child = childrenParams->ChildId[i]; |
| 140 | SymFromIndex(m_hProcess, _address, child, pMemberInfo); |
| 141 | if (!::strcmp(pMemberInfo->Name, memberName.c_str())) { |
| 142 | SymGetTypeInfo(m_hProcess, _address, child, TI_GET_OFFSET, &offset); |
| 143 | break; |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | free(pMemberInfo); |
| 148 | free(childrenParams); |
| 149 | |
| 150 | return offset; |
| 151 | } |
| 152 | |
| 153 | DWORD64 SymbolHandler::LoadKernelModule(DWORD64 address) { |
| 154 | auto size = 1 << 20; |
no test coverage detected