예제 #1
0
 def SystemTagList(self, ctx):
   cmd_ptr = ctx.cpu.r_reg(REG_D1)
   tagitem_ptr = ctx.cpu.r_reg(REG_D2)
   cmd = ctx.mem.access.r_cstr(cmd_ptr)
   tag_list = taglist_parse_tagitem_ptr(ctx.mem, tagitem_ptr, DosTags)
   log_dos.info("SystemTagList: cmd='%s' tags=%s", cmd, tag_list)
   # parse "command line"
   cl = CommandLine()
   if not cl.parse_string(cmd):
     log_dos.info("SystemTagList: error parsing command: '%s'", cmd)
     return 10 # RETURN_ERROR
   args = cl.args
   if len(args) == 0:
     log_dos.info("SystemTagList: error parsing command: '%s'", cmd)
     return 10 # RETURN_ERROR
   bin = args[0]
   args = args[1:]
   # TODO: redirs
   log_dos.info("SystemTagList: bin='%s' args=%s", bin, args)
   # create a process and run it...
   proc = Process(ctx, bin, args)
   if not proc.ok:
     log_dos.warn("SystemTagList: can't create process for '%s' args=%s", bin, args)
     return 0xffffffff
   ctx.start_sub_process(proc)
예제 #2
0
 def SystemTagList(self, lib, ctx):
     cmd_ptr = ctx.cpu.r_reg(REG_D1)
     tagitem_ptr = ctx.cpu.r_reg(REG_D2)
     cmd = ctx.mem.access.r_cstr(cmd_ptr)
     tag_list = taglist_parse_tagitem_ptr(ctx.mem, tagitem_ptr, DosTags)
     log_dos.info("SystemTagList: cmd='%s' tags=%s", cmd, tag_list)
     # parse "command line"
     cl = CommandLine()
     if not cl.parse_string(cmd):
         log_dos.info("SystemTagList: error parsing command: '%s'", cmd)
         return 10  # RETURN_ERROR
     args = cl.args
     if len(args) == 0:
         log_dos.info("SystemTagList: error parsing command: '%s'", cmd)
         return 10  # RETURN_ERROR
     bin = args[0]
     args = args[1:]
     # TODO: redirs
     log_dos.info("SystemTagList: bin='%s' args=%s", bin, args)
     # create a process and run it...
     proc = Process(ctx, bin, args)
     if not proc.ok:
         log_dos.warn(
             "SystemTagList: can't create process for '%s' args=%s", bin,
             args)
         return 0xffffffff
     ctx.start_sub_process(proc)
예제 #3
0
 def LoadSeg(self, ctx):
   name_ptr = ctx.cpu.r_reg(REG_D1)
   name = ctx.mem.access.r_cstr(name_ptr)
   seg_list = self.seg_loader.load_seg(name)
   if seg_list == None:
     log_dos.warn("LoadSeg: '%s' -> not found!" % (name))
     return 0
   else:
     log_dos.warn("LoadSeg: '%s' -> %s" % (name, seg_list))
     b_addr = seg_list.b_addr
     self.seg_lists[b_addr] = seg_list
     return b_addr
예제 #4
0
 def LoadSeg(self, lib, ctx):
     name_ptr = ctx.cpu.r_reg(REG_D1)
     name = ctx.mem.access.r_cstr(name_ptr)
     seg_list = self.seg_loader.load_seg(name)
     if seg_list == None:
         log_dos.warn("LoadSeg: '%s' -> not found!" % (name))
         return 0
     else:
         log_dos.warn("LoadSeg: '%s' -> %s" % (name, seg_list))
         b_addr = seg_list.b_addr
         self.seg_lists[b_addr] = seg_list
         return b_addr
예제 #5
0
 def FreeDosObject(self, ctx):
   obj_type = ctx.cpu.r_reg(REG_D1)
   ptr = ctx.cpu.r_reg(REG_D2)
   # retrieve struct
   if ptr in self.dos_objs:
     entry = self.dos_objs[ptr]
     del self.dos_objs[ptr]
     # check type
     if obj_type != entry[1]:
       log_dos.warn("FreeDosObject: type mismatch %d != %d", obj_type, entry[1])
     # free struct
     ctx.alloc.free_struct(entry[0])
   else:
     log_dos.error("FreeDosObject: type=%d ptr=%08x -> NOT FOUND!", obj_type, ptr)
