int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs) { unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_iret)); if (wrapper == 0) return 0x8015; memcpy(wrapper, wrapper_common, sizeof(wrapper_common)); memcpy(wrapper+sizeof(wrapper_common), wrapper_iret, sizeof(wrapper_iret)); *(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15; info->size = (int)wrapper; r.x.ax = 0x0303; r.x.si = (int)wrapper; r.x.di = (int)regs; s.ds = _go32_my_cs(); s.es = _go32_my_ds(); s.fs = 0; s.gs = 0; int86x(0x31, &r, &r, &s); if (r.x.flags & 1) { return r.x.ax; } else { info->rm_segment = r.x.cx; info->rm_offset = r.x.dx; return 0; } }
int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) { char *mystack; unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intchain)); if (wrapper == 0) return 0x8015; mystack = (char *)malloc(_interrupt_stack_size); if (mystack == 0) return 0x8015; r.x.ax = 0x0204; r.h.bl = vector; int86(0x31, &r, &r); memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intchain, sizeof(wrapper_intchain)); *(short *)(wrapper+9) = _go32_my_ds(); *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; *(long *)(wrapper+sizeof(wrapper_intcommon)+3) = (long)wrapper+sizeof(wrapper_intcommon)+8; *(long *)(wrapper+sizeof(wrapper_intcommon)+8) = r.x.dx; *(short *)(wrapper+sizeof(wrapper_intcommon)+12) = r.x.cx; r.x.ax = 0x0205; r.h.bl = vector; r.x.cx = _go32_my_cs(); r.x.dx = (int)wrapper; int86(0x31, &r, &r); return 0; }
static void _unlock_dpmi_data(void *addr, int size) { unsigned long baseaddr; __dpmi_meminfo mem; __dpmi_get_segment_base_address(_go32_my_ds(), &baseaddr); mem.address = baseaddr + (unsigned long)addr; mem.size = size; __dpmi_unlock_linear_region(&mem); }
int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info) { char *mystack; unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intiret)); if (wrapper == 0) return 0x8015; mystack = (char *)malloc(_interrupt_stack_size); if (mystack == 0) return 0x8015; memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intiret, sizeof(wrapper_intiret)); *(short *)(wrapper+9) = _go32_my_ds(); *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; info->pm_offset = (int)wrapper; return 0; }