/* Retrieves the start offset * Returns 1 if successful or -1 on error */ int libexe_section_get_start_offset( libexe_section_t *section, off64_t *start_offset, libcerror_error_t **error ) { libexe_internal_section_t *internal_section = NULL; static char *function = "libexe_section_get_start_offset"; size64_t segment_size = 0; uint32_t segment_flags = 0; int segment_file_index = 0; if( section == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid section.", function ); return( -1 ); } internal_section = (libexe_internal_section_t *) section; if( internal_section->section_descriptor == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid section - missing section descriptor.", function ); return( -1 ); } if( libfdata_stream_get_segment_by_index( internal_section->section_descriptor->data_stream, 0, &segment_file_index, start_offset, &segment_size, &segment_flags, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve section data stream segment: 0.", function ); return( -1 ); } return( 1 ); }
/* Retrieves a specific extent (decoded data run) * Returns 1 if successful or -1 on error */ int libfsntfs_data_stream_get_extent_by_index( libfsntfs_data_stream_t *data_stream, int extent_index, off64_t *extent_offset, size64_t *extent_size, uint32_t *extent_flags, libcerror_error_t **error ) { libfsntfs_internal_data_stream_t *internal_data_stream = NULL; static char *function = "libfsntfs_data_stream_get_extent_by_index"; size64_t data_size = 0; uint32_t range_flags = 0; int segment_file_index = 0; if( data_stream == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid data stream.", function ); return( -1 ); } internal_data_stream = (libfsntfs_internal_data_stream_t *) data_stream; if( internal_data_stream->data_cluster_block_stream == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS, "%s: invalid extent index value out of bounds.", function ); return( -1 ); } if( extent_offset == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid extent offset.", function ); return( -1 ); } if( extent_size == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid extent size.", function ); return( -1 ); } if( extent_flags == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid extent flags.", function ); return( -1 ); } if( libfdata_stream_get_segment_by_index( internal_data_stream->data_cluster_block_stream, extent_index, &segment_file_index, extent_offset, extent_size, &range_flags, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve data cluster block stream segment: %d.", function, extent_index ); return( -1 ); } if( libfdata_stream_get_segment_mapped_range( internal_data_stream->data_cluster_block_stream, extent_index, extent_offset, extent_size, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve data cluster block stream segment: %d mapped range.", function, extent_index ); return( -1 ); } if( ( *extent_offset < 0 ) || ( (size64_t) *extent_offset >= internal_data_stream->data_size ) ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS, "%s: invalid extent offset value out of bounds.", function ); return( -1 ); } data_size = internal_data_stream->data_size - *extent_offset; if( *extent_size > data_size ) { *extent_size = data_size; } *extent_flags = 0; if( ( range_flags & LIBFDATA_RANGE_FLAG_IS_SPARSE ) != 0 ) { *extent_flags |= LIBFSNTFS_EXTENT_FLAG_IS_SPARSE; } if( ( range_flags & LIBFDATA_RANGE_FLAG_IS_COMPRESSED ) != 0 ) { *extent_flags |= LIBFSNTFS_EXTENT_FLAG_IS_COMPRESSED; } return( 1 ); }