static int load_and_run_DOS_program(char *command, char *cmdline, int quit) { BMEM(pa4) = (struct param4a *)lowmem_alloc(sizeof(struct param4a)); if (!BMEM(pa4)) return -1; BMEM(allocated) = 1; BMEM(quit) = quit; BMEM(cmd) = com_strdup(command); if (!BMEM(cmd)) { com_errno = 8; return -1; } BMEM(cmdl) = lowmem_alloc(256); if (!BMEM(cmdl)) { com_strfree(BMEM(cmd)); com_errno = 8; return -1; } if (!cmdline) cmdline = ""; snprintf(BMEM(cmdl), 256, "%c %s\r", (char)(strlen(cmdline)+1), cmdline); /* prepare param block */ BMEM(pa4)->envframe = 0; // ctcb->envir_frame; BMEM(pa4)->cmdline = MK_FARt(DOSEMU_LMHEAP_SEG, DOSEMU_LMHEAP_OFFS_OF(BMEM(cmdl))); BMEM(pa4)->fcb1 = MK_FARt(COM_PSP_SEG, offsetof(struct PSP, FCB1)); BMEM(pa4)->fcb2 = MK_FARt(COM_PSP_SEG, offsetof(struct PSP, FCB2)); SREG(es) = DOSEMU_LMHEAP_SEG; LWORD(ebx) = DOSEMU_LMHEAP_OFFS_OF(BMEM(pa4)); /* path of programm to load */ SREG(ds) = DOSEMU_LMHEAP_SEG; LWORD(edx) = DOSEMU_LMHEAP_OFFS_OF(BMEM(cmd)); fake_call_to(BIOSSEG, GET_RETCODE_HELPER); LWORD(eax) = 0x4b00; real_run_int(0x21); return 0; }
/******************************************** * GetRedirection - get next entry from list of redirected devices * ON ENTRY: * redirIndex has the index of the next device to return * this should start at 0, and be incremented between calls * to retrieve all elements of the redirection list * ON EXIT: * returns CC_SUCCESS if the operation was successful, and * deviceStr has a string with the device name: * either disk or printer (ex. 'D:' or 'LPT1') * resourceStr has a string with the server and name of resource * (ex. 'TIM\TOOLS') * deviceType indicates the type of device which was redirected * 3 = printer, 4 = disk * deviceParameter has my rights to this resource * NOTES: * ********************************************/ static uint16 GetRedirection(uint16 redirIndex, char *deviceStr, char **presourceStr, uint8 * deviceType, uint16 * deviceParameter) { uint16 ccode; uint8 deviceTypeTemp; char slashedResourceStr[MAX_RESOURCE_PATH_LENGTH]; struct REGPACK preg = REGPACK_INIT; char *dStr, *sStr; dStr = lowmem_alloc(16); preg.r_ds = FP_SEG(dStr); preg.r_si = FP_OFF(dStr); sStr = lowmem_alloc(128); preg.r_es = FP_SEG(sStr); preg.r_di = FP_OFF(sStr); preg.r_bx = redirIndex; preg.r_ax = DOS_GET_REDIRECTION; intr(0x21, &preg); strcpy(deviceStr,dStr); lowmem_free(dStr, 16); strcpy(slashedResourceStr,sStr); lowmem_free(sStr, 128); ccode = preg.r_ax; deviceTypeTemp = preg.r_bx & 0xff; /* save device type before C ruins it */ *deviceType = deviceTypeTemp; *deviceParameter = preg.r_cx; /* copy back unslashed portion of resource string */ if (preg.r_flags & CARRY_FLAG) { return (ccode); } else { /* eat the leading slashes */ *presourceStr = strdup(slashedResourceStr + 2); return (CC_SUCCESS); } }
char * com_strdup(char *s) { struct lowstring *p; int len = strlen(s); if (len > 254) { error("lowstring too long: %i bytes. builtin: %s\n", len, builtin_name); len = 254; } p = (void *)lowmem_alloc(len + 1 + sizeof(struct lowstring)); if (!p) return 0; p->len = len; memcpy(p->s, s, len); p->s[len] = 0; return p->s; }
static int getCWD(char **presourceStr) { char *cwd; struct REGPACK preg = REGPACK_INIT; uint8_t drive = sda_cur_drive(sda); char dl; int ret; cwd = lowmem_alloc(64); preg.r_ax = DOS_GET_CWD; preg.r_dx = 0; preg.r_ds = FP_SEG(cwd); preg.r_si = FP_OFF(cwd); intr(0x21, &preg); if (preg.r_flags & CARRY_FLAG) { lowmem_free(cwd, 64); return preg.r_ax ?: -1; }