def MatchFirst(self, ctx): pat_ptr = ctx.cpu.r_reg(REG_D1) pat = ctx.mem.access.r_cstr(pat_ptr) anchor_ptr = ctx.cpu.r_reg(REG_D2) anchor = AccessStruct(self.ctx.mem,AnchorPathDef,struct_addr=anchor_ptr) # create MatchFirstNext instance mfn = MatchFirstNext(self.path_mgr, self.lock_mgr, pat, anchor) log_dos.info("MatchFirst: pat='%s' anchor=%06x strlen=%d flags=%02x-> ok=%s" \ % (pat, anchor_ptr, mfn.str_len, mfn.flags, mfn.ok)) if not mfn.ok: self.io_err = ERROR_BAD_TEMPLATE return self.io_err log_dos.debug("MatchFirst: %s" % mfn.matcher) # try first match self.io_err = mfn.first(ctx) if self.io_err == NO_ERROR: log_dos.info("MatchFirst: found name='%s' path='%s' -> parent lock %s, io_err=%d", mfn.name, mfn.path, mfn.dir_lock, self.io_err) self.matches[anchor_ptr] = mfn # no entry found or error elif self.io_err == ERROR_OBJECT_NOT_FOUND: log_dos.info("MatchFirst: none found") self.matches[anchor_ptr] = mfn else: log_dos.info("MatchFirst: error: %d", self.io_err) return self.io_err
def MatchFirst(self, lib, ctx): pat_ptr = ctx.cpu.r_reg(REG_D1) pat = ctx.mem.access.r_cstr(pat_ptr) anchor_ptr = ctx.cpu.r_reg(REG_D2) anchor = AccessStruct(self.ctx.mem, AnchorPathDef, struct_addr=anchor_ptr) # create MatchFirstNext instance mfn = MatchFirstNext(self.path_mgr, self.lock_mgr, pat, anchor) log_dos.info("MatchFirst: pat='%s' anchor=%06x strlen=%d flags=%02x-> ok=%s" \ % (pat, anchor_ptr, mfn.str_len, mfn.flags, mfn.ok)) if not mfn.ok: self.io_err = ERROR_BAD_TEMPLATE return self.io_err log_dos.debug("MatchFirst: %s" % mfn.matcher) # no entry found if mfn.path == None: log_dos.info("MatchFirst: none found!") self.matches[anchor_ptr] = None self.io_err = ERROR_OBJECT_NOT_FOUND # first match else: self.io_err = mfn.first(ctx) log_dos.info( "MatchFirst: found path='%s' -> dir path=%s -> parent lock %s, io_err=%d", mfn.path, mfn.voldir_path, mfn.dir_lock, self.io_err) self.matches[anchor_ptr] = mfn return self.io_err
def ReadArgs(self, ctx): template_ptr = ctx.cpu.r_reg(REG_D1) template = ctx.mem.access.r_cstr(template_ptr) array_ptr = ctx.cpu.r_reg(REG_D2) rdargs_ptr = ctx.cpu.r_reg(REG_D3) # get args from process bin_args = ctx.process.bin_args log_dos.info( "ReadArgs: args=%s template='%s' array_ptr=%06x rdargs_ptr=%06x" % (bin_args, template, array_ptr, rdargs_ptr)) # try to parse argument string args = Args() args.parse_template(template) args.prepare_input(ctx.mem.access, array_ptr) ok = args.parse_string(bin_args) if not ok: self.io_err = args.error log_dos.info("ReadArgs: not matched -> io_err=%d/%s", self.io_err, dos_error_strings[self.io_err]) return 0 log_dos.debug("matched template: %s", args.get_result()) # calc size of result size = args.calc_result_size() log_dos.debug("longs=%d chars=%d size=%d" % (args.num_longs, args.num_chars, size)) # alloc result mem (extra longs and cstrs) if size > 0: addr = self._alloc_mem("ReadArgs(@%06x)" % self.get_callee_pc(ctx), size) else: addr = 0 # fill result array and memory args.generate_result(ctx.mem.access, addr, array_ptr) # alloc RD_Args if rdargs_ptr == 0: rdargs = ctx.alloc.alloc_struct("RDArgs", RDArgsDef) own = True else: rdargs = ctx.alloc.map_struct("RDArgs", rdargs_ptr, RDArgsDef) own = False rdargs.access.w_s('RDA_Buffer', addr) rdargs.access.w_s('RDA_BufSiz', size) # store rdargs self.rdargs[rdargs.addr] = (rdargs, own) # result self.io_err = NO_ERROR log_dos.info("ReadArgs: matched! result_mem=%06x rdargs=%s", addr, rdargs) return rdargs.addr
def VPrintf(self, ctx): format_ptr = ctx.cpu.r_reg(REG_D1) argv_ptr = ctx.cpu.r_reg(REG_D2) fmt = ctx.mem.access.r_cstr(format_ptr) # write on output fh = self.file_mgr.get_output() log_dos.info("VPrintf: format='%s' argv=%06x" % (fmt,argv_ptr)) # now decode printf ps = dos.Printf.printf_parse_string(fmt) dos.Printf.printf_read_data(ps, ctx.mem.access, argv_ptr) log_dos.debug("VPrintf: parsed format: %s",ps) result = dos.Printf.printf_generate_output(ps) # write result self.file_mgr.write(fh, result) return len(result)
def VPrintf(self, lib, ctx): format_ptr = ctx.cpu.r_reg(REG_D1) argv_ptr = ctx.cpu.r_reg(REG_D2) format = ctx.mem.access.r_cstr(format_ptr) # write on output fh = self.file_mgr.get_output() log_dos.info("VPrintf: format='%s' argv=%06x" % (format, argv_ptr)) # now decode printf ps = dos.Printf.printf_parse_string(format) dos.Printf.printf_read_data(ps, ctx.mem.access, argv_ptr) log_dos.debug("VPrintf: parsed format: %s", ps) result = dos.Printf.printf_generate_output(ps) # write result self.file_mgr.write(fh, result) return len(result)
def ReadArgs(self, ctx): template_ptr = ctx.cpu.r_reg(REG_D1) template = ctx.mem.access.r_cstr(template_ptr) array_ptr = ctx.cpu.r_reg(REG_D2) rdargs_ptr = ctx.cpu.r_reg(REG_D3) # get args from process bin_args = ctx.process.bin_args log_dos.info( "ReadArgs: args=%s template='%s' array_ptr=%06x rdargs_ptr=%06x" % (bin_args, template, array_ptr, rdargs_ptr) ) # try to parse argument string args = Args() args.parse_template(template) args.prepare_input(ctx.mem.access, array_ptr) ok = args.parse_string(bin_args) if not ok: self.io_err = args.error log_dos.info("ReadArgs: not matched -> io_err=%d/%s", self.io_err, dos_error_strings[self.io_err]) return 0 log_dos.debug("matched template: %s", args.get_result()) # calc size of result size = args.calc_result_size() log_dos.debug("longs=%d chars=%d size=%d" % (args.num_longs, args.num_chars, size)) # alloc result mem (extra longs and cstrs) if size > 0: addr = self._alloc_mem("ReadArgs(@%06x)" % self.get_callee_pc(ctx), size) else: addr = 0 # fill result array and memory args.generate_result(ctx.mem.access, addr, array_ptr) # alloc RD_Args if rdargs_ptr == 0: rdargs = ctx.alloc.alloc_struct("RDArgs", RDArgsDef) own = True else: rdargs = ctx.alloc.map_struct("RDArgs", rdargs_ptr, RDArgsDef) own = False rdargs.access.w_s("RDA_Buffer", addr) rdargs.access.w_s("RDA_BufSiz", size) # store rdargs self.rdargs[rdargs.addr] = (rdargs, own) # result self.io_err = NO_ERROR log_dos.info("ReadArgs: matched! result_mem=%06x rdargs=%s", addr, rdargs) return rdargs.addr