| 7163 | } |
| 7164 | |
| 7165 | void COFF::ParseFrameDescriptors(uint8* data, int size, addr_target baseAddr) |
| 7166 | { |
| 7167 | uint8* ptr = data; |
| 7168 | uint8* endPtr = data + size; |
| 7169 | |
| 7170 | Dictionary<int, COFFFrameProgram> programMap; |
| 7171 | Array<COFFFrameProgram::Command> cmds; |
| 7172 | |
| 7173 | while (ptr < endPtr) |
| 7174 | { |
| 7175 | COFFFrameDescriptor* frame = (COFFFrameDescriptor*)ptr; |
| 7176 | ptr += sizeof(COFFFrameDescriptor); |
| 7177 | |
| 7178 | COFFFrameDescriptorEntry entry; |
| 7179 | entry.mFrameDescriptor = frame; |
| 7180 | |
| 7181 | bool failed = false; |
| 7182 | |
| 7183 | COFFFrameProgram* programPtr = NULL; |
| 7184 | if (programMap.TryAdd(frame->mFrameFunc, NULL, &programPtr)) |
| 7185 | { |
| 7186 | COFFFrameProgram program; |
| 7187 | |
| 7188 | cmds.Clear(); |
| 7189 | String curCmd; |
| 7190 | const char* ptr = mStringTable.mStrTable + frame->mFrameFunc; |
| 7191 | while (true) |
| 7192 | { |
| 7193 | char c = *(ptr++); |
| 7194 | if ((c == ' ') || (c == 0)) |
| 7195 | { |
| 7196 | if (curCmd == "$eip") |
| 7197 | cmds.Add(COFFFrameProgram::Command_EIP); |
| 7198 | else if ((curCmd == "$esp") || (curCmd == "$21")) |
| 7199 | cmds.Add(COFFFrameProgram::Command_ESP); |
| 7200 | else if ((curCmd == "$ebp") || (curCmd == "$22")) |
| 7201 | cmds.Add(COFFFrameProgram::Command_EBP); |
| 7202 | else if ((curCmd == "$eax") || (curCmd == "$17")) |
| 7203 | cmds.Add(COFFFrameProgram::Command_EAX); |
| 7204 | else if ((curCmd == "$ebx") || (curCmd == "$20")) |
| 7205 | cmds.Add(COFFFrameProgram::Command_EBX); |
| 7206 | else if ((curCmd == "$ecx") || (curCmd == "$18")) |
| 7207 | cmds.Add(COFFFrameProgram::Command_ECX); |
| 7208 | else if ((curCmd == "$edx") || (curCmd == "$19")) |
| 7209 | cmds.Add(COFFFrameProgram::Command_EDX); |
| 7210 | else if ((curCmd == "$esi") || (curCmd == "$23")) |
| 7211 | cmds.Add(COFFFrameProgram::Command_ESI); |
| 7212 | else if ((curCmd == "$edi") || (curCmd == "$24")) |
| 7213 | cmds.Add(COFFFrameProgram::Command_EDI); |
| 7214 | else if (curCmd == "$T0") |
| 7215 | cmds.Add(COFFFrameProgram::Command_T0); |
| 7216 | else if (curCmd == "$T1") |
| 7217 | cmds.Add(COFFFrameProgram::Command_T1); |
| 7218 | else if (curCmd == "$T2") |
| 7219 | cmds.Add(COFFFrameProgram::Command_T2); |
| 7220 | else if (curCmd == "$T3") |
| 7221 | cmds.Add(COFFFrameProgram::Command_T3); |
| 7222 | else if ((curCmd == ".raSearch") || (curCmd == ".raSearchStart")) |
no test coverage detected