/* Reads a sector * Callback function for the volume vector * Returns 1 if successful or -1 on error */ int libbde_io_handle_read_sector( libbde_io_handle_t *io_handle, libbfio_handle_t *file_io_handle, libfdata_vector_t *vector, libfcache_cache_t *cache, int element_index, int element_data_file_index LIBBDE_ATTRIBUTE_UNUSED, off64_t element_data_offset, size64_t element_data_size LIBBDE_ATTRIBUTE_UNUSED, uint32_t element_data_flags LIBBDE_ATTRIBUTE_UNUSED, uint8_t read_flags LIBBDE_ATTRIBUTE_UNUSED, libcerror_error_t **error ) { libbde_sector_data_t *sector_data = NULL; static char *function = "libbde_io_handle_read_sector"; LIBBDE_UNREFERENCED_PARAMETER( element_data_file_index ); LIBBDE_UNREFERENCED_PARAMETER( element_data_size ); LIBBDE_UNREFERENCED_PARAMETER( element_data_flags ); LIBBDE_UNREFERENCED_PARAMETER( read_flags ); if( io_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid IO handle.", function ); return( -1 ); } /* TODO handle virtual sectors, what about different sector sizes? */ if( libbde_sector_data_initialize( §or_data, (size_t) io_handle->bytes_per_sector, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create sector data.", function ); goto on_error; } if( libbde_sector_data_read( sector_data, io_handle, file_io_handle, element_data_offset, io_handle->encryption_context, 1, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read sector data.", function ); goto on_error; } if( libfdata_vector_set_element_value_by_index( vector, (intptr_t *) file_io_handle, cache, element_index, (intptr_t *) sector_data, (int (*)(intptr_t **, libcerror_error_t **)) &libbde_sector_data_free, LIBFDATA_LIST_ELEMENT_VALUE_FLAG_MANAGED, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set sector data as element value.", function ); return( -1 ); } return( 1 ); on_error: if( sector_data != NULL ) { libbde_sector_data_free( §or_data, NULL ); } return( -1 ); }
/* Reads a page * Callback function for the page vector * Returns 1 if successful or -1 on error */ int libesedb_io_handle_read_page( libesedb_io_handle_t *io_handle, libbfio_handle_t *file_io_handle, libfdata_vector_t *vector, libfcache_cache_t *cache, int element_index, int element_file_index LIBESEDB_ATTRIBUTE_UNUSED, off64_t element_offset, size64_t element_size LIBESEDB_ATTRIBUTE_UNUSED, uint32_t element_flags LIBESEDB_ATTRIBUTE_UNUSED, uint8_t read_flags LIBESEDB_ATTRIBUTE_UNUSED, libcerror_error_t **error ) { libesedb_page_t *page = NULL; static char *function = "libesedb_io_handle_read_page"; LIBESEDB_UNREFERENCED_PARAMETER( element_file_index ); LIBESEDB_UNREFERENCED_PARAMETER( element_size ); LIBESEDB_UNREFERENCED_PARAMETER( element_flags ); LIBESEDB_UNREFERENCED_PARAMETER( read_flags ); if( libesedb_page_initialize( &page, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create page.", function ); goto on_error; } if( libesedb_page_read( page, io_handle, file_io_handle, element_offset, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read page.", function ); goto on_error; } if( libfdata_vector_set_element_value_by_index( vector, (intptr_t *) file_io_handle, cache, element_index, (intptr_t *) page, (int (*)(intptr_t **, libcerror_error_t **)) &libesedb_page_free, LIBFDATA_VECTOR_ELEMENT_VALUE_FLAG_MANAGED, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set page as element value.", function ); goto on_error; } return( 1 ); on_error: if( page != NULL ) { libesedb_page_free( &page, NULL ); } return( -1 ); }