/* Frees a resource file * Returns 1 if successful or -1 on error */ int resource_file_free( resource_file_t **resource_file, libcerror_error_t **error ) { static char *function = "resource_file_free"; int result = 1; if( resource_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource file.", function ); return( -1 ); } if( *resource_file != NULL ) { if( ( *resource_file )->is_open != 0 ) { if( resource_file_close( *resource_file, error ) != 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_CLOSE_FAILED, "%s: unable to close resource file.", function ); result = -1; } } if( libfcache_cache_free( &( ( *resource_file )->message_string_cache ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free message string cache.", function ); result = -1; } if( libwrc_stream_free( &( ( *resource_file )->resource_stream ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free resource stream.", function ); result = -1; } if( libexe_file_free( &( ( *resource_file )->exe_file ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free EXE file.", function ); result = -1; } if( ( *resource_file )->name != NULL ) { memory_free( ( *resource_file )->name ); } memory_free( *resource_file ); *resource_file = NULL; } return( result ); }
/* Creates a resource file * Make sure the value resource_file is referencing, is set to NULL * Returns 1 if successful or -1 on error */ int resource_file_initialize( resource_file_t **resource_file, uint32_t preferred_language_identifier, libcerror_error_t **error ) { static char *function = "resource_file_initialize"; if( resource_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource file.", function ); return( -1 ); } if( *resource_file != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid resource file value already set.", function ); return( -1 ); } *resource_file = memory_allocate_structure( resource_file_t ); if( *resource_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create resource file.", function ); goto on_error; } if( memory_set( *resource_file, 0, sizeof( resource_file_t ) ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable to clear resource file.", function ); memory_free( *resource_file ); *resource_file = NULL; return( -1 ); } if( libexe_file_initialize( &( ( *resource_file )->exe_file ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create EXE file.", function ); goto on_error; } if( libwrc_stream_initialize( &( ( *resource_file )->resource_stream ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create resource stream.", function ); goto on_error; } if( libfcache_cache_initialize( &( ( *resource_file )->message_string_cache ), 16, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create message string cache.", function ); goto on_error; } ( *resource_file )->preferred_language_identifier = preferred_language_identifier; return( 1 ); on_error: if( *resource_file != NULL ) { if( ( *resource_file )->resource_stream != NULL ) { libwrc_stream_free( &( ( *resource_file )->resource_stream ), NULL ); } if( ( *resource_file )->exe_file != NULL ) { libexe_file_free( &( ( *resource_file )->exe_file ), NULL ); } memory_free( *resource_file ); *resource_file = NULL; } return( -1 ); }
/* Tests seeking in a file * Returns 1 if successful, 0 if not or -1 on error */ int exe_test_seek( libcstring_system_character_t *source, libcerror_error_t **error ) { libexe_file_t *file = NULL; libexe_section_t *section = NULL; size64_t section_size = 0; int number_of_sections = 0; int result = 0; int section_index = 0; if( libexe_file_initialize( &file, error ) != 1 ) { fprintf( stderr, "Unable to create file.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libexe_file_open_wide( file, source, LIBEXE_OPEN_READ, error ) != 1 ) #else if( libexe_file_open( file, source, LIBEXE_OPEN_READ, error ) != 1 ) #endif { fprintf( stderr, "Unable to open file.\n" ); goto on_error; } if( libexe_file_get_number_of_sections( file, &number_of_sections, error ) != 1 ) { fprintf( stderr, "Unable to retrieve number of sections.\n" ); goto on_error; } for( section_index = 0; section_index < number_of_sections; section_index++ ) { if( libexe_file_get_section( file, section_index, §ion, error ) != 1 ) { fprintf( stderr, "Unable to retrieve section: %d.\n", section_index ); goto on_error; } if( libexe_section_get_size( section, §ion_size, error ) != 1 ) { fprintf( stderr, "Unable to retrieve section size.\n" ); goto on_error; } fprintf( stdout, "Section: %d size: %" PRIu64 " bytes\n", section_index, section_size ); if( section_size == 0 ) { result = 1; } else { result = exe_test_seek_section( section, section_size ); if( result == -1 ) { fprintf( stderr, "Unable to seek in section: %d.\n", section_index ); goto on_error; } } if( libexe_section_free( §ion, error ) != 1 ) { fprintf( stderr, "Unable to free section: %d.\n", section_index ); goto on_error; } if( result != 1 ) { break; } } if( libexe_file_close( file, error ) != 0 ) { fprintf( stderr, "Unable to close file.\n" ); goto on_error; } if( libexe_file_free( &file, error ) != 1 ) { fprintf( stderr, "Unable to free file.\n" ); goto on_error; } return( result ); on_error: if( section != NULL ) { libexe_section_free( §ion, NULL ); } if( file != NULL ) { libexe_file_close( file, NULL ); libexe_file_free( &file, NULL ); } return( -1 ); }