示例#1
0
文件: dpmi.c 项目: hallco978/msys
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;
  }
}
示例#2
0
文件: dpmi.c 项目: hallco978/msys
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;
}
示例#3
0
文件: serdos.c 项目: haision/GitHub_C
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);
}
示例#4
0
文件: dpmi.c 项目: hallco978/msys
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;
}