Subversion Repositories pentevo

Rev

Rev 716 | Blame | Last modification | View Log | Download | RSS feed

  1. #include "std.h"
  2.  
  3. #include "resource.h"
  4. #include "emul.h"
  5. #include "vars.h"
  6.  
  7. #include "gui.h"
  8. #include "dx.h"
  9. #include "util.h"
  10.  
  11. struct CHEATDLG
  12. {
  13.    HWND dlg;
  14.    HWND resBox;
  15.    HWND resLabel;
  16.  
  17.    void ShowResults();
  18.    void SetControls();
  19.    void Search();
  20.  
  21.    unsigned char *lastsnap;
  22.    unsigned char *bitmask;
  23.    unsigned searchSize;
  24.    unsigned nFound;
  25.    unsigned char wordmode, hex;
  26.  
  27.    CHEATDLG() { lastsnap = 0; bitmask = 0; nFound = -1; mode = S_NEW; }
  28.    ~CHEATDLG() { free(lastsnap); free(bitmask);  }
  29.  
  30.    enum SR_MODE { S_NEW, S_VAL, S_INC, S_DEC } mode;
  31.  
  32. } CheatDlg;
  33.  
  34. void CHEATDLG::Search()
  35. {
  36.    if (nFound == -1) searchSize = conf.ramsize*1024;
  37.    searchSize = min(searchSize, conf.ramsize*1024);
  38.  
  39.    bitmask = (unsigned char*)realloc(bitmask, searchSize/8);
  40.    if (nFound == -1) memset(bitmask, 0xFF, searchSize/8);
  41.  
  42.    unsigned i;
  43.  
  44.    switch (mode) {
  45.  
  46.       case S_NEW:
  47.       {
  48.          memset(bitmask, 0xFF, searchSize/8);
  49.          nFound = -1;
  50.          break;
  51.       }
  52.  
  53.       case S_VAL:
  54.       {
  55.          char str[16]; GetDlgItemText(dlg, IDE_VALUE, str, sizeof(str));
  56.          unsigned val; sscanf(str, hex? "%X" : "%d", &val);
  57.          if (wordmode) {
  58.             for (i = 0; i < searchSize-1; i++)
  59.                if (*(WORD*)(memory+i) != (WORD)val)
  60.                   bitmask[i/8] &= ~(1 << (i & 7));
  61.          } else {
  62.             for (i = 0; i < searchSize; i++)
  63.                if (memory[i] != (BYTE)val)
  64.                   bitmask[i/8] &= ~(1 << (i & 7));
  65.          }
  66.          break;
  67.       }
  68.  
  69.       case S_INC:
  70.       case S_DEC:
  71.       {
  72.          unsigned char *ptr1, *ptr2;
  73.          if (mode == S_INC) ptr1 = memory, ptr2 = lastsnap;
  74.          else ptr2 = memory, ptr1 = lastsnap;
  75.  
  76.          if (wordmode) {
  77.             for (i = 0; i < searchSize-1; i++)
  78.                if (*(WORD*)(ptr1+i) <= *(WORD*)(ptr2+i))
  79.                   bitmask[i/8] &= ~(1 << (i & 7));
  80.          } else {
  81.             for (i = 0; i < searchSize; i++)
  82.                if (ptr1[i] <= ptr2[i])
  83.                   bitmask[i/8] &= ~(1 << (i & 7));
  84.          }
  85.          break;
  86.       }
  87.  
  88.    }
  89.  
  90.    if (wordmode) bitmask[(searchSize-1)/8] &= 0x7F;
  91.  
  92.    if (mode != S_NEW) {
  93.       for (nFound = i = 0; i < searchSize/8; i++) {
  94.          if (!bitmask[i]) continue;
  95.          if (bitmask[i] & 0x01) nFound++;
  96.          if (bitmask[i] & 0x02) nFound++;
  97.          if (bitmask[i] & 0x04) nFound++;
  98.          if (bitmask[i] & 0x08) nFound++;
  99.          if (bitmask[i] & 0x10) nFound++;
  100.          if (bitmask[i] & 0x20) nFound++;
  101.          if (bitmask[i] & 0x40) nFound++;
  102.          if (bitmask[i] & 0x80) nFound++;
  103.       }
  104.    }
  105.  
  106.    lastsnap = (unsigned char*)realloc(lastsnap, searchSize);
  107.    memcpy(lastsnap, memory, searchSize);
  108.    ShowResults();
  109. }
  110.  
  111. void CHEATDLG::SetControls()
  112. {
  113.    int enabled;
  114.  
  115.    setcheck(IDC_HEX, hex);
  116.    setcheck(IDC_BYTE, !wordmode);
  117.    setcheck(IDC_WORD, wordmode);
  118.  
  119.    enabled = lastsnap && (nFound > 0);
  120.    EnableWindow(GetDlgItem(dlg, IDC_DEC), enabled);
  121.    EnableWindow(GetDlgItem(dlg, IDC_INC), enabled);
  122.    if (!enabled && (mode == S_DEC || mode == S_INC)) mode = S_NEW;
  123.  
  124.    enabled = (nFound > 0);
  125.    EnableWindow(GetDlgItem(dlg, IDC_EXACT), enabled);
  126.    if (!enabled && mode == S_VAL) mode = S_NEW;
  127.  
  128.    setcheck(IDC_NEW, (mode == S_NEW));
  129.    setcheck(IDC_EXACT, (mode == S_VAL));
  130.    setcheck(IDC_INC, (mode == S_INC));
  131.    setcheck(IDC_DEC, (mode == S_DEC));
  132.  
  133.    enabled = (nFound == -1);// || (mode == S_NEW);
  134.    EnableWindow(GetDlgItem(dlg, IDC_BYTE), enabled);
  135.    EnableWindow(GetDlgItem(dlg, IDC_WORD), enabled);
  136.  
  137.    enabled = (mode == S_VAL);
  138.    EnableWindow(GetDlgItem(dlg, IDE_VALUE), enabled);
  139.    EnableWindow(GetDlgItem(dlg, IDC_HEX), enabled);
  140. }
  141.  
  142. void CHEATDLG::ShowResults()
  143. {
  144.    if (nFound > 0 && nFound <= 100) {
  145.  
  146.       ShowWindow(resLabel, SW_HIDE);
  147.       ShowWindow(resBox, SW_SHOW);
  148.       SendMessage(resBox, LVM_DELETEALLITEMS, 0, 0);
  149.  
  150.       char fn[10];
  151.       LVITEM item; int count = 0;
  152.       item.mask = LVIF_TEXT;
  153.       item.pszText = fn;
  154.  
  155.       for (unsigned i = 0; i < searchSize; i++) {
  156.          if (!(bitmask[i/8] & (1 << (i & 7)))) continue;
  157.  
  158.          unsigned base = 0xC000;
  159.          unsigned page = i / PAGE;
  160.          if (page == 2) base = 0x8000;
  161.          if (page == 5) base = 0x4000;
  162.  
  163.          sprintf(fn, "%04X", base + (i & (PAGE-1)));
  164.          item.iItem = count++;
  165.          item.iSubItem = 0;
  166.          item.iItem = SendMessage(resBox, LVM_INSERTITEM, 0, (LPARAM) &item);
  167.  
  168.          sprintf(fn, "%02X", page);
  169.          item.iSubItem = 1;
  170.          SendMessage(resBox, LVM_SETITEM, 0, (LPARAM) &item);
  171.  
  172.          sprintf(fn, "%04X", i & (PAGE-1));
  173.          item.iSubItem = 2;
  174.          SendMessage(resBox, LVM_SETITEM, 0, (LPARAM) &item);
  175.  
  176.          if (wordmode) sprintf(fn, "%04X", *(WORD*)(memory+i));
  177.          else sprintf(fn, "%02X", memory[i]);
  178.          item.iSubItem = 3;
  179.          SendMessage(resBox, LVM_SETITEM, 0, (LPARAM) &item);
  180.  
  181.       }
  182.    } else {
  183.       ShowWindow(resBox, SW_HIDE);
  184.       ShowWindow(resLabel, SW_SHOW);
  185.       char str[128];
  186.       if (!lastsnap) strcpy(str, "no active search");
  187.       else if (nFound == -1) strcpy(str, "new search started");
  188.       else if (!nFound) strcpy(str, "found nothing");
  189.       else sprintf(str, "result list too large (%d entries)", nFound);
  190.       SetWindowText(resLabel, str);
  191.    }
  192. }
  193.  
  194. INT_PTR CALLBACK cheatdlg(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  195. {
  196.    if (msg == WM_INITDIALOG) {
  197.  
  198.       ::dlg = CheatDlg.dlg = dlg;
  199.       CheatDlg.resLabel = GetDlgItem(dlg, IDC_STATUS);
  200.       CheatDlg.resBox = GetDlgItem(dlg, IDC_RESULTS);
  201.  
  202.       unsigned exflags = LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT;
  203.       SendMessage(CheatDlg.resBox, LVM_SETEXTENDEDLISTVIEWSTYLE, exflags, exflags);
  204.  
  205.       LVCOLUMN sizeCol;
  206.       sizeCol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  207.       sizeCol.fmt = LVCFMT_LEFT;
  208.  
  209.       sizeCol.cx = 50;
  210.       sizeCol.pszText = LPSTR("Address");
  211.       SendMessage(CheatDlg.resBox, LVM_INSERTCOLUMN, 0, (LPARAM)&sizeCol);
  212.  
  213.       sizeCol.cx = 40;
  214.       sizeCol.pszText = LPSTR("Page");
  215.       SendMessage(CheatDlg.resBox, LVM_INSERTCOLUMN, 1, (LPARAM)&sizeCol);
  216.  
  217.       sizeCol.cx = 50;
  218.       sizeCol.pszText = LPSTR("Offset");
  219.       SendMessage(CheatDlg.resBox, LVM_INSERTCOLUMN, 2, (LPARAM)&sizeCol);
  220.  
  221.       sizeCol.cx = 50;
  222.       sizeCol.pszText = LPSTR("Value");
  223.       SendMessage(CheatDlg.resBox, LVM_INSERTCOLUMN, 3, (LPARAM)&sizeCol);
  224.  
  225.       // SetFocus(GetDlgItem(dlg, IDE_VALUE));
  226.       SendDlgItemMessage(dlg, IDE_VALUE, EM_LIMITTEXT, 5, 0);
  227.       CheatDlg.SetControls();
  228.       CheatDlg.ShowResults();
  229.       return 1;
  230.    }
  231.  
  232.    if ((msg == WM_COMMAND && wp == IDCANCEL) ||
  233.        (msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE)) EndDialog(dlg, 0);
  234.  
  235.    if (msg == WM_COMMAND && HIWORD(wp) == BN_CLICKED)
  236.    {
  237.       DWORD id = LOWORD(wp);
  238.       if (id == IDC_NEW) CheatDlg.mode = CHEATDLG::S_NEW;
  239.       else if (id == IDC_EXACT) CheatDlg.mode = CHEATDLG::S_VAL;
  240.       else if (id == IDC_INC) CheatDlg.mode = CHEATDLG::S_INC;
  241.       else if (id == IDC_DEC) CheatDlg.mode = CHEATDLG::S_DEC;
  242.       else if (id == IDC_HEX) CheatDlg.hex = getcheck(id);
  243.       else if (id == IDC_BYTE) CheatDlg.wordmode = 0;
  244.       else if (id == IDC_WORD) CheatDlg.wordmode = 1;
  245.       else if (id == IDB_SEARCH) CheatDlg.Search();
  246.       else id = 0;
  247.  
  248.       if (id) CheatDlg.SetControls();
  249.    }
  250.  
  251.    return 0;
  252. }
  253.  
  254. void main_cheat()
  255. {
  256.    OnEnterGui();
  257.    DialogBox(hIn, MAKEINTRESOURCE(IDD_CHEAT), wnd, cheatdlg);
  258.    eat();
  259.    OnExitGui();
  260. }
  261.