static void mouse_callback(struct sigcontext *scp, const struct RealModeCallStructure *rmreg, int is_32, void *arg) { void *sp = SEL_ADR_CLNT(_ss, _esp, is_32); struct pmaddr_s *mouseCallBack = arg; if (!ValidAndUsedSelector(mouseCallBack->selector)) { D_printf("MSDOS: ERROR: mouse callback to unused segment\n"); return; } D_printf("MSDOS: starting mouse callback\n"); if (is_32) { unsigned int *ssp = sp; *--ssp = _cs; *--ssp = _eip; _esp -= 8; } else { unsigned short *ssp = sp; *--ssp = _cs; *--ssp = _LWORD(eip); _LWORD(esp) -= 4; } rm_to_pm_regs(scp, rmreg, ~(1 << ebp_INDEX)); _ds = ConvertSegmentToDescriptor(RMREG(ds)); _cs = mouseCallBack->selector; _eip = mouseCallBack->offset; }
void msdos_api_winos2_call(struct sigcontext *scp, void *arg) { u_short *ldt_alias_winos2 = arg; D_printf("MSDOS: WINOS2 extension API call: 0x%04x\n", _LWORD(eax)); if (_LWORD(eax) == 0x0100) { u_short sel = *ldt_alias_winos2; if (sel) { _eax = sel; _eflags &= ~CF; } else { _eflags |= CF; } } else { _eflags |= CF; } }
static void ps2_mouse_callback(struct sigcontext *scp, const struct RealModeCallStructure *rmreg, int is_32, void *arg) { unsigned short *rm_ssp; void *sp = SEL_ADR_CLNT(_ss, _esp, is_32); struct pmaddr_s *PS2mouseCallBack = arg; if (!ValidAndUsedSelector(PS2mouseCallBack->selector)) { D_printf("MSDOS: ERROR: PS2 mouse callback to unused segment\n"); return; } D_printf("MSDOS: starting PS2 mouse callback\n"); rm_ssp = MK_FP32(RMREG(ss), RMREG(sp) + 4 + 8); if (is_32) { unsigned int *ssp = sp; *--ssp = *--rm_ssp; D_printf("data: 0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x\n", *ssp); *--ssp = _cs; *--ssp = _eip; _esp -= 24; } else { unsigned short *ssp = sp; *--ssp = *--rm_ssp; D_printf("data: 0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x ", *ssp); *--ssp = *--rm_ssp; D_printf("0x%x\n", *ssp); *--ssp = _cs; *--ssp = _LWORD(eip); _LWORD(esp) -= 12; } _cs = PS2mouseCallBack->selector; _eip = PS2mouseCallBack->offset; }
static void rmcb_ret_from_ps2(struct sigcontext *scp, struct RealModeCallStructure *rmreg, int is_32) { if (is_32) _esp += 16; else _LWORD(esp) += 8; do_retf(rmreg, (1 << ss_INDEX) | (1 << esp_INDEX)); }
char *e_print_scp_regs(struct sigcontext_struct *scp, int pmode) { static char buf[300]; char *p = buf; char *q = eregbuf; unsigned short *stk; int i; while (*q) *p++ = *q++; *p=0; exprintl(_rax,buf,(ERB_L1+ERB_LEFTM)); exprintl(_rbx,buf,(ERB_L1+ERB_LEFTM)+13); exprintl(_rcx,buf,(ERB_L1+ERB_LEFTM)+26); exprintl(_rdx,buf,(ERB_L1+ERB_LEFTM)+39); exprintl(_rsi,buf,(ERB_L2+ERB_LEFTM)); exprintl(_rdi,buf,(ERB_L2+ERB_LEFTM)+13); exprintl(_rbp,buf,(ERB_L2+ERB_LEFTM)+26); exprintl(_rsp,buf,(ERB_L2+ERB_LEFTM)+39); if (pmode & 1) exprintl(get_vFLAGS(TheCPU.eflags),buf,(ERB_L3+ERB_LEFTM)); else exprintl(TheCPU.veflags,buf,(ERB_L3+ERB_LEFTM)); exprintw(_cs,buf,(ERB_L3+ERB_LEFTM)+13); exprintw(_ds,buf,(ERB_L3+ERB_LEFTM)+26); exprintw(_es,buf,(ERB_L3+ERB_LEFTM)+39); exprintw(_fs,buf,(ERB_L4+ERB_LEFTM)); exprintw(_gs,buf,(ERB_L4+ERB_LEFTM)+13); exprintw(_ss,buf,(ERB_L4+ERB_LEFTM)+26); exprintl(_eflags,buf,(ERB_L4+ERB_LEFTM)+39); if (pmode & 2) { buf[(ERB_L4+ERB_LEFTM)+47] = 0; } else { if (pmode & 1) { if (Segments[_ss>>3].is_32) stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_esp); else stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_LWORD(esp)); } else
static void pm_to_rm_regs(const struct sigcontext *scp, struct RealModeCallStructure *rmreg, unsigned int mask) { if (mask & (1 << eflags_INDEX)) RMREG(flags) = _eflags; if (mask & (1 << eax_INDEX)) X_RMREG(ax) = _LWORD(eax); if (mask & (1 << ebx_INDEX)) X_RMREG(bx) = _LWORD(ebx); if (mask & (1 << ecx_INDEX)) X_RMREG(cx) = _LWORD(ecx); if (mask & (1 << edx_INDEX)) X_RMREG(dx) = _LWORD(edx); if (mask & (1 << esi_INDEX)) X_RMREG(si) = _LWORD(esi); if (mask & (1 << edi_INDEX)) X_RMREG(di) = _LWORD(edi); if (mask & (1 << ebp_INDEX)) X_RMREG(bp) = _LWORD(ebp); }
void rm_to_pm_regs(struct sigcontext *scp, const struct RealModeCallStructure *rmreg, unsigned int mask) { /* WARNING - realmode flags can contain the dreadful NT flag * if we don't use safety masks. */ if (mask & (1 << eflags_INDEX)) _eflags = 0x0202 | (0x0dd5 & RMREG(flags)); if (mask & (1 << eax_INDEX)) _LWORD(eax) = RMLWORD(ax); if (mask & (1 << ebx_INDEX)) _LWORD(ebx) = RMLWORD(bx); if (mask & (1 << ecx_INDEX)) _LWORD(ecx) = RMLWORD(cx); if (mask & (1 << edx_INDEX)) _LWORD(edx) = RMLWORD(dx); if (mask & (1 << esi_INDEX)) _LWORD(esi) = RMLWORD(si); if (mask & (1 << edi_INDEX)) _LWORD(edi) = RMLWORD(di); if (mask & (1 << ebp_INDEX)) _LWORD(ebp) = RMLWORD(bp); }
exprintw(_fs,buf,(ERB_L4+ERB_LEFTM)); exprintw(_gs,buf,(ERB_L4+ERB_LEFTM)+13); exprintw(_ss,buf,(ERB_L4+ERB_LEFTM)+26); exprintl(_eflags,buf,(ERB_L4+ERB_LEFTM)+39); if (pmode & 2) { buf[(ERB_L4+ERB_LEFTM)+47] = 0; } else { if (pmode & 1) { if (Segments[_ss>>3].is_32) stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_esp); else stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_LWORD(esp)); } else stk = MK_FP32(_ss,_LWORD(esp)); for (i=(ERB_L5+ERB_LEFTM); i<(ERB_L6-2); i+=5) { exprintw(*stk++,buf,i); } } return buf; } char *e_emu_disasm(unsigned char *org, int is32, unsigned int refseg) { static char buf[512]; static char frmtbuf[256]; int rc; int i; char *p, *p1;