void _dx_free_rmode_wrapper (REALPTR dosAddr) { int i; for (i = 0; i < MAX_WRAPPERS; i++) if (_rmcb[i].dosReal && _rmcb[i].dosReal == dosAddr) { struct TaskRecord *tr = _rmcb + i; if (tr->marker == MARKER) /* task marker ok */ _dx_real_free (RP_SEG(tr->dosReal)); if (tr->stackTop[1] == MARKER) /* stack marker ok */ free (tr->stackStart); memset (tr,0,sizeof(*tr)); } }
void WriteRealMem (REALPTR rp, const void *src, int size) { DWORD lin = (RP_SEG(rp) << 4) + RP_OFF(rp); __asm { push es push edi push esi mov es, _watt_dos_ds mov edi, lin mov esi, src mov ecx, size shr ecx, 2 cld db 0F3h, 0A5h /* rep movsd */ mov ecx, size and ecx, 3 rep movsb /* move rest */ pop esi pop edi pop es } }
void ReadRealMem (void *dst, REALPTR rp, unsigned size) { DWORD lin = (RP_SEG(rp) << 4) + RP_OFF(rp); __asm { push ds push edi push esi mov ds, _watt_dos_ds mov esi, lin mov edi, dst mov ecx, size shr ecx, 2 cld db 0F3h, 0A5h /* rep movsd */ mov ecx, size and ecx, 3 rep movsb /* move rest */ pop esi pop edi pop ds } }
/** * Try asking a LAN extension of DOS for a host-name. */ int _get_machine_name (char *buf, int size) { IREGS reg; char *h; char dosBuf[16]; int len; memset (®, 0, sizeof(reg)); reg.r_ax = 0x5E00; #if (DOSX & DJGPP) if (_go32_info_block.size_of_transfer_buffer < sizeof(dosBuf)) return (-1); reg.r_ds = __tb / 16; reg.r_dx = __tb & 15; #elif (DOSX & (PHARLAP|X32VM|POWERPAK)) if (_watt_dosTbSize < sizeof(dosBuf) || !_watt_dosTbr) return (-1); reg.r_ds = RP_SEG (_watt_dosTbr); reg.r_dx = RP_OFF (_watt_dosTbr); #elif (DOSX & DOS4GW) if (_watt_dosTbSize < sizeof(dosBuf) || !_watt_dosTbSeg) return (-1); reg.r_ds = _watt_dosTbSeg; reg.r_dx = 0; #elif (DOSX == 0) reg.r_ds = FP_SEG (dosBuf); reg.r_dx = FP_OFF (dosBuf); #else #error Help me! #endif GEN_INTERRUPT (0x21, ®); if ((reg.r_flags & CARRY_BIT) || hiBYTE(reg.r_cx) == 0) return (-1); #if (DOSX & DJGPP) dosmemget (__tb, sizeof(dosBuf), dosBuf); #elif (DOSX & (PHARLAP|X32VM|POWERPAK)) ReadRealMem ((void*)&dosBuf, _watt_dosTbr, sizeof(dosBuf)); #elif (DOSX & DOS4GW) memcpy (dosBuf, SEG_OFS_TO_LIN(_watt_dosTbSeg,0), sizeof(dosBuf)); #endif /* Remove right space padding */ h = dosBuf + min (strlen(dosBuf), sizeof(dosBuf)-1); while (h > dosBuf && h[-1] == ' ') h--; *h = '\0'; h = dosBuf; len = strlen (h); if (len + 1 > size) { SOCK_ERRNO (ERANGE); return (-1); } strcpy (buf, h); strlwr (buf); return (0); }
int GetCountryCode (void) { #if (DOSX & DJGPP) /* _osmajor/_osminor not set in crt0.o */ _get_dos_version (0); #endif if (_osmajor >= 3) { #if (DOSX & DJGPP) __dpmi_regs reg; reg.d.edx = 0; reg.x.ds = __tb / 16; reg.d.eax = 0x3800; __dpmi_int (0x21, ®); if (reg.x.flags & 1) return (0); dosmemget (__tb, sizeof(_country_info), &_country_info); return (reg.x.bx); #elif (DOSX & PHARLAP) SWI_REGS reg; if (_watt_dosTbSize < sizeof(_country_info)) return (0); reg.edx = RP_OFF (_watt_dosTbr); reg.ds = RP_SEG (_watt_dosTbr); reg.eax = 0x3800; _dx_real_int (0x21, ®); if (reg.flags & 1) return (0); ReadRealMem (&_country_info, _watt_dosTbr, sizeof(_country_info)); return (reg.ebx); #elif (DOSX & (DOS4GW|WDOSX)) union REGS reg; struct SREGS sreg; if (_watt_dosTbSize < sizeof(_country_info)) return (0); reg.x.edx = 0; sreg.ds = _watt_dosTbSeg; reg.x.eax = 0x3800; int386x (0x21, ®, ®, &sreg); if (reg.x.cflag) return (0); memcpy (&_country_info, SEG_OFS_TO_LIN(_watt_dosTbSeg,0), sizeof(_country_info)); return (reg.w.bx); #elif (DOSX & POWERPAK) UNFINISED(); #elif (DOSX == 0) /* real-mode */ union REGS reg; struct SREGS sreg; reg.x.dx = FP_OFF (_country_info); sreg.ds = FP_SEG (_country_info); reg.x.ax = 0x3800; int86x (0x21, ®, ®, &sreg); if (reg.x.cflag) return (0); return (reg.x.bx); #else #error Unsupported target #endif } return (0); }