void CtrlMemView::onKeyDown(WPARAM wParam, LPARAM lParam) { if (ctrlDown) { switch (tolower(wParam & 0xFFFF)) { case 'g': { ctrlDown = false; u32 addr; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); return; } break; case 'f': case 's': search(false); return; case 'c': search(true); return; } } switch (wParam & 0xFFFF) { case VK_DOWN: scrollCursor(rowSize); break; case VK_UP: scrollCursor(-rowSize); break; case VK_LEFT: scrollCursor(-1); break; case VK_RIGHT: scrollCursor(1); break; case VK_NEXT: scrollWindow(visibleRows); break; case VK_PRIOR: scrollWindow(-visibleRows); break; case VK_CONTROL: ctrlDown = true; break; case VK_TAB: SendMessage(GetParent(wnd),WM_DEB_TABPRESSED,0,0); break; default: return; } }
void CtrlDisAsmView::disassembleToFile() { wchar_t fileName[MAX_PATH]; u32 size; // get size if (executeExpressionWindow(wnd,debugger,size) == false) return; if (size == 0 || size > 10*1024*1024) { MessageBox(wnd,L"Invalid size!",L"Error",MB_OK); return; } // get file name OPENFILENAME ofn; ZeroMemory( &ofn , sizeof( ofn)); ofn.lStructSize = sizeof ( ofn ); ofn.hwndOwner = NULL ; ofn.lpstrFile = fileName ; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( fileName ); ofn.lpstrFilter = L"All Files\0*.*\0\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL ; ofn.nMaxFileTitle = 0 ; ofn.lpstrInitialDir = NULL ; ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT; if (GetSaveFileName(&ofn) == false) return; FILE* output = _wfopen(fileName, L"wb"); if (output == NULL) { MessageBox(wnd,L"Could not open file!",L"Error",MB_OK); return; } std::string disassembly = disassembleRange(curAddress,size); fprintf(output,"%s",disassembly.c_str()); fclose(output); MessageBox(wnd,L"Finished!",L"Done",MB_OK); }
void CtrlRegisterList::changeValue(RegisterChangeMode mode, int cat, int reg) { wxString oldStr; u128 oldValue = cpu->getRegister(cat, reg); switch (mode) { case LOWER64: oldStr = wxsFormat(L"0x%016llX", oldValue._u64[0]); break; case UPPER64: oldStr = wxsFormat(L"0x%016llX", oldValue._u64[1]); break; case CHANGE32: oldStr = wxsFormat(L"0x%08X", oldValue._u64[0]); break; } u64 newValue; if (executeExpressionWindow(this, cpu, newValue, oldStr)) { switch (mode) { case LOWER64: oldValue._u64[0] = newValue; break; case UPPER64: oldValue._u64[1] = newValue; break; case CHANGE32: oldValue._u32[0] = newValue; break; } cpu->setRegister(cat, reg, oldValue); oldValue = cpu->getRegister(cat, reg); } needsValueUpdating = true; needsSizeUpdating = true; }
void CtrlRegisterList::changeValue(RegisterChangeMode mode) { wchar_t str[64]; u128 oldValue = cpu->getRegister(category,currentRows[category]); switch (mode) { case LOWER64: swprintf(str,64,L"0x%016llX",oldValue._u64[0]); break; case UPPER64: swprintf(str,64,L"0x%016llX",oldValue._u64[1]); break; case CHANGE32: swprintf(str,64,L"0x%08X",oldValue._u32[0]); break; } u64 newValue; if (executeExpressionWindow(this,cpu,newValue,str)) { switch (mode) { case LOWER64: oldValue._u64[0] = newValue; break; case UPPER64: oldValue._u64[1] = newValue; break; case CHANGE32: oldValue._u32[0] = newValue; break; } cpu->setRegister(category,currentRows[category],oldValue); } }
void CtrlDisAsmView::onKeyDown(WPARAM wParam, LPARAM lParam) { dontRedraw = false; u32 windowEnd = manager.getNthNextAddress(windowStart,visibleRows); keyTaken = true; if (KeyDownAsync(VK_CONTROL)) { switch (tolower(wParam & 0xFFFF)) { case 'f': case 's': search(false); break; case 'c': case VK_INSERT: copyInstructions(selectRangeStart, selectRangeEnd, true); break; case 'x': disassembleToFile(); break; case 'a': assembleOpcode(curAddress,""); break; case 'g': { u32 addr; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); } break; case 'e': // edit breakpoint editBreakpoint(); break; case 'd': // toogle breakpoint enabled toggleBreakpoint(true); break; case VK_UP: scrollWindow(-1); scanFunctions(); break; case VK_DOWN: scrollWindow(1); scanFunctions(); break; case VK_NEXT: setCurAddress(manager.getNthPreviousAddress(windowEnd,1),KeyDownAsync(VK_SHIFT)); break; case VK_PRIOR: setCurAddress(windowStart,KeyDownAsync(VK_SHIFT)); break; } } else { switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(manager.getNthNextAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_UP: setCurAddress(manager.getNthPreviousAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_NEXT: if (manager.getNthNextAddress(curAddress,1) != windowEnd && curAddressIsVisible()) { setCurAddress(manager.getNthPreviousAddress(windowEnd,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthNextAddress(windowEnd,visibleRows-1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthPreviousAddress(windowStart,visibleRows), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_LEFT: if (jumpStack.empty()) { gotoPC(); } else { u32 addr = jumpStack[jumpStack.size()-1]; jumpStack.pop_back(); gotoAddr(addr); } return; case VK_RIGHT: followBranch(); return; case VK_TAB: displaySymbols = !displaySymbols; break; case VK_SPACE: debugger->toggleBreakpoint(curAddress); break; case VK_F3: search(true); break; default: keyTaken = false; return; } } redraw(); }
void CtrlDisAsmView::onKeyDown(WPARAM wParam, LPARAM lParam) { dontRedraw = false; u32 windowEnd = windowStart+visibleRows*instructionSize; keyTaken = true; if (controlHeld) { switch (tolower(wParam & 0xFFFF)) { case 's': search(false); break; case 'c': search(true); break; case 'x': disassembleToFile(); break; case 'a': controlHeld = false; assembleOpcode(curAddress,""); break; case 'g': { u32 addr; controlHeld = false; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); } break; } } else { switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(curAddress + instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_UP: setCurAddress(curAddress - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_NEXT: if (curAddress != windowEnd - instructionSize && curAddressIsVisible()) { setCurAddress(windowEnd - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress + visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress - visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_LEFT: if (jumpStack.empty()) { gotoPC(); } else { u32 addr = jumpStack[jumpStack.size()-1]; jumpStack.pop_back(); gotoAddr(addr); } return; case VK_RIGHT: followBranch(); return; case VK_TAB: displaySymbols = !displaySymbols; break; case VK_CONTROL: controlHeld = true; break; case VK_SPACE: debugger->toggleBreakpoint(curAddress); break; default: keyTaken = false; return; } } redraw(); }
void CtrlDisAsmView::disassembleToFile() { wchar_t fileName[MAX_PATH]; u32 size; // get size if (executeExpressionWindow(wnd,debugger,size) == false) return; if (size == 0 || size > 10*1024*1024) { MessageBox(wnd,L"Invalid size!",L"Error",MB_OK); return; } // get file name OPENFILENAME ofn; ZeroMemory( &ofn , sizeof( ofn)); ofn.lStructSize = sizeof ( ofn ); ofn.hwndOwner = NULL ; ofn.lpstrFile = fileName ; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( fileName ); ofn.lpstrFilter = L"All files"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL ; ofn.nMaxFileTitle = 0 ; ofn.lpstrInitialDir = NULL ; ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT; if (GetSaveFileName(&ofn) == false) return; FILE* output = _wfopen(fileName, L"w"); if (output == NULL) { MessageBox(wnd,L"Could not open file!",L"Error",MB_OK); return; } // gather all branch targets without labels std::set<u32> branchAddresses; for (u32 i = 0; i < size; i += instructionSize) { char opcode[64],arguments[256]; const char *dis = debugger->disasm(curAddress+i, instructionSize); parseDisasm(dis,opcode,arguments); if (branchTarget != -1 && debugger->findSymbolForAddress(branchTarget) == NULL) { if (branchAddresses.find(branchTarget) == branchAddresses.end()) { branchAddresses.insert(branchTarget); } } } bool previousLabel = true; for (u32 i = 0; i < size; i += instructionSize) { u32 disAddress = curAddress+i; char addressText[64],opcode[64],arguments[256]; const char *dis = debugger->disasm(disAddress, instructionSize); parseDisasm(dis,opcode,arguments); bool isLabel = getDisasmAddressText(disAddress,addressText,false); if (isLabel) { if (!previousLabel) fprintf(output,"\n"); fprintf(output,"%s\n\n",addressText); } else if (branchAddresses.find(disAddress) != branchAddresses.end()) { if (!previousLabel) fprintf(output,"\n"); fprintf(output,"pos_%08X:\n\n",disAddress); } if (branchTarget != -1 && debugger->findSymbolForAddress(branchTarget) == NULL) { char* str = strstr(arguments,"0x"); sprintf(str,"pos_%08X",branchTarget); } fprintf(output,"\t%s\t%s\n",opcode,arguments); previousLabel = isLabel; } fclose(output); MessageBox(wnd,L"Finished!",L"Done",MB_OK); }