Setcpu

void Setcpu(ulong threadid,ulong asmaddr,ulong dumpaddr,ulong selsize,ulong stackaddr,int mode);

Sets code and memory areas that will be displayed in the CPU window. If necessary, creates or restores CPU.


Parameters:

threadid
(in) Identifier of the thread that should be selected in the CPU window. If threadid is 0 or invalid, thread remains unchanged
asmaddr
(in) Address of the first selected command to be displayed in the Disassembler pane. If address is currently not visible, Disassembler is scrolled according to the mode. If asmaddr is 0 and threadid is 0, Disassembler selection remains unchanged. If asmaddr is 0 and threadid is valid, selection is moved to the EIP of the specified thread. If flag CPU_RUNTRACE is set, asmaddr is interpreted as the step back in the run trace
dumpaddr
(in) Address of the first byte to be displayed in the CPU Dump pane. If dumpaddr is 0, current selection remains unchanged
selsize
(in) If asmaddr is not 0, determines size, in bytes, of the selection in the Disassembler pane. If asmaddr is not 0 and selsize is 0, OllyDbg selects single command at address asmaddr. If dumpaddr is not 0, specifies size of the selection in the Dump pane. If dumpaddr is not 0 and selsize is 0, OllyDbg selects single dump item.
stackaddr
(in) Address of the selected Stack doubleword. If address is currently not visible, Stack is scrolled according to the mode.
mode
(in) A combination of the following flags:

CPU_ASMHIST Add asmaddr to the Disassembler history. User can walk history back and forth using menu items "Go to | Previous location", "Go to | Next location", or corresponding shortcuts
CPU_ASMCENTER If possible, places asmaddr in the middle of the CPU pane. If CPU_ASMCENTER is not set, asmaddr appears in the first displayed line
CPU_ASMFOCUS Moves focus to the Disassembler pane of the CPU window. Not compatible with CPU_DUMPFOCUS and CPU_STACKFOCUS
CPU_DUMPHIST Add dumpaddr to the CPU Dump history. User can walk history back and forth using menu items "Go to | Previous location", "Go to | Next location", or corresponding shortcuts
CPU_DUMPFOCUS Moves focus to the Dump pane of the CPU window. Not compatible with CPU_ASMFOCUS and CPU_STACKFOCUS
CPU_STACKFOCUS Moves focus to the Stack pane of the CPU window. Not compatible with CPU_ASMFOCUS and CPU_DUMPFOCUS
CPU_STACKCTR If possible, places stackaddr in the middle of the Stack pane. Necessary, for example for stack walk. If CPU_STACKCTR is not set, stackaddr appears in the first displayed line
CPU_REGAUTO Asks to switch FPU register display to FPU, MMX or 3DNow! mode depending on the command pointed to by asmaddr. If pointed command does not access FPU registers, display mode remains unchanged
CPU_NOCREATE If CPU window is absent, it will not be created
CPU_REDRAW Asks to redraw all panes of CPU window immediately. If CPU_REDRAW is not specified, OllyDbg only invalidates all panes of the CPU window
CPU_NOFOCUS Asks to not restore CPU window if it's minimized and to not move keyboard focus to the CPU
CPU_RUNTRACE Asks to switch to the run trace display. asmaddr is interpreted as the step back in the run trace
CPU_NOTRACE Asks to stop run trace display if currently active


Return values:

None


Example:

This is the adapted menu function of the Dump window that executes command "Go to expression":

int Mgotoexpression(t_table *pt,wchar *name,ulong index,int mode) {
  int answer;
  ulong addr;
  t_dump menudump;
  POINT coord;
  if (process==NULL)
    return MENU_ABSENT;
  menudump=(t_dump *)pt->customdata;
  if (menudump==NULL)
    return MENU_ABSENT;                // In fact, internal error
  if (menudump->menutype & DMT_STRUCT)
    return MENU_ABSENT;                // Not allowed for the structure dumps
  if (mode==MENU_VERIFY)
    return MENU_NORMAL;                // In all other cases, allowed operation
  else if (mode==MENU_EXECUTE) {
    if (Gettableselectionxy(&(menudump->table),2,&coord)<0)
      coord.x=coord.y=-1;              // Unknown selection coordinates, use defaults
    if (menudump->filecopy!=NULL)
      answer=Getdwordexpression(pt->hw,T(L"Enter expression to follow"),&addr,
      0,NM_GOTOSAV,coord.x,coord.y,menudump->table.font,0);
    else
      answer=Getgotoexpression(pt->hw,T(L"Enter expression to follow"),&addr,
      Getcputhreadid(),NM_GOTOSAV,coord.x,coord.y,menudump->table.font,0);
    if (answer!=0)
      return MENU_NOREDRAW;
    // Now we have address to follow. The action strongly depends on the dump type.
    if (menudump->filecopy!=NULL && addr>=menudump->size) {
      Flash(T(L"Offset beyond the end of file")); return MENU_NOREDRAW; }
    else if (menudump->filecopy==NULL && Findmemory(addr)==NULL) {
      Flash(T(L"No memory at the specified address")); return MENU_NOREDRAW; }
    else if (menudump->menutype & DMT_CPUDASM)
      // This is the CPU Disassembler pane.
      Setcpu(0,addr,0,0,0,CPU_ASMHIST|CPU_ASMCENTER);
    else if (menudump->menutype & DMT_CPUDUMP)
      // This is the CPU Dump pane.
      Setcpu(0,0,addr,0,0,CPU_DUMPHIST);
    else if (menudump->menutype & DMT_CPUSTACK)
      // This is the CPU stack.
      Setcpu(0,0,0,0,addr,0);
    else
      // This is the standalone dump window.
      Newdumpselection(menudump,addr,0);
    return MENU_REDRAW; };
  return MENU_ABSENT;
};



See also:
Getcputhreadid(), Redrawcpudisasm(), Redrawcpureg()