예제 #6
0
 def FreeDosObject(self, ctx):
     obj_type = ctx.cpu.r_reg(REG_D1)
     ptr = ctx.cpu.r_reg(REG_D2)
     # retrieve struct
     if ptr in self.dos_objs:
         entry = self.dos_objs[ptr]
         del self.dos_objs[ptr]
         # check type
         if obj_type != entry[1]:
             log_dos.warn("FreeDosObject: type mismatch %d != %d", obj_type,
                          entry[1])
         # free struct
         ctx.alloc.free_struct(entry[0])
     else:
         log_dos.error("FreeDosObject: type=%d ptr=%08x -> NOT FOUND!",
                       obj_type, ptr)
예제 #7
0
 def AllocDosObject(self, ctx):
     obj_type = ctx.cpu.r_reg(REG_D1)
     tags_ptr = ctx.cpu.r_reg(REG_D2)
     if obj_type == 0:  # DOS_FILEHANDLE
         name = "DOS_FILEHANDLE"
         struct_def = FileHandleDef
     elif obj_type == 1:  # DOS_EXALLCONTROL
         name = "DOS_EXALLCONTROL"
         struct_def = None
     elif obj_type == 2:  # DOS_FIB
         name = "DOS_FIB"
         struct_def = FileInfoBlockDef
     elif obj_type == 3:  # DOS_STDPKT
         name = "DOS_STDPKT"
         struct_def = DosPacketDef
     elif obj_type == 4:  # DOS_CLI
         name = "DOS_CLI"
         struct_def = CLIDef
     elif obj_type == 5:  # DOS_RDARGS
         name = "DOS_RDARGS"
         struct_def = RDArgsDef
     else:
         log_dos.error("AllocDosObject: invalid type=%d", obj_type)
         return 0
     if struct_def is None:
         log_dos.warn("AllocDosObject: unsupported type=%d/%s", obj_type,
                      name)
         return 0
     # allocate struct
     dos_obj = ctx.alloc.alloc_struct(name, struct_def)
     log_dos.info("AllocDosObject: type=%d/%s tags_ptr=%08x -> dos_obj=%s",
                  obj_type, name, tags_ptr, dos_obj)
     # store struct
     ptr = dos_obj.addr
     self.dos_objs[ptr] = (dos_obj, obj_type)
     # pre fill struct
     if obj_type == 0:
         dos_obj.access.w_s('fh_Pos', 0xffffffff)
         dos_obj.access.w_s('fh_End', 0xffffffff)
     elif obj_type == 4:
         raise UnsupportedFeatureError("AllocDosObject: DOS_CLI fill TBD")
     return ptr
예제 #8
0
 def AllocDosObject(self, ctx):
   obj_type = ctx.cpu.r_reg(REG_D1)
   tags_ptr = ctx.cpu.r_reg(REG_D2)
   if obj_type == 0: # DOS_FILEHANDLE
     name = "DOS_FILEHANDLE"
     struct_def = FileHandleDef
   elif obj_type == 1: # DOS_EXALLCONTROL
     name = "DOS_EXALLCONTROL"
     struct_def = None
   elif obj_type == 2: # DOS_FIB
     name = "DOS_FIB"
     struct_def = FileInfoBlockDef
   elif obj_type == 3: # DOS_STDPKT
     name = "DOS_STDPKT"
     struct_def = DosPacketDef
   elif obj_type == 4: # DOS_CLI
     name = "DOS_CLI"
     struct_def = CLIDef
   elif obj_type == 5: # DOS_RDARGS
     name = "DOS_RDARGS"
     struct_def = RDArgsDef
   else:
     log_dos.error("AllocDosObject: invalid type=%d", obj_type)
     return 0
   if struct_def is None:
     log_dos.warn("AllocDosObject: unsupported type=%d/%s", obj_type, name)
     return 0
   # allocate struct
   dos_obj = ctx.alloc.alloc_struct(name, struct_def)
   log_dos.info("AllocDosObject: type=%d/%s tags_ptr=%08x -> dos_obj=%s",
     obj_type, name, tags_ptr, dos_obj)
   # store struct
   ptr = dos_obj.addr
   self.dos_objs[ptr] = (dos_obj, obj_type)
   # pre fill struct
   if obj_type == 0:
     dos_obj.access.w_s('fh_Pos',0xffffffff)
     dos_obj.access.w_s('fh_End',0xffffffff)
   elif obj_type == 4:
     raise UnsupportedFeatureError("AllocDosObject: DOS_CLI fill TBD")
   return ptr