Ejemplo n.º 1
0
  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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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