//Yeah this truly turned into a mess with the latest additions.. but it sure looks nice ;) void CtrlMemView::onPaint(WPARAM wParam, LPARAM lParam) { GetClientRect(wnd, &rect); PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(wnd, &ps); int width = rect.right; int numRows=(rect.bottom/rowHeight)/2+1; SetBkMode(hdc, TRANSPARENT); HPEN nullPen=CreatePen(0,0,0xFFFFFF); HPEN currentPen=CreatePen(0,0,0); HPEN selPen=CreatePen(0,0,0x808080); LOGBRUSH lbr; lbr.lbHatch=0; lbr.lbStyle=0; lbr.lbColor=0xFFFFFF; HBRUSH nullBrush=CreateBrushIndirect(&lbr); lbr.lbColor=0xFFEfE8; HBRUSH currentBrush=CreateBrushIndirect(&lbr); lbr.lbColor=0x70FF70; HBRUSH pcBrush=CreateBrushIndirect(&lbr); HPEN oldPen=(HPEN)SelectObject(hdc,nullPen); HBRUSH oldBrush=(HBRUSH)SelectObject(hdc,nullBrush); HFONT oldFont = (HFONT)SelectObject(hdc,(HGDIOBJ)font); int i; for (i=-numRows; i<=numRows; i++) { unsigned int address=curAddress + i*align; int rowY1 = rect.bottom/2 + rowHeight*i - rowHeight/2; int rowY2 = rect.bottom/2 + rowHeight*i + rowHeight/2; wchar temp[256]; swprintf(temp,L"%08x",address); //SelectObject(hdc,currentBrush); Rectangle(hdc,0,rowY1,16,rowY2); if(selecting && address == (u32)selection) SelectObject(hdc,selPen); else SelectObject(hdc,i==0 ? currentPen : nullPen); Rectangle(hdc,16,rowY1,width,rowY2); SelectObject(hdc,nullBrush); SetTextColor(hdc,0x600000); TextOut(hdc,17,rowY1,temp,(int)wcslen(temp)); SetTextColor(hdc,0x000000); switch(mode) { case MV_NORMAL: swprintf(temp, L"%08X %08X %08X %08X", ReadMem32((address+0)), ReadMem32((address+4)), ReadMem32((address+8)), ReadMem32((address+12))); TextOut(hdc,90,rowY1,temp,(int)wcslen(temp)); SetTextColor(hdc,0x0033BB22); ((u32*)temp)[0] = ReadMem32(address); ((u32*)temp)[1] = ReadMem32(address+4); ((u32*)temp)[2] = ReadMem32(address+8); ((u32*)temp)[3] = ReadMem32(address+12); ((u32*)temp)[4] = 0x00000000; TextOut(hdc,420,rowY1,temp,(int)wcslen(temp)); break; case MV_SYMBOLS: SetTextColor(hdc,0x0000FF); //int fn = address&3;//Debugger_GetSymbolNum(address); swprintf(temp,L"MV_SYMBOLS !!!"); // sprintf(temp, "%s (0x%x b)", Debugger_GetSymbolName(fn),Debugger_GetSymbolSize(fn)); TextOut(hdc,200,rowY1,temp,(int)wcslen(temp)); SetTextColor(hdc,0x0000000); UINT value = 0xBADC0D3;//ReadMem(address,4);//CMemory::ReadUnchecked_U32(address); swprintf(temp, L"%08x", value ); // sprintf(temp, "%08x [%s]", value, Debugger_GetSymbolName(Debugger_GetSymbolNum(value))); TextOut(hdc,70,rowY1,temp,(int)wcslen(temp)); break; } } SelectObject(hdc,oldFont); SelectObject(hdc,oldPen); SelectObject(hdc,oldBrush); DeleteObject(nullPen); DeleteObject(currentPen); DeleteObject(selPen); DeleteObject(nullBrush); DeleteObject(pcBrush); DeleteObject(currentBrush); EndPaint(wnd, &ps); }
//constprop void constprop(RuntimeBlockInfo* blk) { u32 rv[16]; bool isi[16]={0}; for (size_t i=0;i<blk->oplist.size();i++) { shil_opcode* op=&blk->oplist[i]; if (op->rs2.is_r32i() && op->rs2._reg<16 && isi[op->rs2._reg]) { /* not all opcodes can take rs2 as constant */ if (op->op!=shop_readm && op->op!=shop_writem && op->op!=shop_mul_u16 && op->op!=shop_mul_s16 && op->op!=shop_mul_i32 && op->op!=shop_mul_u64 && op->op!=shop_mul_s64 && op->op!=shop_adc && op->op!=shop_sbc) { op->rs2.type=FMT_IMM; op->rs2._imm=rv[op->rs2._reg]; if (op->op==shop_shld || op->op==shop_shad) { //convert em to mov/shl/shr printf("sh*d -> s*l !\n"); s32 v=op->rs2._imm; if (v>=0) { //x86e->Emit(sl32,reg.mapg(op->rd),v); op->op=shop_shl; op->rs2._imm=0x1f & v; } else if (0==(v&0x1f)) { if (op->op!=shop_shad) { //r[n]=0; //x86e->Emit(op_mov32,reg.mapg(op->rd),0); op->op=shop_mov32; op->rs1.type=FMT_IMM; op->rs1._imm=0; op->rs2.type=FMT_NULL; } else { //r[n]>>=31; //x86e->Emit(op_sar32,reg.mapg(op->rd),31); op->op=shop_sar; op->rs2._imm=31; } } else { //x86e->Emit(sr32,reg.mapg(op->rd),-v); if (op->op!=shop_shad) op->op=shop_shr; else op->op=shop_sar; op->rs2._imm=0x1f & (-v); } } } } if (op->rs1.is_r32i() && op->rs1._reg<16 && isi[op->rs1._reg]) { if ((op->op==shop_readm /*|| op->op==shop_writem*/) && (op->flags&0x7F)==4) { op->rs1.type=FMT_IMM; op->rs1._imm=rv[op->rs1._reg]; if (op->rs3.is_imm()) { op->rs1._imm+=op->rs3._imm; op->rs3.type=FMT_NULL; } printf("%s promotion: %08X\n",shop_readm==op->op?"shop_readm":"shop_writem",op->rs1._imm); } else if (op->op==shop_jdyn) { if (blk->BlockType==BET_DynamicJump || blk->BlockType==BET_DynamicCall) { blk->BranchBlock=rv[op->rs1._reg]; if (op->rs2.is_imm()) blk->BranchBlock+=op->rs2._imm;; blk->BlockType=blk->BlockType==BET_DynamicJump?BET_StaticJump:BET_StaticCall; blk->oplist.erase(blk->oplist.begin()+i); i--; printf("SBP: %08X -> %08X!\n",blk->addr,blk->BranchBlock); continue; } else { printf("SBP: failed :(\n"); } } else if (op->op==shop_mov32) { //handled later on ! } else if (op->op==shop_add || op->op==shop_sub) { if (op->rs2.is_imm()) { op->rs1.type=1; op->rs1._imm= op->op==shop_add ? (rv[op->rs1._reg]+op->rs2._imm): (rv[op->rs1._reg]-op->rs2._imm); op->rs2.type=0; printf("%s -> mov32!\n",op->op==shop_add?"shop_add":"shop_sub"); op->op=shop_mov32; } else if (op->op==shop_add && !op->rs2.is_imm()) { u32 immy=rv[op->rs1._reg]; op->rs1=op->rs2; op->rs2.type=1; op->rs2._imm=immy; printf("%s -> imm prm (%08X)!\n",op->op==shop_add?"shop_add":"shop_sub",immy); } } else { op->op=op->op; } } if (op->rd.is_r32i() && op->rd._reg<16) isi[op->rd._reg]=false; if (op->rd2.is_r32i() && op->rd2._reg<16) isi[op->rd._reg]=false; if (op->op==shop_mov32 && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16) { isi[op->rd._reg]=true; rv[op->rd._reg]=op->rs1._imm; } //NOT WORKING //WE NEED PROPER PAGELOCKS if (op->op==shop_readm && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16 && op->flags==0x4 && op->rs3.is_null()) { u32 baddr=blk->addr&0x0FFFFFFF; if (/*baddr==0xC158400 &&*/ blk->addr/PAGE_SIZE == op->rs1._imm/PAGE_SIZE) { isi[op->rd._reg]=true; rv[op->rd._reg]= ReadMem32(op->rs1._imm); printf("IMM MOVE: %08X -> %08X\n",op->rs1._imm,rv[op->rd._reg]); op->op=shop_mov32; op->rs1._imm=rv[op->rd._reg]; } } } rw_related(blk); }