def ql_syscall_creat(ql: Qiling, filename: int, mode: int): flags = posix_open_flags["O_WRONLY"] | posix_open_flags[ "O_CREAT"] | posix_open_flags["O_TRUNC"] path = ql.os.utils.read_cstring(filename) real_path = ql.os.path.transform_to_real_path(path) relative_path = ql.os.path.transform_to_relative_path(path) flags &= 0xffffffff mode &= 0xffffffff idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) if idx == -1: regreturn = -ENOMEM else: try: if ql.archtype == QL_ARCH.ARM: mode = 0 flags = ql_open_flag_mapping(ql, flags) ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) regreturn = idx except QlSyscallError as e: regreturn = -e.errno ql.log.debug("creat(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) if regreturn >= 0 and regreturn != 2: ql.log.debug(f'File found: {real_path:s}') else: ql.log.debug(f'File not found {real_path:s}') return regreturn
def ql_syscall_open(ql: Qiling, filename: int, flags: int, mode: int): path = ql.os.utils.read_cstring(filename) real_path = ql.os.path.transform_to_real_path(path) relative_path = ql.os.path.transform_to_relative_path(path) flags &= 0xffffffff mode &= 0xffffffff idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) if idx == -1: regreturn = -EMFILE else: try: if ql.archtype == QL_ARCH.ARM and ql.ostype != QL_OS.QNX: mode = 0 #flags = ql_open_flag_mapping(ql, flags) flags = ql_open_flag_mapping(ql, flags) ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) regreturn = idx except QlSyscallError as e: regreturn = -e.errno ql.log.debug("open(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) if regreturn >= 0 and regreturn != 2: ql.log.debug(f'File found: {real_path:s}') else: ql.log.debug(f'File not found {real_path:s}') return regreturn
def ql_syscall_openat(ql: Qiling, fd: int, path: int, flags: int, mode: int): file_path = ql.os.utils.read_cstring(path) # real_path = ql.os.path.transform_to_real_path(path) # relative_path = ql.os.path.transform_to_relative_path(path) flags &= 0xffffffff mode &= 0xffffffff idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) if idx == -1: regreturn = -EMFILE else: try: if ql.archtype == QL_ARCH.ARM: mode = 0 flags = ql_open_flag_mapping(ql, flags) try: dir_fd = ql.os.fd[fd].fileno() except: dir_fd = None ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file( file_path, flags, mode, dir_fd) regreturn = idx except QlSyscallError as e: regreturn = -e.errno ql.log.debug( f'openat(fd = {fd:d}, path = {file_path}, flags = {open_flags_mapping(flags, ql.archtype)}, mode = {mode:#o}) = {regreturn:d}' ) return regreturn
def ql_syscall_openat(ql: Qiling, fd: int, path: int, flags: int, mode: int): file_path = ql.os.utils.read_cstring(path) # real_path = ql.os.path.transform_to_real_path(path) # relative_path = ql.os.path.transform_to_relative_path(path) flags &= 0xffffffff mode &= 0xffffffff idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] is None), -1) if idx == -1: regreturn = -EMFILE else: try: if ql.arch.type == QL_ARCH.ARM: mode = 0 flags = ql_open_flag_mapping(ql, flags) fd = ql.unpacks(ql.pack(fd)) if 0 <= fd < NR_OPEN: fobj = ql.os.fd[fd] # ql_file object or QlFsMappedObject if hasattr(fobj, "fileno") and hasattr(fobj, "name"): if not Path.is_absolute(Path(file_path)): file_path = Path(fobj.name) / Path(file_path) ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file( file_path, flags, mode) regreturn = idx except QlSyscallError as e: regreturn = -e.errno ql.log.debug( f'openat(fd = {fd:d}, path = {file_path}, mode = {mode:#o}) = {regreturn:d}' ) return regreturn